3 de dezembro de 2017

Controle Bluetooth HC-06

Projeto base para controlar um circuito utilizando conexão bluetooth.


São quatro leds que são controlados através do telefone celular com uma conexão bluetooth.
O projeto foi montando utilizando um microcontrolador ATMEGA328 com bootloader Arduino, e um módulo bluetooth HC-06.

O HC-06 funciona somente no modo escravo. Ele não se conecta a outros dispositivos, somente aceita conexões.
O funcionamento da conexão é através da comunição serial: RX e TX.

É possível enviar e receber informações entre o circuito e o dispositivo bluetooth conectado.

O módulo pode ser configurado alterando o seu nome, o PIN para pareamento e a velocidade de transmissão.

Pode-se configurar com o mesmo conectado ao Arduino em portas digitais configuradas para conexão serial com a biblioteca SoftwareSerial. A configuração é feita através de comandos AT.

Para configurar dessa forma, deve-se utilizar o código abaixo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*
   BLUETOOTH - CONFIGURAÇÃO

  -COMANDO-   -RESPOSTA-   -FUNÇÃO-
  AT           OK           Teste de comunicação
  AT+VERSION   OKlinvorV1.5 Mostra a versão do firmware
  AT+NAMExyz   OKsetname    Altera o nome do módulo
  AT+PIN1234   OKsetPIN     Altera a senha do módulo
  AT+BAUD1     OK1200       Seta o baud rate em 1200
  AT+BAUD2     OK2400       Seta o baud rate em 2400
  AT+BAUD3     OK4800       Seta o baud rate em 4800
  AT+BAUD4     OK9600       Seta o baud rate em 9600
  AT+BAUD5     OK19200      Seta o baud rate em 19200
  AT+BAUD6     OK38400      Seta o baud rate em 38400
  AT+BAUD7     OK57600      Seta o baud rate em 57600
  AT+BAUD8     OK115200     Seta o baud rate em 115200
  AT+BAUD9     OK230400     Seta o baud rate em 230400
  AT+BAUDA     OK460800     Seta o baud rate em 460800
  AT+BAUDB     OK921600     Seta o baud rate em 921600
  AT+BAUDC     OK1382400    Seta o baud rate em 1382400
*/

#include <SoftwareSerial.h>
SoftwareSerial bluetooth(2, 3); //Módulo Bluetooth ligado aos pinos 2=RX e 3=TX

void setup() {
  //Inicia a comunicação serial USB
  Serial.begin(9600);
  Serial.println("Comando AT:");

 //Inicia a comunicação serial com o módulo bluetooth
  bluetooth.begin(9600); //JY-MCU v1.05 tem por padrão 9600
}

void loop() {
  String command = "";
  while (bluetooth.available()) {
    command += char(bluetooth.read());
    delay(25);
  }
  if (command != "") {
    Serial.println(command);
  }
  if (Serial.available()) {
    delay(10);
    bluetooth.write(Serial.read());
  }
}

Podemos também configurar o módulo bluetooth conectando-o diretamente a um módulo USB-TTL.
Dessa forma, basta apenas abrir um programa de conexão serial, podendo ser o próprio Monitor Serial da IDE Arduino. Lembrando que o RX do bluetooth deve ser conectado ao TX do módulo USB-TTL.

 

Após a configuração do módulo HC-06, é só conectar ao circuito e seguir com a programação.

No telefone celular Android, utilizei para testes de comunicação o aplicativo Bluetooth Terminal.
Primeiro efetue o pareamento do telefone com o módulo HC-06, e em seguida conecte o aplicativo. O PIN padrão de conexão é 1234.

O módulo bluetooth funciona com uma tensão de 3,6v a 6v. E sua tensão de comunicação RX é de 3,3v. Porém em todos os meus testes, a comunicação só funcionou corretamente quando não utilizei divisor de tensão no RX.

Segue a foto do circuito montado na protoboard, o esquema elétrico e o código-fonte:




  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*---------------------------------------------------------
  Programa : CONTROLE BLUETOOTH HC-06
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 02/12/2017
  ---------------------------------------------------------*/
#include <SoftwareSerial.h> //Biblioteca da SoftwareSerial [ https://www.arduino.cc/en/Reference/SoftwareSerial ]

/*----- VARIÁVEIS -----*/
SoftwareSerial BT(2, 3); //Declara BT como uma SoftwareSerial, utilizando os pinos 2=RX e 3=TX
const int leds[4] = {9, 10, 11, 12}; //Pinos dos leds
boolean ledState[4] = {0, 0, 0, 0}; //Variável para controle do estado dos leds. Ligado/Desligado

/*----- SETUP -----*/
void setup() {
  //Configura os pinos dos leds
  for (int i = 0; i < 4; i++) {
    pinMode(leds[i], OUTPUT);
  }

  //Inicializa a SoftwareSerial
  BT.begin(9600);

  //Exibe a mensagem informando os comandos
  BT.println(":: CONTROLE BLUETOOTH HC-06 ::");
  BT.println("Comandos:");
  BT.println(" 1 : Led Vermelho");
  BT.println(" 2 : Led Verde");
  BT.println(" 3 : Led Azul");
  BT.println(" 4 : Led Amarelo");
  BT.println(" 5 : Pisca todos");
  BT.println(" 6 : Sequencial");
  BT.println("Digite o comando:");
}

/*----- LOOP PRINCIPAL -----*/
void loop() {
  //Variavel para receber o comando da serial via bluetooth
  String txtSerial = "";

  //Efetua a leitura do valor da serial BT
  while (BT.available() > 0) {
    txtSerial += String(char(BT.read()));
    delay(25);
  }

  //Verifica o valor da variável txtSerial
  if (txtSerial == "1") {
    SwitchLed(0);
  } else if (txtSerial == "2") {
    SwitchLed(1);
  } else if (txtSerial == "3") {
    SwitchLed(2);
  } else if (txtSerial == "4") {
    SwitchLed(3);
  } else if (txtSerial == "5") {
    BlinkLeds();
  } else if (txtSerial == "6") {
    SequenceLeds();
  }

  if (txtSerial != "") {
    BT.println("Digite o comando:");
  }
}

/*----- LIGA/DESLIGA LED -----*/
void SwitchLed(int led) {
  switch (led) {
    case 0:
      ledState[0] = !ledState[0];
      digitalWrite(leds[0], ledState[0]);
      if (ledState[0] == 1) {
        BT.println(">> LED Vermelho: ON");
      } else {
        BT.println(">> LED Vermelho: OFF");
      }
      break;
    case 1:
      ledState[1] = !ledState[1];
      digitalWrite(leds[1], ledState[1]);
      if (ledState[1] == 1) {
        BT.println(">> LED Verde: ON");
      } else {
        BT.println(">> LED Verde: OFF");
      }
      break;
    case 2:
      ledState[2] = !ledState[2];
      digitalWrite(leds[2], ledState[2]);
      if (ledState[2] == 1) {
        BT.println(">> LED Azul: ON");
      } else {
        BT.println(">> LED Azul: OFF");
      }
      break;
    case 3:
      ledState[3] = !ledState[3];
      digitalWrite(leds[3], ledState[3]);
      if (ledState[3] == 1) {
        BT.println(">> LED Amarelo: ON");
      } else {
        BT.println(">> LED Amarelo: OFF");
      }
      break;
  }
}

/*----- PISCAR TODOS OS LEDS -----*/
void BlinkLeds() {
  BT.println(">> Piscando Leds");
  for (int i = 0; i < 10; i++) {
    //Acende todos
    for (int a = 0; a < 4; a++) {
      digitalWrite(leds[a], HIGH);
    }
    delay(200);
    //Apaga todos
    for (int a = 0; a < 4; a++) {
      digitalWrite(leds[a], LOW);
    }
    delay(200);
  }
}

/*----- SEQUENCIAL DE LEDS -----*/
void SequenceLeds() {
  BT.println(">> Sequencial ativado");
  //Apaga todos
  for (int a = 0; a < 4; a++) {
    digitalWrite(leds[a], LOW);
  }
  for (int i = 0; i < 15; i++) {
    //Direita (vai)
    for (int a = 1; a < 4; a++) {
      digitalWrite(leds[a], HIGH);
      delay(80);
      digitalWrite(leds[a], LOW);
    }
    //Esquerda (volta)
    for (int a = 2; a >= 0; a--) {
      digitalWrite(leds[a], HIGH);
      delay(80);
      digitalWrite(leds[a], LOW);
    }
  }
}

Nenhum comentário:

Postar um comentário