Arduino Mega 2560 R3

Introduzione

Questa piccola guida, come evidente già dal titolo, parla dei moduli bluetooth HC-05 e HC-06, come impostarli per una comunicazione corretta, verificarne il corretto funzionamento, impostarli come master e slave (AT-mode), e delle loro caratteristiche, ad esempio della tensione di alimentazione.

La prima volta che andiamo ad utilizzare questi moduli, se non si ha mai avuto a che fare con essi, è probabile di essere presi dallo sconforto, poichè bisogna sapere alcuni piccoli dettagli per utilizzarli in modo corretto, ma niente paura, la cosa diventerà chiara a breve, e presto riusciremo ad utilizzarli senza nemmeno pensarci qualche secondo.

I moduli bluetooth sono una comodissima via di comunicazione se non si vuole trasmettere dati attraverso un collegamento tramite cavi; hanno davvero molte potenzialità, poichè è possibile trasmettere semplicemente numeri, numeri decimali, stringhe di caratteri e tutto ciò che ci serve.

Spero che questo articolo sia chiaro e di aiuto, in ogni caso buon divertimento!







Caratteristiche fisiche del modulo

Partiamo quindi da come collegare il nostro modulo ad Arduino. Questo presenta quattro pins già saldati, più due eventualmente da saldare, ma che non ci serviranno: i quattro pins sono RXD (<), TXD (>), GND (<), VCC (<). A prima vista sembra tutto abbastanza chiaro, ma è facile commettere i primi errori già da adesso; prima di tutto, andiamo ad alimentare, tramite il pin VCC, il nostro modulo tramite una tensione di 3.3 V, e non 5 V come solitamente facciamo. Colleghiamo poi ovviamente il pin GND a GND di Arduino, e infine colleghiamo il pin RXD al pin TX di Arduino, e TXD ad RX; ebbene si, i nomi dei due pin sono invertiti, perciò collegandoli al contrario non vedremo nessun tipo di trasmissione dati, e questo è un problema molto riscontrato.

I collegamenti con la nostra scheda sono fatti, mancano solo alcuni piccoli dettagli. Prima di tutto dobbiamo capire come entrare in modalità AT, altrimenti ci sarà impossibile connettere due moduli bluetooth con una corretta comunicazione: questo non è molto semplice in alcuni tipi di modulo, poichè alcuni presentano un piccolo tasto laterale sulla destra dei pins che ci consente di eseguire l’operazione, mentre altri no. In ogni caso ora andremo a vedere come risolvere questo problema.

Ricordiamo sempre che il nostro componente è chiamato modulo perchè installato su una basetta con piste di rame che ci consentono di utilizzare il micro controllore senza dover costruire un circuito tutte le volte; questo è fondamentale, poichè per consentire al nostro HC-05 di entrare in modalità AT è necessario utilizzare un cavo collegato ad una tensione di 3.3 V mentre il modulo è alimentato, dopo di che mettere a contatto il nostro cavo con il pin 34 del micro controllore, che è l’ultimo in alto a destra vicino ai resistori. A questo punto, tenendo sempre saldamente a contatto il cavo al pin, dobbiamo staccare l’alimentazione da VCC, e subito dopo ricollegarla, togliendo poi il contatto col pin 34; potremmo quindi osservare che il led rosso che ci indica che il nostro modulo è funzionante rallenta, rimanendo acceso per circa due secondi e spento altrettanto. Se il led avrà questo ritmo, saremo entrati in modalità AT. Di seguito troverete un immagine del nostro micro controllore (EGBT046S) installato nel modulo HC-05 che rappresenta i pin di cui è necessario sapere le funzioni.

Caratteristiche fisiche del modulo



Invece, se il nostro modulo presenta il piccolo tasto laterale, esso prenderà il posto del nostro contatto fatto a mano, ed il procedimento sarà di premere il tasto mentre il modulo è in funzione, scollegare VCC, ricollegarlo e rilasciare quindi il pulsante, che abbiamo tenuto premuto fino a quel momento.

