sábado, 23 de julho de 2016

Arduino + Bluetooth + Android (parte 1)

Foi se o tempo em que fazer piscar o led no Arduino já bastasse para entrar em êxtase. Peguei essa fase nos primeiros Arduinos. A dispensa daqueles programadores e fuse bits complicados já era coisa do passado.

Hoje temos à nossa disposição mais do que uma plataforma de desenvolvimento de hardware, mas uma possibilidade de inclusão dos dispositivos ao mundo IoT (Internet Of Things)

--//--

Por estes dias, recebi um desafio de um professor, amigo meu. Ensinar para uma turma de robótica os mecanismos de comunicação Bluetooth.

Mas não era um pequeno tutorial. Abrangeria demonstração com o Arduino e um controle básico usando o Android!

Challenge Accepted!

--//--

Quem já acompanhou em tópicos anteriores, montei há uns 2 ou 3 anos atrás um pequeno carro motorizado (kit da Tamyia) com um driver L293  e um outro usando o poderoso L298. O projeto do 298 está por aqui. Mas para não confundir ninguém resolvi simplificar o circuito simulando parte dos comandos usando LEDs.

Então vamos lá, o circuito base é o representado ao lado no breadboard. (Na demonstração com o arduino usei um shield, mas o esquema de conexão é o MESMO!)

O programa

Antes de qualquer coisa, precisamos definir os requisitos básicos do firmware. Vamos pensar como se estivéssemos controlando um motor. Linha para ativar o motor, linha para definir a direção conforme quadro abaixo:

LedItem"0""1"
VermelhoAtivaçãoInativoAtivo
VerdeRotaçãohorárioanti-horário

No circuito apresentado, então temos 2 conjuntos de led Verde+Vermelho. Cada um significa um motor!

E como comandarei esses "motores"? Bem, vamos aproveitar a linha serial do Arduino e utilizar um programa terminal (Termite/PuTTY) para testar o programa. Agora definirei como fazer a interação.

A minha sugestão é usar as letras das teclas para dar ações. Quem jogou usando o teclado do computador, sabe o significado das teclas E,S,D,X. 

E, seria como mandar o motor pra frente, X para trás. S e D, fazem as vistas de esquerda e direita. Poderia usar as setas? poderia, mas o teclado do computador envia códigos complexos quando são as setas. Então, prefiro ficar no simples...

As outras teclas são: M e espaço: ativa/desativa o motor. E por fim "Z", zera o seu estado.

Simples?

--//--
Não. Abstraia... abstraia. Não o fiz com motores porque não tive o controlador em mãos, Ok. Mas o principio é o mesmo. Lembre-se que temos 4 leds, 2 verdes, 2 vermelhos. Cada um fazendo como se fosse um estado do motor.

Para girar um carro de 2 motores, podemos usar um artificio de girar motores em contraposição.Isto é, se girarmos um motor para um sentido e outro no sentido contrário, o conjunto todo irá girar para.

Nesse esquema teremos a seguinte indicação dos leds

Fácil! :) Lembre-se, os vermelhos estão acionados, (M ou espaço, alternam seu estado); led verde escuro, desativado; verde claro, ligado.

Vamos pro nosso primeiro algoritmo! Implemente o circuito acima e transfira o programa abaixo para o Arduino (Edite usando ArduinoIDE, compile e transfira).


// Este sketch adiciona porta serial e o controle de motores usando um terminal 
//    E       - posiciona o motor à frente   m12=m22=0;
//  S         - posiciona o motor à esquerda m12=1; m22=0
//      D     - posiciona o motor à direita  m12=0; m22=1
//    X       - posiciona o motor à ré       m12=m22=1;
// [espaço]M  - Ativa/desativa o motor       m11=m21=1/0
//  Z         - inicializa                   mXY=0;


// Definição dos motores 
// mXY onde:
// X=motor (1 ou 2) 
// Y=direção (0 FW; 1 BW)
// usando os pinos 8,9,10 e 11 do arduino
int m11=8;
int m12=9;

int m21=11;
int m22=10;

// armazena o estado do motor
int motor=0; // off

void testaLed() {
  //testa os leds...
  digitalWrite(m11,HIGH);
  digitalWrite(m12,LOW);
  digitalWrite(m21,HIGH);
  digitalWrite(m22,LOW);
  delay(500);
  digitalWrite(m11,LOW);
  digitalWrite(m12,HIGH);
  digitalWrite(m21,LOW);
  digitalWrite(m22,HIGH);
  delay(500);
}


void setup() {
  //inicia os pinos de controle do motor
  pinMode(m11,OUTPUT);
  pinMode(m12,OUTPUT);
  pinMode(m21,OUTPUT);
  pinMode(m22,OUTPUT);

  Serial.begin(9600);

  // comente a linha abaixo se realmente estiver
  // usando um motor.
  testaLed();

  // motor desligado e registros zerados
  motor=0;
  digitalWrite(m11,LOW);
  digitalWrite(m12,LOW);
  digitalWrite(m21,LOW);
  digitalWrite(m22,LOW);
}


void loop() {
  // le instrução da porta serial
  while(Serial.available()>0) {
    char c=Serial.read();
    switch(c) {
      case 'Z': // zera o motor (desliga)
      case 'z':
        motor=0;
        digitalWrite(m11,LOW);
        digitalWrite(m12,LOW);
        digitalWrite(m21,LOW);
        digitalWrite(m22,LOW);
        break;
      case 'M': // alterna o estado do motor on/off
      case ' ': // espaço:
        motor=!motor; // inverte o estado do motor
        digitalWrite(m11,motor?HIGH:LOW);
        digitalWrite(m21,motor?HIGH:LOW);
        break;
      case 'E': // pra frente
      case 'e':
        digitalWrite(m12,LOW);
        digitalWrite(m22,LOW);
        break;
      case 'X': // pra tras
      case 'x':
        digitalWrite(m12,HIGH);
        digitalWrite(m22,HIGH);
        break;
      case 'S': // gira à esquerda
      case 's':
        digitalWrite(m12,HIGH);
        digitalWrite(m22,LOW);
        break;
      case 'D': // gira à direita
      case 'd':
        digitalWrite(m12,LOW);
        digitalWrite(m22,HIGH);
        break;
    }
  }
}


Transferiu para o Arduino? Então conecte-se a ele, usando um programa de terminal ou até mesmo o Monitor de Porta Serial (no Arduino IDE), mande os comandos E,S,X,D,M,Z, espaço para compreender o seu funcionamento!

Na parte 2 iremos fazer o mesmo, só que via Bluetooth. Se ainda nao tem um modulo, arrume um, para nao perder o trem da "estória".

Nenhum comentário:

Postar um comentário