Arduino kan communiceren met andere apparaten via Bluetooth met behulp van de module HC-05 (master/slave). Het stelt de Arduino in staat om verbinding te maken en gegevens uit te wisselen met andere apparaten zoals Smartphone, computer of andere microcontrollers.Bluetooth communicatie kan worden gebruikt om een robot op afstand te besturen, gegevens weer te geven en op te slaan op uw computer of op uw smartphone, bijvoorbeeld.
Voorwaarde: Arduino Seriële communicatie
Materiaal
- Computer
- Arduino UNO x2
- USB kabel
- Bluetooth module HC-05 ZS-040 x2 (of 1x HC-05 en 1x HC-06)
- Dupont kabels M/F
Module HC-05 overzicht
De Bluetooth module HC-05 heeft 6 pinnen, 2 voor de voeding, 2 om de verbinding tot stand te brengen, 1 om de configuratiemodus in te voeren en de andere om de verbindingsstatus te kennen.
- VCC voeding. Typisch vastgehaakt aan 5V speld van Arduino.
- GND grond. Typisch omhoog vastgehaakt aan GND speld van Arduino
- RX ontvangstspeld. Typisch opgehaakt aan transmissiespeld (TX) van Arduino
- TX transmissiespeld. Typisch aangesloten op ontvangstpen (RX) van de Arduino
- State is HIGH wanneer de module is aangesloten
- Key ou EN moet op HIGH (3,3 V) worden gezet om configuratiemodus in te gaan en moet worden losgekoppeld om communicatiemodus in te gaan.
Het bijzondere van de HC-05 is dat hij als slave-module (gelijk aan de HC-06) en als master-module kan worden gebruikt, d.w.z. dat hij zichzelf alleen aan een ander apparaat kan koppelen.
Schema’s voor configuratie
WAARSCHUWING :
- We gebruiken pen 2 en 3 van de Arduino Uno. Afhankelijk van de microcontroller, kunnen sommige spelden geen periodieke mededeling steunen. Vooral, Arduino Mega, Micro en Leonardo. Controleer de documentatie.
- Since de Bluetooth-module is met behulp van 3.3V logica, is het raadzaam om een spanningsdeler toe te voegen aan de 5V spanning van Arduino te verminderen. (weerstand 1k tussen pin3 en Rx; 2k Ohm tussen Rx en GND).
Configuratie van de module HC-05
Configuratie van de module HC-05 kan interessant zijn om te controleren of deze werkt, correct is aangesloten en om de parameters te wijzigen, zoals de naam (handig wanneer u meerdere modules gebruikt), PIN-code en communicatiesnelheid (baudrate). Vooral als u hem als mastermodule wilt gebruiken. Om de configuratie mogelijk te maken, moet de module HC-05 worden gevoed maar niet gekoppeld en moet de pin KEY/EN op HIGH worden gezet voordat de module wordt ingeschakeld. Wanneer de HC-05 in configuratie mode staat zal de LED om de twee seconden knipperen.
Open de Seriële monitor en selecteer de eind lijn optie “Nieuwe lijn” en een baudrate van 9600.
Merk op dat de HC-05 in configuratie mode komt met een baudrate van 38400bps.
Configuratie code
Met de volgende code kunt u de parameters wijzigen en controleren met behulp van de seriële monitor en de AT commando’s.
#include <SoftwareSerial.h>#define rxPin 2#define txPin 3#define baudrate 38400String msg;SoftwareSerial hc05(rxPin ,txPin);void setup(){ pinMode(rxPin,INPUT); pinMode(txPin,OUTPUT); Serial.begin(9600); Serial.println("ENTER AT Commands:"); hc05.begin(baudrate);}void loop(){ readSerialPort(); if(msg!="") hc05.println(msg); if (hc05.available()>0){ Serial.write(hc05.read()); }}void readSerialPort(){ msg=""; while (Serial.available()) { delay(10); if (Serial.available() >0) { char c = Serial.read(); //gets one byte from serial buffer msg += c; //makes the string readString } }}
AT Commando’s
In vergelijking met de module HC-06 kan de HC-05 als mastermodule worden gebruikt en kunt u ook de opgeslagen parameters controleren met behulp van de AT commando’s.
In het algemeen zal het intoetsen van het commando AT+<commando>? de opgeslagen parameter opvragen (vb: AT+PSWD? zal de PIN code van de module weergeven). Als u AT+<command>=<Param> invoert, kunt u de parameterwaarde plaatsen (b.v.: AT+PWSD=0000 om de PIN code in 0000 te wijzigen).
Hier zijn sommige van de AT-opdrachten:
- Om mededeling te testen, voer AT in de periodieke monitor van Arduino IDE in. Als alles correct is ingesteld zou het OK moeten tonen.
- Om de naam van de module te wijzigen, voer AT+NAME=<Param> in. De module zou OK moeten antwoorden (Defaut HC-05, Ex: Om de naam in BTM1 te veranderen voer AT+NAME=BTM1).
- Om de PIN code te wijzigen, voer AT+PSWD=<Param> in. De module zou OK moeten antwoorden (Standaard 1234 Ex: Om de PIN code te veranderen in 0000 voer AT+PSWD=0000).
- AT+ROLE=<Param> om de rol van de module als slaaf of master te wijzigen (Standaard 0, Ex: om de rol als master te veranderen voer AT+ROLE=1 in, als slaaf voer AT+ROLE=0 in).
- Om de baudrate te wijzigen, voert u AT+UART=<Param1>,<Param2>,<Param3> in met Param1, 2 en 3 seriële communicatie parameters: baudrate, stop bit en pariteitsbit respectievelijk (Standaard ingesteld op 9600,0,0. Bijvoorbeeld: om de baudrate te wijzigen in 115200 voer AT+UART=115200,0,0).
Er bestaan nog andere AT commando’s voor de Bluetooth module HC-05 die u kunt vinden via de link.
LET OP: Er bestaan verschillende versies van de module HC-05 en de configuratie procedure kan verschillen. Controleer voor gebruik het etiket van de module en de firmwareversie. Voor deze tutorial, gebruikten we een module HC-05 gelabeld ZS-040 en firmware versie 2.0-20100601.
N.B.: Als module niet reageert controleer bedrading, kabels geleidbaarheid en baudrate.
Aarzel niet om een reactie achter te laten of om ons te contacteren als u problemen heeft met het configureren van uw HC-05 module.
Slave Configuration
Om de module als slave in te stellen, kunt u de naam wijzigen als AT+NAME=HC05-Slave en de communicatie parameters en de PIN code kiezen die u wenst. U moet ervoor zorgen dat master en slave dezelfde communicatieparameters hebben.
- AT retourneert OK
- AT+NAME=HC05-Slave
- AT+UART=9600,0,0
- AT+ROLE=0
- Voer AT+ADDR in om het module-adres te verkrijgen (ex: +ADDR:98d3:32:21450e)
Voor de slave module kunt u ook een HC-06 module gebruiken
Master Configuration
Om de module als master in te stellen, moet u de rol veranderen en dezelfde communicatie parameter instellen als de slave module.
- AT retourneert OK
- AT+NAME=HC05-Master
- AT+UART=9600,0,0
- AT+ROLE=1
- Het adres van de slave module moet in de master module ingevoerd worden om deze te laten apparen: AT+BIND=98d3,32,21450e (vervang punten “:” door komma “,”)
Schema’s voor communicatie
In communicatie mode is de Key/EN pin niet aangesloten.
Communicatie Code
Wanneer beide modules geconfigureerd zijn, upload dan de volgende codes in de Arduino boards die verbonden zijn met uw modules. Schakel de modules in om communicatiewijze in te gaan. De master module moet verbinding maken met de slave module en de LED moet elke seconde knipperen.
We gebruiken dezelfde bibliotheek SoftwareSerial.h als voor de HC-06 module:
- SoftwareSerial hc05(Rx,Tx) om de pinnen van de seriële poort te definiëren
- hc05.begin() om de baudrate te definiëren (waarde moet gelijk zijn aan die van uw module)
- hc05.available() om te testen of er gegevens beschikbaar zijn in de buffer van de module
- hc05.read() om gegevens één byte per keer te lezen
- hc05.print() om een string in ASCII-vorm te verzenden
- hc05.write() om data één byte per keer te versturen
Master Code
#include <SoftwareSerial.h>SoftwareSerial ArduinoSlave(2,3);String answer;String msg;void setup(){Serial.begin(9600);Serial.println("ENTER Commands:");ArduinoSlave.begin(9600);}void loop(){//Read command from monitorreadSerialPort();//Read answer from slavewhile (ArduinoSlave.available()) {delay(10); if (ArduinoSlave.available() >0) {char c = ArduinoSlave.read(); //gets one byte from serial bufferanswer += c; //makes the string readString}}//Send data to slaveif(msg!=""){Serial.print("Master sent : ");Serial.println(msg);ArduinoSlave.print(msg);msg="";}//Send answer to monitorif(answer!=""){Serial.print("Slave recieved : ");Serial.println(answer);answer="";}}void readSerialPort(){while (Serial.available()) {delay(10); if (Serial.available() >0) {char c = Serial.read(); //gets one byte from serial buffermsg += c; //makes the string readString}}Serial.flush();}
Slave Code
#include <SoftwareSerial.h>SoftwareSerial ArduinoMaster(2,3);String msg;void setup(){Serial.begin(9600);ArduinoMaster.begin(9600); }void loop(){readSerialPort();// Send answer to masterif(msg!=""){Serial.print("Master sent : " );Serial.println(msg);ArduinoMaster.print(msg);msg=""; }}void readSerialPort(){while (ArduinoMaster.available()) {delay(10); if (ArduinoMaster.available() >0) {char c = ArduinoMaster.read(); //gets one byte from serial buffermsg += c; //makes the string readString}}ArduinoMaster.flush();}
Als u beide seriële monitors opent en een commando invoert in de monitor van het moederbord, zou u de volgende resultaten moeten zien. Het master board stuurt een commando dat wordt ontvangen en teruggezonden door het slave board. De communicatie werkt correct in beide richtingen.