Você está na página 1de 4

mathertel.

de
A Biblioteca Arduino para enviar e receber DMX
Esta uma biblioteca para envio e recebimento de cdigos DMX usando o plattform Arduino ou um ATmega (ATmega168,
ATmega328 ou similar) processador com uma velocidade de clock de 16 MHz.
A biblioteca evita problemas timming sobre o protocolo de baixo nvel que normalmente existe ao usar implementaes de
software usando o hardware de comunicao serial interna dos chips. Portanto, muito acrtica para adicionar-lhe efeitos
especficos DMX em cima desta biblioteca de comunicao.
DMX envio e recebimento DMX so ambos suportados por esta biblioteca. Voc pode encontrar uma breve descrio de usar
os detalhes dos registros de hardware de srie neste artigo.
Baixar
Faa o download dos arquivos de biblioteca, incluindo duas amostras para envio e recebimento de mensagens de DMX:
DMXSerial.zip
Ferragens
Este esboo e biblioteca mostra como usar a interface de hardware de srie para envio e recebimento de pacotes de dados
DMX.
Para ter um hardware compatvel DMX mnimo voc tem que adicionar um chip controlador RS-485 como o MAX481 e anex-
lo ao hardware da interface baseada em srie do microcontrolador ATMEGA. Um correspondente Arduino compatvel DMX
escudo pode ser encontrada em DMXShield.aspx .
DMX e RDM
DMX521 ou DMX em suma foi definido para controlar os efeitos de raios palco usando cabos de estilo XLR. Um bom ponto de
partida para obter mais informaes sobre a histria e evoluo de DMX pode ser encontrada na Wikipedia:
http://en.wikipedia.org/wiki/DMX512
Algumas informaes Arduino relacionada tambm est disponvel no playground do site do Arduino:
http://www.arduino.cc/playground/Learning/DMX
Enquanto DMX foi projetado para ter um nico emissor e vrios receptores. Em 2006, um protocolo bidirecional chamado RDM
foi definido que aumenta DMX que permite uma comunicao bi-direcional que eu gosto de apoiar tambm. Veja tambm:
http://en.wikipedia.org/wiki/RDM_ (iluminao)
Ambos, o hardware e software decises e os projetos foram feitos para apoiar RDM e DMX e morrer Arduino escudo pode ser
usado para tudo isso.
Com esta primeira verso Controladores porm apenas DMX (somente envio) e Receptores DMX (s ouvindo) so suportados
modo de operao.
Antes de iniciar a soldagem e programao que eu fiz alguma pesquisa sobre projetos de interface j existentes DMX e
marcada por dicas de design bons e ruins.
Nveis de protocolo DMX
O nvel lgico de comunicao DMX construdo sobre envio de srie com 250,000 transmisso de acordo com a definio RS-
485 sem uso de bits de paridade e 2 bits de parada.
Felizmente as portas seriais de hardware construdo nos chips Atmega usado na placa Arduino apoia este tipo de comunicao
e essa alta taxa de transmisso. ver tambm http://en.wikipedia.org/wiki/RS-485
No h nada de especial sobre os nveis deste protocolo de comunicao, exceto o quadro de reset que baixa para mais de
88 ms. Os dois bits de paragem tem um tempo mnimo de 8 secs mas este tempo pode ser mais longo se para um segundo.
Depois de um quadro de redefinio dos bytes de carga til so transmitidos pelo host DMX usando um byte inicial (valor 0) e
mximo de 512 bytes de valor do canal. No recomendado para enviar menos de 24 canais.
casa

projetos

blogs

contato

