Da appassionato Makers almeno una volta nella vita hai immaginato di poter impartire comandi vocali ad un progetto tecnologico realizzato da te: EasyVR è nata proprio per farti realizzare questo sogno.
Più volte avrei voluto dare ai miei progetti la capacità di comprendere i miei comandi vocali.
Interagire con la voce è una caratteristica dell’essere umano, almeno per la maggior parte delle persone, comunichiamo ogni giorno con la voce e i film di fantascienza ci hanno prospettato un futuro in cui l’interazione uomo macchina avviene attraverso la voce.
Forse siamo ancora lontani da quel momento, a mio avviso non troppo, vedi Siri:
che Apple ha introdotto con le ultime versioni di IOS e smartphone.
Ma come puoi dotare il tuo progetto di comandi vocali con Arduino e la EasyVR shield?
Due appassionati Matteo e Marco, a cui ho dedicato già un articolo qualche settimana fa, hanno realizzato un tutorial video:
Come hai visto hanno utilizzato la EasyVR per impartire comandi vocali ad un piccolo robot.
Potresti decidere di utilizzarla per controllare il tuo impianto domotico …
corro a comprarne una anch’io così potrò testare personalmente gli insegnamenti appresi dal video.
Comandi Vocali con arduino e easyVR
Sul sito ufficiale della shield easyVR ho trovato il manuale utente, sia per il collegamento della easyVR al pc sia per la sua configurazione ed anche il link alle librerie da usare con Arduino per realizzare velocemente il mio prossimo progetto.
Matteo e Marco mi hanno anche inviato la foto del loro progetto del robot con comandi vocali:
e lo sketch utilizzato per apprendere i comandi vocali dalla easyVR e trasformarli in movimento applicato al loro robot:
#include "EasyVR.h" #include "SoftwareSerial.h" SoftwareSerial port(12,13); EasyVR easyvr(port); //Groups and Commands enum Groups { GROUP_0 = 0, GROUP_1 = 1, GROUP_4 = 4, }; enum Group0 { G0_GO = 0, }; enum Group1 { G1_ANDARE = 0, G1_DESTRA = 1, G1_SINISTRA = 2, G1_STOP = 3, G1_INDIETRO = 4, }; enum Group4 { G4_VAI = 0, }; EasyVRBridge bridge; int8_t group, idx; char comando; void setup(){ // bridge mode? if (bridge.check()) { cli(); bridge.loop(0, 1, 12, 13); } // run normally Serial.begin(9600); port.begin(9600); if (!easyvr.detect()) { Serial.println("EasyVR not detected!"); for (;;); } easyvr.setPinOutput(EasyVR::IO1, LOW); Serial.println("EasyVR detected!"); easyvr.setTimeout(5); easyvr.setLanguage(1); group = 1; //<-- start group (customize) } void action(); void loop(){ easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening) Serial.print("Say a command in Group "); Serial.println(group); easyvr.recognizeCommand(group); do { //cosa fare in attesa } while (!easyvr.hasFinished()); easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off idx = easyvr.getWord(); if (idx >= 0) { // built-in trigger (ROBOT) // group = GROUP_X; <-- jump to another group X return; } idx = easyvr.getCommand(); if (idx >= 0) { // print debug message uint8_t train = 0; char name[32]; Serial.print("Command: "); Serial.print(idx); if (easyvr.dumpCommand(group, idx, name, train)) { Serial.print(" = "); Serial.println(name); } else Serial.println(); easyvr.playSound(0, EasyVR::VOL_FULL); //azioni action(); } else // errors or timeout { if (easyvr.isTimeout()) Serial.println("Timed out, try again..."); int16_t err = easyvr.getError(); if (err >= 0) { Serial.print("Error "); Serial.println(err, HEX); } } if(Serial.available()>0){ comando=Serial.read(); Serial.println(comando); } void go(){ //Motore sinistro digitalWrite(7,HIGH); analogWrite(6,255); //Motore destro digitalWrite(4,HIGH); analogWrite(5,255); } void stop(){ //Motore sinistro digitalWrite(7,LOW); analogWrite(6,0); //Motore destro digitalWrite(4,LOW); analogWrite(5,0); } void back(){ //Motore sinistro digitalWrite(7,LOW); analogWrite(6,255); //Motore destror digitalWrite(4,LOW); analogWrite(5,255); } void right(){ //Motore sinistro digitalWrite(7,HIGH); analogWrite(6,255); delay(2000); analogWrite(6,0); //Motore destro digitalWrite(4,LOW); analogWrite(4,0); } void left(){ digitalWrite(7,LOW); analogWrite(6,0); //Motore destro digitalWrite(4,HIGH); analogWrite(5,255); } void action() { switch (group) { case GROUP_1: switch (idx) { case G1_ANDARE:go(); break; case G1_DESTRA:right(); break; case G1_SINISTRA:left(); break; case G1_STOP:stop(); break; case G1_INDIETRO:back(); break; } } }
Buon divertimento !!!
43 commenti
Vai al modulo dei commenti
Ciao, volevo chiederti se è possibile sostituire il microfono in dotazione alla easyVR con uno più performante così da migliorare la ricezione. Se sì che tipo di preciso? Grazie
Autore
Ciao Gianluca,
hai consultato il sito del produttore della shield?
Dovrebbe darti delle utili info.
Mauro
si puo e in che modo: far dire alla scheda easy VR “sono stata progettata da……” o altre cose simili grazie per l’aiuto
Autore
Ciao Luca,
nell’articolo trovi una descrizione dettagliata di cosa puoi fare con questa shield.
sono riuscito a far funzionare tutto ma adesso mi si è posto un altro problema: quando vado a collegare la scheda relè,”a 16 canali”,con l’arduino e la easyvr ,mi trovo che i relè sono gia alimentati lo spengo lo riavvio e sono allimentati metto il monitor seriale e sono sempre alimentati ,per disattivarli devo partire con i comandi,puoi insegnarmi come posso far partire tutto da zero e poi quando io do il comando loro si alimentano so che devo programmare le uscite ma nn so in che modo e dove deve essere posizionato nel programma mi potete aiutare ho provato a dare il ciclo if nel setup pero mi da errore.
Autore
Ciao Luca,
il posto corretto è il setup(), senza alcun if()
Se non sai come programmare le uscite arduino puoi leggere uno dei miei tutorial del corso base gratiuto on-line.
il problema lo fa solo con la scheda relè se provo solamente con i led e la breadboard funziona tutto regolare
ho risolto il problema con il modulo relè a 16 il comando(HIGH,LOW) sono al contrario.Nel programma nella voce dove devi selezionare il GRUPPO e selezionare le uscite ,assieme bisogna dargli anche il digitalWrite,cosi facendo quando si va a collegare il tutto il modulo relè parte spento. Ho provato funziona,resta il problema del monitor seriale che quando lo attivo in automatico mi riaccende tutti i relè come si fa?
Autore
Ciao Luca,
quando attivi il monitor seriale di fatto invii un reset ad arduino, leggi gli articoli sul minitor seriale.
Per risolvere devi fare come suggerito prima: metti i comandi di LOW o HIGH, dipende dalla logica dei tuoi relay, nella funziona setup().
cusami se ti disturbo ho guardato come impostare la easyvr con comando vocale ,ci sono riuscito per meta ;praticamente ho messo le parole che mi servivano e le ho caricate . L’unica cosa che son riuscito a fare è fargli dire una parola alla volta e fin qua ci sono tranne che per tutti i comandi dice sempre la stessa frase . ho letto pero che è possibile associare i comandi vocali a una determinata risposta ora o provato a leggere e rileggere ma senza risultato .non ai qualche spezzone di programma da farmi vedere come si fa o qualche tutorial. so che nel programma generato dalla easyvr 2.0 alla voce (easyvr.playSound(5,EasyVR::VOL_DOUBLE); cambiando il numero cambi la risposta ma se io gli dico accendi luce come associo la risosta luce accesa?
Ti ringrazio della tua pazieza con me .Son due giorni che provo ma senza risultato ,CIAO
Autore
Purtroppo Luca, come hai già letto non ho ancora provato la mia EasyVr per fornirti alcuno sketch che faccia ciò che desideri.
Tuttavia sono certo che se possibile fare ciò che desideri nella documentazione ufficiale troverai tutto ciò che ti occorre come hanno fatto gli autori di questo articolo.
Io in prima persona seguo la documentazione ufficiale quando desidero ottenere dei risultati fattibili ma a me ignoti.
Ciao Mauro,
per prima cosa mi complimento per i tuoi progetti ne ho realizzati alcuni. Sono alle prime armi con arduino, ho appena preso la shield easyVR, ho eseguito il tuo video e sketch, ma non mi funziona.
Mi da un errore se uso il tuo sketch tipo
In file included from comandi_robot.pde:2:
C:\Users\carlo davide\Desktop\arduino\arduino-1.0.2\libraries\SoftwareSerial/SoftwareSerial.h:52:
error: conflicting return type specified for ‘virtual void SoftwareSerial::write(uint8_t)’
C:\Users\carlo davide\Desktop\arduino\arduino-1.0.2\hardware\arduino\cores\arduino/Print.h:48:
error: overriding ‘virtual size_t Print::write(uint8_t)’
comandi_robot.pde: In function ‘void loop()’:
comandi_robot:112: error: a function-definition is not allowed here before ‘{‘ token
comandi_robot:120: error: a function-definition is not allowed here before ‘{‘ token
comandi_robot:128: error: a function-definition is not allowed here before ‘{‘ token
comandi_robot:137: error: a function-definition is not allowed here before ‘{‘ token
comandi_robot:149: error: a function-definition is not allowed here before ‘{‘ token
comandi_robot:158: error: a function-definition is not allowed here before ‘{‘ token
comandi_robot:176: error: expected `}’ at end of input
poi avvolte mi da un errore che sinceramente ho fatto molte ricerche ma non riesco a capire
Print.h:48: error: overriding ‘virtual size_t Print::write(uint8_t)’
Mi puoi aiutare cortesemente..
Autore
Ciao Gianluca,
Questo tutorial é frutto di un esperimento eseguito da due appassionati, citati nell’articolo, per cui provo ad inoltrare loro i tuoi errori e chiedere se possono darti una mano 🙂
Mauro
Scusa Mauro io collego lo shield ad arduino ma non va in reset e a sua volta il pc non lo riconosce.
E’ Tutto apposto funzioina tutto i pin sono collegati perfettamente ( ho testato la continuità della corrente con un multimetro) Ma arduino non va in reset e non si spegne quella lucina arancione che dovrebbe spegnersi.
Cercando su internet dicono che non va in reset perché i pin non sono collegati perfettamente e muovendo lo shield si può risolvere il problema ma niente non funziona
Mi puoi aiutare Grazie in anticipo
Autore
Ciao Pietro,
dove hai letto che dovrebbe spegnersi una lucina arancione?
In un video su youtube dicono che arduino dovrebbe andare in reset e i led L TX ed RX di arudino dovrebbero rimanere spenti e comunque apparte quello il pc non riconosce lo shield che posso foare ho provato in tutti i modi!
Autore
Ciao Pietro,
la EasyVR la conosco poco.
Ma l’arduino senza la EasyVR viene riconosciuto dal computer?
ciao Mauro,
Sono riuscito a portare il Sketch su Arduino ma se apro il monitor seriale mi dice che non è connesso perchè?
Aiutooo!!!
Autore
Ciao Gianluca,
Se provi con un’altro sketch che scrive sulla seriale, funziona?
Mauro
grazie tanto per avermi risposto…
Sto uscendo pazzo.. Allora ho provato di tutto, con alcuni sketch mi da un errore tipo size e write (unit8 _t)
altri sketch vanno a buon fine ma al momento che apro il monitor seriale mi da la voce EasyVR non connesso..
Ho provato con tutte le versioni di arduino dalla 00022 alla 1.5.3. ho paura che sia la libreria SoftwareSerial.
L’arduino che uso è “uno R3” e funziona bene…
Di dico di più la scheda EasyVR sembra che funzioni bene perchè con il programma commander quando inserico i group e controllo con il test funziona. Ti prego aiutami..
Ciao e buona giornata…
Autore
Ciao Gianluca,
attendiamo fiduciosi l’intervento degli autori, io non ho mai provato quella shield, non saprei da dove iniziare, ne come aiutarti.
Mauro
Grazie mille!!!!
Ciao Mauro,
Tutto il casino era perchè non facevano bene i contatti dei piedini 12-13
Sono riuscito a farlo partire. adesso la seriale mi dice EasyVR detected. Pero non risponde ai comandi e noto che il led verde in corrispondenza del microfono è sempre spento. Cosa può essere ?
Ciao Mauro,
Funziona alla meraviglia grazie mille di tutto…
Autore
Ciao Gianluca,
sono contento per il tuo progetto, se vorrai pubblicare i tuoi esperimenti e condividerli con altri appassionati io sarò felice di pubblicarli sul Blog a tuo nome.
Mauro
Si grazie.. Sai cosa vorrei realizzare ? Hai presente quel Robot Spider che è comandato da arduino ? ecco vorrei farlo funzionare con la easyVR… Sarà dura!!!
Grazie ancora…
Autore
Ciao Gianluca, non conosco il robot spider di cui parli tuttavia mi sembra un gran bel progetto e sono ancora più desideroso di pubblicarlo, potrebbe essere applicato anche ad altri robot.
Mauro
I have an Arduino Mega 2560 and the EasyVR shield. When I use EasyVR Commander, I can only train the trigger command. Everything else I try to train it tells me “Training Error: Recognition Failed”.
This is the only issue I’m having since I can test the trigger command as well as the wordlist. I even tried using the same command on the group lists but even that tells me the message.
Any help is appreciated.
Ciao Mauro,
ho acquistato anche io la easyvr shield, ma ho parecchie difficoltà a reperire le voci di risposta comando in italiano. Sai indicarmi dove posso trovarle o scaricarle? Giusto per rendere l’idea, se vai sul tutorial di adrirobot senti che la scheda una volta ricevuto il comando da conferma, ma in italiano, e a me manca sto pezzo.
Come credi sia meglio agire?
grazie mille
Autore
Ciao Volpato,
hai provato sul sito del produttore della shield?
Se non le trovi lascio il tuo commento on-line così che qualche appassionato possa aiutarti.
Mauro
Buonasera, ho 2 moduli easyVR ma non riesco a farli funzionare, ho seguito il video e il codice C lo compila perfettamente, il problema e che va in errore come se non rilevasse i comandi audio. Con il Commander funziona perfettamente, creo i comandi e se faccio il test e pronuncio la parola lui li identifica, ma con l’arduino no, mi da (Timed out, try again…) come posso fare? ho provato il vostro codice ma mi da subito errore .
Autore
Ciao Roberto, lascio il tuo commento on line perché qualche appassionato possa aiutarti. Io non ho ancora provato la mia EasyVr e rischio di darti consigli errati.
Mauro
ciao mi chiamo luca e sono alle prime armi con la EasyVr. Nel mio progettino ho impostato i comandi vocali. Fatto lo sketch l’ho passato su l’arduino caricato e il tutto funziona.Il problema è che fatto tutto questo ho solo programmato le parole ma come si fa a trasformarle in uscita dalla scheda easyvr? e come faccio poi a fermare l’azione con la parola stop?Mi potete dare una mano grazie.
es:” la parola accendi luce” la luce dovrebbe accendersi. E poi con la parola “stop” dovrebbero spegnersi.Come si fa?
un saluto a tutti
Autore
Ciao Luca,
lascio on-line la tua richiesta perchè possano risponderti gli autori dell’articolo.
Io ho acquistato la EasyVr ma non ho ancora provato ad usarla.
Ciao mi chiamo Filippo e conoscendo da poco la shield EasyVR 3.0 per Arduino mi sono appassionato e sto facendo delle prove…la domanda che volevo porti è la seguente: ho fatto il programma e nella pratica al mio comando vocale si riproduce l’audio che avevo impostato con il commander tramite uno speaker 8 ohm ma il suono è debolissimo; In più per simulare ad esempio l’accensione al mio comando di una luce ho messo un led ma quando pronuncio il comando esempio “accendi” mi da la risposta come ho detto prima bassissima e la luce del led si accende ma è davvero fioca fioca. Quindi se magari hai dei consigli da darmi per il fatto del volume del suono in risposta al comando vocale e la luce fioca del led te ne sarei molto grato…Un grazie in anticipo!!!
Autore
Ciao Filippo,
in merito al volume controlla che l’audio possa supportare un impedenza da 8ohm, se non ricordo male è una 4ohm.
Per l’accensione del led che resistenza stai utilizzando? a che pin ? con quale comando ?
Mauro
Ciao Mauro…
Mi chiamo Alessandro….
e possibile aggiungere a questo progetto,anche delle risposte vocali?…….non so magari al comando ” avanti ” ,arduino mi risponda ” va bene ” oppure ” ok ” ecc ecc….
grazie
Ciao Mauro volevo chiederti se questa scheda permette di leggere i valori analogici e ripetterli?
Se no esiste una scheda che faccia questo?
Autore
Ciao Luca,
non ho compreso la tua esigenza.
salve qualcuno puo dpiegarmi il codice gentilmente
grazie mille
Autore
Ciao Pierpaolo,
hai ragione in questo articolo manca 🙂 Chiederò all’autore pubblicare una descrizione dello sketch.
Ciao per cortesia qualcuno ha fatto uno sketch che colleghi la scheda easyvr 3 ad una scheda arduino ed una scheda con relè
Grazie
Autore
Ciao Mirco,
lascio on-line la tua richiesta perché chi ha già realizzato quanto chiedi possa aiutarti.