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)