quarta-feira, 24 de agosto de 2011

Arduino conversando com Lego NXT via RS-485

Hoje finalmente consegui testar algo que já tinha vontade há algum tempo: comunicação entre Arduino e o NXT via RS-485. [Obrigado ao Ivan Seidel, que me emprestou um conector super bacana para ligar o cabo do NXT direto no pront-o-board! :-) ]

Para quem não conhece, o NXT é um bloco programável da Lego, ideal para quem quer trabalhar com robótica sem se preocupar com eletrônica. Ele é muito versátil! Você pode conhecer o NXT lendo este post.

O sistema que montei é o que está descrito no Rostrich's Blog, onde você vai encontrar o esquema para conexão entre o Arduino e o NXT, além dos programas para ambos:
http://rostrich.wordpress.com/2010/05/16/nxt-and-arduino-talking-rs-485/



Ele sugeriu o uso do chip MAX485, que é um circuito integrado de baixo consumo da Maxim dedicado a implementação de comunicação nos padrões RS-485 e RS-422. Veja o datasheet do integrado aqui.

Se você planeja usar outro Arduino que não o Uno ou o Nano, veja observação no final do post.

O sistema que montei tem poucas diferenças em relação ao descrito pelo Rostrich. Fisicamente, a diferença se resume ao CI que utilizei: como eu não tinha o MAX485, usei o MAX483, que é um CI equivalente mas com menor velocidade de comunicação. Talvez por isso eu não tenha conseguido alcançar a velocidade de 57600bps (bits por segundo) que o Rostrich diz ter conseguido. Ou seja, precisei fazer uma pequena alteração no código do arquivo baudrate.h, que ficou assim:

#define RS485_BAUD 28800

Também cheguei a testar com 38400bps, mas a comunicação falha de vez em quando. Essa falha pode ser por causa do meu circuito, feito em pront-o-board e com fios que mais parecem antenas... Mesmo assim, funcionou!

Arduino e NXT conversando via RS-485. Teste feito a 38.400 bps.
Cuidado, pois as velocidades de comunicação permitidas têm valores definidos. Usei 28800 bps, mas você pode usar menores. Veja todas aqui.

As outras diferenças do sistema que montei em relação ao do Rostrich são de software:

  • usei a versão 0022 para compilar o programa do Arduino;
  • meu compilador para o NXT é o NXC NBC-1.2.1-r3;
  • usei o Windows Vista.

A linguagem NXC (Not eXactly C), usada para programar o NXT, tem a mesma estrutura do C comum. A IDE que usei para compilar o programa em NXC e gravar o NXT é o Bricxcc. Ele é gratuito e pode ser baixado aqui. Informações sobre a linguagem NXC estão aqui.

Veja o resultado do sistema funcionando!


Ah! Se você ainda não fez isso, vai precisar atualizar o firmware do seu NXT para que o programa funcione: é necessário ter a versão 1.28 enhanced. Atualizei o meu com o que baixei neste link. O próprio Bricxcc tem um comando para atualização do firmware.

--- acrescentado em 05/01/2014 ---

O programa que está n no Rostrich's Blog foi desenvolvido para o Arduino Nano. Para usar com outros modelos de Arduino pode ser necessário fazer pequenos ajustes, pois o programa faz uso direto dos registradores do microconrtolador. No Arduino Uno (e Nano), com ATmega328, os pinos 10, 11 e 12 são mapeados nos bits PB2, PB3 e PB4 do registrador PORTB, respectivamente. Por exemplo, no Arduino Mega os pinos 10, 11 e 12 são mapeados nos bits PB4, PB5 e PB6 do PORTB.

Como o programa  que está n no Rostrich's Blog faz uso direto do registrador PORTB, para usá-lo no Arduino Mega é necessário alterar as linhas de definição dos bits de recepção e transmissão para os seguintes valores:

const byte RECV_RS485_BIT =  B00100000;
const byte SEND_RS485_BIT =  B00010000;

Outros modelos de Arduino podem exigir alterações semelhantes.

Agradeço ao leitor José Pedro Ribeiro Belo por ter feito a pergunta e por ter insistido em fazer o sistema funcionar com o Arduino Mega (veja comentários abaixo). :-)

---

Divirta-se! E até a próxima!

Referências:
http://rostrich.wordpress.com/2010/05/16/nxt-and-arduino-talking-rs-485/
http://forum.arduino.cc/index.php/topic,146511.0.html