Quando entreremo in modalità AT, dobbiamo ricordare che il baud rate di trasmissione tra il nostro componente e l’interfaccia seriale passa in modo automatico a 38400 baud, perciò se tentiamo di utilizzare comandi AT ad un diverso baud rate non avremo nessun risultato; è necessario quindi entrare nella finestra del monitor seriale ed impostarlo correttamente prima di procedere.

Infine, dovremmo sapere che il nostro modulo bluetooth ha una sensibilità di circa 100 metri, più precisamente, da datasheet, 80 dbm; è inutile tentare di trasmettere dati ad un altro modulo più lontano di questa distanza.



Entriamo nella parte software: i comandi AT

Abbiamo quindi parlato in modo abbastanza approfondito della parte hardware riguardante il nostro modulo, andiamo quindi adesso a vedere come dobbiamo procedere nella parte software.

Per prima cosa, caricheremo sulla nostra scheda Arduino UNO uno sketch di questo tipo:

#include (parentesi angolare sinistra) SoftwareSerial.h (parentesi angolare destra)  //Includiamo la libreria per la gestione delle istruzioni di utilizzo del modulo bluetooth

const int rxpin = 2;  //Andiamo ad assegnare al pin 2 l’indirizzo di ricezione dati (e lo colleghiamo al pin TXD del modulo)
const int txpin = 3;  //Assegnamo invece al pin 3 l’indirizzo di trasmissione dati (collegandolo al pin RXD del nostro componente
SoftwareSerial bluetooth(rxpin, txpin);  //Assegnamo ad un nome (bluetooth) i suoi pin di ricezione e trasmissione, per facilitarci la scrittura del codice

void setup(){
Serial.begin(38400);  //Inizializziamo l’interfaccia seriale al baud rate dell’AT-mode
bluetooth.begin(38400);  //Inizializziamo l’interfaccia del modulo bluetooth sempre al baud rate riferito alla modalità AT
}

void loop(){
if(bluetooth.available()){  //Se il bluetooth riceve qualche dato
char c = bluetooth.read();  //Il dato viene posto in una variabile di tipo char, così da essere adatta sia a lettere che a numeri
Serial.write(c);  //Si scrive sul monitor seriale i dati presi dalla variabile, così da poterli osservare
}
if(Serial.available()){  //Se invece il serial monitor riceve un dato da inviare
char c = Serial.read();  //La variabile c viene memorizzata e letta dal monitor seriale
bluetooth.write(c);  //Il dato viene inviato al bluetooth perchè sia elaborato e quindi trasmesso
}
}



Questo codice ci permetterà di entrare in comunicazione con il nostro modulo HC-05 attraverso una scheda Arduino UNO; se invece utilizziamo un Arduino MEGA, il codice cambierà in questo modo:

void setup(){
Serial.begin(38400);  //Inizializziamo l’interfaccia seriale al baud rate dell’AT-mode
Serial1.begin(38400);  //Inizializziamo l’interfaccia del modulo bluetooth sempre al baud rate riferito alla modalità AT
}

void loop(){
if(Serial1.available()){  //Se il bluetooth riceve qualche dato
char c = Serial1.read();  //Il dato viene posto in una variabile di tipo char, così da essere adatta sia a lettere che a numeri
Serial.write(c);  //Si scrive sul monitor seriale i dati presi dalla variabile, così da poterli osservare
}
if(Serial.available()){  //Se invece il serial monitor riceve un dato da inviare
char c = Serial.read();  //La variabile c viene memorizzata e letta dal monitor seriale
Serial1.write(c);  //Il dato viene inviato al bluetooth perchè sia elaborato e quindi trasmesso
}
}



Questo cambio di codice avviene perchè Arduino MEGA ha a disposizione più interfacce di monitor seriale rispetto ad Arduino UNO, perciò andiamo ad utilizzare una di queste, mentre prima andavamo ad emularlo tramite i pins 2 e 3.

Adesso che siamo entrati con il giusto programma in modalità AT, è possibile cambiare le impostazioni del nostro modulo. Di seguito sono riportate le più utilizzate e utili:

