LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: joaopedrocmp em 29 de Março de 2012, 17:49
-
Boas pessoal,
Ja fiz um conversor igual ao deste post: http://lusorobotica.com/index.php?topic=560.0 (http://lusorobotica.com/index.php?topic=560.0)
agora estou a fazer uma experiencia, é possivel ligar o Max ao vdd, gnd , e txdo arduino?
Em vez de ligar a um serial converter igual ao do link?
-
Boas.
Sou o autor desse interface que fizeste.
Descreve melhor a tua pergunta porque eu não percebi...
-
Estava a perguntar, se podia ligar o arduino ao pc, em vez do usb to serial converter. Mas ja testei, e vi que sim, funciona ligando ao pino rx do arduino ;)
Outra coisa, sabes como receber e ler sinal dmx no arduino?
Tenho 2 bibliotecas para experimentar, mas so durante esta semana é que tenho o conversor que fiz.
A ideia, é fazer um dispositivo em que tens 5 canais, em que mais de "x" valor DMX liga um rele, e menos desliga. e com opção de escolher endereço. è para ligar uma maq. de fumo, e outras coisas do genero.
-
Estava a perguntar, se podia ligar o arduino ao pc, em vez do usb to serial converter. Mas ja testei, e vi que sim, funciona ligando ao pino rx do arduino ;)
Outra coisa, sabes como receber e ler sinal dmx no arduino?
Tenho 2 bibliotecas para experimentar, mas so durante esta semana é que tenho o conversor que fiz.
A ideia, é fazer um dispositivo em que tens 5 canais, em que mais de "x" valor DMX liga um rele, e menos desliga. e com opção de escolher endereço. è para ligar uma maq. de fumo, e outras coisas do genero.
Boas joão.
Não tenho nenhum código, mas sei que existe código disponível na net para o efeito... Não é fácil pô-lo a compilar mas sei de gente que já o conseguiu fazer. Pessoalmente, nunca me dediquei muito à recepção e portanto não te posso ajudar muito.
Cumps,
Ricardo
-
DMX é basicamente serial a 19200 bps, portanto é uma questão de usar uart e código a enrolar a uart em funções bonitas.
-
DMX é RS-485, não tem nada a ver com RS-232, e funciona a 250 kbps.
-
Durante a semana vou experimentar, depois vemos :P
-
DMX é RS-485, não tem nada a ver com RS-232, e funciona a 250 kbps.
A uart do Arduino funciona dos dois modos, para além de que são os dois serial.
-
Já agora, lembro-me de ler uma application note da microchip que explicava como liam DMX usando a UART, mas como os tempos de break são muito longos, tinha de se "enganar" a UART porque era gerado um erro de paridade que depois ignoravam e faziam uma carrada de maroscas para a UART "comer" o sinal DMX, portanto não é uma coisa assim muito trivial.
Boa sorte ;) vai dando notícias...
-
A Uart do Arduino suporta modo de 9 bits, que é o que o RS-485 quer, até existem app-notes na Atmel sobre o assunto. Mas como nunca usei não posso falar muito mais sobre o assunto, mas até a datasheet refere isso, portanto imagino que já alguem tenha feito uma lib para arduino.
-
Sim, eu tenho aqui uma, é a DMXSerial, e tenho um programa, mas não tem nada a ver com a 1º:
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
// ********************* local definitions *********************
#define DMX_CHANNELS (32) //Define the number of DMX values to store
enum {IDLE, BREAK, STARTB, STARTADR}; //DMX states
uint8_t gDmxState;
uint8_t *gDmxPnt;
uint16_t DmxCount;
uint8_t DmxField[DMX_CHANNELS]; //array of DMX vals (raw)
uint16_t DmxAddress; //start address
int ledPin = 13; // LED connected to digital pin 13
void setup() // run once, when the sketch starts
{
// sets the digital pin as output
pinMode(ledPin, OUTPUT);
// Disable interrupts
cli();
// 250kbps baud - only works for 16MHz clock frequency. See the ATMega8 datasheet if you are using a different clock speed
UBRR0H = 0;
UBRR0L = 3;
// enable rx and interrupt on complete reception of a byte
UCSR0B = (1<<RXEN0)|(1<<RXCIE0);
UCSR0C = (1<<UMSEL01)|(3<<UCSZ00)|(1<<USBS0);
// Enable interrupts
sei();
gDmxState= IDLE;
uint8_t i;
for (i=0; i<DMX_CHANNELS; i++)
{
DmxField[i]= 0;
}
DmxAddress= 10; //Set the base DMX address. Could use DIP switches for this.
}
void loop() // run over and over again
{
if(DmxField[0] >=127)
{
digitalWrite(ledPin, HIGH); // sets the LED on
}
else
{
digitalWrite(ledPin, LOW); // sets the LED off
}
}
// *************** DMX Reception ISR ****************
SIGNAL(USART_RX_vect)
{
uint8_t USARTstate= UCSR0A; //get state
uint8_t DmxByte= UDR0; //get data
uint8_t DmxState= gDmxState; //just get once from SRAM!!!
if (USARTstate &(1<<FE0)) //check for break
{
UCSR0A &= ~(1<<FE0); //reset flag
DmxCount= DmxAddress; //reset frame counter
gDmxState= BREAK;
}
else if (DmxState == BREAK)
{
if (DmxByte == 0)
{
gDmxState= STARTB; //normal start code detected
gDmxPnt= ((uint8_t*)DmxField +1);
}
else gDmxState= IDLE;
}
else if (DmxState == STARTB)
{
if (--DmxCount == 0) //start address reached?
{
gDmxState= STARTADR;
DmxField[0]= DmxByte;
}
}
else if (DmxState == STARTADR)
{
uint8_t *DmxPnt;
DmxPnt= gDmxPnt;
*DmxPnt= DmxByte;
if (++DmxPnt >= (DmxField +DMX_CHANNELS)) //all ch received?
{
gDmxState= IDLE;
}
else gDmxPnt= DmxPnt;
}
}
Mas so testo amanha ou depois, nao tenho o conversor.