О протоколе DALI
DALI (Digital Addressable Lighting Interface) – протокол, предназначенный для управления осветительными приборами. Протокол был разработан австрийской компанией Tridonic и основан на манчестерском кодировании: каждый бит данных кодируется перепадом от низкого сигнала к высокому или наоборот.
DALI сеть состоит из контроллера и подключенных к нему осветительных приборов. Передача данных идет на скорости 1200бит/с. Напряжение для логической единицы составляет 16±6,5В, а для логического нуля 0±4,5В. Шина DALI всегда находится под напряжением 16В, в противном случае все осветительные приборы, подключенные к шине, переходят в аварийный режим и включаются. Питание шины обеспечивает контроллер. К одной шине подключается до 64 светильников. Устройства можно объединять в 16 групп и задавать до 16 сцен освещения. Яркость каждого осветительного прибора регулируется от 0 до 254.
Сообщение от контроллера к осветительному прибору состоит из 16 бит и одного стартового бита. Сообщение может быть адресовано отдельному светильнику, группе светильников либо быть широковещательным. Некоторые команды должны передаваться дважды с интервалом не более 100мс. На определенные команды, например запрос текущей яркости или запрос типа устройства, осветительный прибор отправляет ответное сообщение.
Сообщение от осветительного прибора контроллеру состоит из 8 бит и одного стартового бита.
Список команд можно посмотреть здесь.
Инициализация новых светильников
До начала работы каждому светильнику должен быть присвоен адрес от 1 до 63 (short address). У новых светильников короткий адрес как правило не задан, поэтому управлять конкретным светильником не получится. Такие светильники реагируют только на широковещательные команды.
Для того чтобы назначить короткий адрес светильнику нужно его инициализировать. У каждого светильника есть случайный адрес, состоящий из 24 бит (3 раза по 8 бит). 24 битный адрес может принимать значения от 1 до 16777216. Вероятность подключения светильников с одинаковыми адресами минимален и составляет один случай из 1 из 266144.
Процесс инициализации заключается в следующем:
- от контроллера дважды передается широковещательная команда INITIALISE (0b1010010100000000) с интервалом не более 100мс, которая переводит все светильники в режим инициализации;
- от контроллера дважды передается широковещательная команда RANDOMISE (0b1010011100000000) с интервалом не более 100мс, после которой все светильники присваивают себе новый случайный адрес;
- от контроллера передается значение случайного адреса (24бит) тремя сообщениями по 8 бит (0b10110001HHHHHHHH, 0b10110011MMMMMMMM, 0b10110101LLLLLLLL);
- от контроллера передается широковещательная команда COMPARE (0b1010100100000000);
- если контроллер фиксирует ответное сообщение, значит есть светильники с меньшими адресами; таким образом запрашиваемый адрес снижается до тех пор, пока светильники перестанут отвечать;
- если ответ от светильника не был получен, адрес увеличивается на одну единицу и таким образом определяется светильник с наименьшим случайным адресом;
- после определения адреса светильника контроллер задает светильнику короткий адрес (0b10110111AAAAAAAA) и посылает команду WITHRAW (0b1010101100000000), которая исключает светильник из процесса поиска;
- далее контроллер переходит к поиску следующего светильника с большим случайным адресом;
- после завершения процесса инициализации контроллер посылает команду TERMINATE (0b1010000100000000), и светильники выходят из режима инициализации.
DALI и ARDUINO
Для управления светильником я использовал ARDUINO NANO, блок питания 12В, резисторы, светодиоды, транзистор и светильник ERCO Grasshopper. Схема довольно простая.
Светильник ERCO Grasshopper предназначен для освещения фасадов зданий и архитектурных памятников. У меня оказался RGB светильник с DALI драйвером TRIDONIC. У данного светильника 3 адреса (RED, GREEN, BLUE).
Библиотекy DALI можно скачать здесь.
Настройка
void setup() {
Serial.begin(74880);
/*
Задаем цифровой выход.
*/
dali.setupTransmit(3);
/*
Задаем аналоговый вход.
Применяется блок питания большой мощности (12В 2,1А)
и светильники не могут просадить напряжение до 0В.
В моем случае логическая единица соответствует напряжению 4,5В,
а логический нуль соответствует напряжению 3,8В.
*/
dali.setupAnalogReceive(0);
/*
Тестирование шины:
- светильники должны выключиться и включиться;
- определяется среднее значение между логическим нулем и единицей.
*/
dali.busTest();
/*
Режим сообщений, передаваемых по-COM порту
false - передаются только ответы от светильников;
true - предается вся информации с комментариями.
*/
dali.msgMode = true;
}
Основные команды
/*
Передача информации от DALI контроллера, где:
cmd1 - адресный байт;
cmd2 - байт команды.
*/
dali.transmit(cmd1, cmd2)
/*
Получить ответ от светильника
*/
uint8_t response = dali.receive()
/*
Проверка получения ответа
*/
bool response = dali.getResponse()
/*
Сканировать короткие адреса.
*/
dali.scanShortAdd()
/*
Запустить инициализацию.
*/
dali.initialisation();
Пример использования
Ниже приводится пример использования библиотеки. Комбинируя яркости различных каналов светильника, мы получаем разные цвета.
#include <Dali.h>
const int DALI_TX = 3;
const int DALI_RX_A = 0;
#define BROADCAST_C 0b11111111
#define ON_C 0b00000101
void setup() {
Serial.begin(74880);
//устанавливаем цифровой выход для передачи сообщений
dali.setupTransmit(DALI_TX);
//устанавливаем аналоговый вход для приема сообщений
dali.setupAnalogReceive(DALI_RX_A);
//тестируем шину
dali.busTest();
//режим сообщений
dali.msgMode = true;
sinus();
}
void sinus () {
// задаем адреса светильников
uint8_t lf_1_add = 0;
uint8_t lf_2_add = 1;
uint8_t lf_3_add = 2;
// переменные для значений яркости каждого светильника
uint8_t lf_1;
uint8_t lf_2;
uint8_t lf_3;
// счетчик
uint8_t i;
while (Serial.available() == 0) {
for (i = 0; i < 360; i ++) {
//выход из цикла
if (Serial.available() != 0) {
dali.transmit(BROADCAST_C, ON_C);
break;
}
//определяем значение яркости
lf_1 = (int) abs(254 * sin(i * 3.14 / 180));
lf_2 = (int) abs(254 * sin(i * 3.14 / 180 + 2 * 3.14 / 3));
lf_3 = (int) abs(254 * sin(i * 3.14 / 180 + 1 * 3.14 / 3));
//задаем яркость
dali.transmit(lf_1_add << 1, lf_1);
delay(5);
dali.transmit(lf_2_add << 1, lf_2);
delay(5);
dali.transmit(lf_3_add << 1, lf_3);
delay(5);
delay(20);
}
}
}
void loop() {
};
Литература
Комментарии (25)
vconst
15.02.2017 14:29Получается, что надо иметь светильники этого стандарта, что бы использовать такое управление?
laviol
15.02.2017 15:47Не совсем. Важно, чтобы блок питания, который установлен в светильник, поддерживал управление по DALI.
А вообще тут много вариаций, вплоть до преобразователя DALI-PWM, сигнал с которого уже заводится на БП светильника.vconst
15.02.2017 15:57То есть для самодельного освещения светодиодными лентами — не подойдет. Жаль, готовый стандарт — это удобно.
trapwalker
15.02.2017 16:12+2Этот стандарт для меня оказался откровенным и приятным сюрпризом.
Оказывается на али есть и драйверы типа такого, и выключатели, и даже модули на dyn-рейку… Пошел переосмысливать свой «колхозный» потенциально умный дом.
pesp
16.02.2017 08:28Отличная статья. Я как раз взялся разрабатывать светодиодные драйвера с управлением по DALI. Опыт создания освещения для умного дома (2 котеджа) показал, что придумывать что-то свое накладно, впоследствии связано с исправлением косяков. У меня есть хорошая реализованная идея низковольтного драйвера для светодиодов (48В). Сейчас прикручу к нему DALI и будет удобная маленькая платка, способная управляться цифровой шиной, легко масштабируемая в плане количества используемых светодиодов, с хорошим КПД и (как показало уже время) хорошей надежностью.
Первое, с чем столкнулся — нету доступных мастер-контроллеров. То что встречал в продаже — по негуманным 100-300 евро. Поэтому буду что-то придумывать сам. Или для начала попробую вариант из статьи. Правда с ардуинами никогда не работал. Но видимо это будет быстрее, чем самому делать мастер-контроллер на микроконтроллере.
Автору за статью большое спасибо.
b0rmann
16.02.2017 10:52большое спасибо — вот как раз на работе посадили за разработку dali master управляемого через сеть LoRa. Библиотеку с радостью изучу, но вот схемка мне кажется как-то сильно упрощённой. не посоветует кто-нибудь схему или готовые dali master устройства?
Nabiyev
16.02.2017 10:55b0rmann
16.02.2017 17:49ну, как раз USB это не совсем то что хочется. в плане есть сделать недорогой gateway между радио сетью построеной на технологии LoRa — https://www.lora-alliance.org/ и уличными фонарями которые в себе имеют dali slave интерфейс. т.е. какое-нибудь радио SX1276, а за ним, например, atmega, а далее dali master который как бы і есть главной темой разработки ;)
Nabiyev
16.02.2017 22:04А с какой целью применяется стандарт DALI? Я не слышал, чтоб DALI применялся для уличного освещения. Мне кажется, что ZigBee удобнее.
b0rmann
17.02.2017 11:35просто нам были предложено использовать лампы с интерфейсом dali. а почему применяется — хрен его знает. из-за ограничений на длинну шины даже целой улицой нельзя управлять. и управляющие кабели не натянуты. из-за этого и приходится мутить весь этот зоопарк с радио и придурочной топологией 1-master:1-slave. иначе — без проблем бы хватило стандартной 10V PWM регуляции. но есть в ламах дали — надо делать дали ;)
b0rmann
17.02.2017 17:44единственное к чему в моём случае dali может быть полезным — диагностика сеть освещения.
pesp
16.02.2017 11:37Могу еще порекомендовать, из того что нашел, http://www.st.com/en/evaluation-tools/steval-ilm001v1.html?s_searchtype=partnumber — это модуль к слейву, но я думаю с небольшими доработками сгодиться и для мастера.
pesp
16.02.2017 11:41От Microchip с корректировкой http://www.elsys.biz/wpblog/?p=1351
http://www.nxp.com/assets/documents/data/en/reference-manuals/DRM004.pdf и вот здесь есть схема для управляющего контроллера.
engune
Это у Вас в зависимости от спектра так пульсация плавает? В видео было бы лучше выбрать ручную стабилизацию.
Nabiyev
Да, снималось на мобильный телефон. Камера не очень.
san915
Да не в камере дело. Просто драйвер имеет пульсации тока (и соответственно светового потока) более чем положено по СанПиН. При съемке на камеру это проявляется в виде интерференционных артефактов (полосы статичные или бегущие). Особенно это заметно при диммировании драйвера. Как правило, при диммировании дешевые китайские драйверы пульсируют особенно сильно. Ручная стабилизация ни при чем. Это свойство драйвера (или ПРА, или УУ как его еще называют).