Perché leggere un valore di tensione o una temperatura su un display quando possiamo conoscere il valore misurato grazie alla voce della nostra scheda? Vedremo insieme, con questo articolo, come dare una voce ad Arduino.
Il progetto proposto permette di dare la parola ad Arduino; sarà così facile, per esempio, sentire il valore letto tramite una porta analogica attraverso l’altoparlante connesso alla scheda. Il tutto è possibile utilizzando uno speciale shield su cui è installato un modulo sonoro LPM11162 con cui è possibile memorizzare e riprodurre file audio in formato wave. Lo shield misura 43x59 mm e, su di esso, sono presenti uno stadio alimentatore, un'interfaccia per l'adattamento delle tensioni di comunicazione tra il processore Arduino e il modulo LPM11162, uno stadio amplificatore e, infine, una sezione sensori e una di I/O.
Schema elettrico
Cuore dello shield è il Modulo LPM1162, che si presenta come un piccolo circuito (28x20 mm) dotato di due file da sei pin. Sul modulo sono presenti pochi componenti tra cui il processore, un PIC32MX320F, e una memoria flash da 2Mbyte che permette di memorizzare un massimo di 95 secondi di registrazione in formato wave 11 KHz-16bit mono (tempo massimo per tutti i file), mentre il numero massimo di file è di 512 e non c'è limitazione alle dimensioni di ciascun file.
Per gestire il modulo sono necessari pochi e semplici comandi seriali che vengono inviati tramite le quattro linee RX, TX, Busy, Reset.
Per maggiori informazioni e per l'acquisto del modulo vedere il sito del produttore LP Elettronica
Descrizione del circuito
Per la descrizione del circuito partiamo dallo stadio di alimentazione del modulo LPM11162 che necessita della tensione di 3,3 V, senza utilizzare quella fornita da Arduino.
Nel nostro caso, si utilizza la tensione derivata da quella a +5V che è ridotta utilizzando un classico regolatore LM317LZ (corrente massima fornita 100mA), il valore della tensione è impostato tramite le due resistenze da 240Ω e 390Ω.
Dato che il modulo LPM11162 funziona con una tensione di alimentazione di +3,3 V, anche le comunicazioni seriali e i segnali di reset e busy sono e devono essere a questa tensione. Visto che Arduino ha una logica a +5V, è necessario adattare i livelli uscenti ed entranti dal modulo. Per quelli entranti (RX - Reset), è sufficiente un partitore resistivo 10K/15K che adatta la tensione d'uscita 5 V di Arduino ai 3,3 V con cui il modulo LPM11162 è alimentato. Per quelli uscenti, si sono utilizzati due transistor BC337 che traslano il livello d'uscita 3,3 V del modulo audio ai 5 V di Arduino.
Per amplificare il segnale audio analogico in uscita dal pin 9 del modulo LPM11162, è utilizzato un integrato amplificatore, in questo caso un LM386. Questo circuito integrato che si presenta in un contenitore plastico ad 8 pin (DIP8), è molto diffuso perché con pochi componenti esterni è in grado di pilotare direttamente un piccolo altoparlante: con 5 V di alimentazione riesce a fornire una potenza di circa 300 mW su un altoparlante da 8 Ohm. Per quanto riguarda il guadagno, questo è impostato a 200 tramite il condensatore C6 da 10 µF connesso ai pin 1 ed 8.
Il condensatore, infatti, influisce su questo valore dal momento che esso funge da bypass per il resistore e la componente resistiva in gioco è quella della impedenza complessa che varia come 1/C.
La regolazione del volume è ottenuta con il trimmer RV1 da 10 kOhm, il condensatore da 47 nF e la resistenza da 10 Ω in serie sull'uscita dell'amplificatore, sono necessari per rendere stabile l'amplificatore come indicato nel Datasheet. In serie all'altoparlante è presente il condensatore di disaccoppiamento C9 che costituisce un blocco per la componente in continua evitando che la medesima venga inviata all'altoparlante.
Per il collegamento dei sensori sono presenti due connettori, X1 connesso all’ingresso Analogico A0, e X2 connesso all’ingresso A3.
Abbiamo poi altre due possibilità di interagire con la scheda, rappresentati da un pulsante connesso alla porta digitale D7 e da un led dotato di resistenza limitatrice connesso alla porta digitale D6.
Connettori per sensori
Ai connettori X1 e X2, è possibile collegare sensori con uscita analogica come un sensore di temperatura LM35; questo si presenta con tre terminali: uno per l’alimentazione, uno di massa e uno per l’uscita della tensione proporzionale alla temperatura rilevata che è pari a 10 mV per ogni grado centigrado, ed è calibrato in gradi Celsius. Per trasformare la tensione letta si può utilizzare la formula:
temp = (5.0 * analogRead(tempPin) * 100.0) / 1024
Si consideri che, con un campionamento a 10 bit, Arduino ha una risoluzione in tensione di circa 5 mV, e considerando che LM35 fornisce 10 mV per ogni grado centigrado, la massima precisione che si può ottenere, è di mezzo grado.
Altro tipo di dispositivo collegabile al connettore è un potenziometro; si possono utilizzare indifferentemente i potenziometri in contenitore rotativo o lineare.
Anche in questo caso per la lettura della porta analogica, si userà il comando analogRead() che converte la tensione d’ingresso da 0 a 5 volt, in un valore digitale. Ruotando l’albero del potenziometro, si cambia la quantità di resistenza su entrambi i lati del pin centrale del potenziometro. Questo cambia la resistenza relativa tra il pin centrale e i pin esterni, dando una tensione diversa all’ingresso analogico. Quando l’albero è girato completamente in una direzione, non vi è resistenza tra il pin centrale e il pin collegato a GND. La tensione al pin centrale è quindi 0 volt. Quando l’albero è girato tutto nella direzione opposta, non vi è resistenza tra il pin centrale e il pin collegato a +5 volt. La tensione al pin centrale è quindi di 5 volt. Perciò analogRead() restituirà un numero tra 0 e 1023 che è proporzionale alla quantità di tensione applicata al pin analogico.
Circuito stampato
L'immagine vista riporta la traccia del circuito stampato, questo è del tipo monofaccia e sono previsti solamente tre ponticelli.
Piano di montaggio
Di seguito invece è visibile l'immagine del piano di montaggio.
Lista Parti
Realizzazione pratica
Per la costruzione della scheda, si procederà iniziando dalla realizzazione del circuito stampato, la traccia è scaricabile in scala 1:1 mediante il link (in fondo all'articolo).
Occorre ricordare che la stampa dovrà essere fatta deselezionando la funzione che adatta il foglio alla pagina. Per la sua realizzazione, si utilizzerà una basetta in vetronite (monofaccia) di dimensioni 43x59 mm, il metodo potrà essere quello della fotoincisione o del trasferimento termico utilizzando i cosiddetti fogli blu (PRESS-N-PELL), in questo caso ricordo che l’immagine delle tracce del circuito dovrà essere speculare. Una volta inciso il rame, si verificherà in controluce o mediante l’utilizzo di un multimetro, che non vi siano cortocircuiti soprattutto tra le piste più vicine. Si passerà quindi alla foratura della stessa, utilizzando principalmente una punta da 0,8 mm, mentre, se ne utilizzerà una da 1 mm per le pin strip. In seguito, si potrà passare al posizionamento e alla saldatura dei componenti seguendo lo schema di montaggio visto prima.
Per la saldatura, si utilizzerà un piccolo saldatore a punta fine, della potenza di circa 25 – 30 W. S’inizierà dai vari ponticelli, continuando con le resistenze; si potrà, quindi, procedere con il pulsante, lo zoccolo dell'integrato, i condensatori. Si concluderà con le pin strip e i connettori.
Terminata la saldatura, si potranno inserire gli integrati IC2 (Modulo LPM1162) e IC3 (LM386) nell’apposito zoccolo facendo attenzione alla tacca di riferimento.
Sensori
Come detto sopra, alla scheda possono essere connessi vari sensori, la cui uscita sia analogica con un range di tensione compreso tra 0 e +5V.
Nella figura sotto, sono visibili due esempi: un potenziometro (utilizzato poi nel test) e un sensore di temperatura LM35.
Programma ToolKit
Per trasferire i file wav nella memoria del modulo LPM11162, è disponibile presso il sito del produttore, uno speciale programma chiamato LPM11162 ToolKit; con quest’applicazione per PC l'uso del modulo diventa semplice.
Con questo programma è possibile:
- Convertire i file wave nel formato mono-11KHz-16bit.
- Programmare i file wave sul LPM11162
- Riprodurre i file wave programmati con regolazione del volume.
- Verificare la versione di firmware dei moduli LPM11162.
- Aggiornare il firmware all'ultima versione Firmware.
Per la programmazione tramite la scheda Arduino, è disponibile la modalità Bridge: Arduino diventa programmatore per il modulo audio LPM11162 e non sono necessari dispositivi esterni. Quindi il modulo LPM11162 è collegato ad Arduino che a sua volta è collegato al PC tramite una COM virtuale (connessione USB).
Libreria Arduino
Per la gestione del modulo, è disponibile, sempre presso il sito del produttore, la LPM11162 Arduino Library che è una libreria open-source per il controllo dei moduli audio LPM11162 con Arduino.
La libreria fornisce alcune semplici funzioni e invia comandi seriali al modulo audio per riprodurre i file programmati. Sono disponibili le seguenti funzioni:
begin(baudrate)
Configura la libreria e l'hardware per comunicare con il modulo audio LPM11162 con il baudrate selezionato, tipicamente 9600.
end()
All'opposto di begin() rilascia interamente le risorse hardware e software impegnate per la comunicazione con il modulo audio LPM11162.
play(fileName)
Inizia la riproduzione del file WAV il cui nome è specificato come parametro della funzione.
stop()
Interrompe la riproduzione del file WAV che è in corso.
volume(volume)
Regola il livello del volume di riproduzione audio passando un numero tra 0 e 100 come parametro per indicare il volume.
isBusy()
Legge lo stato del pin /BUSY del modulo LPM11162. Questa informazione è utile per sapere se la riproduzione di un file WAV è ancora in corso.
reset(resetLevel)
Pilota direttamente il pin /RESET del modulo LPM11162.
synch()
Verifica la presenza del collegamento con il Toolkit per la programmazione dei file WAV sul modulo LPM11162.
bridge()
Con questa funzione la libreria Arduino entra in modalità Bridge.
Programma per creazione file wav
Se, oltre ai numeri e alle parole presenti nel programma demo, si vogliono registrare altri numeri o parole da pronunciare, si può utilizzare un qualsiasi programma di registrazione audio, ma utilizzando un programma di TTS cioè Text To Speech tutto si semplifica poiché è sufficiente scrivere quello che vogliamo far pronunciare e il programma, utilizzando la sintesi vocale che è la tecnica per la riproduzione artificiale della voce umana, creerà per voi il file che potrà essere salvato in formato wav. Quello che consiglio si chiama DSpeech è stato scritto da Dimitrios Coutsoumbas (Dimio). Il programma che tra l’altro è freeware, oltre alle funzioni TTS, possiede le funzionalità di ASR (Automatic Speech Recognition) integrate. E' cioè, in grado di leggere ad alta voce il testo scritto e di scegliere le frasi da pronunciare a seconda delle risposte vocali dell'utente.
Non ha bisogno di essere installato e occupa poca memoria. Permette di salvare l'output sotto forma di un file Wav, Mp3, Aac, Wma o Ogg.
Per scaricarlo e per le istruzioni di come installarlo vedere il seguente link.
Programma di prova
Segue un esempio di programma, in questo caso è letto il valore di tensione variato tramite un potenziometro collegato al connettore X2. Il valore di tensione è poi “pronunciato” tramite l’altoparlante connesso all’uscita. La procedura di caricamento è la seguente.
Lanciare l’IDE e trasferire il programma nella memoria di Arduino. A caricamento terminato, lanciare il programma ToolKit e utilizzando la funzione bridge trasferire nella memoria del modulo LPM11162 i file wav presenti nel file zip allegato a quest’articolo, essi sono riferiti ai numeri, la parola “punto” e “volt”. Sconnettere il programma toolkit e resettare la scheda Arduino. A questo punto ruotando l’alberino del potenziometro, si udrà dall’altoparlante il valore di tensione letta
#include <SoftwareSerial.h> #include <LPM11162.h> #define LPM11162_RX 3 //Arduino TX (out) #define LPM11162_TX 4 //Arduino RX (in) #define LPM11162_RESET 2 //(out) #define LPM11162_BUSY 5 //(in) #define pin_tensione A3 // Pin analogico lettura LPM11162 audio(LPM11162_RX, LPM11162_TX, LPM11162_RESET, LPM11162_BUSY); int pinval = 0; int oldpinval =0; void setup() { Serial.begin(9600); if ( audio.synch() ) { audio.bridge(); } audio.begin(9600); } void loop() { pinval = analogRead(pin_tensione); // Legge il pin analogico if(pinval != oldpinval) { oldpinval = pinval; SayVolts(pinval); // Converte in una tensione e dice il valore } delay (2000); } void SayVolts(int volts) { int BigNumber = 0; int SmallNumber = 0; BigNumber = abs(volts/204); // Converte il valore analogico in tensione Serial.println (BigNumber); SmallNumber = volts - abs(BigNumber*204); // Converte i decimali ad una sola cifra SmallNumber = abs(204-SmallNumber)/2; SmallNumber = abs(100-SmallNumber)/10; Serial.println (SmallNumber); if (BigNumber != 0) { String intero= String (String (BigNumber) + ".wav"); char frase_array[20]; intero.toCharArray( frase_array, sizeof(frase_array) ); audio.play(frase_array); while( audio.isBusy() ); delay (1000); } audio.play("punto.wav"); // Dice "punto" while( audio.isBusy() ); delay (1000); String decimale = String (String (SmallNumber) + ".wav"); char frase_array[20]; decimale.toCharArray( frase_array, sizeof(frase_array) ); audio.play(frase_array); while( audio.isBusy() ); delay (1000); audio.play("volt.wav"); // Dice "volt" while( audio.isBusy() ); delay (1000); }
Conclusioni
Il programma presentato è molto semplice, ma è possibile crearne altri, per esempio uno che leggendo la tensione in uscita dal sensore di LM35, converte il valore letto e fa pronunciare quest'ultimo tramite l'altoparlante.
Documentazione completa Open Source
La documentazione completa è disponibile, a questo link: voice_shield_arduino.zip
- Schema elettrico PDF
- Layout PDF
- Circuito stampato PDF
- Schema elettrico e layout sorgente EAGLE
- Sketch per Arduino
- File wav da memorizzare sul Modulo LPM11162.
Davvero un ottimo lavoro!
Complimenti!
Completo, esaustivo, ben documentato e Open Source… perfetto!
Bravissimo! 🙂
Una domanda: quando dici che DSpeech può salvare in mp3 senza bisogno d’altro (installazione) intendi che i codec mp3 e la libreria lame son già installati, vero?
Ti ringrazio per i complimenti.
Per quanto riguarda il programma DSpeek ti confermo che scaricando il file zip dal sito, ultima versione 1.57.2 trovi già al suo interno il file lame.exe.
Sto lavorando con un modulo voce da 89 euro e ancora causa mia inesperienza dell’elettronica non sono riuscito a farla funzionare=) questo modulo e semplice perfetto e l’articolo e spiegato benissimo, davvero i miei complimenti
Volevo anche io fare i miei complimenti all’autore per l’ottimo articolo, sia per la validità e utilità del progetto che per la qualità e cura dell’articolo. Anni fa, quando Arduino non era ancora nato, mi cimentai pure io nella realizzazione di un semplice WAV player, seguendo un noto Application Note di Microchip. In pratica si utilizzava un PIC per implementare un file system FAT su una schedina di memoria (SD, ma in origine erano delle MMC). Praticamente bisognava fare tutto da zero (da scratch, come dicono gli anglosassoni), però Microchip forniva le librerie per il file system (da configurare, ovviamente).
La soluzione con Arduino e relativo sketch è sicuramente più veloce e risparmia diversi problemi. Una curiosità: i file wav devono necessariamente avere le caratteristiche indicate (16 bit, 11Khz), oppure si possono creare/utilizzare file anche a 8 bit (in questo caso aumenterebbe la memoria disponibile per registrare i suoni)?
Un mio precedente progetto utilizzava un chip SpeakJet, che è un sintetizzatore vocale, di voce e di suoni complessi a singolo chip che utilizza la tecnologia MSA (Mathematical Sound Architecture) per controllare i suoi cinque canali interni usati per generare un vocabolario pressoché illimitato di sintesi vocale e di suoni complessi.
Peccato che sia preconfigurato con 72 allofoni, 43 effetti sonori e 12 toni DTMF, il che permette di creare frasi con accento marcatamente inglese e metallico.
http://www.adrirobot.it/speakjet/modulo_speakjet.htm
Attualmente il firmware del modulo prevede l’utilizzo di file wav solamente a con le caratteristiche descritte; 11KHz che garantisce una buona banda passante per file vocali, per rumori ambientali, ma anche per la musica. Mentre i 16 bit assicurano un suono privo di fruscio o rumore di fondo.
Ma potendo aggiornare il firmware, non è detto che questo sia possibile accettando un certo decadimento che nel caso di soli messaggi vocali potrebbe essere accettabile.
Proverò a contattare il progettista del modulo con cui ho già collaborato per realizzare varie applicazioni del modulo per vedere se questo è possibile.
Nel caso sul mio sito potrete vedere la nuova applicazione.
http://www.adrirobot.it/menu_new/index/index_lpm11162.htm
Dopo la pubblicazione dell’articolo, un lettore ha montato diversi shield basati sul progetto, facendosi realizzare il circuito stampato industrialmente.
A montaggio avvenuto il circuito non funzionava in quanto il modulo audio LPM1162 non era riconosciuto dal programma di gestione.
Dato che il prototipo funzionava correttamente, anche con l’aiuto di Luca Pellegrini costruttore e fornitore del modulo si è ricercato il problema, trovandolo nel partitore presente sulla linea di Reset.
Il valore utilizzato nel mio prototipo originale era di 1KΏ/1,5KΏ. mentre sul circuito proposto su era di 10KΏ/15KΏ analogo a quello sulla linea verso il pin 6 RX.
Il suo valore è troppo elevato e deve essere ridotto permettendo il sicuro RESET del modulo da parte del programma.
Per questo, occorre diminuire il valore della resistenza R10 portandolo a 470Ώ, mentre il valore di R11 deve essere diminuito a quello di 820 Ώ.
Altra segnalazione di un errore nel disegno della disposizione dei componenti, le posizioni delle resistenze R4 e R5 sono invertite.
Sul mio sito ho pubblicato un’apposita pagina, dove oltre alle foto della scheda realizzata è possibile scaricare la documentazione aggiornata.
Ecco il link
http://www.adrirobot.it/lpm11162/LPM11162_voice_shield_errata_corrige.htm
Ciao,
scusate, ma non ho capito se questo sintetizzatore vocale può pronunciare anche i valori restituiti, come per esempio la temperatura.
grazie
Si che è possibile, occorre solamente modificare il programma, e utilizzare il sensore LM35 come descritto nel testo.
In pratica devi ottenere il valore numerico della temperatura, analogamente come ho fatto per il valore della tensione.
Dopodiché crei la parte del programma che unisce le varie parole che avrai precedentemente salvato nella memoria del LPM 11162.
Per esempio farai pronunciare la frase ” La temperature è di ” seguita dalle parole per formare il numero corrispondente alla temperatura, seguito infine dalla parola “Gradi”.
Ciao,
In realtà al modulo puoi fare quello che vuoi, occorre solo scrivere un programma che converta quello che vuoi “far dire” in istruzioni che preparino la stringa da passare al comando “audio.play(frase_array)”
Nel modulo occorre poi inserire le parti di frase da far pronunciare.
Nel tuo caso occorrerà inserire nella memoria del modulo le frasi specifiche da far pronunciare, per esempio la frase “La temperatura è di” e “gradi centigradi.
Saluti
Ma se si aggiungesse un microfono, potremmo realizzare l’easyVR shield? Se è si come?
Mi spiace ma non è possibile aggiungere un microfono, il modulo non ha la capacità di campionare e convertire il suono.
La memoria del modulo accetta solamente dei file wave nel formato mono-11KHz-16bit.
No, sfortunatamente Arduino non ha la potenza necessaria per effettuare il riconoscimento vocale.
La scheda easyVR utilizza uno speciale processore tipo RSC-4128 pensato appositamente per questa funzione, affiancato da una memoria Flash tipo 39VF040.
Il modulo qui presentato permette solamente di riprodurre dei file wav registrati sul modulo LPM11162.
E se vorrei collegare un orologio e farlo parlare come posso fare.?
Ciao Fabio
E’ possibile, dovrai prima di tutto collegare ad Arduino un modulo DS2307
http://www.adrirobot.it/rtc_module/rtc_module_arduino.htm
La parte un pò più complessa è la realizzazione della parte del programma.
Nella prima parte dovrai dividere le varie parti in cui sono divisi i dati che vorrai far pronunciare dal modulo, le ore, i minuti, il giorno della settimana, ect
Farai poi “pronunciare” in sequenza la relative frasi che avrai precedentemente salvato nella memoria del modulo, per cui avrai per esempio:
“sono le ore”+”dieci”+”e”+”trentadue”+ “di”+”venerdì'”+”ventitrè”+”gennaio”
Qualcuno ha provato a collegare un potenziometro tra arduino e lo speaker per regolare il suono?
E secondo voi c’è un modo per modificare la voce magari con un equilizzatore fatto con arduino oppure un semplicissimo mixer.
Scusa la domanda, ma ti rifeisci ad un circuito che utilizza una porta digitale per emettere un suono con l’istruzione tone?
http://arduino.cc/en/reference/tone
Per quanto riguarda uno shield per modificare la voce trova a vedere questo
https://learn.adafruit.com/wave-shield-voice-changer/overview
salve
segnalo che l’allegato ZIP in fondo all’articolo porta ad una pagina d’errore 404…
Il link è ora funzionante, grazie della segnalazione 🙂