В прокатной конторе, где я помогал освежать сцену, весь свет — два десятка приборов — висел на одном кабеле с тремя контактами: земля и пара сигнальных. Это был не USB и не Ethernet, а DMX512, стандарт, по которому живёт сценический свет уже больше тридцати лет. Один канал — одно значение от 0 до 255: ярче, строб, цвет. Arduino смотрится там органично в роли мини-пульта, и чтобы собрать свой, надо понять ровно три вещи: скорость 250000, break длиной 88 мкс и слоты кадра.
Урок про протокол и его границы: покажу кадр по слотам, посчитаю, сколько длится полный цикл обновления, разберу адресацию дип-свитчем — и честно скажу, где аппаратный Serial на Uno упирается в потолок: break он сам не делает, для настоящего света нужна библиотека. Нестандартные скорости Serial — не экзотика, я их уже трогал в уроке про MIDI на 31250 бод; DMX — следующий шаг: 250000 бод и два стоп-бита.
Кадр: break 88 мкс, START-код и 512 слотов
DMX512 живёт на 250000 бод с форматом 8N2: бит тянется 4 мкс, символ с двумя стоп-битами — 44 мкс. Кадр начинается с break: контроллер прижимает линию к LOW минимум на 88 мкс — вдвое дольше целого символа, так не выглядит ни один байт, и все приборы на линии понимают: началось заново. Затем короткая пауза-отпускание не меньше 8 мкс — и 513 слотов подряд: нулевой слот это START-код, у классических диммеров 0x00, за ним до 512 слотов значений. Слот 1 — канал 1, и так по порядку, без адресов внутри кадра: номер канала — просто позиция в потоке.
Полный кадр из 513 слотов длится около 23 мс — значит, пульт обновляет всю сцену примерно 44 раза в секунду. Значения в слотах живут до следующего break: приборы держат последний уровень, поэтому пропавший кадр не гасит свет мгновенно — свет встанет на последний уровень и так и останется стоять. Это защита от моргания при потерянных кадрах, а уровень 255 на канале яркости — полное свечение, 0 — тьма, промежуточных ступеней нет, шаг один бит.
| Канал | Что управляет | 0 даёт | 255 даёт |
|---|---|---|---|
| 1 | яркость прожектора | тьма | полный свет |
| 2 | строб | строб выключен | вспышки на верхней частоте |
| 3 | красный | красный выключен | полный красный |
| 4 | зелёный | зелёный выключен | полный зелёный |
| 5 | синий | синий выключен | полный синий |
Адрес прибора задаётся дип-свитчем на корпусе и равен номеру слота, с которого прибор начинает слушать. Вес замыкателей — степени двойки: 1, 2, 4, 8 и дальше до 256; адрес 9 — это 8 плюс 1, то есть замыкатели 1 и 4 вверх, остальные вниз. Прожектор с адресом 9 на пять каналов занимает слоты с 9 по 13: яркость на 9, красный на 11 и так далее по паспорту. Адресный бюджет — самая частая кабинетная грабля: взяли адрес 510 на пятиканальный прибор — вылезли за 512, и хвост каналов молчит. Раздавайте адреса по порядку, с запасом и таблицей на стене.
Пульт на потенциометре и честная оговорка
На реальной плате аппаратный USART сам break не умеет: надо трогать регистры или брать библиотеку — Conceptinetics или DmxMaster сделают break, START-код и слоты за вас. В симуляторе я показываю логику протокола: массив слотов, кадр, дамп значений — а роль break честно выполняет пауза с переводом строки, и это оговорка, а не уловка. Ручку яркости от потенциометра я уже крутил просто на светодиоде через map и с плавным ходом в уроке про диммер на FastLED — здесь та же рука ведёт канал DMX.
// Библиотека Conceptinetics: break 88 мкс, START-код и слоты — на ней.#include <Conceptinetics.h> #define DMX_MASTER_CHANNELS 8 // сколько каналов ведёт наш пульт#define RXEN_PIN 7 // DE/RE модуля RS-485: HIGH — передача DMX_Master dmx_master(DMX_MASTER_CHANNELS, RXEN_PIN); void setup() { dmx_master.enable();} void loop() { int yarkost = analogRead(A0) / 4; // 0-1023 -> 0-255 dmx_master.setChannelValue(1, yarkost); // канал 1 — яркость прожектора delay(20); // кадр обновится сам в свой такт}RXEN на пине 7 — знакомая механика MAX485: HIGH — передача, LOW — приём, библиотека переключает сама. setChannelValue(1, yarkost) не шлёт кадр мгновенно — значение встанет в слот 1 ближайшего кадра после break; полный кадр уходит со своей частотой, и это нормально: диммеры рассчитаны на постоянный поток. Управление яркостью по командам из порта я собирал в уроке про ШИМ-регулятор по командам — пульт DMX отличается от него только адресатом: значение едет в слот, а не в analogWrite.
- DMX512: 250000 бод, формат 8N2, бит 4 мкс, символ 44 мкс; кадр — break не меньше 88 мкс, пауза от 8 мкс, START-код 0x00 и до 512 слотов
- Номер канала — позиция слота в кадре, адресов внутри кадра нет; полный кадр около 23 мс, обновление до 44 Гц
- Пропавший кадр свет не гасит: прибор держит последний уровень до следующего break
- Дип-свитч складывает степени двойки: 9 = 8+1; пятиканальный прибор с адресом 9 занимает слоты 9-13
- Аппаратный Serial на Uno break не делает: для настоящего света нужны Conceptinetics или DmxMaster, и пин 1 при этом занят
- 1. Скорость и формат линии DMX512:
- 2. Зачем в начале кадра break не короче 88 мкс?
- 3. Что несёт нулевой слот кадра DMX?
- 4. Пятиканальный прожектор стоит на адресе 9. Какие слоты он занимает?
- 5. Дип-свитчем нужно набрать адрес 9. Какие замыкатели поднять?
Частые вопросы по теме урока
- Скорость и формат линии DMX512:
- DMX512 гонит 250 кбод с двумя стоп-битами: бит длится 4 мкс, символ — 44 мкс. 31250 из варианта про MIDI сюда не подходит, хотя и там нестандартная скорость. 250000 бод, 8N2
- Зачем в начале кадра break не короче 88 мкс?
- Целый символ при 250000 бод — 44 мкс, и LOW на 88 мкс и дольше внутри него невозможен. Поэтому длинное прижатие линии приборы читают однозначно: начался новый кадр. линия прижимается к LOW дольше целого символа — так все приборы видят начало нового кадра
- Что несёт нулевой слот кадра DMX?
- Слот 0 — START-код, он маркирует тип кадра: 0x00 для обычного света, другие значения отданы под расширения. Канал 1 — это уже слот 1, сразу после START-кода. START-код: 0x00 для классических диммеров
- Пятиканальный прожектор стоит на адресе 9. Какие слоты он занимает?
- Адрес — номер первого слота: прибор слушает 9, 10, 11, 12 и 13. С адресом 510 такой прибор вылез бы за пределы 512 слотов, и хвост каналов молчал бы. 9-13
- Дип-свитчем нужно набрать адрес 9. Какие замыкатели поднять?
- Веса замыкателей — степени двойки: 1, 2, 4, 8... Адрес 9 складывается из 8 и 1. Так прибор узнаёт, с какого слота кадра он начинает слушать каналы. с весами 1 и 8