Bluetooth mestre + escravo

Descrición

bluetoothNesta sección imos conectar dúas placas de arduino utilizando bluetooth.

Imos utilizar de forma simplificada o que se coñece por arquitectura mestre/escravo, na que un compoñente realiza labores de control, supervisión e coordinación (denominado mestre) e os restantes realizan tarefas específicas (denominados escravos), devolvendo os resultados ao compoñente mestre.

Os módulos Bluetooth máis comúns para Arduíno son o HC-05 (6 pins) que pode actuar como mestre ou como escravo e o HC-06 (4 pins) que só pode actuar como escravo.

Montaxe

Unha das placas, a que ten o HC-05 funcionará enviando datos cada vez que prememos nun pulsador e a outra, a que ten un HC-06, recibirá estes datos e actuará acendendo e apagando un LED.

Necesitamos:

  • 2 placas arduino UNO
  • Un módulo HC-05
  • Un módulo HC-06
  • 2 reistencias de 220Ω e 2 resistencias de 100Ω para os divisores de tensión
  • Un pulsador e unha resistencia de 10kΩ
  • Un led e unha resistencia de 220Ω

Protección do módulo bluetooth:

bluetooth_proteccionO pin de recepción de datos Rx do módulo bluetooth non debería superar unha voltaxe de 3,3V, así que se traballamos con 5V deberiamos protexer o módulo.

Se conectamos un divisor de tensión tal e como aparece na imaxe, con resistencias de 100Ω e 220Ω, ao pin Rx chegarán como máximo 3,4V cando o pin Tx do Arduíno envíe 5V, polo que evitaremos que o módulo se queime cando o utilizamos de maneira continua.

Hai módulos, coma o “CZ-HC-05” da marca “gomcu” e outros que se poden conectar a 5V, pero tamén funcionan a 3,3V. Se non tes a seguridade de que se pode conectar a 5V utiliza sempre un divisor de tensión.

Montaxe da placa 1:

  • Arduino UNO: Ard-RX=pin 10 e Ard-TX pin 11
  • Un módulo HC-05:  bt-RX ao divisor de tensión, bt-TX a Ard-RX pin 10
  • Divisor de tensión: Mirar esquema. Ard-TX= pin 11
  • Un pulsador coa súa resistencia de 100kΩ ao pin 2.

Montaxe da placa 2:

  • Arduino UNO: Ard-RX=pin 10 e Ard-TX pin 11
  • Un módulo HC-06: bt-RX ao divisor de tensión, bt-TX a Ard-RX pin 10
  • Divisor de tensión: Mirar esquema. Ard-TX= pin 11
  • Un LED coa súa resistencia de 220Ω ao pin 13.

Configuración dos módulos bluetooth

Para que se podan comunicar entre si debemos configurar o HC-05 como mestre. O HC-06 sempre actúa coma escravo, así que non imos facer nada.

O noso módulo HC-05 non ten pulsador. Nese caso debemos conectar o pin Key a 3.3V Este pin utilízase para configurar o módulo bluetooth (cambiar o nome, contrasinal, parámetros, etc.)

Carga o seguinte programa no arduino e despois conecta o módulo HC-05:

/*
Configuración AT do módulo HC-05

Ard-RX= pin10 e Ard-TX pin11
bt-KEY a Ard-3,3V
bt-VCC a Ard-5V
bt-GND a Ard-GND
bt-RX a ard-TX (pin 11) a través dun divisor de tesnión
bt-TX a ard-RX (pin10)

*/

#include <SoftwareSerial.h>
SoftwareSerial BTserial(10, 11); // RX | TX
 
const long baudRate = 38400; // velocidade de comunicación co BT
char c=' ';
boolean NL = true;
 
void setup() {
  Serial.begin(9600);
  Serial.print("Sketch:   ");   Serial.println(__FILE__);
  Serial.print("Uploaded: ");   Serial.println(__DATE__);
  Serial.println(" ");

  BTserial.begin(baudRate);  
  Serial.print("BTserial started at "); Serial.println(baudRate);
  Serial.println(" ");
}
 
void loop(){
 
  // Lemos desde o módulo BT e enviamos á consola

  if (BTserial.available()) {
    c = BTserial.read();
    Serial.write(c);
  }

  // Lemos desde a consola e enviamos ao módulo BT

  if (Serial.available()) {
    c = Serial.read();
    BTserial.write(c);   

    // O carácter ">" indica que se introduce un texto.
    if (NL) { Serial.print(">");  NL = false; }
    Serial.write(c);
    if (c==10) { NL = true; }
  }
 
}

