DMX Shield — плата расширения Arduino для проектов управления световыми эффектами
DMX Shield – простая плата расширения, которая позволит использовать платформу Arduino для управления системами освещения или световыми эффектами по интерфейсу DMX (Рисунок 1). Фактически, плата реализует интерфейс RS485, электрические уровни сигналов которого необходимы для коммуникации по протоколу DMX.
![]() | |
Рисунок 1. | Внешний вид платы расширения Arduino DMX Shield. |
При проектировании схемы платы расширения была заложена определенная гибкость. Так, с помощью перемычек (джамперов), пользователь может выбирать какие сигнальные линии платы Arduino использовать в качестве цифрового входа и выхода интерфейса DMX. Дополнительно, на плате установлен слот для карт памяти microSD с соответствующей схемой согласования уровней и разъем для подключения ЖК индикатора с последовательным интерфейсом.
Такая конструкция позволит реализовать базовые функции DMX протокола посредством сообщений, предварительно запрограммированных в коде программы микроконтроллера или, при использовании соответствующих библиотек, может стать автономной системой с функциями воспроизведения последовательностей записанных на карте памяти microSD. При необходимости данное решение может служить удобным интерфейсом для передачи DMX команд от ПК через последовательный порт.
Стандарт интерфейса и протокол обмена данными были разработаны специально для упрощения управления сложными осветительными системами и дополнительным оборудованием. Различные прожекторы, стробоскопы, диммеры, лазеры, дымовые машины и другое светотехническое оборудование должны управляться и контролироваться, но управление с централизованного пульта усложняет прокладку силовых кабелей и снижает безопасность.
В случае применения DMX протокола и интерфейса каждое устройство имеет свой интегрированный или внешний контроллер. Система управления посылает определенное адресное сообщение в виде байта данных на каждый контроллер, который, в свою очередь, его интерпретирует с учетом адреса и возможностей. Источник питания в такой системе освещения становится «локальным», и связь обеспечивается экранированным двужильным кабелем, по которому передаются низковольтные сигналы.
Адрес контроллера и данные (сообщения) передаются параллельно для всех контроллеров в сети, но каждый контроллер, ориентируясь на свой адрес, получает и интерпретирует только предназначенную для него информацию.
Схема передачи была разработана с целью повышения эффективности управления устройствами, поэтому интерфейс DMX поддерживает одновременное управление 512 устройствами с 40 полными циклами передачи в секунду. Чтобы добиться такого при передаче 8-битных данных, 1 стоп-бита и 1 старт-бита, скорость должна быть 250 Кбит/с. Последовательная передача данных начинается с заголовка, а затем байты передаются последовательно, начиная с первого (Таблица 1, Рисунок 2).
Таблица 1. Базовые команды протокола DMX512 и их длительность
(Каждый бит, передаваемый по протоколу DMX512, имеет длительность 4 мкс)
Примечание: НО – означает «не определено», определяется разработчиком.
![]() | |
Рисунок 2. | Диаграмма сигнала при передаче данных по протоколу DMX512. |
Все это означает, что если мы хотим передать новые данные контроллеру с адресом 10, то необходимо также передать данные для контроллеров с адресами 1 – 9. Система адресации основана на номере передаваемого байта, поэтому каждый контроллер ведет подсчет входящих байтов. Контроллер игнорирует байты данных, поступающие до и псоле «своего».
Важно также помнить, что каждая полученная команда всегда актуальна, поэтому, чтобы изменить состояние одного контроллера, необходимо отправить корректные команды всем контроллерам, которые имеют более низкий адрес. Тем не менее, последовательность передаваемых команд и данных можно прервать после того, как будет достигнут адрес нужного контроллера (не имеет смысла передавать последовательность с данными для контроллеров с адресом выше).
В первоначальной версии протокола DMX значения в диапазоне 0-255 интерпретировались как уровни яркости осветительного устройства (00 – выключен, 255 – максимальная яркость), но растущий список устройств с интерфейсом DMX вызвал изменения в интерпретации значений байта. Появилось много дополнительных команд и функций, например, установка позиции, выбор программы, применение специфических параметров, активация функции и пр. Каждый производитель определяет набор команд и карту соответствия значений и функций. Следует учитывать, что иногда одного байта недостаточно для управления всеми возможностями контроллера, поэтому для устройства на шине DMX выделяется диапазон адресов, и считывается более одного байта в последовательности.
Принципиальная схема платы расширения
![]() | |
Рисунок 3. | Принципиальная схема платы расширения Arduino DMX Shield. |
Основным элементом платы является микросхема MAX485 компании Maxim (Рисунок 3), которая преобразует уровни цифровых сигналов микроконтроллера в дифференциальные сигналы двухпроводного интерфейса RS485. Микросхема содержит приемник, передатчик и логику управления. Для управления направлением передачи данных микросхема MAX485 имеет инверсные входы /RE (вывод 2) и OE (вывод 3). В нашем случае эти входы можно объединить и для управления потребуется одна линия ввода/вывода микроконтроллера. Выводы 6 и 7 микросхемы – это дифференциальный выход, вывод 1 – выход приемника, вывод 4 – вход данных.
Все сигнальные выводы микросхемы подключаются к порту D платы Arduino через перемычки (джамперы). Вывод RO (вывод 1) может подключаться к порту D0 или D4, вывод DI может подключаться к порту D1 или D3, а соединенные вместе /RE+OE могут подключаться к порту D2 или D5.
Еще одна микросхема, использующаяся в схеме, предназначена для преобразования ТТЛ уровней интерфейса ICSP платы Arduino в уровни с напряжением 3.3 В, которые требуются для работы с картой памяти microSD. Микросхема 74HC4050D содержит шесть буферов для преобразования уровней сигналов ТТЛ, но в данной схеме используются лишь три, включенные на входных линиях интерфейса microSD. Выходные уровни интерфейса microSD с напряжением 3.3 В корректно определяются микроконтроллером на плате Arduino как «лог. 1».
Дополнительно на плате установлены два пользовательских светодиода (порт D8 и D7), пользовательская кнопка (порт A1), кнопка сброса и разъем для подключения ЖК индикатора с последовательным интерфейсом (порт A0 или A2, выбирается перемычкой).
Перед работой с платой необходимо корректно установить перемычки сигнальных линий (на плате они обозначены JRO, JDI, JRDE, Рисунок 4). Если совместно с Arduino не используются дополнительные платы расширения, то перемычки можно устанавливать в любую из двух позиций. При использовании дополнительных плат расширения перемычки необходимо устанавливать так, чтобы избежать конфликтов. Также учитывайте, что плата расширения Ethernet Shield использует интерфейс ICSP Arduino, и слот карты памяти microSD в таком случае может конфликтовать с Ethernet платой.
![]() | |
Рисунок 4. | Расположение элементов на плате расширения DMX Shield. |
Для работы с платой потребуется специальная программная библиотека функций DmxSimple.h, которая вместе с примерами доступна для скачивания в разделе загрузок.
Для управления платой DMX Shield с персонального компьютера и реализации световых эффектов синхронизированных с музыкой можно использовать программный комплект Vixen. Пользователи создают в программе последовательность данных, которые затем передаются через последовательный порт компьютера в Arduino. Пример исходного кода программы микроконтроллера для работы с Vixen находится папке DMX_LightSequencing.
Демонстрационное видео
Загрузки
Библиотека функций и исходные коды примеров — скачать
Перевод: Vadim по заказу РадиоЛоцман
DMX-512 Визуализация передаваемых уровней каналов
По роду деятельности, мне часто приходится разрабатывать всевозможные системы управления световыми эффектами. В случаях, когда для заказчика избыточен функционал представленных на рынке контроллеров, приходится под конкретный объект изобретать простенький контроллер практически на коленке. Задача каждый раз уникальна , начиная от одного канала, пульсирующего словно сердце до управления «гирляндой» декодеров работающих по протоколу DMX-512 или на микросхемах WS28хх:
Стоят копейки у китайцев. Я очень люблю эти декодеры. С их помощью легко можно масштабировать систему от трех до 512 каналов.
Для меня самый удобный вариант всем известная плата Arduino. Очень удобно держать в ящике десяток-другой клонов Arduino Pro Mini и по мере надобности использовать их в подобных проектах. Люблю его за то что на его базе можно быстро собрать достаточно компактное устройство и стоят эти клоны в Китае, примерно столько же, как и голая Atmaga328.
И вот при разработке эффектов для очередного контроллера на 16 каналов, работающего по протоколу DMX-512, я окончательно замучился раскладывать на столе паутину проводов на скрутках ради того, что бы один раз отладить эффекты и снова все это разобрать. Я озадачился поиском приборов для анализа DMX пакетов, но оказалось, что это весьма редкие и довольно дорогостоящие приборы. Это и подтолкнуло меня к созданию собственного DMX-тестера.
Изначально я решил, что нужен прибор, который будет уметь отображать уровни каналов в реальном времени и этого будет достаточно, но немного пораздумав, я определил следующий список задач:
- Отображение уровней каналов в режиме реального времени в относительных единицах;
- Отображение общего количества каналов, на которые контроллер выдает данные;
- Отображение уровня одного выбранного канала в абсолютных единицах (0-255);
Выводить уровни каналов, было принято в виде столбиков, т. е. если использовать символьный LCD-дисплей 16х2, то в одной строке уже можно наблюдать 16 каналов одновременно. Т.к. каналов может быть до 512, то хорошо бы было иметь возможность прокрутки отображаемого диапазона каналов.
Ну раз задача поставлена, перейдем к железу. В основе, как я уже писал, у меня клон Arduino Pro Mini:
Ну и выводить информацию будем на LCD-дисплей 16х2 (сразу оговорюсь, что в момент разработки уже заказал аналогичный дисплей 40х2 который встанет на свое место в конечном устройстве). Управлять всем этим буду посредством клавиатуры, описанной здесь товарищем kumbr_87.
И как ни странно, все заработало! Столбики «прыгали» в соответствии с получаемыми данными. К этому времени, как раз пришел дисплей 40х2. Подключил его, переделал скетч под дисплей на 40 символов, залил, и тут произошло необъяснимое.
В момент запуска микроконтроллера в первом отображаемом кадре вся информация верна, при отображении последующих кадров, arduino куда-то съедает несколько каналов. Т.е. если контроллер выдает данные на 60 каналов, то в момент включения или перезагрузки arduino, отображается общее количество каналов 60 и первый канал на дисплее является действительно первым. Но сразу после смены кадров, отображается количество кадров 57, а первым отображается, в реальности пятый. Пробовал еще загонять сигнал на 30 каналов — тоже самое, только сначала все правильно, а потом показывает общее количество каналов 29, а на месте первого показывает вообще непонятно что.
Все остальное работает без проблем — прокрутка листает. Может кто-нибудь свежим взглядом увидит… Да, кстати, если выдавать сигнал на
Arduino DMX to RGBW LED with MAX485
Updated on 30th May 2022 16:44 in DIY, General
So here’s a fun one: you have a DMX console and an entire system that runs using it. You just bought an awesome set of LED strips for super cheap from Amazon and of course, you want to use them in sync with the rest of the system. You could, of course, buy a DMX decoder but I wasn’t able to find any decent ones for what I wanted.
Disclaimer: This post contains affiliate links. As an Amazon Associate, I earn from qualifying purchases.
Table of Contents
Bill of materials (BOM)
The MOSFETs do not need to be exactly the same model, just make sure to look up the datasheet of what you have and to wire it up correctly. Additionally, note that the current draw of LED strips is high and so make sure your FET is up to it.
Let’s go over the basics of how this is going to work. There are two parts to making this work, the DMX conversion part and the RGBW control part.
The DMX decoder
Following this wonderful schematic from gilles.thebault.free.fr, we will connect the Arduino to the MAX485 by connecting the following:
Arduino | Max485 | XLR OUT |
5v | VCC | |
GND | RE | |
GND | DE | |
GND | GND | XLR 1 |
RX | RO | |
A | XLR 3 | |
B | XLR 2 |
The XLR outputs can be seen in this picture:
Image from Omegatron and can be found here
The wiring diagram below shows the connections from the table above very clearly.
Image from thebault and can be found here
The next thing is to connect a male XLR connector and a female connector in series with our circuit. This simply means connecting both the male XLR and the female XLR to the output of the MAX485. An important thing to remember is that if this device will be the last one in the chain a 120Ω resistor must be added between the data lines (XLR 2 and XLR 3). This is to reduce signal bounce back, which can create very chaotic scenes if left unchecked.
The RGBW controller
Now that the DMX side of the circuit is sorted, we need a way to control the LED strip. There are countless tutorials on this already but I will include a diagram and short explanation for what is going on.
The diagram
This is where the 10k resistors come in. They are used to keep the FET’s gates low until the Arduino sets them high. Many circuits found online omit this part, but if you require the output to only light when the Arduino sends the command to, you will need the resistor. Important! Do not connect the LED strip directly to the Arduino! In most cases, the LED strip will draw far too much current for the Arduino, ESPECIALLY if like me, you are using a pro micro instead of the full-size uno in the diagram! It is important however to connect the grounds of the Arduino and the LED power supply together!
While the pins used in the diagram are not the only pins you can use, it is important to make sure the pins you are using are the PWM pins. If your pins aren’t PWM you won’t be able to adjust the brightness of each colour and instead, you will only be able to turn them on or off.
In my project, I used one of those cheap car USB chargers to convert the LED strip’s 12V power supply to the Arduino’s 5V. If you are using the pro micro, note that from my experience anything above 5V will destroy the onboard regulator despite it being rated for up to 12V. If you are going with this approach, make sure to use the RAW input pin to power it to ensure that if something does go wrong, it will at least attempt to regulate the power down to something it can handle.
The Code
The code is a bit of a mix of a few things. It is rather simple though as it is reading data from the serial line and simply sending it back out on the PWM outputs. It uses the DMXSerial library and the source for the sample code I used is also linked.