Comunicação Serial com Ruby e Program-ME (Arduino) no Ubuntu

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

Com a biblioteca instalada e testada vamos ver seu funcionamento com o Program-ME.
Vou fazer um teste usando os LEDs do Program-ME que estão nas portas digitais 7 e 8.
Um programa bem simples que irá tratar as informações recebidas através da porta serial. Irá acender os LEDs 7 e 8, se a porta serial receber ‘A’ ou ‘B’, respectivamente e apagar se a porta receber ‘a’ ou ‘b’.
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.

Tags: , , , , , , ,

16 comments

  1. 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

  2. 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.

  3. 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.

  4. 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 🙂

  5. 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.

    > gem install serialport

    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.

  6. 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’

  7. esse erro ja revolvi Marco, era o Devkit. Mas esbarrei no erro da lina 4 no IRB.

  8. 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.

  9. […] para o microcontrolador. O SerialPort permite também programar outras placas Arduino-like, como a Program-ME. Programando Arduino – sem Arduino Caso você queira aprender a programar microcontroladores […]

  10. Marco muito obrigado, parabéns pelo site. vc me ajudo mt. Vlw mesmo.

  11. Obrigado.
    Bom ter ajudado.
    Se precisar de mais alguma coisa é só falar. 😉
    Abs.

  12. 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

  13. […] SerialPort O SerialPort é uma biblioteca Ruby que permite utilizar as portas seriais do computador (padrão RS-232). Essa gem é mencionada no site do Arduino como opção para programadores escreverem scripts Ruby para o microcontrolador. O SerialPort permite também programar outras placas Arduino-like, como a Program-ME. […]

  14. Olá Maciel, existe a possibilidade de comunicar um leitor biométrico (Scanner de Digital) com o Ruby???

  15. Oi, Max.
    Penso que seja possível, sim. Nunca mexi com scanners, mas se ele tiver alguma API que permita comunicação via porta serial seria possível integrar com Ruby. Dá uma pesquisada na documentação do scanner, e se conseguir avisa aí 😉
    Abs, Marco.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *