Nesse post eu vou demonstrar como usar Ruby para fazer a comunicação entre um Arduino e um computador através da porta serial. No meu caso eu vou usar um Program-ME, que é o Arduino-Like da Globalcode. Mais detalhes do Program-ME podem ser vistos aqui, aqui, aqui, aqui e aqui. Tá bom, né? :p
Vou partir da premissa que você já tem o Ruby instalado e atualizado. Com as gems (RubyGems) e tudo, ok? O objetivo desse post não é ensinar a instalar e configurar o Ruby, e sim usá-lo com a porta serial do seu computador. Mais informações sobre como instalar o Ruby podem ser obtidas aqui, e as ruby gems aqui. Caso tenha tenha alguma dúvida ou problema nessa parte pode me enviar sua dúvida que vou tentar ajudá-lo.
Instalar SerialPort
Ruby-SerialPort é uma biblioteca que fornece facilidades para utilização das portas seriais do computador (padrão RS-232) usando Ruby.
Existem outras formas de acessar as portas seriais como JARs para aplicações Java, DLL para Windows, e várias outras maneiras. Mas para aplicações Ruby essa biblioteca é a mais usada e a que possuí melhor documentação, então fiquemos com ela.
Abra o terminal (Crt+Alt+T) e execute o comando abaixo para atualizar as gems:
sudo gem update
Para instalar a biblioteca SerialPort execute o seguinte comando.
sudo gem install serialport
Vamos testar a instalação da biblioteca fazendo o seguinte:
Execute o irb.
Agora execute os comandos abaixo no console do “irb”. Se a resposta for “true”, então a biblioteca foi instalada corretamente.
require 'rubygems' requile 'serialport'
Comunicação com o Program-ME / Arduino
int led_A = 7;
int led_B = 8;
void setup() {
Serial.begin(9600);
// define as portas como saida
pinMode(led_A, OUTPUT);
pinMode(led_B, OUTPUT);
}
void loop() {
// testa se a porta serial está disponível
if (Serial.available() > 0) {
// le os dados da porta serial armazena na variavel 'entrada'
int entrada = Serial.read();
switch (entrada) {
case 'A':
digitalWrite(led_A, HIGH); //acende led_A
break;
case 'B':
digitalWrite(led_B, HIGH); //acende led_B
break;
case 'a':
digitalWrite(led_A, LOW); // apaga led_A
break;
case 'b':
digitalWrite(led_B, LOW); // apaga led_B
break;
}
}
}
Agora vamos ao programa Ruby.
require 'rubygems' require 'serialport' sp = SerialPort.new "/dev/ttyUSB0" # use "while true do" se quiser executar sem parar for i in 1..10 do sp.write "A" sp.write "b" sleep 1 sp.write "a" sp.write "B" sleep 1 end
Para executar o programa execute a seguinte na linha de comando: ruby <nome_do_arquivo>.rb. No meu caso ficou assim.
ruby envia_dados_serial.rb
O programa vai apagar e acender alternadamente os dois LEDs por 10 vezes. Tudo muito simples, mas vamos a algumas explicações.
Na linha “4″ a classe “SerialPort” irá criar o objeto responsável pela comunicação serial e passamos o endereço da porta serial como parâmetro. No meu caso é a “/dev/ttyUSB0″, mas poderia ser “/dev/ttyS1″ ou até mesmo “COM7″ no caso do Windows (Sim. Funciona no Win). Nessa linha também podemos definir a taxa de dados (rate) por segundo para transmissão de dados serial. Por padrão o “SerialPort” utiliza “9600″, por isso não precisamos declarar explicitamente, mas poderia fazer algo assim: sp = SerialPort.new “/dev/ttyUSB0″, 9600. Mas deve ser a mesma que o programa do Program-ME/Arduino está configurada.
Já o comando “write” envia o texto para a porta serial configurada.
Você pode dizer: Pô! Mas porque testar com dois leds? O Arduino só tem um.
Bom! Por dois motivos: Primeiro. Eu achei o efeito com os dois LEDs mais legal. Mas é claro que você pode usar somente o LED na porta 13 do Arduino apagando as linhas desnecessárias, ou até mesmo usar duas portas digitais e fazer igual. Fica à seu critério. Segundo. Para mostrar, de novo, como esse Program-ME é bacana e facilita muito esse tipo de teste. (Fight! Program-ME Wins) rsrsrsrsrs
Esse mesmo teste pode ser feito usando o “irb” diretamente. Como exemplificado abaixo.
Pretendo fazer um vídeo para demonstrar esse programa. Aguardem…
Conclusão
Tudo muito fácil. Bem a cara do Ruby, né?
Fiz o mesmo teste usando Java, e deu um “pouco” mais de trabalho.
. Eu também pretendo fazer um post parecido mostrando como fazer a configuração da porta serial e a comunicação, só que usando Java. Mas vai ficar pra um mais tarde.
Espero que o post tenha sido útil
Abs.





