Autor Tema: Dimmer 12 Canales DMX (ayuda, por donde empezar)  (Leído 5033 veces)

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

Desconectado mattfabiani

  • PIC10
  • *
  • Mensajes: 8
Dimmer 12 Canales DMX (ayuda, por donde empezar)
« en: 29 de Mayo de 2015, 12:03:44 »
Hola grupo, quiero construir un dimmer de 12 canales y la verdad no se por donde empezar, no se nada de PIC nunca trabaje con uno. Alguien podria ayudarme o proporcionarme algun circuito, estuve buscando y solo hay de unos pocos canales 4 u 8 como mucho

Adjunto un circuito de un dimmer de 4 canales, alguien podria confirmarme si se puede expandir hasta 12 canales este proyecto?

Y aqui el programa:

Código: [Seleccionar]
//**************************************************************//
//  Name    : DMX 4 ch Dimmer                                   //
//  Author  : Dan Fredell                                       //
//  Date    : 16 Apr, 2013                                      //
//  Version : 1.1                                               //
//  Website :                                                   //
//**********************************z ******************************
/*File modifacations:
* hardware/arduino/boards.txt uno.build.f_cpu=20000000L
* It tells the software that the hardware is running at 20MHz
*
* In cores/arduino/HardwareSerial.cpp remove 42 lines,
*   this allows us to make our own intrupt for DMX signal in
* From
* #if !defined(USART0_RX_vect) && defined(USART1_RX_vect)
* to
* #if defined(USART1_RX_vect)
*/

/*
* V1.1 - fixed issue of flashing output caused by AC interrupting the DMX data
*/

//double dim = 0;    // Dimming level (0-128)  0 = on, 128 = 0ff
int AC_pin[4] = {  
  6,7,8,12};  // Output to Opto Triac
int LED_pin[4] = {  
  5,9,10,11};  // Output to Opto Triac
int brightness[4];
int LEDBrightness[4];
boolean zeroCross[]={
  false,false,false,false};
int PrevLEDValue[]={
  0,0,0,0};
unsigned long startZeroTime=0;
unsigned long timeElapsed=0;//Time until end of cycle

volatile uint8_t  DmxRxField[4]; //array of DMX vals (raw)  DMX Max:255 Min:0
volatile uint16_t DmxAddress;    //start address
enum {
  IDLE, BREAK, STARTB, STARTADR}; //DMX states
volatile uint8_t gDmxState;

void setup() {
  delay(500);//Wait for the system to charge
  //Setup DMX
  gDmxState= IDLE; // initial state

  DmxAddress = 1; // The desired DMX Start Adress. Starts at 1
  Serial.begin(250000);//Read DMX signal via RX

  //Setup Outputs
  attachInterrupt(1,zeroCrossInterupt,FALLING);
  for(int ch=0;ch<4;ch++){
    pinMode(AC_pin[ch],OUTPUT);
    pinMode(LED_pin[ch],OUTPUT);
    digitalWrite(AC_pin[ch],HIGH);
    analogWrite(LED_pin[ch],255);
    delay(1000);
    digitalWrite(AC_pin[ch],LOW);
    analogWrite(LED_pin[ch],0);
  }
}

void zeroCrossInterupt(){
  startZeroTime=micros();
  gDmxState= IDLE;  
  for(int ch=0;ch<4;ch++){
    brightness[ch]=map(DmxRxField[ch],0,265,8000,0);
    zeroCross[ch]=true;
  }
}

void loop() {

  timeElapsed=micros()-startZeroTime;
  /**
   * This is the main loop. I use timeElapsed instead of delay to allow for more then 1 output.
   * The +50 is to elimnate random noisy high and low values
   * DmxRxField[ch] > 10 because at DMX val8 it flickers
   */

  for(int ch=0;ch<4;ch++){
    if(zeroCross[ch] && timeElapsed > brightness[ch] && timeElapsed < brightness[ch]+50 && DmxRxField[ch]>10){
      digitalWrite(AC_pin[ch], HIGH);  // fire the Triac
      delayMicroseconds(10);       //pause briefly to ensure the triac turned on
      digitalWrite(AC_pin[ch], LOW);   // turn off the Triac gate (triac will not turn off until next zero cross)
      zeroCross[ch]=false;
    }
    if(PrevLEDValue[ch]!=DmxRxField[ch]){//Change the LED value only if it changed
      analogWrite(LED_pin[ch],DmxRxField[ch]);
      PrevLEDValue[ch]=DmxRxField[ch];
    }
  }
}


