magnify
Home Proyectos Arduino Mini controlador DMX con Arduino
formats

Mini controlador DMX con Arduino

En este post te mostramos como realizar un pequeño y util controlador DMX 512 con Arduino, que puede servirte por ejemplo para manejar una maquina de humo con DMX, o como equipo para pruebas, etc.

Podemos utilizar Arduino Mega, Arduino UNO y otros con pequeños cambios.
Solamente se utilizan un puñado de componentes adicionales, faciles de localizar y de precio economico.

En la configuracion mostrada disponemos de 6 canales con valores variables, proporcionados por 6 potenciometros conectados a las entradas analogicas del Arduino, los valores de 10 bits son reducidos a 8 bits (0-255 que son los que utiliza el dmx), y 12 canales con valores todo-nada manejados con 12 pulsadores conectados a las entradas digitales del arduino, las entradas digitales utilizan las resistencias de pullup internas del arduino, luego si el boton esta pulsado el valor de la entrada es 0, y si no esta pulsado el valor de la entrada es 1.

Necesitaras descargar e instalar nuestra Libreria Arduino cuatro universos DMX 512

Descargar codigo controlador DMX con Arduino

Problemas conocidos:
Al compilar nos aparece el error: ‘ArduinoDmxN’ was not declared in this scope:
Comprobar si esta configurado correctamente el tipo de placa en el IDE Arduino, menu tools > board
(con Arduino nano y uno solo se puede utilizar una USART = ArduinoDmx0 = USART0)
Errores al programar el Arduino:
Quitar el shield DMX para programar el Arduino y enchufarlo otra vez despues.

En las siguientes imagenes se detalla el conexionado:

Esquema Mini controlador DMX con Arduino

Esquema Mini controlador DMX con Arduino

Mini controlador DMX con Arduino

Mini controlador DMX con Arduino

Imagenes y esquema realizados con Fritzing: www.fritzing.org

 

Ejemplo de codigo para testear el funcionamiento:

//*********************************************************************************************************
#include <lib_dmx.h>  // libreria DMX 4 universos   // four universes DMX library  - blog.deskontrol.net

//*********************************************************************************************************
//                        New 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, DMX 4x or 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 DMX 
                                      // put here DMX start address 

  ArduinoDmx0.set_tx_channels(100);   // poner aqui el numero de canales a transmitir 
                                      // put here the number of 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 DMX entre 0 y 255 a los canales 1 al 6
  // six analog inputs with potentiometers, sending values from 0 to 255, to 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 DMX 2
                                                  // copy value from analog input 1 to 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 DMX 4
                                                  // copy value from analog input 3 to 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 DMX 6
                                                  // copy value from analog input 5 to 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 DMX 7   // send value 255 to 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 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()

//*************************************************************************************************************

Ejemplo de codigo 2:

/*************************************************************************************************************
*
*   Title		    : Controlador 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                     : blog.deskontrol.net
*
*
*   Ejemplo de codigo para el mini-controlador DMX con Arduino:
*   Este codigo lee los valores de 6 potenciometros conectados a 6 entradas analogicas y escribe cada valor en la salida DMX 
*   solo cuando se presiona el pulsador correspondiente. (canales de salida 1 al 6) 
*
**************************************************************************************************************/
#include <lib_dmx.h>  // libreria DMX 4 universos   // deskontrol four universes DMX library  - blog.deskontrol.net

//*********************************************************************************************************
//                        New 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, DMX 4x or DMX 1M ???

uint8_t    buffer[6];        // buffer 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 DMX 
                                      // put here DMX start address 
                                      
  ArduinoDmx0.set_tx_channels(100);   // poner aqui el numero de canales a transmitir 
                                      // put here the number of 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 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 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 DMX 2
                                    // copy value from analog input 1 to 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 DMX 4
                                    // copy value from analog input 3 to 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 DMX 6
                                    // copy value from analog input 5 to 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 DMX 1   // send analog value to 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()

//************************************************************************************************************************

Podriamos por ejemplo, utilizar la mitad de los pulsadores como flash de canal DMX, y los otros 6 como memorias de escenas, para ello deberemos almacenar los valores DMX en la eeprom y rellamarlos al pulsar una memoria…

Sin duda hay muchas opciones para experimentar cada uno, y adaptar el software a nuestras necesidades.

Espero que compartas tus experiencias.

Saludos.

 

 
 Share on Facebook Share on Twitter Share on Reddit Share on LinkedIn

2 Respuestas

  1. Probably just due to reusing code (no bad thing there), but reanidg from a pin configured for output is probably not the best idea, as need analogRead may not function correctly, change that to INPUT and see how you go.Hugs and kisses.T

  2. Exelente trabajo Toni Merino !
    Gracias!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *