====== USB DMX 512 контроллер на основе Arduino своими руками====== Создать свой [[:wiki:dmx_512|dmx]] 512 контроллер не составит труда, на базе микроконтроллера Arduino. ====== Технические характеристики ====== В конфигурации, мы имеем 6 каналов с переменными значениями, предусмотренные 6 потенциометров, соединенных с Arduino на аналоговых входов, 10-битовые значения сводятся к 8 битам (0-255 которые используются [[:wiki:dmx_512|DMX]]), и 12 каналов с включения-выключения значения с 12 кнопками, подключенных к цифровых входов Arduino, цифровые входы с использованием Arduino внутренние резисторы подтяжки, так что если кнопка нажата входное значение 0, и, если он свободен входное значение 1. ====== Общая информация ====== Исходный код открыт, и выложен в сети интернетах в открытом доступе. Мы будем использовать **Arduino Mega**, или **Arduino Uno** для основной базы контроллера. Известные проблемы: Когда мы будем компилировать исходный код и получим ошибку: //‘ArduinoDmxN’ was not Declared In This scope:// Проверьте, правильно ли настроен правильный тип правления в **Arduino IDE**, меню Сервис> доска (с Arduino Nano может использовать только один **USART** = **ArduinoDmx0** = **USART0**) Перед тем как перепрограмировать Arduino, необходимо отключить его от общей сборки. ===== Исходный код и библиотеки ===== Подключаемая библиотека [[http://dmx-512.ru/ardu/arduino-four.zip|arduino-four.zip]] ===== Сборка ===== Сборка состоит из микроконтролера * 1 Arduino UNO(MEGA) * 1 Маломощного трансивера, [[:wiki:electronnie_komponenty:max485|MAX485]] * 1 резистора на 220khm * 6 потенциометров(димеров) * 12 кнопок. {{:zheleznaja_chast:schematic-arduino-dmx-controller.png?400|}} - Подключаем к входам ардуино с 2 по 13 выходы кнопки, а к gnd цепляем землю. - К аналоговым входам подключаем потенциометрыс с 1 по 5 выходы. Подключаем землю и выход 5V. Как показано на рисунке. - Подключаем к входу и выходу RX TX микросхему [[:wiki:electronnie_komponenty:max485|MAX485]], как вариант можно использовать аналог MAX487 или SN75176 к земле цепляем резистор на 220 килоом. Выход с микросхемы и есть управляющий сигнал [[:wiki:dmx_512|DMX]] {{:zheleznaja_chast:arduino-dmx-controller.png?300|}} ===== Прошивка контроллера ===== Будем использовать 1 библиотеку. ===== Примеры ===== Пример тестового кода прошивки микроконтроллера. ==== Пример кода №1 ==== //********************************************************************************************************* #include // Подключаем скаченую нами библиотеку //********************************************************************************************************* // Пример кода №1 *** Экспериментальный*** //********************************************************************************************************* #define DMX512 (0) // (250 kbaud - 2 от 512 каналов) Стандарт USITT DMX-512 #define DMX1024 (1) // (500 kbaud - 2 от 1024 каналов) Не стандарт, проверка. #define DMX2048 (2) // (1000 kbaud - 2 от 2048 каналов) called by manufacturers DMX1000K, [[:wiki:dmx_512|DMX]] 4x or [[:wiki:dmx_512|DMX]] 1M ??? void setup() { // configurar pines arduino del 2 al 13 como entradas con pullup, (cuando se pulsa el boton = 0 si no = 1) // configure arduino pins 2 to 13 as inputs with pullup, (button pressed = 0, button free = 1) for (int i=2;i<=13;i++) { pinMode(i,INPUT); // pines como entradas // pins as inputs digitalWrite(i, HIGH); // activar resistencias pullup internas // turn on pullup internal resistors } ArduinoDmx0.set_tx_address(1); // poner aqui la direccion de inicio de [[:wiki:dmx_512|DMX]] // put here [[:wiki:dmx_512|DMX]] start address ArduinoDmx0.set_tx_channels(100); // poner aqui el numero de canales a transmitir // put here the number of [[:wiki:dmx_512|DMX]] channels to transmmit ArduinoDmx0.init_tx(DMX512); // iniciar transmision universo 0, modo estandar DMX512 // starts universe 0 as TX, standard mode DMX512 } //end setup() void loop() { // seis entradas con potenciometros que envian valores [[:wiki:dmx_512|DMX]] entre 0 y 255 a los canales 1 al 6 // six analog inputs with potentiometers, sending values from 0 to 255, to [[:wiki:dmx_512|dmx]] output channels 1 to 6 ArduinoDmx0.TxBuffer[0] = scale(analogRead(0)); // copiar valor de la entrada analogica 0 al canal DMX 1 // copy value from analog input 0 to DMX channel 1 ArduinoDmx0.TxBuffer[1] = scale(analogRead(1)); // copiar valor de la entrada analogica 1 al canal [[:wiki:dmx_512|DMX]] 2 // copy value from analog input 1 to [[:wiki:dmx_512|DMX]] channel 2 ArduinoDmx0.TxBuffer[2] = scale(analogRead(2)); // copiar valor de la entrada analogica 2 al canal DMX 3 // copy value from analog input 2 to DMX channel 3 ArduinoDmx0.TxBuffer[3] = scale(analogRead(3)); // copiar valor de la entrada analogica 3 al canal [[:wiki:dmx_512|DMX]] 4 // copy value from analog input 3 to [[:wiki:dmx_512|DMX]] channel 4 ArduinoDmx0.TxBuffer[4] = scale(analogRead(4)); // copiar valor de la entrada analogica 4 al canal DMX 5 // copy value from analog input 4 to DMX channel 5 ArduinoDmx0.TxBuffer[5] = scale(analogRead(5)); // copiar valor de la entrada analogica 5 al canal [[:wiki:dmx_512|DMX]] 6 // copy value from analog input 5 to [[:wiki:dmx_512|DMX]] channel 6 if (digitalRead(2) == LOW) // pulsador en pin 2 apretado // push-button on pin 2, is pressed ArduinoDmx0.TxBuffer[6] = 255; // enviar 255 al canal [[:wiki:dmx_512|DMX]] 7 // send value 255 to [[:wiki:dmx_512|DMX]] channel 7 else ArduinoDmx0.TxBuffer[6] = 0; // si no enviar 0 // push-button free, send 0 if (digitalRead(3) == LOW) // pulsador en pin 3 apretado ArduinoDmx0.TxBuffer[7] = 255; // enviar 255 al canal DMX 8 else ArduinoDmx0.TxBuffer[7] = 0; // si no enviar 0 if (digitalRead(4) == LOW) // pulsador en pin 4 apretado ArduinoDmx0.TxBuffer[8] = 255; // enviar 255 al canal [[:wiki:dmx_512|DMX]] 9 else ArduinoDmx0.TxBuffer[8] = 0; // si no enviar 0 // añadir aqui hasta el pin 13 // add here the others inputs } //end loop() uint8_t scale(uint16_t value) // scale values from 10 bits to 8 bits { if(value > 1023) // test for 10 bits limit value = 1023; return (value >> 2); // scale } //end scale() //************************************************************************************************************* ==== Пример кода №2 ==== /************************************************************************************************************* * * Title : Controlador [[:wiki:dmx_512|DMX]] con Arduino * Version : v 0.1 * Last updated : 28.08.2012 * Target : Arduino mega 2560, Arduino mega 1280, Arduino UNO, Arduino nano * Author : Toni Merino - merino.toni at gmail.com * Web : www.deskontrol.net/blog * * * Ejemplo de codigo para el mini-controlador [[:wiki:dmx_512|DMX]] con Arduino: * Este codigo lee los valores de 6 potenciometros conectados a 6 entradas analogicas y escribe cada valor en la salida [[:wiki:dmx_512|DMX]] * solo cuando se presiona el pulsador correspondiente. (canales de salida 1 al 6) * **************************************************************************************************************/ #include // libreria [[:wiki:dmx_512|DMX]] 4 universos // deskontrol four universes [[:wiki:dmx_512|DMX]] library - www.deskontrol.net/blog //********************************************************************************************************* // New [[:wiki:dmx_512|DMX]] modes *** EXPERIMENTAL *** //********************************************************************************************************* #define DMX512 (0) // (250 kbaud - 2 to 512 channels) Standard USITT DMX-512 #define DMX1024 (1) // (500 kbaud - 2 to 1024 channels) Completely non standard - TESTED ok #define DMX2048 (2) // (1000 kbaud - 2 to 2048 channels) called by manufacturers DMX1000K, [[:wiki:dmx_512|DMX]] 4x or [[:wiki:dmx_512|DMX]] 1M ??? uint8_t buffer[6]; // buffer [[:wiki:dmx_512|DMX]] data void setup() { // configurar pines arduino del 2 al 13 como entradas con pullup, (cuando se pulsa el boton = 0 si no = 1) // configure arduino pins 2 to 13 as inputs with pullup, (button pressed = 0, button free = 1) for (int i=2;i<=13;i++) { pinMode(i,INPUT); // pines como entradas // pins as inputs digitalWrite(i, HIGH); // activar resistencias pullup internas // turn on pullup internal resistors } ArduinoDmx0.set_tx_address(1); // poner aqui la direccion de inicio de [[:wiki:dmx_512|DMX]] // put here [[:wiki:dmx_512|DMX]] start address ArduinoDmx0.set_tx_channels(100); // poner aqui el numero de canales a transmitir // put here the number of [[:wiki:dmx_512|DMX]] channels to transmmit ArduinoDmx0.init_tx(DMX512); // iniciar transmision universo 0, modo estandar DMX512 // starts universe 0 as TX, standard mode DMX512 } //end setup() void loop() { // seis entradas con potenciometros que envian valores [[:wiki:dmx_512|DMX]] entre 0 y 255 a los canales 1 al 6, cuando se presiona el pulsador // six analog inputs with potentiometers, sending values from 0 to 255, to [[:wiki:dmx_512|dmx]] output channels 1 to 6, when switch is pressed buffer[0] = scale(analogRead(0)); // copiar valor de la entrada analogica 0 al canal DMX 1 // copy value from analog input 0 to DMX channel 1 buffer[1] = scale(analogRead(1)); // copiar valor de la entrada analogica 1 al canal [[:wiki:dmx_512|DMX]] 2 // copy value from analog input 1 to [[:wiki:dmx_512|DMX]] channel 2 buffer[2] = scale(analogRead(2)); // copiar valor de la entrada analogica 2 al canal DMX 3 // copy value from analog input 2 to DMX channel 3 buffer[3] = scale(analogRead(3)); // copiar valor de la entrada analogica 3 al canal [[:wiki:dmx_512|DMX]] 4 // copy value from analog input 3 to [[:wiki:dmx_512|DMX]] channel 4 buffer[4] = scale(analogRead(4)); // copiar valor de la entrada analogica 4 al canal DMX 5 // copy value from analog input 4 to DMX channel 5 buffer[5] = scale(analogRead(5)); // copiar valor de la entrada analogica 5 al canal [[:wiki:dmx_512|DMX]] 6 // copy value from analog input 5 to [[:wiki:dmx_512|DMX]] channel 6 if (digitalRead(2) == LOW) // pulsador en pin 2 apretado // push-button on pin 2, is pressed ArduinoDmx0.TxBuffer[0] = buffer[0]; // enviar valor potenciometro al canal [[:wiki:dmx_512|DMX]] 1 // send analog value to [[:wiki:dmx_512|DMX]] channel 1 else ArduinoDmx0.TxBuffer[0] = 0; // si no enviar 0 // push-button free, send 0 if (digitalRead(3) == LOW) // pulsador en pin 3 apretado // push-button on pin 3, is pressed ArduinoDmx0.TxBuffer[1] = buffer[1]; // enviar valor potenciometro al canal DMX 2 // send analog value to DMX channel 2 else ArduinoDmx0.TxBuffer[1] = 0; // si no enviar 0 // push-button free, send 0 if (digitalRead(4) == LOW) ArduinoDmx0.TxBuffer[2] = buffer[2]; else ArduinoDmx0.TxBuffer[2] = 0; if (digitalRead(5) == LOW) ArduinoDmx0.TxBuffer[3] = buffer[3]; else ArduinoDmx0.TxBuffer[3] = 0; if (digitalRead(6) == LOW) ArduinoDmx0.TxBuffer[4] = buffer[4]; else ArduinoDmx0.TxBuffer[4] = 0; if (digitalRead(7) == LOW) ArduinoDmx0.TxBuffer[5] = buffer[5]; else ArduinoDmx0.TxBuffer[5] = 0; } //end loop() uint8_t scale(uint16_t value) // scale values from 10 bits to 8 bits { if(value > 1023) // test for 10 bits limit value = 1023; return (value >> 2); // scale } //end scale() //************************************************************************************************************************ ===== Заключение ===== Мы могли бы, например, использовать EEPROM((Энергонезависимая память устройства)) чтобы хранить значения DMX в EEPROM и извлекать для загрузки сцен ... ===== Где взять комплектующие ===== Все необходимое можно недорого заказать на алиэкспресс ссылки приведены ниже: **[[http://ali.pub/9op65|Arduino UNO]]** ~ 253-400 руб. **[[http://ali.pub/23gzet|MAX485 RS-485]]** ~ 46-52 руб. партия минимум 10 штук. **[[http://ali.pub/183erb|Резисторы 220 кОм]]** ~ 44-240 руб. партия минимум 100 штук. **[[http://ali.pub/183fen|Потенциометры]]** ~ 240-600руб. партия минимум 10 штук. **[[http://ali.pub/183gk2|Кнопки]]** ~ 200руб. 25 кнопок. {{tag>контроллеры dmx512 устройство своими руками паяем ардуино max485}}