//ISR method from http://playground.arduino.cc/DMX/Ardmx
ISR(USART_RX_vect) {
  static  uint16_t DmxCount;
  uint8_t  USARTstate= UCSR0A;    //get state before data!
  uint8_t  DmxByte   = UDR0;          //get data
  uint8_t  DmxState  = gDmxState; //just load once from SRAM to increase speed

  
  if (DmxState == STARTADR)
  {
    DmxRxField[DmxCount++]= DmxByte;        //get channel
    if (DmxCount >= sizeof(DmxRxField)) //all ch received?
    {
      gDmxState= IDLE;        //wait for next break
    }
  } else if (USARTstate &(1<<FE0))               //check for break
  {
    DmxCount =  DmxAddress;         //reset channel counter (count channels before start address)
    gDmxState= BREAK;
  }

  else if (DmxState == BREAK)
  {
    if (DmxByte == 0) gDmxState= STARTB;  //normal start code detected
    else                      gDmxState= IDLE;
  }

  else if (DmxState == STARTB)
  {
    if (--DmxCount == 0)    //start address reached?
    {
      DmxCount= 1;            //set up counter for required channels
      DmxRxField[0]= DmxByte; //get 1st DMX channel of device
      gDmxState= STARTADR;
    }
  }
}
« Última modificación: 29 de Mayo de 2015, 14:00:00 por mattfabiani »

Desconectado Joseph90

  • PIC12
  • **
  • Mensajes: 89
Re: Dimmer 12 Canales DMX (ayuda, por donde empezar)
« Respuesta #1 en: 29 de Mayo de 2015, 14:52:29 »
hola mattfabiani, yo he diseñado un dimmer controlado por DMX512 para 8 canales con un PIC16f74, te adjunto el digrama en proteus y los códigos de los proggramas(el de TX para pruebas y RX). compílalo con CCS 5.

Espero que te sirva, saludos desde CUBA
El problema del hombre no está en la boma atómica, sino en su corazón. Albert Einstein.

Desconectado mattfabiani

  • PIC10
  • *
  • Mensajes: 8
Re: Dimmer 12 Canales DMX (ayuda, por donde empezar)
« Respuesta #2 en: 01 de Junio de 2015, 16:16:55 »
hola mattfabiani, yo he diseñado un dimmer controlado por DMX512 para 8 canales con un PIC16f74, te adjunto el digrama en proteus y los códigos de los proggramas(el de TX para pruebas y RX). compílalo con CCS 5.

Espero que te sirva, saludos desde CUBA

Gracias voy a intentar transformarlo en un Dimmer de 12 canales

Desconectado Joseph90

  • PIC12
  • **
  • Mensajes: 89
Re: Dimmer 12 Canales DMX (ayuda, por donde empezar)
« Respuesta #3 en: 01 de Junio de 2015, 17:09:53 »
OK ese ya lo estoy armando, en cuanto este terminado te digo que tal ha ido. Una pregunta, que quieres dimmerizar?
El problema del hombre no está en la boma atómica, sino en su corazón. Albert Einstein.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Dimmer 12 Canales DMX (ayuda, por donde empezar)
« Respuesta #4 en: 01 de Junio de 2015, 17:39:36 »
Por la forma parecen lamparas de 220V

Desconectado Joseph90

  • PIC12
  • **
  • Mensajes: 89
Re: Dimmer 12 Canales DMX (ayuda, por donde empezar)
« Respuesta #5 en: 02 de Junio de 2015, 08:55:57 »
Pienso que no sea dificil expandir el proyecto a 12 salidas, sin embargo es recomendable optimizar la parte del código que compara con el arreglo, no se quizas sea mejor trabajar punteros, me refiero a esto:

