05
nov 11

Robótica e PHP com Arduino @ PHPn’Rio 2011

Esse post é para divulgar o material que eu e a Desireé usamos na nossa palestra no PHP’n Rio 2011. O evento foi ótimo, com palestras interessantes 😉 , mini cursos e uma área para temas livres. Muito bom mesmo. O pessoal da organização está de parabéns. Obrigado ao Ralphael Almeida pelo convite.
Aqui está o link para o meu Github para o download dos fontes do projeto e a apresentação.
Abs, Marco

02
jul 11

Robótica e Computação nas Nuvens

Aí estão os arquivos da palestra que eu fiz no FISL 12 e no TDC 2011 sobre Arduino, Robótica e Computação nas Nuvens.

Update: também apresentei no CEFET Summer of Code em 29/07 😉

Abaixo da apresentação estão os fontes dos projetos que eu criei para demonstrar o uso do Google App Engine e o Arduino.

Vídeo do braço robô em ação

http://www.youtube.com/watch?v=3xjVs3T-rpk

Projeto web

Criado com criado com Google App Engine
Projeto Eclipse: Clouduino.zip
Usa o plugin do Google App Engine para eclipse.

Programa local

Programa que roda localmente e lê as informações da aplicação web..
Projeto Netbeans: ClouduinoLocal.zip
Usa a lib Jettison 1.2 para ajudar no parse do JSON.

Programa Arduino

Lê a porta serial e executa o comando enviado.

#include

Servo myservo1;
Servo myservo2;
Servo myservo3;

int pinServo1 = 10;
int pinServo2 = 11;
int pinServo3 = 9;
int velocidade = 5;
int pos;
int entrada;

void setup()
{
  myservo1.attach(pinServo1);
  myservo2.attach(pinServo2);
  myservo3.attach(pinServo3);

  myservo1.write(180);
  myservo2.write(0);
  myservo3.write(90);

  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0) {
    while (Serial.available()>0) {
      entrada = Serial.read();
      Serial.print(entrada);
      delay(1);
    }
      if (entrada == '1'){
  	sobe();
      } else if (entrada == '2'){
  	desce();
      } else if (entrada == '3'){
  	esquerda();
      } else if (entrada == '4'){
  	direita();
      } else if (entrada == '5'){
  	abre();
      } else if (entrada == '6'){
          fecha();
      } else {

      }
  }
}
void desce(){
   for(pos = 0; pos < 180; pos += velocidade) {                                          	       myservo1.write(pos);         	       delay(10);                                }    }    void sobe(){          for(pos = 180; pos>=1; pos-= velocidade) {
     myservo1.write(pos);
     delay(10);
  }
}
void esquerda(){
  for(pos = 0; pos < 180; pos += velocidade) {                                          	     myservo2.write(pos);         	     delay(10);                               }    }    void direita(){       for(pos = 180; pos>=1; pos-= velocidade) {
    myservo2.write(pos);
    delay(10);
  }
}
void abre(){
  for(pos = 0; pos < 90; pos += velocidade) {                                          	      myservo3.write(pos);         	      delay(10);                               }    }    void fecha(){           for(pos = 90; pos>=1; pos-= velocidade) {
       myservo3.write(pos);
       delay(10);
  }
}



08
ago 10

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.