Autor Tema: Receptor DMX 6 Canales 4 PWM Strobo y Dimmer general  (Leído 2415 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado niht

  • PIC10
  • *
  • Mensajes: 10
Receptor DMX 6 Canales 4 PWM Strobo y Dimmer general
« en: 04 de Mayo de 2017, 17:28:24 »
Hola a todos quiero dejarles esto por aquí para quien lo quiera armar, modificar o mejorar que seria lo ideal y obviamente que comparta jejeje.
Este es un receptor DMX de 4 canales PWM que podria ser RGBW, dimmer general y canal strobo para un total de 6 canales DMX tiene selector de direccion DMX por medio de pulsadores y display.
Este circuito y código es una trabajo a partir de varios códigos encontrados en la web que me permitieron realizar el proyecto por tanto en el encabezado del mismo encontraran la información de las paginas web y autores de las librerías de donde se tomaron los datos para llegar al resultado el circuito esta montado sobre código de arduino Atmega 328p y las pruebas hechas en un arduino uno R3.
 

Código: [Seleccionar]
// 28/04/2017
// RECEPTOR DMX 6 CANALES
// 1 DIMMER GENERAL, 2 ROJO, 3 VERDE, 4 AZUL, 5 BLANCO, 6 STROBO
// Implementacion de Canal Strobo
// Niht Gonzalez C.

// 30/01/2013
// Set y visualización de la dirección DMX para controlador DMX Arduino
// Leer datos de la dirección DMX y salida PWM
// Primer Canal = dimmer general (multiplicador)
// http://www.city416.ru/
 
// http://www.mathertel.de/License.aspx
// Acuerdo de licencia de software (Licencia BSD)
// Copyright (C) 2005 a 2014 de Matthias Hertel, http://www.mathertel.de/
// Todos los derechos reservados.
// La redistribución y el uso en formas de fuente y binario, con o sin modificaciones, están permitidos siempre que se cumplan las siguientes condiciones:
// • Las redistribuciones del código fuente deben conservar el aviso de copyright anterior, esta lista de condiciones y la siguiente renuncia.
// • Las redistribuciones en formato binario deben reproducir el aviso de copyright anterior, esta lista de condiciones y la siguiente renuncia en la documentación y / u otros materiales proporcionados con la distribución.
// • Ni el nombre de los propietarios de derechos de autor ni los nombres de sus colaboradores pueden usarse para apoyar o promocionar productos derivados de este software sin el consentimiento previo por escrito.
// ESTE SOFTWARE SE PROPORCIONA LOS PROPIETARIOS DEL COPYRIGHT Y SUS COLABORADORES "tal cual" y EXPRESA O IMPLÍCITAS, INCLUYENDO,
// PERO NO LIMITADO A, LAS GARANTÍAS DE COMERCIALIZACIÓN Y APTITUD PARA UN FIN DETERMINADO. IN NO CASO EL PROPIETARIO COPYRIGHT O COLABORADORES responsables de daños directos,, INCIDENTAL, O INDIRECTOS ESPECIALES,
// EJEMPLARES DERIVADOS (INCLUYENDO, pero no limitado a, ADQUISICIÓN DE BIENES O SERVICIOS; PÉRDIDA DE USO, DATOS O GANANCIAS; O INTERRUPCIÓN COMERCIAL) CAUSADOS Y EN CUALQUIER TEORÍA DE RESPONSABILIDAD, SEA CONTRACTUAL,
// RESPONSABILIDAD ESTRICTA O AGRAVIO (INCLUYENDO NEGLIGENCIA) DERIVADOS DE CUALQUIER FORMA DE USO DE ESTE SOFTWARE, AUNQUE advertido de la posibilidad DE TAL DAÑO.


#include <TM1637.h>                    // display TM1637 libreria
#include <EEPROM.h>                    // EEPROM libreria
#include <DMXSerial.h>                 // DMXSerial library: http://www.mathertel.de/Arduino/DMXSerial.aspx //
#define MODEPIN  7                     // entrada para Boton Modo
#define UPPIN    8                     // entrada para Boton incrementa direccion DMX
#define DOWNPIN  12                    // entrada para Boton decrementa direccion DMX
#define SETPIN   1                     // entrada boton ok
#define KEYSPEED    100                // buttons action trheshold, 200 ms
#define KEEPDMXDISP  30                // keep DMX address on screen, sec
#define PWM1 3                         // Pines de Salidas para el PWM
#define PWM2 5
#define PWM3 6
#define PWM4 9

TM1637 tm1637(2,4);                    // CLK & DIO salidas para Display TM1637

int           strobo=0;                // Strober
boolean       setaddr=false,           // DMX process/set address flag
              btn_up=true,             // button flags
              btn_down=true,
              btn_set=true,
              btn_mode=true;
unsigned long last_btn;                // buttons press timestamps
unsigned long last_disp=millis();      // last screen update timestamp**
byte          ticks,                   // movement buttons handled actions
              deltadmx;                // movement step
int           dmxaddr=1,               // DMX address
              mult=0;                  // all channels light multiplicator
uint8_t       dmxh,dmxl;               // EEPROM DMX record
int8_t        brightness=2;            // screen brightness level

void dmxdisp(){                     
  int tmp;                             // temp
  int8_t digit[3];                     // address output
  tmp=dmxaddr-(dmxaddr%100);
  digit[0]=tmp/100;
  tmp=dmxaddr-(dmxaddr%10)-(digit[0]*100);
  digit[1]=tmp/10;
  digit[2]=dmxaddr-(digit[0]*100)-(digit[1]*10);
  if(setaddr){
    tm1637.display(0,0x0A);            // setup address
    tm1637.display(1,digit[0]);
    tm1637.display(2,digit[1]);
    tm1637.display(3,digit[2]);
  }else{
    tm1637.display(0,0x0d);
    tm1637.display(1,digit[0]);        // display address
    tm1637.display(2,digit[1]);
    tm1637.display(3,digit[2]);
  }
}

void processmovestep(){
  ticks++;
  if(ticks>10) deltadmx=10;            // increase step
  if(ticks>20) deltadmx=50;
  if(ticks>30){                        // reset step
    deltadmx=1;
    ticks=0;
  }
  dmxdisp();
}

void setup(){
 
  pinMode(PWM1,OUTPUT);                // Iniciar pines de salida
  pinMode(PWM2,OUTPUT);
  pinMode(PWM3,OUTPUT);
  pinMode(PWM4,OUTPUT);
  pinMode(SETPIN,INPUT_PULLUP);        // init input key pins
  pinMode(MODEPIN,INPUT_PULLUP);
  pinMode(UPPIN,INPUT_PULLUP);
  pinMode(DOWNPIN,INPUT_PULLUP);
  tm1637.init();                       // LDM init
  tm1637.set(brightness);
  DMXSerial.init(DMXReceiver);
  dmxh=EEPROM.read(0x00);              // restore DMX
  dmxl=EEPROM.read(0x01);
  if(dmxh!=0xFF) dmxaddr=(dmxh*256)+dmxl;
  dmxdisp();
}

void loop(){
  if(setaddr){
    if(btn_up && btn_down && btn_set && btn_mode){  // read movement keys from idle mode
      btn_up=digitalRead(UPPIN);
      btn_down=digitalRead(DOWNPIN);
      btn_set=digitalRead(SETPIN);
      btn_mode=digitalRead(MODEPIN);
      last_btn=millis();
      ticks=0;
      deltadmx=1;
      if(!btn_up && !btn_down) btn_down=true;
    }
    if(!btn_mode){                                // back to DMX process mode
      btn_mode=true;                              // change mode
      setaddr=false;
      dmxh=EEPROM.read(0x00);                     // restore DMX
      dmxl=EEPROM.read(0x01);
      if(dmxh!=0xFF) dmxaddr=(dmxh*256)+dmxl;
      tm1637.init();                              // reset screen
      delay(500);
      dmxdisp();
     }
    if(!btn_set){                                 // store DMX
      if(dmxaddr>255){
        if(EEPROM.read(0x00)!=0x01) EEPROM.write(0x00,0x01);
        dmxl=dmxaddr-256;
      }else{
        if(EEPROM.read(0x00)!=0x00) EEPROM.write(0x00,0x00);
        dmxl=dmxaddr;
      }
      if(EEPROM.read(0x01)!=dmxl) EEPROM.write(0x01,dmxl);
      btn_set=true;                               // change mode
      setaddr=false;
      tm1637.init();                              // reset screen
      delay(500);
      dmxdisp();
      }
    if(!btn_up) btn_up=digitalRead(UPPIN);        // read movement keys from moving mode
    if(!btn_down) btn_down=digitalRead(DOWNPIN);
    if(!btn_up && millis()-last_btn>=KEYSPEED){   // move DMX up
      last_btn=millis();
      dmxaddr+=deltadmx;
      if(dmxaddr>512) dmxaddr=1;
      processmovestep();
    }
    if(!btn_down && millis()-last_btn>=KEYSPEED){ // move DMX down
      last_btn=millis();
      dmxaddr-=deltadmx;
      if(dmxaddr<1) dmxaddr=512;
      processmovestep();
    }
  }
  else{
    if(digitalRead(MODEPIN)==0){                 // enter set address mode
      setaddr=true;                              // change mode
      tm1637.init();                             // reset screen
      delay(500);
      dmxdisp();
    }
    mult = DMXSerial.read(dmxaddr);                            // Letura de canales DMX
    analogWrite(PWM1,(DMXSerial.read(dmxaddr+1)*mult/256));    // Canal Rojo 2
    analogWrite(PWM2,(DMXSerial.read(dmxaddr+2)*mult/256));    // Canal Verdde 3
    analogWrite(PWM3,(DMXSerial.read(dmxaddr+3)*mult/256));    // Canal Azul 4
    analogWrite(PWM4,(DMXSerial.read(dmxaddr+4)*mult/256));    // Canal Blanco 5

    strobo = (DMXSerial.read(dmxaddr+5));                      // Canal Strobo 6
 int stroboporcent = map(strobo, 0, 255, 400, 10);             

 if ( strobo > 1 )                                          //Activa strobo si canal 6 es mayor a 1
  {
    analogWrite(PWM1,(DMXSerial.read(dmxaddr+1)*mult/256));
    analogWrite(PWM2,(DMXSerial.read(dmxaddr+2)*mult/256));
    analogWrite(PWM3,(DMXSerial.read(dmxaddr+3)*mult/256));
    analogWrite(PWM4,(DMXSerial.read(dmxaddr+4)*mult/256));   
    delay (stroboporcent);
   
    analogWrite(PWM1, 0);
    analogWrite(PWM2, 0);
    analogWrite(PWM3, 0);
    analogWrite(PWM4, 0);
    delay(stroboporcent);
  }
 }  // final final
}

Este es un vídeo del funcionamiento el receptor esta conectado a una interfaz usb dmx.
primero pruebo las salidas PWM luego el canal de strobo y el dimmer general.


Espero les guste y pueda servirles en la construcción de unos Par Led por ejemplo o adaptarlo para otros dispositivos.

Desconectado stk500

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 4862
Re:Receptor DMX 6 Canales 4 PWM Strobo y Dimmer general
« Respuesta #1 en: 04 de Mayo de 2017, 17:38:53 »
 ((:-)) ((:-)) muy buenos, muchas gracias por compartirlos!! 

Saludo

Desconectado estaciondj

  • PIC10
  • *
  • Mensajes: 1
Re:Receptor DMX 6 Canales 4 PWM Strobo y Dimmer general
« Respuesta #2 en: 10 de Mayo de 2017, 13:26:02 »
 :-/ :-/ :-/ gracias amigo por este excelente proyecto, justo en esta época estaba trabajando en uno similar... ya lo monte en proto y voy a empezar a hacer un pcb.  ((:-)) ((:-)) ((:-))

Desconectado w3-sistemas

  • PIC12
  • **
  • Mensajes: 89
Re:Receptor DMX 6 Canales 4 PWM Strobo y Dimmer general
« Respuesta #3 en: 22 de Mayo de 2017, 16:33:44 »
hola niht, justo con lo que queria practicar, podes postear el esquematico, recien arranco con arduino y estoy medio en pañales, muchas gracias

Desconectado w3-sistemas

  • PIC12
  • **
  • Mensajes: 89
Re:Receptor DMX 6 Canales 4 PWM Strobo y Dimmer general
« Respuesta #4 en: 06 de Junio de 2017, 14:29:41 »
hola, a todos intente compilar el proyecto pero me salta error en una libreria que busque y encontre varias con el mismo nombre y sigue el error, la libreria es la TM1637.h que es la del display y seguimos con el error, alguien que me diga cual o donde bajarla, gracias

Desconectado niht

  • PIC10
  • *
  • Mensajes: 10
Re:Receptor DMX 6 Canales 4 PWM Strobo y Dimmer general
« Respuesta #5 en: 19 de Junio de 2017, 18:52:09 »
hola, a todos intente compilar el proyecto pero me salta error en una libreria que busque y encontre varias con el mismo nombre y sigue el error, la libreria es la TM1637.h que es la del display y seguimos con el error, alguien que me diga cual o donde bajarla, gracias

Que tal amigo perdona por responder hasta ahora estuve por fuera un tiempo, no se si ya solucionaste el problema de compilacion aqui te adjunto las librerias por si las necesitas, en cuanto al esquematico no lo tengo nunca realice uno en el codigo puedes encontrar la descipcion de los pines a usar.

Desconectado w3-sistemas

  • PIC12
  • **
  • Mensajes: 89
Re:Receptor DMX 6 Canales 4 PWM Strobo y Dimmer general
« Respuesta #6 en: 19 de Junio de 2017, 18:54:05 »
hola , gracias por pasarme las librerias, realmente no lo pude solucionar, asi que las bajo y te aviso lo sucedido, gracias

Desconectado juano_orozco

  • PIC10
  • *
  • Mensajes: 1
Re:Receptor DMX 6 Canales 4 PWM Strobo y Dimmer general
« Respuesta #7 en: 06 de Abril de 2020, 15:04:14 »
Hola niht,
estaba revisando el código para 6 canales, tengo una inquietud, si yo fuera a aumentar la cantidad de canales solamente sería aumentar a las lineas de código de lectura y escritura?

 mult = DMXSerial.read(dmxaddr);                            // Letura de canales DMX
    analogWrite(PWM1,(DMXSerial.read(dmxaddr+1)*mult/256));    // Canal Rojo 2
    analogWrite(PWM2,(DMXSerial.read(dmxaddr+2)*mult/256));    // Canal Verdde 3
    analogWrite(PWM3,(DMXSerial.read(dmxaddr+3)*mult/256));    // Canal Azul 4
    analogWrite(PWM4,(DMXSerial.read(dmxaddr+4)*mult/256));    // Canal Blanco 5

Te agradezco por tu información

Desconectado niht

  • PIC10
  • *
  • Mensajes: 10
Re:Receptor DMX 6 Canales 4 PWM Strobo y Dimmer general
« Respuesta #8 en: 20 de Julio de 2020, 23:49:56 »
Juan buenas noches, disculpe por responder hasta ahora pero hace mucho que no entraba al foro y no llegan notificaciónes.
Tal vez ya halla encontrado la respuesta.
En cuanto a la pregunta va a depender del Arduino que se use y la cantidad de salidas PWM que tenga disponibles, hacer la lectura del canal dmx correspondiente y asignarlo al pin PWM cómo está en el codigo.