Descrición
Nesta 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:
O 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.