Pular para o conteúdo

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.
João Victor vikitor566
Hits: 91.687 Categoria: Python Subcategoria: Outros
  • Indicar
  • Impressora
  • Denunciar

Parte 5: 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)

   1. Introdução
   2. Montagem do robô
   3. Programando
   4. Bluetooth
   5. Integrando recursos
   6. Aplicação de controle
   7. Conclusão

Python com SL4A - A camada de script do Android

Como criar um bot para curtir e comentar perfis do Instagram

Arduino com Bluetooth e pySerial

Desenvolvendo aplicações GUI simples em Python & Glade (PyGTK) com banco de dados SQLite

Threads - Importância dentro de um software

Criando um leitor de RSS com Python

#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

Entre na sua conta para comentar.