sábado, 30 de julho de 2016

Arduino + Bluetooth + Android (parte 3)

Android!

Já viu na internet um controle de drone via bluetooth, feito por iPhone? Esse vídeo ficou famoso pois o autor controlava um quadcóptero. Eu lembro dele pois quando ele foi divulgado os nossos aparelhos Android careciam de alguns hardwares interessantes, por exemplo, acelerômetro! (Os que tinham eram realmente caros).

Ok... fim da sessão naftalina. Certifique-se de que o SEU SMARTPHONE, tenha acelerômetro (se nao tiver, Ok, desenvolvi uma interface de dedo) :)

AppInventor

O MIT (isso mesmo Massachussets Institute of Technology) em parceria com a Google, desenvolveu um ambiente chamado AppInventor. Ele permite de forma gráfica e de layout simplificado desenvolver aplicativos para Android.

Quem já conhece Scratch, não terá problemas para  desenvolver nele. 

Já desenvolvo para Android há anos, mas uso o SDK. Isso toma mais tempo e mais linhas de código. No desafio que eu recebi, eu só tinha 2 dias para fazer a solução completa! Essa parte ficou no 2o dia.

Quer saber mais sobre o AppInventor? http://appinventor.mit.edu/explore/index-2.html

O design do aplicativo

Desenhar o aplicativo no AppInventor não é um bicho de 7 cabeças. Mas o que quero mostrar aqui, é como posso tirar proveito do mesmo design discutido nos artigos anteriores sem alterar uma virgula sequer.


Na tela acima temos o design do mesmo, os botões de direção, a seleção com conexão/desconexão do bluetooth, e no quadro abaixo does botões de ativação e comando de direção, a visualização dos registros do acelerômetro;

Conforme o balanço do acelerômetro, haverá o despacho do respectivo comando para os motores.

Abaixo do design da tela, no campo Non-visible componentes, tem os componentes responsáveis por conexão por bluetooth, leitura do acelerômetro, e um componente específico para mostrar os alertas do sistema.


O programa

Bom, não é minha intenção ensinar ninguém a programar, mas vou mostrar aqui uma parte interessante do programa que eu fiz. 


Esse são os trechos do programa em que comunico com o arduino via Bluetooth. Olha que estou enviando os mesmos comandos que especifiquei e foi testado.

Na parte da esquerda o comado do acelerômetro. Tem uma esperteza ali; dependendo do intensidade da inclinação (maior que 2, ou menor que -2) o respectivo comando é enviado pro bluetooth.

Pra quem nunca programou usando AppInventor, a programação é assim mesmo. Caixinha com caixinha, igual Lego... legal!

Eis aqui o link do resultado final https://www.youtube.com/watch?v=VqTXDF1rouc

Este programa está disponivel na App Store: https://play.google.com/store/apps/details?id=appinventor.ai_mauricio_marcosta.BTMotor

sexta-feira, 29 de julho de 2016

Arduino + Bluetooth + Android (parte 2)

Fez a parte 1? Arduino + Bluetooth + Android (parte 1)

Se não fez, estudou ou visitou, faça-o. Meus artigos seqüenciais são extremamente dependentes um do outro.

--//--

Para estudar essa parte 2, precisamos lançar mão daqueles módulos Bluetooth disponibilizados nos sites tipo MercadoLivre, AliExpress, DX, entre outros (se bobear, tem alguém ou alguma casa de eletrônica que os vende)... arrume um! Rápido!

Esses módulos são especializações dos chips de suporte a bluetooth que disponibilizam uma comunicação serial (nível TTL). E se for olhar pelo stack de protocolos bluetooth, ele só implementa o profile SPP (Serial).

Bom isso é mais do que suficiente!

O aspecto dele é simples, e assim:
Ele já tem um conversor de nível embutido se ele vier montado na plaquinha azul, Caso contrário ele é 3,3V e tem que tomar muito cuidado ao conectar ao arduino. Procure os que já tem a plaquinha azul.

Veja que ele já tem as marcas de VCC, GND, TX, RX... isso facilita bastante para conectar ao arduino. O esquema básico é plugar o RXD do Bluetooth, to TXD do arduino, o TXD do bluetooth no RXD do arduino e o VCC/GND nos seus respectivos portos.

Um ledzinho na plaquinha irá ficar piscando. Isso significa que ninguém está conectado a ele. Quando fizer o pareamento e a conexão, o led ficará aceso, estático.

Para conectá-lo ao arduino obedeça ao seguinte esquema.
Veja que não fiz nenhuma alteração ao circuito do post anterior. Só adicionei o circuito do bluetooth! E nem precisa alterar o programa da etapa anterior!!!

ATENÇÃO: Em algumas placas, por exemplo o meu HC06, o setup RX/TX do Bluetooth parece invertido. Portanto siga o esquema:
ArduinoVCCVCCBluetooth
GNDGND
TXRXD
RXTXD



Ligue o Arduino. O led do modulo bluetooth deverá permanecer piscando.

Conectando-se ao Bluetooth!

Não é nenhum bicho de sete cabeças mas vai exigir alguma disciplina. Não vou descrever como se faz mas certifique que o seu computador que tenha o bluetooth nativo (se o seu note ou computador não tem, você terá que gastar uns $$$ para comprar um adaptador bluetooth)

Enquanto o modulo bluetooth pisca, ele fica sinalizando para os sistemas ao redor: "Ei, estou aqui e me chamo X"; Esse X pode ser LINVOR se for um módulo HC-05, ou HC-06 (para modulos desse naipe);

Antes de mais nada você precisa registrar esse módulo como um "pareado" no sistema.  A senha para o pareamento é "0000" ou "1234".

Habilite o bluetooth, e espere ele "descobrir" algum dispositivo com o nome acima. Conecte-se a ele, informe a senha!

Pareou? Tudo tranquilo? O Windows vai criar uma porta serial VIRTUAL. Deve ser alguma COM3, COM4, COM5, COM8, etc...

Usando o programa terminal (PuTTY ou Termite) procure por essa nova COM e conecte usando os parametros: 9600, 8bits, N (sem paridade) 1 stop bit (ou simplificando 9600,8N1);

Assim que conectar-se, o led irá ficar acesão. Voce está ali, pronto para mandar os comandos.

Mande lá os comandos ESDXZ[espaço]M... divirta-se. Você  já está 100% wireless.


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".