Comandi 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 (Master / 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

In ogni caso, se non abbiamo bisogno di molto altro che connetterci, per esempio, ad un altro HC-06, di seguito sono elencate in ordine le istruzioni da comunicare al nostro componente in AT-mode per eseguire questa operazione in modo semplice e veloce, senza troppi dettagli. Quindi, siamo appena entrati in modalità AT, accediamo al monitor seriale, e scriviamo:

  1. AT e la risposta del modulo sarà OK;
  2. AT + cmode = 1 e la risposta sarà nuovamente OK;
  3. AT + role = 1 così da impostare il modulo su cui lavoriamo come master (sarebbe stato a 0 per impostarlo come slave; per chiedere come è attualmente impostato, utilizziamo il comando AT + role?) e la risposta che avremo sarà ancora OK;
  4.  AT + init inizializziamo la ricerca di dispositivi, e la risposta sarà OK;
  5. AT + inq così da ricercare altri dispositivi nelle vicinanze, la risposta sarà l’indirizzo del dispositivo trovato, che può ad esempio essere +inq:4D65:4D:CA6612,5A0204,7FFF, e subito dopo un altro OK (se il dispositivo risulta essere già associato il modulo si conetterà già adesso);
  6. AT + bind = (indirizzo del bluetooth a cui ci colleghiamo separato da virgole) e ci verrà risposto ancora OK;
  7. AT + pair = (indirizzo del bluetooth a cui ci colleghiamo separato da virgole) accoppiamo i due moduli, cla risposta sarà quindi ok per segnalare che va tutto bene.

Questo processo deve essere applicato ad entrambi i moduli, con la differenza che a quello che decidiamo essere lo slave dobbiamo comunicare AT + role = 0.

Quindi adesso i nostri bluetooth sono collegati, operativi ed associati; se proveremo a scrivere nel monitor seriale “Ciao” e premere invio, questo sarà comunicato al nostro bluetooth associato, e comparirà nel secondo monitor seriale. Grazie a questo codice che abbiamo preso in esame, è possibile comunicare dati di qualsiasi tipo da un Arduino ad un altro tramite interfaccia bluetooth, perciò senza collegamenti fisici; questa cosa risulta utile ed efficiente quando andiamo ad utilizzare sistemi che richiedono un controllo in una stanza, ma un monitoraggio da qualche altra parte, ed inoltre possiamo lavorare in modo automatico su questi dati, permettendoci attraverso la scrittura di un determinato codice di attivare un suono audio quando un PIR installato davanti alla porta di casa rileva una presenza. In seguito sarà possibile trovare un codice complesso provato che da un assaggio delle potenzialità di questo mezzo di comunicazione.

Software: errori riscontrabili nell’utilizzo dei comandi AT

È possibile che quando andiamo a scrivere un comando AT sia rilevato un errore; questo errore ovviamente avrà un codice, e, non essendoci mai avvicinati alla programmazione di questo modulo prima di adesso, il senso dell’errore potrebbe rimanere alquanto oscuro.

Di seguito, quindi, troverete un elenco completo dei codici di errore riscontrabili e del loro significato:

Codice dell’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



L’errore verrà subito segnalato nel nostro monitor seriale; basterà quindi agire di conseguenza e correggerci per procedere correttamente nel nostro lavoro.



Progetto: preleviamo dati a distanza

  • Introduzione

Ho elaborato questo semplice esempio per farvi capire le potenzialità di questo modulo. Intanto bisogna sapere che dobbiamo avere a disposizione due moduli per poterlo realizzare; servono due Arduino, un UNO ed un Mega, dove l’UNO comanda il bluetooth definito come master ed il Mega il componente slave. Andiamo ad installare i due dispositivi in luoghi differenti, in modo che comunichino attraverso una connessione di tipo wireless; in questo progetto andremo infatti a prelevare dati da una certa stanza per elaborarli e renderli in output in modo visibile in un altro luogo, in particolare utilizzerò un fotoresistore per elaborare la luce di una posizione e cambiare nell’altra l’intensità luminosa di un led e scrivere una certa frase su un dispositivo lcd.

I moduli bluetooth sono molto comodi per certe cose, infatti pensando all’utilizzo di un PIR per creare un sistema di sicurezza casalingo, questo componente potrebbe giocare un ruolo fondamentale nel trasmettere informazioni quando il modulo rileva una presenza alla porta di casa, per comunicarcelo immediatamente.

Potremmo quindi dire che il modulo bluetooth ci offre velocità di trasmissione, comodità e versatilità, ed anche se è più dispendioso rispetto a fare dei collegamenti attraverso dati utilizzando l’SDA e l’SCL, le sue caratteristiche ci ripagano appieno di questo particolare.

  • Impostare il collegamento tra HC-05 master e slave

Dopo essere entrati in modalità AT (sopra è spiegato come fare), dobbiamo connettere i nostri due moduli per farli comunicare correttamente. Andiamo ad agire sul nostro modulo master, e, dopo aver caricato sull’Arduino il codice corretto sopra riportato, entriamo nel monitor seriale e scriviamo:

AT, per verificare che il modulo riconosca i comandi AT, e risponderà OK;

AT + cmode?, per verificare che il modulo sia abilitato a ricercare un bluetooth, e la sua risposta sarà ?cmode:(1) se è abilitato, oppure 0 se non lo è;

AT + cmode = 1, e risponderà quindi OK;

AT + role?, per verificare se il bluetooth è impostato come master (1) o slave (0), e la risposta sarà ?role:(1 o 0);

AT + role = 1, risposta OK;

AT + init, e la risposta sarà OK, dopodichè non ci farà più inserire comandi AT, ed il modulo entrerà in modalità ricerca, con il led che lampeggerà in modo veloce.

Sul modulo slave invece dovremo scrivere:

AT, per verificare che il modulo riconosca i comandi AT, e risponderà OK;

AT + cmode = 0, e risponderà quindi OK;

AT + role?, per verificare se il bluetooth è impostato come master (1) o slave (0), e la risposta sarà ?role:(1 o 0);

AT + role = 0, risposta OK;

AT + init, e la risposta sarà OK, dopo di che il led lampeggerà velocemente per poco tempo, fino a quando non sarà trovato dal modulo master, e quindi farà due lampeggi veloci succeduti da due secondi di pausa. Adesso proviamo a scrivere qualcosa al monitor seriale, dopo aver cambiato il baud rate di entrambi a 9600, ed il messaggio verrà inviato all’altro modulo, che lo darà in output sul serial monitor.

  • Codice del modulo master (caricare su Arduino UNO)



Per questo circuito ho utilizzato un Arduino UNO, una bread board, un modulo bluetooth HC-05, collegato come spiegato ad inizio articolo e con i pins TX e RX collegati rispettivamente ai pins 6 e 7, un led collegato al pin con funzione PWM 9, ed un lcd, collegato ai pin 12, 11, 5, 4, 3, 2.

Qua potete trovare anche lo schema fatto con Fritzing per vedere i collegamenti:

Caratteristiche fisiche del modulo



/*

Sketch da caricare su Arduino UNO, collegato al modulo bluetooth master.

Legge i dati inviati dallo slave, li rielabora per lavorare agevolmente col PWM, ed

in base a ciò che riceve scrive una determinata frase sullo schermo lcd, oltre che

variare l’intensità luminosa di un led.

*/

#include (parentesi angolare sinistra) LiquidCrystal.h (parentesi angolare destra) //Si include la libreria per utilizzare le istruzioni riguardanti lo schermo lcd

#include (parentesi angolare sinistra) SoftwareSerial.h (parentesi angolare destra)  //Si include la libreria riguardante l’utilizzo delle istruzioni per dispositivi wireless (necessario solo con Arduino UNO)

LiquidCrystal lcd (12, 11, 5, 4, 3, 2); //Definiamo i pins di controllo collegati all’lcd

const int rxpin = 6; //Definiamo il pin di ricezione dati

const int txpin = 7; //Definiamo il pin di trasmissione dati

SoftwareSerial bluetooth (rxpin, txpin); //Assegnamo un nome ai pin di ricezione/trasmissione e indichiamo la loro funzione tramite un istruzione di libreria

const short led = 9; //Definiamo il pin collegato al led. Utilizziamo il 9 poichè consente il PWM

void setup() {

pinMode (led, OUTPUT); //Definiamo la modalità del pin come OUTPUT

lcd.begin (16, 2); //Inizializziamo l’lcd dicendo che ha 16 colonne e 2 righe

bluetooth.begin (9600); //Inizializziamo l’interfaccia bluetooth di scambio dati e ne definiamo la velocità in baud (38400 per la modalità AT, 9600 per la trasmissione normale)

}

void loop() {

if(bluetooth.available()){ //Se il bluetooth riscontra dati in entrata

int messaggio = bluetooth.read (); //Inseriamo in una variabile il dato ricevuto dal modulo

delay (1000); //Attendiamo 1 secondo

short pwm = map (messaggio, 0, 100, 0, 254); //”Mappiamo” il valore ricevuto dal componente per renderlo maneggevole e lo inseriamo in una nuova variabile

analogWrite (led, pwm); //Il led va a emettere un’intensità di luce adeguata alla luce naturale della stanza

if ( messaggio < 50){ //Se la variabile “messaggio” è minore di 50

pluce (); //Si richiama il void pluce

}

else if ( messaggio >= 50) { //Se la variabile è maggiore o uguale a 50

mluce (); //Si richiama il void mluce

}

}

}

void pluce () { //Assegnamo il nome pluce al nuovo void

lcd.clear (); //Istruzione per pulire lo schermo dalle scritte superflue

lcd.setCursor (5, 0); //Impostiamo l’inizio della scrittura alla colonna 5 della riga 0

lcd.write (“Luce”); //Scriviamo Luce

lcd.setCursor (5, 1); //Impostiamo l’inizio della scrittura alla colonna 5 della riga 1

lcd.write (“alta”); //Scriviamo alta

delay(250); //Attesa necessaria alla corretta visualizzazione della scritta, altrimenti per lcd.clear () la vedremo leggermente male

}

void mluce () { //Assegnamo il nome mluce al nuovo void

lcd.clear (); //Istruzione per la pulizia dello schermo dlle scritte della schermata precedente

lcd.setCursor (5, 0); //Impostiamo l’inizio della scrittura alla colonna 5 della riga 0

lcd.write (“Luce”); //Scriviamo Luce

lcd.setCursor (4, 1); //Impostiamo l’inizio della scrittura alla colonna 4 della riga 1

lcd.write (“bassa!”); //Scriviamo bassa!

delay(250); //Attesa necessaria alla corretta visualizzazione della scritta, per eliminare le “interferenze” causate dall’lcd.clear ()

}

  • Codice del modulo slave (caricare su Arduino Mega)



Per questo circuito ho utilizzato un Arduino Mega, una bread board, un fotoresistore collegato al pin A0 e ad un resistore da 10 KΩ per fungere da partitore di tensione, ed un modulo bluetooth HC-05 collegato a 3.3 V, GND, RX a TX1 e TX ad RX1. Di seguito comunque lascio lo schema per facilitarne il montaggio:

Schema di montaggio



/*

Sketch da caricare ad Arduino Mega collegato con il modulo bluetooth slave.

Effettua una lettura di un fooresistore e la invia elaborata in un range da 0 a 100

al bluetooth master.

*/

short ph = A0; //Assegnamo al fotoresistore il pin A0

void setup() {

Serial1.begin (9600); //Inizializziamo l’interfaccia seriale del bluetooth con baud rate 9600

}

void loop() {

short luce = analogRead (ph); //Lettura analogica del fotoresistore

int messaggio = map (luce, 1023, 0, 0, 100); //”Mappiamo” il valore ricavato dal fotoresistore per renderlo più maneggevole e lo inseriamo in una nuova variabile

Serial1.write (messaggio); //Inviamo tramite modulo bluetooth la variabile “messaggio”

delay (1500); //Attesa di un secondo e mezzo per sincronizzare i dati che arrivano all’altro bluetooth

}