Neste post, é mostrado como controlar um Arduino com um smartphone usando um método fácil, através de um módulo Bluetooth HC-05 ou HC-06.
Para saber como funciona a tecnologia Bluetooth, clique no link abaixo.
Os módulos HC-05 e HC-06
Além do número de pinos, como mostra a figura acima, o HC-06 só pode ser usado como escravo, ou seja, apenas recebe dados e transmite para o Arduino. Enquanto o HC-05 também pode operar no modo mestre, ou seja, pode transmitir dados para outros módulos Bluetooth. Nos projetos apresentados neste post, o HC-05 é usado apenas para receber comandos do celular. As funções dos pinos do módulo são:
- VCC: a alimentação positiva, pode ir de 3,6V a 6V. Pode ser conectado diretamente ao terminal 5V do Arduino.
- GND: chamado de terra, deve ser ligado ao GND do Arduino.
- TXD: o terminal de transmissão de dados, deve ser ligado ao pino digital 0 do Arduino.
- RXD: o terminal de recepção de dados, fica conectado ao pino digital 1 do Arduino.
- STATE: este pino está conectado ao LED. Indica se o módulo está conectado com algum dispositivo via Bluetooth. Se estiver conectado, retorna nível “ALTO” (5V), caso contrário, retorna nível “BAIXO” (0V).
- EN: é usado para configurar o HC-05 como mestre. Com este pino, pode-se habilitar o módulo para modo de dados ou modo de comando AT, este é para ser usado como mestre. Por padrão de fabricação, o estado padrão do HC-05, sem receber um sinal externo, é o modo de dados.
O aplicativo
Existem vários aplicativos para controlar o Arduino via Bluetooth. Para os projetos neste post, escolhi o aplicativo “Bluetooth Automation HC-05”, cujo link está aqui.
Projetos com o módulo HC-05
Controlando dispositivos pelo celular
Materiais necessários:
- Arduino Uno.
- Protoboard.
- Fios.
- Resistores: 1 de 470Ω e 1 de 1kΩ.
- LED de qualquer cor.
- Buzzer.
- Diodo zener.
- MOSFET IRF640N.
- Motor CC.
- HC-05.
O código a seguir.
char data;
int LED=12;
int buzzer=11;
int motor=10;
void setup() {
Serial.begin(9600);
pinMode(LED,OUTPUT);
pinMode(buzzer,OUTPUT);
pinMode(motor,OUTPUT);
}
void loop() {
data=Serial.read();
Serial.println(data);
switch(data){
case 'A':
digitalWrite(LED,HIGH);
break;
case 'a':
digitalWrite(LED,LOW);
break;
case 'B':
digitalWrite(buzzer,HIGH);
break;
case 'b':
digitalWrite(buzzer,LOW);
break;
case 'C':
digitalWrite(motor,HIGH);
break;
case 'c':
digitalWrite(motor,LOW);
break;
}
}
Este projeto deve funcionar como mostra o vídeo.
Veículo controlado pelo celular
Lista de materiais para este projeto:
- Arduino Uno.
- Chassi de robô com 4 rodas Mecanum para Arduino.
- Shield de ponte H para 4 motores.
- Fios.
- Chave de 1 polo e 3 terminais.
- 2 baterias recarregáveis Li-ion de 4,2V e 12000mAh.
- Suporte para baterias.
- Um sensor LDR.
- Resistores: 1 de 15kΩ e 4 de 1kΩ.
- LEDs brancos de alto brilho.
- Módulo Bluetooth HC-05.
Abaixo o algoritmo, quando o sensor com LDR não detectar luz, os LEDs acendem.
#include <AFMotor.h>
//Portas analogicas A0 A1 A2 A3 A4 A5
//Portas Digitais 12 13 14 15 16 17 18 19
char dados;
int LEDS=14;
const int LDR=A3;
int stateLDR=0;
AF_DCMotor motor1(1,MOTOR12_64KHZ);
AF_DCMotor motor2(2,MOTOR12_64KHZ);
AF_DCMotor motor3(3,MOTOR34_64KHZ);
AF_DCMotor motor4(4,MOTOR34_64KHZ);
void setup() {
Serial.begin(9600);
pinMode(LEDS,OUTPUT);
pinMode(LDR,INPUT);
motor1.setSpeed(150);
motor2.setSpeed(150);
motor3.setSpeed(150);
motor4.setSpeed(150);
}
void loop() {
stateLDR=analogRead(LDR);
if(stateLDR<950){
digitalWrite(LEDS,LOW);
mechanum();
}else{
digitalWrite(LEDS,HIGH);
mechanum();
}
}
void mechanum(){
while(Serial.available()>0){
dados=Serial.read();
Serial.println(dados);
switch(dados){
case 'A': //Todas as rodas giram no mesmo sentido.
motor1.run(FORWARD);
motor2.run(BACKWARD);
motor3.run(FORWARD);
motor4.run(BACKWARD);
break;
case 'a': //Todas as rodas giram no mesmo sentido.
motor1.run(BACKWARD);
motor2.run(FORWARD);
motor3.run(BACKWARD);
motor4.run(FORWARD);
break;
case 'B':
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
break;
case 'b':
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
break;
case 'C':
motor1.run(RELEASE);
motor2.run(BACKWARD);
motor3.run(RELEASE);
motor4.run(BACKWARD);
break;
case 'c':
motor1.run(RELEASE);
motor2.run(FORWARD);
motor3.run(RELEASE);
motor4.run(FORWARD);
break;
case 'D':
motor1.run(BACKWARD);
motor2.run(RELEASE);
motor3.run(BACKWARD);
motor4.run(RELEASE);
break;
case 'd':
motor1.run(FORWARD);
motor2.run(RELEASE);
motor3.run(FORWARD);
motor4.run(RELEASE);
break;
case 'E':
motor1.run(FORWARD);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(BACKWARD);
break;
case 'e':
motor1.run(BACKWARD);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(FORWARD);
break;
case 'F':
motor1.run(RELEASE);
motor2.run(FORWARD);
motor3.run(BACKWARD);
motor4.run(RELEASE);
break;
case 'f':
motor1.run(RELEASE);
motor2.run(BACKWARD);
motor3.run(FORWARD);
motor4.run(RELEASE);
break;
case 'G':
motor1.run(BACKWARD);
motor2.run(BACKWARD);
motor3.run(FORWARD);
motor4.run(FORWARD);
break;
case 'g':
motor1.run(FORWARD);
motor2.run(FORWARD);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
break;
case 'H':
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(FORWARD);
motor4.run(FORWARD);
break;
case 'h':
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(BACKWARD);
motor4.run(BACKWARD);
break;
case '@':
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
break;
}
}
}
Dica importante: é possível usar as portas analógicas do Arduino como portas digitais. Caso você queira adicionar sensores com este shield ou precisar de mais saídas ou entradas digitais, basta declarar uma porta digital de números 14 a 19, como mostra no começo do código.
O vídeo de demonstração.