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)