www.mathertel.de -> Arduino Projetos -> Biblioteca DMXSerial
25/12/12 A Biblioteca Arduino para enviar e receber DMX
2/4 www.mathertel.de/Arduino/DMXSerial.aspx
mximo de 512 bytes de valor do canal. No recomendado para enviar menos de 24 canais.
Este DMX e RDM especificao permite envio e recebimento de DMX usando o hardware built-in. Os truques que precisamos
ser explicado mais abaixo.
No usar a implementao Arduino Serial
Eu aprendi a evitar o uso da implementao padro de srie do Arduino. H um problema com ele ao acessar a interface base
de srie do hardware, porque o tipo de srie de paridade e de paragem manipulao bit no est definido em tudo e os
valores padro so usados.
Em vez de usar o objeto embutido de srie que implementado na biblioteca HardwareSerial esta biblioteca inicializa e
controla todo o controle Registros por si s.
Houve uma primeira abordagem publicada em http://arduino.cc/playground/Learning/DMXSerial em 2011 que usou
o build-in implementao de srie, mas o fato que ao usar os recursos de interrupo existe um conflito de implementao
com as rotinas de interrupo necessria para DMX e as rotinas existentes interrupo da implementao padro de srie. O
http://arduino.cc/playground/DMX/Ardmx local menciona que o arquivo principal tem que ser modificado - mas isso
no verdade em srie no usado em tudo.
Ento voc tem que evitar o uso do objeto de srie e, mesmo no us-lo para fins de depurao!
Usando a interface serial atravs de registos
Existem vrias configuraes do hardware que tm de ser implementadas para permitir a interface built-in de srie. Seu eu
apenas vou atravs da implementao de sua orientao como ele feito.
Envio e recebimento de DMX O nvel lgico de comunicao DMX construdo em cima de srie o envio de at 512 bytes
usando 250,000 horrios de transmisso sem bits de paridade e 2 bits de parada. Felizmente as portas seriais de hardware
construdo nos chips Atmega usado na placa Arduino apoia este tipo de comunicao e essa alta taxa de transmisso.
Ativando o hardware tem que ser feito, definindo os bits correspondentes no controle USART e Status Register B. A seguir se
permitindo o envio e os dados correspondentes Registre interrupo vazio no caso do modo DMXController:
/ / Ativar transmissor e interromper
UCSRnB = (1 << TXENn) | (1 << UDRIEn);
Permitindo que o receptor e o correspondente Receber Interrupt completo, no caso do modo de DMXReceiver muito
semelhante:
/ / Ativar receptor e receber interrupo
UCSRnB = (1 << RXENn) | (1 << RXCEn);
Definir a taxa de transmisso implementado na funo _DMXSerialBaud porque muitas vezes temos que mudar isso quando
enviar pacotes DMX. O cdigo de fonte desta funo muito semelhante ao utilizado na implantao de srie padro, a no
ser que tambm define o modo de transmisso de 2 bits de paragem, 8 bits de dados e sem paridade:
/ / Inicializar a porta serial do hardware com a taxa de transmisso dado
/ / Usando 8 bits de dados dados de um 2 stop bits.
vazio _DMXSerialBaud (baud longa)
{
baud_setting uint16_t;
/ / Calcula as configuraes de transmisso
baud_setting = (F_CPU / 8 / baud - 1) / 2;
/ / Atribuir o baud_setting para a taxa de transmisso USART Registre-se
UBRRnH = baud_setting >> 8;
UBRRnL = baud_setting;
/ / 2 stop bits e 8 tamanho carter bit, sem paridade
UCSRnC = (1 << USBSn) | (3 << USCZn0);
} / / _DMXSerialBaud
Enviando um byte, usando o hardware feito escrevendo um novo valor para os dados USART Registre depois de verificar que
no h transmisso atual.
_DMXSerialWrite void (dados uint8_t)
{
/ / Espera para buffer de transmisso vazio
while (! (UCSRnA & (1 << UDREn)))
;
/ / Coloque os dados em buffer, envia os dados
UDRn = dados;
} / _DMXSerialWrite /
25/12/12 A Biblioteca Arduino para enviar e receber DMX
3/4 www.mathertel.de/Arduino/DMXSerial.aspx
Onde voc pode encontrar mais detalhes sobre esta linha de cdigo
Na documentao oficial da ATMEL para o microcontrolador ATMEGA328P h um captulo 20 sobre o interno Receptor
sncrona e assncrona serial universal e transmissor (USART) a partir da pgina 178. H tambm chips de microcontrolador
ATmega na famlia que tm mais do que uma USART, de modo a USART tambm referenciada pelo nmero 0 com USART
(USART0).
No diagrama de blocos que voc pode ver que existem alguns registros de software endereveis (em negrito) utilizados para
configurar essas portas. O nome dos registradores so UBRRn, UDRn, UCSRnA, UCSRnB e UCSRnC onde n o espao
reservado para o nmero da USART. Os registros concretos para a USART0 so:
UBRR0H e UBRR0L: Registros Baud Rate
UDRn: I / O de dados registra
UCSR0A: Controle e Status registrar um
UCSR0B: Controle e Status Register B
UCSR0C: Controle e registro de status C
No captulo Register Descrio 20,11 voc pode encontrar uma breve descrio de cada registo faz.
A biblioteca Arduino Serial cuida de muitas configuraes quando inicializado pelo telefone Serial.begin ([taxa de
transmisso]). Na pasta \ hardware \ arduino \ ncleos \ arduino voc pode encontrar o HardwareSerial.cpp arquivo com a
implementao desta biblioteca. Voc pode procurar o mtodo begin e pode ver que a taxa de transmisso usado para
calcular os valores para os registros UBRR0H (_ubrrh) e UBRR0L (_ubrrl) e alguns trechos do UCSR0B registo (_ucsrb) esto
definidos. No h nenhuma inicializao do controlo e C Estado Register em tudo.
Esta linha de cdigo define o modo de comunicao serial para o modo assncrono (UMSEL01 e UMSEL00 no esto
definidos), no o modo de paridade (UPM01 e UPM02 no esto definidos), 2 bits de parada (1 << USBS0) e 8 tamanho dos
caracteres pouco (3 < <UCSZ00).
Receber rotina de interrupo
Recepo de um byte no implementada usando uma funo, em vez de uma rotina de servio de interrupo registado e
ser chamada quando um pacote de dados foi recebido e detectado pelo hardware. No ciclos de CPU so necessrios para a
espera. Os dados recebidos est disponvel nos dados USART Receber Registrar UDRn e um potencial buffer overflow que vai
acontecer quando receber o sinal de reset DMX est disponvel em USART Estado de Controle Registre Um UCSRnA. Ambos os
valores so armazenados em variveis locais para uso posterior:
ISR (USART_RX_vect) {
uint8_t USARTstate = UCSRnA / / obter o estado antes de dados!
uint8_t DmxByte = UDRn / / obter dados
...
}
A rotina de interrupo de envio
Esta rotina de interrupo chamado pelo hardware apenas depois de um byte foi completamente enviado. Esta rotina
seguida, verificar para o prximo byte que tem de ser enviado para fora. No modo DMX controlador a rotina comea
novamente com o envio do sinal de reset, quando todos os dados do pacote completo enviado.
ISR (USART_UDRE_vect) {... }
Enviando o reset
O chip Arduino padro suporta a taxa de transferncia de 250,000 baud que usado por DMX. A nica excepo a uma
comunicao simples 250,000 baud este o sinal BREAK / reinicializao que um nvel fsico baixo no fio para mais de 88
ms.
Este sinal de 88 mseg baixo no podem ser enviados usando a taxa de 250,000 baud. Para enviar a ruptura de um ritmo mais
lento de transmisso inicializado, um byte 0 enviado e a taxa de transmisso reiniciada para a transmisso 250,000
correta.
/ / Setup taxa mais lenta baud
_DMXSerialBaud (115200);
/ / E enviar um byte 0
_DMXSerialWrite ((Uint8_t) 0);
Depois do intervalo foi enviada com o seguinte cdigo volta para 250,000 de transmisso para enviar os bytes de dados:
25/12/12 A Biblioteca Arduino para enviar e receber DMX
4/4 www.mathertel.de/Arduino/DMXSerial.aspx
Serial.begin (250.000);
Serial.write ((uint8_t) 0);
O segundo problema com o formato usado pelo DMX o nmero de bits de parada. Normalmente, ao usar a porta serial
apenas um bit de parada usado. Adicionando um pouco segunda parada no pode ser feito atravs de uma chamada de
parmetro ou biblioteca de configurao mas deve ser feito atravs do ajuste da configurao de hardware para a porta serial
0:
UCSR0C = (1 << USBS0) | (3 << UCSZ00);
Voc pode encontrar este cdigo na rotina de interrupo do servio para iniciar um pacote DMX completa e continuamente
enviando os valores DMX no modo DMXController.
Um projeto para um Escudo DMX que trabalha com esta biblioteca pode ser encontrada no artigo: DMX Escudo .
Como detectar que um dispositivo desligado?
No possvel detectar que nenhum dos cabos est realmente ligado a um dispositivo sem a adio de mais hardware.
Portanto, h uma soluo mais suave (baseado em software) para isso.
Quando um pacote DMX recebida a biblioteca se lembra da hora atual para uma varivel esttica. Ao utilizar este valor o
mtodo "DMXSerial.noDataSince ()" o retorna o nmero de milissegundos desde o ltimo pacote foi recebido.
O tempo calculado utilizando a millis () funo.
No circuito principal ou em qualquer outro lugar voc pode verificar se o sinal DMX foi recebido durante o tempo passado e
reagir, se for muito tempo atrs.
Na amostra DmxSerialRecv.pde h uma chamada para a funo para mostrar uma cor fallback (vermelho no meu caso).
Ligaes
DMX no site do Arduino. Um bom ponto de partida para a pesquisa: http://www.arduino.cc/playground/Learning/DMX
Sobre o HSV e HSL Modelos de cores RGB: http://en.wikipedia.org/wiki/HSL_and_HSV
A documentao para o microcontrolador ATMEGA328P pode ser encontrado em:
http://www.atmel.com/dyn/resources/prod_documents/doc8271.pdf
RS-485 Descrio http://en.wikipedia.org/wiki/RS-485
DMX Descrio http://en.wikipedia.org/wiki/DMX512
MAX481 e MAX485 da MAXIM: http://www.maxim-ic.com/datasheet/index.mvp/id/1111
Histria
2011/08/24 primeira verso publicada.
2011/04/12 atualizao para compatibilidade com o meio ambiente 1,0 Arduino.
2012/10/05 Adicionado o mtodo DMXSerial.noDataSince ()
2012/04/06 Agora inicializar o UCSRnA registo a 0 corretamente para evitar problemas com Arduino UNOS
configuraes de velocidade de transmisso de casal.
2012/11/08 Update para ajustar algumas condies de tempo e otimizaes. Muito obrigado a Jonathan L.
Esta pgina parte do http://www.mathertel.de/ site.