Notarás que o LED do módulo latexa moi amodo. Iso é que esa en modo de configuración. Abre a consola e introduce os seguintes parámetros en negriña:

  • AT  (inicia a configuración. Recibirás un OK)
  • AT+ROLE=1  (Establece o rol: role=1 mestre role=1 escravo. Recibirás un OK)
  • AT+CMODE=1 (Configura o módulo para que se emparelle con calquera enderezo. Recibirás un OK)
  • AT+NAME?  (preguntamos o nome do módulo. Recibirás o nome, normalemnte NAME:HC-05)
  • AT+NAME=HC-05 (Con esta instrución podes cambiar o nome. Nós imos deixar o mesmo)
  • AT+PSWD? (devólvenos o enderezo, no noso caso devolve +PSWD:1234)
  • AT+PSWD=1234 (Se queres cambiar o contrasinal usa este comando. Nós imos deixar o que ten)
  • AT+UART?  (devólvenos a velocidade de comunicación en baudios. Devolve +UART:9600,0,0. Imos deixalo así)
  • AT+UART=4 (Para cambiar a velocidade: 1=>1200 baudios, 2=>2400, 3=>4800, 4=>9600 (por defecto), 5=>19200, 6=>38400, 7=>57600, 8=>115200)

Cando acabemos desconectamos co cable KEY e reiniciamos o módulo desconectándoo e volvendo a conectalo. Notarás agora que os latexos son de maior frecuencia. Iso significa que xa está en modo de comunicación.

Programas

Agora imos emparellalo co módulo HC-06 que está na placa que ten un LED. Cando prememos no pulsador o HC-05 envía un dato (‘a’ ou ‘b’) e escríbeo tamén na consola. O HC-06 interpreta ese dato para acender ou apagar o LED. Ao mesmo tempo envía unha resposta ao outro BT para indicar se o led está aceso ou apagado.

Imos chamar BT1 ao módulo HC-05 e BT2 ao módulo HC-06

Carga cada perograma na placa correspondente. O ideal é utilizar para cada programa unha versión diferente do IDE de arduino. Cando estén cargados abre a consola de cada programa e obsérvaas simultaneamente.

Programa 1. Placa con HC-05 e pulsador

#include <SoftwareSerial.h>

SoftwareSerial BT1(10, 11); // RX, TX

// Declaración de variables

const int pulsador=2;
int estado=0; // estado do pulsador

// Configuración:

void setup() {
  
  BT1.begin(9600);       // Comunicación con Bluetooth
  Serial.begin(9600);
  
}
// LOOP
 
void loop() { 

  // Envío de datos de BT1 a BT2

  if (digitalRead(pulsador)==HIGH){  
    while(digitalRead(pulsador)==HIGH);   // Agarda mentres o pulsador esta premido
    delay(30);                            // tempo para evitar o efecto rebote do pulsador
    if (estado==0){
      BT1.print('a');                 // Envía o dato a
      Serial.println("enviado a");    // Indica na consola que enviou oi dato
    }
    else{
      BT1.print('b');                 // Envía o dato b
      Serial.println("enviado b");
    }
    estado=!estado;         // cambia o estado do pulsador
    
  }

  // recepción de datos desde o BT2 a BT1

  if (BT1.available()) {    
    char c = BT1.read();
    Serial.write(c);        // Imprime os datos recibidos na consola
  }

}

Programa 2. Placa con HC-06 e LED

#include <SoftwareSerial.h>

SoftwareSerial BT2(10, 11); // RX, TX

// Declaración de variables

const int led=13;

// Configuración:
void setup() {
  
  // Bluetooth serie
  BT2.begin(9600);       // Comunicación con Bluetooth
  Serial.begin(9600);   // Comunicación coa consola
  pinMode(led, OUTPUT);  // Led como saída
}
// LOOP
 
void loop() { 
  
  while(! BT2.available());   // Agarda a que haxa datos no buffer
  char sinal = BT2.read();    // asigna eses datos á variable sinal
  Serial.println(sinal);      // imrime na consola
  
  if( sinal =='a'){                // Se recibe "a" acende o LED
    digitalWrite(led, HIGH);
    Serial.println("Aceso");     // na consola aparece que esa aceso
    BT2.write("led aceso");        // Envía "led aceso" ao módulo BT1 
    BT2.write("\r\n");
  }
  if( sinal =='b'){                // Se recibe "b" apaga o LED
    digitalWrite(led, LOW);
    Serial.println("Apagado");
    BT2.write("led apagado");
    BT2.write("\r\n");
  }
  
}

Pode que os módulos tarden uns segundos en comunicarse entre si. Cando estean conectados, ao premer no pulsador dunha placa deberás poder acender e apagar o LED da outra e tamén ver o que sucede nas respectivas consolas.

Propostas

Adapta estes programas a calquera outro tipo de comunicación que queiras facer. Por exemplo, un sensor analóxico nunha placa indica os graos de xiro dun servo na outra, ou calquera outra cousa que necesites.