Управление светильниками по протоколу DALI с помощью Arduino

О протоколе 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() {

};


Литература


  1. DALI commands
  2. DALI address setting explained
  3. USB — DALI master using the LPC2141 Application note
  4. DALI slave using the LPC1112 Application note
  5. Manchester Library for Arduino
  6. Digital Addressable Lighting Interface (DALI) Application Note
  7. DALI gateway
Share post

Comments 25

    0
    Это у Вас в зависимости от спектра так пульсация плавает? В видео было бы лучше выбрать ручную стабилизацию.
      0
      Да, снималось на мобильный телефон. Камера не очень.
        0
        Да не в камере дело. Просто драйвер имеет пульсации тока (и соответственно светового потока) более чем положено по СанПиН. При съемке на камеру это проявляется в виде интерференционных артефактов (полосы статичные или бегущие). Особенно это заметно при диммировании драйвера. Как правило, при диммировании дешевые китайские драйверы пульсируют особенно сильно. Ручная стабилизация ни при чем. Это свойство драйвера (или ПРА, или УУ как его еще называют).
      0
      Получается, что надо иметь светильники этого стандарта, что бы использовать такое управление?
        0
        Не совсем. Важно, чтобы блок питания, который установлен в светильник, поддерживал управление по DALI.
        А вообще тут много вариаций, вплоть до преобразователя DALI-PWM, сигнал с которого уже заводится на БП светильника.
          0
          То есть для самодельного освещения светодиодными лентами — не подойдет. Жаль, готовый стандарт — это удобно.
          0
          Светильник должен быть со специальной пускорегулирующей аппаратурой.
          0
          Я что-то не очень понял, при ответе светильник коротит общую шину?
            0
            Да, светильник коротит общую шину, но по стандарту ток не должен превышать 250мА.
              0

              Попробуйте поставить для эксперимента резистор между шиной и блоком питания 12 В для обеспечения тока КЗ не более 250 мА, по идее четче будут уровни при чтении данных

            +2
            Этот стандарт для меня оказался откровенным и приятным сюрпризом.
            Оказывается на али есть и драйверы типа такого, и выключатели, и даже модули на dyn-рейку… Пошел переосмысливать свой «колхозный» потенциально умный дом.
              0

              Не очень красиво вставлять реферральные ссылки без предупреждения об этом.

                0

                Ой. А как их теперь убрать? Плагин завернул, а я не заметил.

              0
              Отличная статья. Я как раз взялся разрабатывать светодиодные драйвера с управлением по DALI. Опыт создания освещения для умного дома (2 котеджа) показал, что придумывать что-то свое накладно, впоследствии связано с исправлением косяков. У меня есть хорошая реализованная идея низковольтного драйвера для светодиодов (48В). Сейчас прикручу к нему DALI и будет удобная маленькая платка, способная управляться цифровой шиной, легко масштабируемая в плане количества используемых светодиодов, с хорошим КПД и (как показало уже время) хорошей надежностью.
              Первое, с чем столкнулся — нету доступных мастер-контроллеров. То что встречал в продаже — по негуманным 100-300 евро. Поэтому буду что-то придумывать сам. Или для начала попробую вариант из статьи. Правда с ардуинами никогда не работал. Но видимо это будет быстрее, чем самому делать мастер-контроллер на микроконтроллере.
              Автору за статью большое спасибо.
                0
                большое спасибо — вот как раз на работе посадили за разработку dali master управляемого через сеть LoRa. Библиотеку с радостью изучу, но вот схемка мне кажется как-то сильно упрощённой. не посоветует кто-нибудь схему или готовые dali master устройства?
                  0
                    0
                    ну, как раз USB это не совсем то что хочется. в плане есть сделать недорогой gateway между радио сетью построеной на технологии LoRa — https://www.lora-alliance.org/ и уличными фонарями которые в себе имеют dali slave интерфейс. т.е. какое-нибудь радио SX1276, а за ним, например, atmega, а далее dali master который как бы і есть главной темой разработки ;)
                      0
                      А с какой целью применяется стандарт DALI? Я не слышал, чтоб DALI применялся для уличного освещения. Мне кажется, что ZigBee удобнее.
                        0
                        если б не применялся — я бы имел о одну проблему меньше ;)
                          0
                          просто нам были предложено использовать лампы с интерфейсом dali. а почему применяется — хрен его знает. из-за ограничений на длинну шины даже целой улицой нельзя управлять. и управляющие кабели не натянуты. из-за этого и приходится мутить весь этот зоопарк с радио и придурочной топологией 1-master:1-slave. иначе — без проблем бы хватило стандартной 10V PWM регуляции. но есть в ламах дали — надо делать дали ;)
                            0
                            Тогда понятно. 0-10В было бы конечно проще и дешевле для всех.
                            0
                            единственное к чему в моём случае dali может быть полезным — диагностика сеть освещения.
                      0
                        0
                        Могу еще порекомендовать, из того что нашел, http://www.st.com/en/evaluation-tools/steval-ilm001v1.html?s_searchtype=partnumber — это модуль к слейву, но я думаю с небольшими доработками сгодиться и для мастера.
                          0
                          От Microchip с корректировкой http://www.elsys.biz/wpblog/?p=1351
                          http://www.nxp.com/assets/documents/data/en/reference-manuals/DRM004.pdf и вот здесь есть схема для управляющего контроллера.

                          Only users with full accounts can post comments. Log in, please.