Pages: [1]   Go Down
Author Topic: Dudas DMX (RS485): Optoacoplador, buffer, in/out...  (Read 3033 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola a todos:

Ante todo saludar en este mi primer mensaje a la comunidad. No estoy muy puesto en programación así que algunas de mis dudas irán por ese camino.

Mi primera duda de hoy viene porque voy a empezar mi primer proyecto con Arduino haciendome una shield para DMX. Mi intención es seguir ESTA GUÍA pero me gustaría añadirle un poco de protección con un optoacoplador. Había leido hilos acerca del 4N28, pero lo usan para MIDI (0-5V) y no se si irá bien para RS485 (+/-V). Alguna idea??

Por otro lado, esa placa usa el mismo MAX485 para entradas y salidas, así como sus pistas. Podria dividir las conexiones y usar el mismo tipo de optoacoplador (invertido) para la entrada??

Por último, realmente mi objetivo es realizar un simil en Arduino del Enttec DMX USB PRO, que a grosso modo, se diferencia del Open USB DMX normal en que lleva optoacoplador, entrada con RDM y microprocesador, que le permite algunas funciones avanzadas como un buffer de seguridad (util si se cuelga el programa y hay que reiniciar). Este buffer esta implementado en algún código DMX para el arduino??

En fín, gracias anticipadas por leer este mensaje.

Salu2 a to2
Logged

Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 956
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con el tema del DMX e iluminacion espectacular no te puedo ayudar.
Te puedo decir que el 485 esta preparado para ir directamente al cableado, si acaso puedes añadirle a la entrada por seguridad fusibles rapidos si acaso, un varistor no se si interferira en las señales.

El tema de optoacopladores para gobernar triacs y demas, por supuesto, pero para la entrada del 485... no sabria decirte...

A ver si algun compañero mas puesto es esto te puede ayudar.

El arduino tiene un watchdog o "perro guardian" pero si no te convence hay chips que hacen esta funcion y son muy nanos.

Un saludo.
Logged

CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

para el rs485 podras utilizar optoacopladores, al igual que en rs232.

El protocolo de dmx lo debes generar con arduino, que en resumen es enviar ciertos datos por el puerto, (direccion y valor) que es en teoria lo que hace el software que te envian con el aparato que nos muestras.

si lo que quieres es que el arduino haga de interface entre el programa que manda las señales DMX a los distintos dispositivos puedes hacer que haga de buffer, por ejemplo que memorice el ultimo valor de cada canal , y que si deja de recivir comandos del software pues arduino se encarga de enviar el ultimo valor de cada canal a todos los elementos disponibles.

un saludo

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Weno, ante todo gracias por la rápida respuesta a ambos.

Sobre el optoacoplador, la duda que tengo es si sería compatible con señales RS485 (las que usa el DMX), ya que los optoacopladores que he visto normalmente trabajan con valores de 0V a +V (o -V) y el 485 va de -V a +V (por ejemplo de -2.5V a +2.5V, mínimo 200mV de diferencia). Una opción es ponerlo ANTES del MAX485, pero ante una sobretensión el MAX quedaría frito y no es plan de quedarse parado en medio de un show. ¿El "Watchdog" al que te refieres haría esta función?

si lo que quieres es que el arduino haga de interface entre el programa que manda las señales DMX a los distintos dispositivos puedes hacer que haga de buffer, por ejemplo que memorice el ultimo valor de cada canal , y que si deja de recivir comandos del software pues arduino se encarga de enviar el ultimo valor de cada canal a todos los elementos disponibles.

ESO EXACTAMENTE ES LO IDEAL. ¿Habeis visto algún ejemplo de implementación?

La cosa es que Arduino puede ser muy útil y escalable para el entorno de los espectáculos luminotécnicos, pero es necesario el mínimo de seguridad que se necesita para lanzarse a un evento con público. Creo que tanto el buffer como el optoisolador añaden ese mínimo necesario (sin entrar en el soft usado claro).

Weno, de nuevo gracias por las respuestas, espero más adelante poder ser yo también de ayuda, al menos con el tema del DMX que me atañe ahora smiley-wink.

Salu2 a to2
Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

un optoacoplador de transistor lo puedes utilizar con tensiones negativas. en el colector puedes poner +2,5 voltios y en el emisor -2,5 y dependiendo de donde tomes la señal puedes tener nivel alto a 2,5 y bajo a -2,5 aproximadamente.

lo que quieres hacer no tiene complicación, haces que el arduino lea el puerto serie en rs232, interprete las señales que le envía el software, memorizar el ultimo valor que le indique el software de cada canal, y enviar por rs232 lo mismo que recibe. o que envíe todos los valores que tiene en memoria de todos los canales, es menos eficiente pues tiene mayor tiempo de refresco los elementos.
luego en caso de estar un tiempo sin recibir datos serie se dedique a enviar los valores memorizados.

no tiene mucha complicación. ( al menos a botepronto)

la salida de RS232 del arduino la llevas al conversor a rs485 y ya está

Un saludo
Logged

Zaragoza
Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola buenas:

Yo también estoy realizando un trabajo sobre DMX512 y protocolos que se pueden implementar sobre la capa física del RS485. Mes gustaría preguntar una duda que tengo respecto a DMX512. Tengo claro que a través de un micro-controlador se envía la trama serie y ésta mediante un transceiver se adapta en niveles de tensión. Lo que no tengo claro es como hemos de conectar los elementos de iluminación. ¿Se necesita otro Arduino con niveles adaptados al final de la linea y que este Arduino saque los datos en paralelo a cada elemento de iluminación? ¿O hay alguna manera de hacerlo?

Gracias y un saludo.  smiley-cool
Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si lo que quieres es hace un receptor de DMX con arduino si que necesitas adaptar niveles a rs232 en niveles TTL. luego con arduino le configuras uno o varios canales a los que deva hacer caso y por ejemplo que haga de dimmer para varios canales.

seria de esta manera


software--- ordenador -- conversor rs232 a ttl--- arduino emisor DMX--- ttl a rs485----cable --- rs485 a ttl---- arduino receptor DMX
Logged

Zaragoza
Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok muchas gracias. El caso es que algunos esquemas como el de la imagen que pongo no dejan claro como se hace el control de los canales.  Porque parece que los controla todos a través del mismo cable. Un saludo. smiley-mr-green

Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

la señal DMX se transmite en serie una serie de datos, canales y valores, cada aparato tiene una direccion y solo obtieve el valor cuando se le manda.

los aparatos van todos en paralelo con el cable DMX

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 3
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok muchas gracias. El caso es que algunos esquemas como el de la imagen que pongo no dejan claro como se hace el control de los canales.  Porque parece que los controla todos a través del mismo cable. Un saludo. smiley-mr-green

Como dice SrDonGato la conexión es en paralelo, aunque los receptores DMX (cabezas, focos, móviles...) traen un conector de entrada y otro de salida y externamente casi da la sensación de ser en serie. De todas formas, el esquema que has puesto no usa los conectores de salida (link) de los aparatos y en cambio usa un splitter externo, algo inusual para pocos focos (a no ser que haya muucha distancia entre ellos). Ibnu AlHaizam, en el caso que he planteado, el Arduino haría las funciones de mesa de control, aunque con el mismo hardware, podrías usarlo para conectar otros dispositivos (también puedes usar focos con DMX integrado o un dimmer para conectar los que no tengan DMX).

En cuanto a la cuestión que planteé, voy a concretar unas cuantas cosas:

- Por si alguien no vió el enlace de la guía que quiero seguir, mi esquema de partida es el siguiente:


- En cuanto a la cuestión de protección, seguramente use un par de 4N25 o 4N28 para la protección (o un integrado que lleve 4 de estos), ya que como comentaste SrDonGato, no hay problema en la cuestión de niveles. Según tu comentario, ¿sería correcto usar GND como LOW (emisor), +5V como HIGH (colector) y 3.3V como referencia (base?)?

- Para tener comunicación bidireccional half-duplex (con un mismo MAX485) CON PROTECCIÓN, sería necesario colocar dos optoacopladores por sentido (cables HOT y COLD, pines 2 y 3 del XLR), o sea 4 optoacopladores, 2 para el envio con los niveles anteriores (RS485) y 2 para la recepción configurados con niveles TTL, ¿correcto?

- En cuanto al código, en principio si no quisieramos buffer creo haber entendido que no hace falta cargar nada al Arduino, solo con conectar a los pines digitales 0 (RX) y 1 (TX), que conectan directamente con el chip FTDI que transforma dichas señales USB. Pero la idea es almacenar un pequeño buffer (suficiente con un frame de 512 canales completo). Es decir, 8bits de canal + 1bit de inicio + 2bits de final X 512 canales = 702 bytes. Por lo que he visto, el mejor código para manejar DMX desde Arduino (sin PC) está en este post, aunque me queda un poco de lectura para poder entender al 100% su funcionamiento :S.

En fín, mañana iré de compras y seguiré con la investigación. Gracias a los interesados (aunque de momento seamos pocos smiley-razz).

Salu2 a to2
« Last Edit: August 31, 2011, 09:10:03 pm by Koitz » Logged

Zaragoza
Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola buenas:

Estoy usando la librería de arduino para DMX. Mirando las funciones he encontrado una interrupción que no acabo de entender del todo. Es las siguiente:

ISR(TIMER2_OVF_vect,ISR_NOBLOCK) {
  // Prevent this interrupt running recursively
  TIMER2_INTERRUPT_DISABLE();
  uint16_t bitsLeft = F_CPU / 31372; // DMX Bit periods per timer tick
  bitsLeft >>=2; // 25% CPU usage
  while (1) {
    if (dmxState == 0) {
      // Next thing to send is reset pulse and start code
      // which takes 35 bit periods
      uint8_t i;
      if (bitsLeft < 35) break;
      bitsLeft-=35;
      *dmxPort &= ~dmxBit;
      for (i=0; i<11; i++) delayMicroseconds(smiley-cool;
      *dmxPort |= dmxBit;
      delayMicroseconds(smiley-cool;
      dmxSendByte(0);
    } else {
      // Now send a channel which takes 11 bit periods
      if (bitsLeft < 11) break;
      bitsLeft-=11;
      dmxSendByte(dmxBuffer[dmxState-1]);
    }
    // Successfully completed that stage - move state machine forward
    dmxState++;
    if (dmxState > dmxMax) {
      dmxState = 0; // Send next frame
      break;
    }
  }
    // Enable interrupts for the next transmission chunk
  TIMER2_INTERRUPT_ENABLE();
}

¿sabe alguien que significan los parámetros TIMER2_OVF_vect y ISR_NOBLOCK? Gracias y un saludo
« Last Edit: September 27, 2011, 06:20:12 am by Ibnu AlHaizam » Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Puedes mirarlo en => http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

Como pista, es la interrupción de Overflow del timer 2.

Como curiosidad, no sabía la opción de poder tener interrupciones anidadas (opción NOBLOCK), y mirando el datasheet he visto:
"When an interrupt occurs, the Global Interrupt Enable I-bit is cleared and all interrupts are disabled. The user software can write logic one to the  I-bit to enable nested interrupts. All enabled interrupts can then interrupt the current interrupt routine. The I-bit is automatically set when a Return from Interrupt instruction – RETI – is executed."

Hoy ya puedo dormir tranquilo, he aprendido una cosa nueva!

smiley-wink
« Last Edit: September 27, 2011, 07:01:08 am by Igor R » Logged


Zaragoza
Offline Offline
Newbie
*
Karma: 0
Posts: 33
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias por la respuesta Igor. Más o menos lo que he entendido es que el timer cuando llega a cero ejecuta dicha interrupción. Supongo que para configurar el timer habrá que mirar el datasheet del microcontrolador. Parece un poco complicado ya que hay que meterse con bajo nivel.
Logged

Ciudad Real
Offline Offline
God Member
*****
Karma: 1
Posts: 747
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Pero la idea es almacenar un pequeño buffer (suficiente con un frame de 512 canales completo). Es decir, 8bits de canal + 1bit de inicio + 2bits de final X 512 canales = 702 bytes.

solo tienes que guardar lo 8 bits del canal, lo demás se genera por hardware, de manera que necesitas los 512 bytes, 1 por canal.

lo que quieres hacer no es dificil , solo tienes que hacer una funcion que lea puerto serie y memorice el canal y otra funcion que envie por puerto serie los canales memorizados. luego puedes optimizar el programa para que envíe solo los canales que se estén utilizando y minimizar el tiempo de refresco de los mismos.

un saludo
Logged

Pages: [1]   Go Up
Jump to: