Un controller DMX512 con un PIC18

DMX512

L'Application Note AN1076 di Microchip ci spiega come sia possibile utilizzare un comune microcontrollore della serie PIC per implementare un controller basato sul protocollo DMX512.

DMX512 è un protocollo di comunicazione utilizzato per il controllo remoto dell'illuminazione di scena a livello professionale (fari, teste mobili, dimmer, scanner, ecc.). L'AN1076 di Microchip ci presenta una soluzione basata sul PIC per trasmettere e ricevere frame dati nel formato DMX512. Il protocollo DMX512 si basa a livello fisico su un'interfaccia di comunicazione di tipo seriale (in particolare, lo standard di riferimento è l'RS485), per cui è sufficiente scegliere un microcontrollore dotato di interfaccia UART (Universal Asynchronous Receiver Transmitter). La scelta è ricaduta sul modello PIC18F24J10, un dispositivo per utilizzi generici dotato di 1024 byte di memoria RAM, sufficiente per memorizzare il valore associato a ciascuno dei 512 possibili canali. Dal punto di vista hardware, è richiesto un solo componente esterno, un transceiver compatibile con lo standard RS-485. La soluzione per il controllo DMX512 si suddivide in due parti:

  1. trasmettitore DMX512 – in questa parte si descriverà come generare e trasmettere i pacchetti DMX512
  2. ricevitore DMX512 – in questa parte si spiegherà invece come ricevere i pacchetti DMX512

In entrambi i casi, la parte teorica sarà accompagnata da un esempio pratico.

Prima dell'avvento del protocollo DMX512, l'illuminazione delle scene teatrali veniva eseguita tramite degli autotrasformatori variabili, che richiedevano un'enorme quantità di fili e diversi addetti per eseguire sia l'installazione che il controllo delle luci. Agli autotrasformatori furono successivamente aggiunti dei motori elettrici, e questi vennero poi sostituiti con dei controlli di tipo analogico. Questi tipi di impianti, tuttavia, non erano esenti da problemi, soprattutto a livello di rumore e non linearità del controllo. Con l'avvento dei primi computer e della tecnologia digitale, cominciarono ad apparire sul mercato le prime centraline di controllo, ma rimaneva tuttavia la necessità di regolare il settore con uno standard specifico. Nacque così, nel 1986, la prima versione del protocollo DMX512 ad opera dell'USITT (United States Institute of Theatre Technology). L'obiettivo era quello di creare un'interfaccia digitale standard per il controllo delle luci di scena. Questo standard venne ulteriormente espanso e migliorato nel 1990 (DMX512-A) ed è stato anche adottato come standard dall'ANSI (E1.11). Il protocollo DMX512 (acronimo di Digital MultipleX) presenta i vantaggi di essere economico, semplice, e robusto. Può supportare fino a 512 dispositivi/canali separati, ed è basato su un'interfaccia seriale asincrona unidirezionale, senza alcun meccanismo di handshacking e di correzione degli errori. I dati sono trasmessi alla velocità fissa di 250 kb/s utilizzando un'interfaccia fisica compatibile con lo standard RS-485 (due fili per i dati più uno per il ground). Un sistema DMX512 si compone sempre di un solo trasmettitore e di diversi ricevitori. Un trasmettitore DMX512 si collega a un ricevitore DMX512 tramite un connettore XLR a 5-pin o a 3-pin (i connettori XLR vengono utilizzati comunemente per le applicazioni professionali nei settori audio, video, e illuminazione). L'immagine seguente mostra il pinout fisico relativo a un connettore XLR 5-pin.

Il trasmettitore DMX512 invia 512 byte contenenti i valori di luminosità (dimming) relativi ai possibili 512 canali. Ogni valore è pertanto mappato su 8-bit, dove il valore 0 rappresenta la condizione di luce spenta e 255 la condizione di massima intensità luminosa. Ogni ricevitore collegato alla linea DMX512 avrà assegnato un proprio indirizzo univoco, e il protocollo DMX512 richiede che il trasmettitore ripeta continuamente (almeno una volta al secondo) l'invio di un frame, come illusrato nelle due immagini seguenti:

Il trasmettitore

Per generare i pacchetti DMX512, il software utilizza una macchina a stati, composta dai seguenti quattro stati:

  1. SENDMBB – la linea dati DMX è in Idle
  2. SENDDATA – viene trasmesso un frame di 512 byte contenente i valori associati a tutti i ricevitori
  3. SENDMAB – la linea dati DMX è in Idle
  4. SENDBREAK – la line adati è pilotata allo stato logico basso

L'immagine seguente mostra la macchina a stati completa. Per semplificare il codice, i periodi di attesa negli stati SENDBREAK, SENDMAB e SENDMBB sono tutti stati impostati allo stesso valore (100 microsecondi).

Occorre inoltre sottolineare che, al fine di evitare problemi legati alla variabile tempo, è necessario attivare la macchina a stati con una certa frequenza (almeno una volta ogni circa 40 microsecondi o anche più frequentemente). Il segnale di Break è molto importante, in quanto consente a tutti i ricevitori di sincronizzarsi con il trasmettirore DMX identificando l'inizio di un nuovo frame dati.
Il microcontrollore PIC avrebbe disponibile il modulo EUSART per questo scopo, ma purtroppo la lunghezza di questo segnale non può arrivare alla lunghezza minima richiesta dal protocollo DMX, pari a 92 microsecondi. L'alternativa prescelta è stata pertanto quella di utilizzare la soluzione hardware, come indicato nell'immagine seguente:

Una resistenza da 100 Ohm viene collegata in serie con il pin EUSART del microcontrollore e con un pin di I/O (nel nostro caso è stato utilizzato il pin RC5). Tramite questa soluzione, il tempo di Break può essere variato a livello software, tra 92 microsecondi e 176 microsecondi, in modo tale da soddisfare i requisiti del protocollo DMX. Il byte contenente l'intensità luminosa (compresa tra 0 e 255) viene rappresentato come indicato nell'immagine seguente. Per generare i due bit di stop richiesti dal protocollo, il modulo EUSART del PIC18 è configurato in modalità a 9-bit, con il nono bit fisso al valore '1'.

Come applicazione pratica dei concetti appena trattati, consideriamo il seguente caso, in cui useremo un potenziometro collegato al trasmettitore DMX512 per controllare remotamente una lampada collegata al ricevitore DMX512. Il PIC18F24J10 dispone di un convertitore analogico-digitale a 10-bit con 13 ingressi, e il potenziometro verrà collegato al pin RA0 dell'MCU, corrispondente al canale di ingresso analogico 0. Poichè il potenziometro non cambierà valore molto velocemente, potremo campionarlo ogni 10 mSec senza perdita dei dati. Possiamo inoltre fare in modo che l'ADC esegua automaticamente il campionamento del valore del potenziometro a una frequenza prefissata (per fare ciò è sufficiente utilizzare il modulo timer a 16-bit in combinazione con modulo CCP (Capture Compare and PWM module) anch'esso configurato a 16-bit. Ogni volta che una conversione analogico-digitale è completata, il valore a 8-bit contenente la codifica digitale associata alla posizione del potenziometro viene copiato nel buffer di trasmissione, nella posizione associata al canale desiderato (lo stesso canale verrà ovviamente utilizzato nel ricevitore). Lo schema del trasmettitore è il seguente:

Il ricevitore

Lato ricevitore, collegheremo un LED all'uscita PWM del PIC18, in modo tale da verificare visivamente la differente luminosità del LED stesso in funzione del valore di dimming ricevuto via DMX. Lo schema a blocchi relativo al ricevitore è il seguente:

Il pin di ricezione del modulo EUSART è collegato al pin di ricezione del transceiver RS-485. Una resistenza da 120 Ohm, ¼ W, va inoltre collegata tra i pin DMX- e DMX+ in modo tale da terminare la linea DMX. La terminazione di linea è importante in quanto riduce drasticamente i problemi relativi alla trasmissione del segnale.

Tutto il codice relativo a questa applicazione dimostrativa può essere liberamente scaricato dal sito Microchip, a questo indirizzo.

One Response

  1. nicorac 19 settembre 2012

Leave a Reply