Código: [Seleccionar]
#int_TIMER0
void TIMER0_isr(void){
      set_timer0(TIMER0);
      if (Rx_Buffer[0]==contador) output_high(PIN_D0);
      if (Rx_Buffer[1]==contador) output_high(PIN_D1);
      if (Rx_Buffer[2]==contador) output_high(PIN_D2);
      if (Rx_Buffer[3]==contador) output_high(PIN_D3);
      if (Rx_Buffer[4]==contador) output_high(PIN_D4);
      if (Rx_Buffer[5]==contador) output_high(PIN_D5);
      if (Rx_Buffer[6]==contador) output_high(PIN_D6);
      if (Rx_Buffer[7]==contador) output_high(PIN_D7);
      contador++;
      
      if (contador>=HEAT) output_d(0xff);    //VER EXPLICACI'ON EN LA DECLARACION DE HEAT  
}

Solo habría que expandir el arreglo, comparar con contador y activar las otras 4 salidas.
« Última modificación: 02 de Junio de 2015, 09:01:48 por Joseph90 »
El problema del hombre no está en la boma atómica, sino en su corazón. Albert Einstein.

Desconectado mattfabiani

  • PIC10
  • *
  • Mensajes: 8
Re: Dimmer 12 Canales DMX (ayuda, por donde empezar)
« Respuesta #6 en: 02 de Junio de 2015, 17:59:02 »
OK ese ya lo estoy armando, en cuanto este terminado te digo que tal ha ido. Una pregunta, que quieres dimmerizar?

Quiero dimmerizar lamparas incandecentes en una linea de 220, para este dimmer de 12 canales sera trifasico, y unos 20 o 25 Amperes por canal, en la practica no excedere los 20A por canal (4 PAR1000)

Desconectado mattfabiani

  • PIC10
  • *
  • Mensajes: 8
Re: Dimmer 12 Canales DMX (ayuda, por donde empezar)
« Respuesta #7 en: 02 de Junio de 2015, 18:02:59 »
SI alguien prefiere usar el PIC 18F4550 y armar todo el programa nuevamente y el circuito no seria un problema, a lo que voy es que no es necesario modificar ese circuito, si lo ven mas facil usar un el PIC que menciono no es una opcion que se descarte.

Desconectado Joseph90

  • PIC12
  • **
  • Mensajes: 89
Re: Dimmer 12 Canales DMX (ayuda, por donde empezar)
« Respuesta #8 en: 04 de Junio de 2015, 09:00:16 »
Vale mattfabiani se puede modificar para usar un 18f4550 pero no es absolutamente necesario, claro las modificaciones serían de soft no de hard. El diseño que te he pasado es precisamente para eso, dimmerizar 8 PAR64. Muy importante tienes que utilizar optotriac´s de potencia o en su defecto optotriac´s  normales que disparen triac´s de potencia, NUNCA relay de estado sólido. (Te lo digo porque yo cometí ese error al empezar con esto de las luces :D :D :D :D).
Saludos....
El problema del hombre no está en la boma atómica, sino en su corazón. Albert Einstein.

Desconectado mattfabiani

  • PIC10
  • *
  • Mensajes: 8
Re: Dimmer 12 Canales DMX (ayuda, por donde empezar)
« Respuesta #9 en: 04 de Junio de 2015, 15:06:30 »
Vale mattfabiani se puede modificar para usar un 18f4550 pero no es absolutamente necesario, claro las modificaciones serían de soft no de hard. El diseño que te he pasado es precisamente para eso, dimmerizar 8 PAR64. Muy importante tienes que utilizar optotriac´s de potencia o en su defecto optotriac´s  normales que disparen triac´s de potencia, NUNCA relay de estado sólido. (Te lo digo porque yo cometí ese error al empezar con esto de las luces :D :D :D :D).
Saludos....

Que otra posibilidades hay? Alguien sugiere algo mejor, quiero montar un dimmer DMX512 de 12 canales!