Robótica com Android e Arduino

Nesse artigo, pretendo descrever o processo de criação de um robô baseado na plataforma Arduino e integrado ao Android, através da camada de script SL4A.

[ Hits: 88.580 ]

Por: João Victor em 16/04/2014


Integrando recursos



Os Smartphones com android, apresentam grandes recursos que usamos de diversas formas, como o acelerômetro para jogos, o uso de GPS para localização, diversos tipos de conexões, como Bluetooth, 3G, Wi-Fi e, grande parte desses recursos, podem ser usados em nosso robô, através da camada de script do Android (SL4A).

Porém, é inviável usar todos recursos juntos, por isso, vou destacar algumas funções que seriam interessantes para o uso em conjunto com o Arduino, não só com projetos de robótica, mas, em qualquer projeto que venhamos a desenvolver.

A seguir, temos vários exemplos que mostram como é feita a integração com determinado recurso a partir da conexão Bluetooth.

Sensores

A gama de sensores presente em um Smartphone aliada a um robô, pode gerar aplicações fantásticas. O código abaixo, mostra como fazer a leitura dos sensores:

import android
droid = android.Android()
droid.startSensingTimed(1, 250)
s1 = droid.readSensors().result
s2 = droid.sensorsGetAccuracy().result
s3 = droid.sensorsGetLight().result
s4 = droid.sensorsReadAccelerometer().result
s5 = droid.sensorsReadMagnetometer().result
s6 = droid.sensorsReadOrientation().result
droid.stopSensing()

Após importarmos a biblioteca Android e criarmos o objeto droid, começamos a escutar os sensores.

A função droid.startSensingTimed(A,B), recebe como parâmetros A(1 = Todos Sensores, 2 = Acelerômetro, 3 = Magnetrômetero 4 = Luz) e B(Intervalo entre a leitura dos sensores em ms). Para integrar os sensores ao Arduino, devemos ler os valores dos sensores e enviar via serial.

No exemplo abaixo, usamos o sensor de luz para controlar um LED:

import android
droid = android.Android()
droid.toggleBluetoothState(True)
droid.bluetoothConnect('00001101-0000-1000-8000-00805F9B34FB')
droid.startSensingTimed(1, 250)
while True:
  luz = droid.sensorsGetLight().result
  if(luz > 0):
    droid.bluetoothWrite('d')
    print 'Desligado'
  else:
    droid.bluetoothWrite('l')
    print 'Ligado'

droid.stopSensing()

No Arduino, apenas lemos os valores enviados pelo Android e acendemos o LED:

int ledPin = 13;
char estado;
void setup(){
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}
void loop(){
if (Serial.available() > 0){
 estado = Serial.read();
 if(estado == 'l'){
  digitalWrite(ledPin,HIGH);
 }
 else if(estado == 'd'){
  digitalWrite(ledPin,LOW);
 }
}

Voz

Um dos recursos mais simples de manipular, mas, um dos mais poderosos. A capacidade de comunicar em linguagem humana, faz com que o robô se torne amigável e acessível.

Usando um sensor, poderíamos programar o robô para falar quando detectasse um movimento. O código abaixo, faz com que o Arduino, em conjunto com o sensor, sirva de gatilho para acionar o programa rodando no Android, que decide qual saudação dizer.

#include "Ultrasonic.h"
int echoPin=5;
int trigPin=6;
int vccPin=7;
int d1,d2,d;
Ultrasonic ultrasonic(trigPin,echoPin);
void setup() {
 pinMode(echoPin,INPUT);
 pinMode(trigPin,OUTPUT);
 pinMode(vccPin,OUTPUT);
 digitalWrite(vccPin,HIGH);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);
 Serial.begin(57600);
}

boolean movimento(){
 boolean mov;
 d1 = ultrasonic.Ranging(CM);
 delay(500);
 d2 = ultrasonic.Ranging(CM);
 d = (d1-d2);
 if(d > 10){
  mov = true;
 }else{
  mov = false;
 }
 return mov;
}

void loop() {
 if(movimento()){
 Serial.print("m");
 }
}

O código do Arduino, basicamente, chama uma função que faz duas leituras com um intervalo de meio segundo. Se a diferença entre essas medições for maior que 30 cm, indica que houve movimento; a partir do movimento, o Arduino envia o caractere m para o Android, que decide qual cumprimento dizer.

