terça-feira, abril 07, 2015

RS485 - Um Exemplo com o Arduino

Fechando esta série, vejamos um exemplo simples de comunicação RS485 com o Arduino, usando o transciever SN75176.



Como exemplo resolvi montar uma "rede" composta por um mestre e dois escravos. Cada um dos escravos possui um "sensor digital" e um "acionador"; para simplificar o sensor é um pino com um botão e o acionador o LED do Arduino. O mestre fica continuamente interrogando os dois escravos. Quando detecta a mudança no sensor de um deles, muda o acionador no outro.

A montagem fica assim:


Não está indicado na figura os resistores de terminação. Para distâncias curtas dá para operar sem eles. O recomendado é ter um resistor em cada extremo da rede, com valor igual à impedância do cabo (120 ohms segundo a wikipedia). Para distâncias grandes e ambientes com mais interferências é recomendado colocar também resistores de pull-up e pull-down nas extremidades.

Os três Arduinos executam o mesmo software. A informação de qual o modo (mestre ou escravo) e o endereço (se escravo) é armazenada na memória EEProm. Para alterar a configuração, o Arduino deve ser ligado a um PC e o pino 5 conectado ao terra.


O protocolo é bastante simples. Cada pacote possui uma marca de início, o endereço do escravo, o tipo de pacote, um byte de dado e um checksum (ou exclusivo de endereço, tipo e dado). Se o checksum estiver errado, o pacote é ignorado. O mestre pode enviar dois tipos de pacote: leitura do sensor e comando do acionador. O escravo pode responder o valor da leitura ou uma confirmação de acionamento. Um esquema simples de timeout é usado no mestre para detectar que um escravo não está na rede ou ocorreu um erro de transmissão.

O código está em ArduinoRS485.zip, nos arquivos do blog.

O vídeo abaixo mostra o sistema em funcionamento:



Obs.: a câmera teve dificuldade com a iluminação e os LEDs.

12 comentários:

Aulaetec disse...

Parabéns pelo projeto, é exatamente o que estou precisando, como faço para ver o código fonte? grato!

Daniel Quadros disse...

Lá no alto à direita tem um link para os arquivos do blog no OneDrive. O arquivo com os fontes é o ArduinoRS485.zip.

Mandrak disse...

Show de bola parabéns... Qual e o link do YouTube...

Daniel Quadros disse...

O vídeo está em https://youtu.be/0I3iiw1--E4

Unknown disse...

Daniel Quadros, muito bom o artigo, a algum tempo atras desenvolvi uma aplicação comunicando arduino com o ScadaBr, um supervisório free, mas isso via porta serial funcionou bem, ficou legal. Trabalho com automação industrial e sei o quanto faz a diferença em sistemas a comunicação entre dispositivos, enfim, acreditas que teria como desenvolver uma aplicação onde eu teria n escravos em rs485 e um mestre e este mestre jogando as informações num display? por exemplo leituras de temperaturas e estado de saidas e entradas digitais.

Daniel Quadros disse...

Cristiano, não vejo nenhum impedimento para isto. Você pode desenvolver o seu próprio protocolo RS485 (como fiz neste exemplo) ou usar uma biblioteca que implemente um protocolo padrão como o Modbus (o Arduino Playground lista algumas). É bastante simples ligar um display a um Arduino (tem alguns exemplos aqui no blog e uma multidão de bibliotecas para isto).

Cleber Tiago disse...

Boa noite! Daniel poderia esclarecer como determino o endereço do mestre e dos escravos?

Daniel Quadros disse...

Cleber, o que eu fiz no meu software é testar se o pino 5 está aberto ou ligado ao terra (usando o digitalRead). Se está ligado ao terra, a configuração do modo (Mestre ou Escravo) e do endereço (se escravo) é feita pela serial (rodando no PC o Monitor Serial da IDE a 38400) e salva na EEProm. Se o pino 5 está aberto, a configuração é lida da EEProm. Para mais detalhes, examine o código.

Cleber Tiago disse...

certo mas se eu quiser acrescentar mais escravos como em faco? pois vi que da forma que ta só consigo dois escravos.

Daniel Quadros disse...

Cleber, para mais escravos você vai ter que mudar ligeiramente o software. No lado do escravo, você vai ter que alterar a rotina Config() para permitir configurar outros endereços (no meu exemplo só aceita 1 e 2). Na rotina Mestre você precisa mudar duas coisas. A primeira é enviar o poll para todos os escravos (substituir o ender ^=1;). A segunda é definir o que será feito quando receber uma leitura de um escravo; o meu exemplo usa a leitura do sensor de um para controlar o LED do outro.

Anônimo disse...

No caso se eu quiser usar 1 Arduíno para sensor de RPM e de temperatura , eu posso? Mantendo ele escravo e mandando os dados para o mestre , que vai imprimir esses dados em um LCD? ou cada função tem que ter 1 arduino?

Daniel Quadros disse...

Lucas, basta mudar um pouco o protocolo. Por exemplo, ter tipos de pacote diferentes para solicitar cada informação. Ou manter os tipos atuais e enviar as duas informações na mesma resposta.