La comunicazione Bluetooth
Lo standard Bluetooth è uno standard tecnico-industriale di trasmissione dati per reti personali senza fili WPAN (Wireless Personal Area Network). Fornisce un metodo standard, economico e sicuro per scambiare informazioni tra dispositivi diversi attraverso una frequenza radio sicura a corto raggio in grado di ricercare i dispositivi coperti dal segnale radio entro un raggio di qualche decina di metri mettendoli in comunicazione tra loro. Questi dispositivi possono essere ad esempio palmari, telefoni cellulari, personal computer, portatili, stampanti, fotocamere digitali, smartwatch, console per videogiochi, cuffie, purché provvisti delle specifiche hardware e software richieste dallo standard stesso. Il BT si è diffuso da tempo anche nel settore industriale (strumenti di misura, lettori ottici, ecc.) per il dialogo con i relativi datalogger.
Lo standard Bluetooth prevede varie versioni. Ogni versione ha delle caratteristiche diverse.
I moduli Bluetooth HC-05 e HC-06
Sono moduli molto semplici da usare, simili tra loro, con standard di comunicazione Bluetooth 2.0 + EDR che possono essere impiegati per comunicazioni seriali wireless punto-punto.
Sono dei moduli in quanto sono formati da una serie di componenti montati su delle schede siglate EGBT-045MS o EGBT-046S che sostanzialmente differiscono tra loro per il firmware caricato all’interno e di conseguenza per il funzionamento del loro pinout (Qui potrete scaricare il manuale).
Il modulo HC-06 ha un firmware “lite” con comandi AT limitati, è sempre in modalità AT quando non è collegato ad un altro dispositivo via Bluetooth e funziona solo come Slave (può solo connettersi ad apparati Master e non può instaurare nuove connessioni verso altri moduli Slave).
Il modulo HC-05 ha il firmware “completo” con molti comandi AT, per farlo entrare nella modalità AT occorre seguire una procedura (che verrà illustrata più avanti), può funzionare sia come Slave, allo stesso modo del modulo HC-06, che come Master (può instaurare quindi nuove connessioni verso altri apparati Slave).
Questi moduli si possono utilizzare, per esempio, per connettere dei Robot (slave) a dei telecomandi (master) quali PC o Smartphone o Schede pilota con moduli HC-05 Master.
Solitamente questi moduli si trovano già montati su una scheda adattatore JY-MCU o su una ZS-040, simili tra loro, che ne facilita l’utilizzo.I moduli HC-06, dato che necessitano di meno componenti per essere utilizzati, hanno una versione “Lite” della scheda adattatore sulla quale mancano, tra l’altro, un pulsantino ed i pin EN e lo STATE, mentre i moduli HC-05 hanno la versione completa della scheda adattatore.
Significato dei pin:
A seconda della versione della scheda adattatore potremo trovare leggere differenze nelle piedinature, comunque vedremo il funzionamento di tutti i pin che potrete trovare:
– EN: questo pin, se messo LOW disattiva il modulo, se messo HIGH o non connesso il modulo funziona normalmente.
– VCC: è il pin dell’alimentazione che può andare dai 3,6 ai 6 V.
– GND: GND
– TXD: uscita seriale del modulo, da collegare all’RX del microcontrollore. Attenzione: questo segnale utilizza il livello logico 3,3 V.
– RXD: ingresso seriale del modulo, da collegare al TX del microcontrollore. Attenzione: questo segnale utilizza il livello logico 3,3 V.
– STATE : connesso al LED2 (Pin32) del modulo passa dallo stato LOW allo stato HIGH quando il modulo è connesso via Bluetooth, se connesso ad un pin Input di Arduino lo si può utilizzare per capire se il modulo è connesso via Bluetooth o no.
Inoltre a bordo degli adattatori c’è un led che lampeggia:
– Velocemente in maniera costante: Il modulo è acceso e pronto a connettersi.
– 2 lampeggi veloci ogni 5 secondi: Modulo connesso via Bluetooth.
– 1 lampeggio ogni 2 secondi: Modulo HT-05 in AT Mode.
I moduli HT-05 e HT-06 possono essere utilizzati in due modalità di funzionamento:
– Data Mode (Modalità Dati): In questa modalità, il modulo viene utilizzato per comunicare con altri dispositivi Bluetooth, il trasferimento dei dati avviene in questa modalità.
– AT Command Mode (Modalità Comando AT): In modalità di comando, possiamo comunicare con il modulo Bluetooth solo via seriale e tramite opportuni comandi AT possiamo configurare varie impostazioni e parametri del modulo. Ciò include conoscere le informazioni sul firmware, la modifica della velocità di trasmissione, la modifica del nome del modulo, ecc. Possiamo anche usarlo per impostare l’HC-05 come master o slave.
Uso dei moduli Bluetooth HC-05 e HC-06 con Arduino in modalità Slave
Quando si utilizzano nella modalità Slave in Data Mode non c’è differenza tra utilizzare l’HC-05 o l’HC-06, solitamente di default entrambi i moduli sono settati per lavorare in Slave, con velocità 9600 baud e la password per associare il modulo con un apparato è 0000 o 1234.
Lo schema di collegamento sarà il seguente:Note sullo schema: i moduli Bluetooth montati su adattatori possono essere alimentati a 5V, però i segnali devono essere a 3,3V. Per quanto riguarda l’uscita TX del modulo che va verso RX di Arduino si può collegare direttamente senza problemi. Infatti i livelli logici 3,3 V vengono interpretati comunque correttamente HIGH da Arduino. Diverso è il discorso per l’ingresso RX del modulo, perché Arduino darà in uscita TX 5V. Per non rischiare di danneggiare il modulo si utilizza un partitore di tensione con due resistenze, R1 da 10kΩ e R2 da 20kΩ. Così facendo il livello di tensione che arriverà al Rx del Modulo Bluetooth sarà di circa 3,33 V, infatti:Dato che 20kΩ non è un valore standard e che di solito nei kit di Arduino si trovano le resistenze da 10kΩ possiamo utilizzare 2 di queste in serie per farne una equivalente da 20kΩ, oppure due in parallelo per farne una da 5kΩ. In questo caso utilizzeremo come R1 quella da 5kΩ e come R2 una da 10kΩ, il risultato finale non cambierà.
Al posto del partitore di tensione si potrebbe utilizzare un convertitori di livelli logici, ma ci complicheremo un po’ lo schema.
Lo sketch da utilizzare per testare il funzionamento del modulo sarà il seguente:
#include <SoftwareSerial.h> #define Rxpin 2 // Tx per Bluetooth Rx per Arduino #define Txpin 3 // Rx per Bluetooth Tx per Arduino char BluetoothBuffer; char SerialBuffer; SoftwareSerial Bluetooth(Rxpin, Txpin); void setup() { Serial.begin(9600); Bluetooth.begin(9600); } void loop() { if (Bluetooth.available() > 0) { BluetoothBuffer = Bluetooth.read(); Serial.print(BluetoothBuffer); } if (Serial.available() > 0) { SerialBuffer = Serial.read(); Bluetooth.print(SerialBuffer); } }
Una volta caricato lo sketch su Arduino apriamo il monitor seriale dell’IDE con il pulsante
Si aprirà la finestra Monitor Seriale ed impostare la velocità di comunicazione a “9600 Baud” e “Entrambi NL & CR)”
A questo punto ci serve un apparato da connettere al modulo bluetooth. Possiamo utilizzare uno Smartphone Android (quelli della Mela non riconoscono i moduli HC-05 e HC-06) e ci servirà una App che invi e ricevi i dati dal Modulo Bluetooth. Noi abbiamo la nostra “Makerslab BT Demo App” che fa al caso nostro.
Collegate il modulo Bluetooth allo Smartphone (per sapere come fare riferimento alla pagina dedicata all’App) e provate i vari pulsanti dell’App e vedrete delle lettere e dei numeri apparire sul Monitor seriale, viceversa se scrivete sul Monitor seriale ed inviate il dato quello che avrete scritto apparirà sull’apposito spazio dell’App.
Questo perché lo sketch caricato dell’esempio legge i dati in arrivo dal Computer sulla porta seriale di Arduino (tramite il cavo USB) e li ritrasmette sulla porta seriale Software collegata al modulo Bluetooth. Il modulo provvederà a convertire i dati ed inviarli via WiFi allo Smartphone.
Viceversa se il modulo riceve dei dati via WiFi inviati dallo Smartphone, li convertirà e li invierà alla seriale Software di Arduino, che a sua volta li trasmetterà al Computer tramite la porta USB.
Accendere e spegnere led, leggere sensori e molto altro con Bluetooth HC-05 e HC-06 con Arduino
Vediamo ora come si utilizzano nella pratica i moduli HC-05 e HC-06 per far fare qualcosa ad Arduino.
Il nuovo Schema da utilizzare è il seguente:
Questo schema ci permetterà di utilizzare tutte le funzione della Makerslab “BT Demo App” ed imparare così ad utilizzare questi moduli Bluetooth.
Lo sketch da utilizzare per testare il funzionamento del modulo sarà il seguente.
/****************************************************************** Librerie ******************************************************************/ #include <SoftwareSerial.h> /****************************************************************** Definizione dei pin e delle variabili ******************************************************************/ #define Rxpin 2 /* RX scheda Arduino da collegare al TX Bluetooth */ #define Txpin 3 /* TX scheda Arduino da collegare al RX Bluetooth */ #define Pulsante 4 /* Pin Pulsante */ #define OUT1 5 /* Pin Uscita OUT1 */ #define OUT2 6 /* Pin Uscita OUT2 */ #define OUT3 7 /* Pin Uscita OUT3 */ #define RGB_R 9 /* Pin LED RGB Rosso */ #define RGB_G 10 /* Pin LED RGB Giallo */ #define RGB_B 11 /* Pin LED RGB Verde */ #define Potenziometro A0 /* Pin Potenziometro */ String RGB_R_PWM; /* Valore PWM per il colore Rosso */ String RGB_G_PWM; /* Valore PWM per il colore Verde */ String RGB_B_PWM; /* Valore PWM per il colore Blu */ char coloreCorrente; int valorePotenziometro; int aa = 1; char bt_char; String stringa; SoftwareSerial Bluetooth(Rxpin, Txpin); void setup() { pinMode(OUT1, OUTPUT); pinMode(OUT2, OUTPUT); pinMode(OUT3, OUTPUT); pinMode(RGB_R, OUTPUT); pinMode(RGB_G, OUTPUT); pinMode(RGB_B, OUTPUT); pinMode(Pulsante, INPUT_PULLUP); Bluetooth.begin(9600); Serial.begin(9600); } void loop() { while (Bluetooth.available() > 0) { /* Questa parte di programma riceve i caratteri inviati al modulo Bluetooth e li compara con i caratteri R,G e B per estrarre il valore numerico per i relativi PWM e salva tutti i caratteri ricevuti in una stringa */ aa = 0; bt_char = Bluetooth.read(); stringa += bt_char; delay(3); if (bt_char == 'R') { coloreCorrente = 'R'; RGB_R_PWM = ""; } if (bt_char == 'G') { coloreCorrente = 'G'; RGB_G_PWM = ""; } if (bt_char == 'B') { coloreCorrente = 'B'; RGB_B_PWM = ""; } if (coloreCorrente == 'R' && bt_char != 'R') { RGB_R_PWM += bt_char; } if (coloreCorrente == 'G' && bt_char != 'G') { RGB_G_PWM += bt_char; } if (coloreCorrente == 'B' && bt_char != 'B') { RGB_B_PWM += bt_char; } } if (aa == 0) { /* si convertono i caratteri estratti per i valori RGB in numeri da inviare ai led PWM */ analogWrite(RGB_R, RGB_R_PWM.toInt()); analogWrite(RGB_G, RGB_G_PWM.toInt()); analogWrite(RGB_B, RGB_B_PWM.toInt()); /* in questa parte di programma si compara l'ultimo carattere ricevuto per eseguire azioni */ if (bt_char == 'A') { digitalWrite (OUT1, HIGH); } if (bt_char == 'a') { digitalWrite (OUT1, LOW); } if (bt_char == 'D') { digitalWrite (OUT2, HIGH); } if (bt_char == 'd') { digitalWrite (OUT2, LOW); } if (bt_char == 'C') { digitalWrite (OUT3, HIGH); } if (bt_char == 'c') { digitalWrite (OUT3, LOW); } /* Invio i dati raccolti alla Seriale Hardware */ Serial.println("----------"); Serial.print("R = "); Serial.println(RGB_R_PWM); Serial.print("G = "); Serial.println(RGB_G_PWM); Serial.print("B ="); Serial.println(RGB_B_PWM); Serial.print("Stringa ricevuta = "); Serial.println(stringa); Serial.print("Ultimo carattere ricevuto = "); Serial.println(bt_char); stringa = ""; /* Azzero la stringa */ bt_char = ""; /* Azzero l'ultimo carattere ricevuto */ aa = 1; coloreCorrente = 0; } /* Parte di programma per inviare dati all'applicazione */ if (digitalRead(Pulsante) == LOW) { valorePotenziometro = analogRead(Potenziometro); delay(300); // Ritardo utilizzato come antirimbalzo per il pulsante Bluetooth.println(valorePotenziometro); } }
La complessità della prima parte dello Sketch è dovuta al fatto che il bluetooth riceve dei caratteri e per poter gestire i PWM occorrono dei numeri, che per Arduino sono due cose differenti, infatti se riceviamo ad esempio 135 dal modulo Bluetooth non è un numero, ma sono 3 caratteri alfanumerici 1, 3 e 5.
Detto questo se non ci interessasse la parte PWM, ma solo ricevere dei caratteri per far eseguire ad Arduino delle operazioni, come per esempio accendere e spegnere un led o avviare un motore, lo Sketch sarebbe molto più semplice come il seguente:
/****************************************************************** Librerie ******************************************************************/ #include <SoftwareSerial.h> /****************************************************************** Definizione dei pin e delle variabili ******************************************************************/ #define Rxpin 2 /* RX scheda Arduino da collegare al TX Bluetooth */ #define Txpin 3 /* TX scheda Arduino da collegare al RX Bluetooth */ #define OUT1 5 /* Pin Uscita OUT1 */ #define OUT2 6 /* Pin Uscita OUT2 */ #define OUT3 7 /* Pin Uscita OUT3 */ int aa=1; char bt_char; SoftwareSerial Bluetooth(Rxpin, Txpin); void setup() { pinMode(OUT1, OUTPUT); pinMode(OUT2, OUTPUT); pinMode(OUT3, OUTPUT); Bluetooth.begin(9600); Serial.begin(9600); } void loop() { if (Bluetooth.available() > 0) { /* Salva l'ultimo carattere ricevuto dal modulo Bluetooth */ bt_char = Bluetooth.read(); delay(3); aa = 0; } if (aa == 0) { // Se ha ricevuto dati dal modulo lancia la verifica */ Serial.print("Ultitmo carattere ricevuto = "); Serial.println(bt_char); verificacarattere(); bt_char = ""; /* Azzero l'ultimo carattere ricevuto */ aa = 1; } } void verificacarattere() { /* verifica se i dati ricevuti corrispondono ad azioni da intraprendere */ switch (bt_char) { case 'A': digitalWrite (OUT1, HIGH); break; case 'a': digitalWrite (OUT1, LOW); break; case 'D': digitalWrite (OUT2, HIGH); break; case 'd': digitalWrite (OUT2, LOW); break; case 'C': digitalWrite (OUT3, HIGH); break; case 'c': digitalWrite (OUT3, LOW); break; } }
Uso dei moduli Bluetooth HC-05 e HC-06 con Arduino in modalità AT Mode
In questo caso c’è una sostanziale differenza tra i due moduli HC-05 e HC-06. Inoltre ci sono varie versioni di moduli anche con lo stesso nome, ce differenziano per la versione del Firmware.
Modalità AT Mode con HC-06
Partiamo prima con l’HC-06, questo modulo è sempre in modalità AT se non connesso via Bluetooth.
Lo schema è simile al primo visto:
Lo sketch da utilizzare per comunicare con il modulo in AT Mode è il seguente (lo stesso usato all’inizio):
#include <SoftwareSerial.h> #define Rxpin 2 // Tx per Bluetooth Rx per Arduino #define Txpin 3 // Rx per Bluetooth Tx per Arduino char BluetoothBuffer; char SerialBuffer; SoftwareSerial Bluetooth(Rxpin, Txpin); void setup() { Serial.begin(9600); Bluetooth.begin(9600); } void loop() { if (Bluetooth.available() > 0) { BluetoothBuffer = Bluetooth.read(); Serial.print(BluetoothBuffer); } if (Serial.available() > 0) { SerialBuffer = Serial.read(); Bluetooth.print(SerialBuffer); } }
Una volta caricato lo Sketch apriamo il Monitor seriale (come visto all’inizio della guida) ed inviamo la parola AT (attenzione: rispettare le maiuscole!)
Se il modulo risponderà con un OK siamo nella modalità AT!
Provate a scrivere AT+VERSION
Ed il modulo ci risponderà con la versione del Firmware.
Con questa versione di modulo HC-06 sono disponibili solo alcuni dei comandi AT utilizzabili del modulo HC-05, in particolare quelli relativi al funziomanto come Slave, più avanti troverete l’elenco completo.
Modalità AT Mode con HC-05
Se avete a disposizione il modulo HC-05 con il pulsantino sulla scheda ed il pin EN lo schema sarà identico a quello utilizzato per l’HC-06.
Lo Sketch da utilizzare sarà uguale a quello utilizzato per l’HC-06 solo dovrete impostare la velocità delle due seriali a 38400 baud, quindi modificate solo questo pezzo di codice, così:
void setup() { Serial.begin(38400); Bluetooth.begin(38400); }
I passaggi da fare saranno:
Passo 1: Caricare lo Sketch sull’Arduino
Passo 2: Aprire il Monitor seriale ed impostare i baud a 38400
Passo 3: Scollegare il pin di Alimentazione del Modulo HC-05
Passo 4: Premere e mantenere premuto il pulsantino del modulo HC-05 e ricollegare l’alimentazione del modulo.
Passo 5: Il modulo si accenderà ed il LED del modulo lampeggerà lentamente, si può lasciare il pulsantino del modulo, siamo in AT mode.
Passo 6: Da terminale inviare AT , se il modulo risponde con OK siamo effettivamente in AT mode e possiamo configurare il modulo.
I comandi AT per il modulo HC-05 sono:
Comando AT | Funzione del comando |
AT | Testa la connessione all’interfaccia AT |
AT + reset | Resetta il nostro componente |
AT + version | Comunica la versione del firmware |
AT + orgl | Riporta le impostazioni correnti alle predefinite |
AT + addr | Il dispositivo ci comunica il proprio indirizzo |
AT + name | Domandiamo o impostiamo il nome del dispositivo |
AT + rname | Domandiamo il nome di un dispositivo bluetooth a cui siamo collegati (remoto) |
AT + role | Domandiamo o impostiamo il ruolo del dispositivo (1=Master / 0=Slave) |
AT + class | Domandiamo o impostiamo la classe del dispositivo ( Classe of Device CoD) |
AT + iac | Domandiamo o impostiamo le richieste del codice di accesso |
AT + inqm | Domandiamo o impostiamo le richieste della modalità di accesso |
AT + pswd | Domandiamo la password o ne impostiamo l’associazione |
AT + uart | Domandiamo i parametri UART o li reimpostiamo |
AT + cmode | Domandiamo la modalità di connessione o la impostiamo |
AT + bind | Domandiamo o impostiamo l’associazione all’indirizzo del bluetooth |
AT + polar | Domandiamo o impostiamo la polarità di output del LED |
AT + pio | Impostiamo o resettiamo un pin di Input/Output (I/O) utente |
AT + mpio | Impostiamo o resettiamo più pin di I/O utente |
AT + mpio? | Domandiamo l’I/O di un pin utente |
AT + ipscan | Domandiamo o impostiamo i parametri di scansione |
AT + sniff | Domandiamo o impostiamo i parametri di risparmio energetico SNIFF |
AT + senm | Domandiamo o impostiamo i modi di sicurezza e crittografia |
AT + rmsad | Elimina un dispositivo autenticato dalla lista |
AT + fsad | Trova un dispositivo dalla lista dei dispositivi autenticati |
AT + adcn | Domandiamo il numero totale dei dispositivi dalla lista dei dispositivi autenticati |
AT + mrad | Domandiamo quale è il dispositivo autenticato utilizzato più di recente |
AT + state | Domandiamo lo stato corrente del dispositivo |
AT + init | Inizializziamo il profilo SPP (ricerca) |
AT + inq | Domandiamo quale sia il dispositivo individuabile più vicino |
AT + inqc | Cancelliamo la ricerca dei dispositivi individuabili |
AT + pair | Associazione al dispositivo |
AT + link | Connessione ad un dispositivo remoto |
AT + disc | Disconnessione da un dispositivo remoto |
AT + ensniff | Entriamo in modalità risparmio energetico |
AT + exsniff | Usciamo dalla modalità di risparmio energetico |
Entrambi i moduli HC-05 e HC-06 durante l’AT mode possono restituirci dei messaggi di errore, ecco l’elenco:
Codice errore | Significato |
0 | Comando errato o non valido |
1 | Valori risultanti di default |
2 | Scrittura della password errata |
3 | Il nome del dispositivo è troppo lungo ( maggiore di 32 caratteri ) |
4 | Nessun nome di dispositivo specificato ( 0 caratteri ) |
5 | L’indirizzo NAP del bluetooth è troppo lungo |
6 | L’indirizzo UAP del bluetooth è troppo lungo |
7 | L’indirizzo LAP del bluetooth è troppo lungo |
8 | Pin di Input/Output non specificato ( 0 caratteri ) |
9 | Pin I/O assegnato ad un numero di porta non valido |
A | Classe del dispositivo non specificata ( 0 caratteri ) |
B | Classe del dispositivo troppo lunga |
C | Codice d’accesso non specificato ( 0 caratteri ) |
D | Codice d’accesso troppo lungo |
E | Codice d’accesso inserito non valido |
F | Password di associazione non specificata ( 0 caratteri ) |
10 | Password di associazione troppo lunga ( maggiore di 16 caratteri ) |
11 | Ruolo non valido inserito |
12 | Baud rate non valido inserito |
13 | Bit d’arresto non valido inserito |
14 | Parity bit non valido inserito |
15 | Nessun dispositivo nella lista associati |
16 | Profilo di ricerca non inizializzato |
17 | Profilo di ricerca già inizializzato |
18 | Modalità di inchiesta non valida |
19 | Si è verificato un timeout nell’inchiesta |
1A | Indirizzo inserito non valido o non scritto |
1B | Modalità di sicurezza non valida inserita |
1C | Modalità di crittografia non valida inserita |