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.
Related posts:
Tags: arduino, gem, porta serial, program-me, ruby, rubygems, serial, serialport






Ae Marcão, belo post camarada!
E vc tem experiência com esta lib serial para Windows?
Estou fazendo um hackign com Google Sketchup com Arduino e precisaria do Ruby + Serialport para windows pois o sketchup não foi portado para Linux.
Parabéns por mais esta colaboração com a comunidade Arduino, Ruby e afins.
Abraços,
Vinicius
Oi Vinicius.

Valeu pelo comentário.
Eu fiz duas instalações dessa lib no Windows. Uma usando “Cygwin” (que funcionou de primeira, igual no ubuntu) e outra no SO direto pelo terminal. Essa última deu mais trabalho, mas consegui
Um amigo também me perguntou sobre essa instalação no Windows e eu pensei até em fazer um outro post sobre isso.
Se você puder esperar eu posso te passar os passos mais tarde. Amanhã no máximo. Antes de fazer o post
Qualquer coisa pode perguntar.
Grande abraço.
Marco.
Pra você fazer o mesmo teste utilizando Python…
http://www.coding.com.br/programacao/pyserial-utilize-o-python-para-controlar-a-interface-serial/
Legal, cara.
Valeu pela dica. Não conheço python, mas sei que ele e ruby tem coisas em comum.
Dá pra ver que a simplicidade é uma delas
Abs.
Muito bom site Marcos, minha meta até e poder controla pelo menos o portão de casa via web. E eu queria fazer isso com o arduino e Ruby on Rails, porem eu encontrei as mesmas dificuldades do Vinicius na instalação no Windows da serialport, vc poderia me passar o passo-a-passo tb, e se poder me da umas dicas para iniciantes agradeço
Opa. Valeu pelo comentário.
Tenho que procurar o passo-a-passo, mas o problema que tive foi no Windows XP. No Windows 7 não tive problemas. Foi só instalar a ‘gem’ normalmente.
E tudo funcionou. Tenta isso primeiro, se não der me manda o erro que eu tento ajudar.
Enquanto isso procuro o tutorial e se achar te mando.
Pode ser?
Abs.
Olá Marciel deu esse erro aqui.
ERROR: Error installing serialport:
The ‘serialport’ native gem requires installed build tools.
Please update your PATH to include build tools or download the DevKit
from ‘http://rubyinstaller.org/downloads‘ and follow the instructions
at ‘http://github.com/oneclick/rubyinstaller/wiki/Development-Kit‘
esse erro ja revolvi Marco, era o Devkit. Mas esbarrei no erro da lina 4 no IRB.
Amigo. Desculpe a demora, mas esses dias tem sido muito corridos.
Vamos lá. A linha 4 que vc se refere é essa aqui: sp = SerialPort.new “/dev/ttyUSB0″
Esse padrão de nome de porta serial é usado pelo Linux. Se for esse o caso então vc tem que mudar e usar o padrão de nomes de portas do Windows, que é diferente. O Win usa COM. Ficaria algo como:
sp = SerialPort.new “COM16″
Para ver qual a porta do seu arduino basta olhar no menu Tools -> Serial Port da IDE do arduino.
Abs.
Marco muito obrigado, parabéns pelo site. vc me ajudo mt. Vlw mesmo.
Obrigado.
Bom ter ajudado.
Se precisar de mais alguma coisa é só falar.
Abs.
Olá Marco, so tenho mais uma dúvida, como é que faço para controlar esse programa via web, eu sei que da via GAE mas ele é mt limitado para operaçoes um pouco mais complexas, vc nao teria uma outra sugestão de serviços parecidos?
Obrigado