from datetime import datetime
import android
droid = android.Android()
droid.toggleBluetoothState(True)
droid.bluetoothConnect('00001101-0000-1000-8000-00805F9B34FB')
while True:
  movimento = droid.bluetoothReadLine().result
  if(movimento == 'm'):
    agora = datetime.now()
    if(agora.hour > 5 and agora.hour < 12):
      fala = "Bom dia"
    elif(agora.hour < 18):
      fala = "Boa tarde"
    else:
      fala = "Boa noite"
    droid.ttsSpeak(fala)

O código acima conecta-se ao Arduino e espera o sinal para, literalmente, falar, a frase é decidida a partir da comparação de horários. A sintaxe é basicamente a mesma dos outros exemplos, porém, com a função ttsSpeak(String), só precisamos passar a String que deve ser falada.

* Lembrando que é necessário o uso de Internet e de ter o pacote de idiomas instalado.

Câmera

Um robô pode levar uma câmera até lugares onde um homem não entraria e a integração de um robô com um Smartphone de última geração, permite o uso de câmera de alta definição.

Com o uso de alguns servos motores e uma estrutura adequada, poderíamos movimentar o celular de diversas maneiras, usando um terminal remoto para controlar o celular que, por sua vez, controlaria o robô, porém, a estrutura desse robô não permite a movimentação da câmera, então, usaremos o último exemplo como partida. O robô utilizará o mesmo código que aciona a fala para acionar a câmera a partir de um movimento.

from datetime import datetime
import android
droid = android.Android()
droid.toggleBluetoothState(True)
droid.bluetoothConnect('00001101-0000-1000-8000-00805F9B34FB')
local = '/sdcard/sl4a/scripts/'
while True:
  agora = datetime.now()
  movimento = droid.bluetoothReadLine().result
  if(movimento == 'm'):
    arquivo = str(agora.month)+str(agora.day)+str(agora.hour)+str(agora.min)+str(agora.second)+'.jpg'
    caminho = local + arquivo
    droid.cameraCapturePicture(caminho, True)

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Montagem do robô
   3. Programando
   4. Bluetooth
   5. Integrando recursos
   6. Aplicação de controle
   7. Conclusão
Outros artigos deste autor

Python com SL4A - A camada de script do Android

Leitura recomendada

Redes definidas por Software com Mininet e POX - Criando meu primeiro Controlador

Pydev - Preparando o Eclipse para o Python

RapidScan - Multi-Tool WEB Vulnerability Scanner

Esteganografia e Esteganálise: transmissão e detecção de informações ocultas em imagens digitais

Python Flask Básico

  
Comentários
[1] Comentário enviado por albfneto em 16/04/2014 - 19:46h

Muito bom isso! favoritado

[2] Comentário enviado por vikitor566 em 16/04/2014 - 23:02h

Muito obrigado albfneto

[3] Comentário enviado por Lisandro em 16/04/2014 - 23:18h

Excelente! Parabéns pelo artigo e pela paciência. Por várias vezes pensei em fazer um artigo semelhante e sei bem o trabalho que dá.
Já está nos meus favoritos.

[4] Comentário enviado por mcnd2 em 17/04/2014 - 13:19h

Muito interessante.

Artigo muito bem explicado e de fácil entendimento.

10!

[5] Comentário enviado por vikitor566 em 17/04/2014 - 14:03h

Muito obrigado a todos, o trabalho é recompensado quando o artigo consegue compartilhar a idéia pelo qual foi feito.

[6] Comentário enviado por Sandro1 em 17/04/2014 - 21:24h

Excelente artigo e como já disseram está muito bem explicado, qualquer pessoa vai conseguir fazer esse robô!

[7] Comentário enviado por k_cesar em 20/04/2014 - 13:52h

Parabéns pelo artigo.
Excelente!

[8] Comentário enviado por matiasalexsandro em 22/04/2014 - 23:56h

excelente artigo favoritado pra projetos futuros

[9] Comentário enviado por vikitor566 em 23/04/2014 - 09:59h

Muito obrigado a todos

[10] Comentário enviado por JFurio em 19/05/2014 - 09:14h

Realmente, nota 10 mesmo ! Cheguei até a estudar um orçamento e ligar em umas lojas para ver uns orçamentos, e realmente não é tão caro ! Vou tentar montar um dia, e independente do resultado, posto aqui ! Vlw !


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts