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:

/*
   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:




/*---------------------------------------------------------
  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