terça-feira, 16 de junho de 2015

Controlando arduino através de um smartphone via bluetooth

Hoje estarei mostrando como é possível fazer interações com o arduino através de um smartphone via protocolo bluetooth. Primeiramente é necessário você ter em mãos um arduino (óbvio) e um usb host shield com um dongle bluetooth para poder fazer a comunicação com seu smartphone.
O hardware
Além disso, também é necessário você fazer o download de algum aplicativo que ofereça comunicação serial através de bluetooth para poder controlar o microcontrolador. Estou utilizando no momento um smartphone Nokia Lumia, equipado com Windows Phone 8.1 e consegui encontrar um aplicativo na loja chamado 'Bluetooth Agent' (https://goo.gl/ZrwIFK) que apresenta uma interface bem bacana com botões para você enviar comandos via serial bluetooth.


Nessa parte tudo o que você a fazer é colocar algum nome conveniente ao botão e configurar para cada botão enviar algum caractere. Um exemplo disso é o botão "Girar <" que ao ser pressionado envia o caractere "1" para a porta serial bluetooth. O mesmo funciona para os outros botões. Isso poderá ser entendido melhor ao analisarmos o código do arduino:

#include <SPP.h>
#include <usbhub.h>
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif

USB Usb;
BTD Btd(&Usb);
SPP SerialBT(&Btd);

int motorE1 = 2;
int motorD1 = 3;

int pin11 = 26;
int pin12 = 27;
int pin13 = 28;
int pin14 = 29;

int rele = A8;

void setup(){
  pinMode(motorE1, OUTPUT);
  pinMode(motorD1, OUTPUT);
  pinMode(pin11, OUTPUT);
  pinMode(pin12, OUTPUT);
  pinMode(pin13, OUTPUT);
  pinMode(pin14, OUTPUT);
  pinMode(rele, OUTPUT);
  digitalWrite(rele, HIGH);
  Serial.begin(115200);
  while (!Serial);
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); 
  }
  Serial.print(F("\r\nSPP Bluetooth Library Started"));
}

void loop(){
  Usb.Task(); 

  if (SerialBT.connected){
  char x = SerialBT.read();
  
  if(x == '1'){
    digitalWrite(pin11, LOW);
    digitalWrite(pin12, HIGH);
    analogWrite(motorE1, 255);
    digitalWrite(pin13, LOW);
    digitalWrite(pin14, HIGH);
    analogWrite(motorD1, 255);
  }
  
  if(x == '2'){
    digitalWrite(pin11, HIGH);
    digitalWrite(pin12, LOW);
    analogWrite(motorE1, 255);
    digitalWrite(pin13, HIGH);
    digitalWrite(pin14, LOW);
    analogWrite(motorD1, 255);
  }
  
  if(x == '3'){
    digitalWrite(pin11, HIGH);
    digitalWrite(pin12, HIGH);
    analogWrite(motorE1, 255);
    digitalWrite(pin13, HIGH);
    digitalWrite(pin14, HIGH);
    analogWrite(motorD1, 255);
  }
  
  if(x == '4'){
    digitalWrite(pin11, LOW);
    digitalWrite(pin12, HIGH);
    analogWrite(motorE1, 255);
  
  }
  
  if(x == '5'){
    digitalWrite(pin11, HIGH);
    digitalWrite(pin12, LOW);
     analogWrite(motorE1, 255);
  }
  
  if(x == '6'){
    digitalWrite(pin11, HIGH);
    digitalWrite(pin12, HIGH);
    analogWrite(motorE1, 255);
  }
  
  if(x == '7'){
    digitalWrite(pin13, LOW);
    digitalWrite(pin14, HIGH);
    analogWrite(motorD1, 255);
  
  }
  
  if(x == '8'){
    digitalWrite(pin13, HIGH);
    digitalWrite(pin14, LOW);
     analogWrite(motorD1, 255);
  }
  
  if(x == '9'){
    digitalWrite(pin13, HIGH);
    digitalWrite(pin14, HIGH);
    analogWrite(motorD1, 255);
  }
  
  if(x == 'a'){
    digitalWrite(rele, LOW);
  }
  
  if(x == '0'){
    digitalWrite(rele, HIGH);
  }
  
  if(x == 'b'){
    digitalWrite(rele, LOW);
    delay(1000);
    digitalWrite(rele, HIGH);
  }
 }
}

O código se baseia em comparações à variável 'x', pois na mesma é guardado o último valor de leitura da porta bluetooth. Sendo assim, quando x for igual à 1 (aquele '1' enviado pelo botão "Girar <") é executado tal comando para controlar uma ponte-h. O mesmo ocorre para todas as outras funções. 

Segue um vídeo de demonstração no qual controlei dois motores e um relé que faz acender uma lâmpada:


7 comentários:

  1. amigo posso usar esse seu código para controlar um braço robótico pelo celular?

    ResponderExcluir
  2. Parabéns Robison, estarei compartilhando o seu blog no face para ajudar!

    Obrigado pela resposta no forum da robocore.

    ResponderExcluir
  3. Parabéns Robison, estarei compartilhando o seu blog no face para ajudar!

    Obrigado pela resposta no forum da robocore.

    ResponderExcluir
  4. Mostra o esquema elétrico. Estou precisando controlar dois motores utilizando um arduino nano, uma ponte-h ld298, um bluetoothhc-08 no Iphone 4. Me ajuda aí, por favor.

    ResponderExcluir