Comandi vocali EasyVR shield

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.

comandi vocali

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:

comandi vocali 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:

comando vocale easyVR

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 !!!

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/comandi-vocali-easyvr-shield.html

43 comments

Skip to comment form

    • Gianluca on 17 Apr 2013 at 01:48
    • Reply

    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

    1. Ciao Gianluca,
      hai consultato il sito del produttore della shield?
      Dovrebbe darti delle utili info.

      Mauro

        • luca on 25 Giu 2014 at 12:09
        • Reply

        si puo e in che modo: far dire alla scheda easy VR “sono stata progettata da……” o altre cose simili grazie per l’aiuto

        1. Ciao Luca,
          nell’articolo trovi una descrizione dettagliata di cosa puoi fare con questa shield.

            • luca on 22 Ago 2014 at 14:18

            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.

          1. 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.

            • luca on 22 Ago 2014 at 14:40

            il problema lo fa solo con la scheda relè se provo solamente con i led e la breadboard funziona tutto regolare

            • luca on 22 Ago 2014 at 16:21

            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?

          2. 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().

            • luca on 25 Ago 2014 at 15:30

            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

          3. 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.

    • gianluca on 10 Set 2013 at 17:01
    • Reply

    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..

    1. 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

        • Pietro on 3 Feb 2016 at 20:11
        • Reply

        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

        1. Ciao Pietro,
          dove hai letto che dovrebbe spegnersi una lucina arancione?

            • Pietro on 8 Feb 2016 at 14:07

            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!

          1. Ciao Pietro,
            la EasyVR la conosco poco.
            Ma l’arduino senza la EasyVR viene riconosciuto dal computer?

    • gianluca on 10 Set 2013 at 17:33
    • Reply

    ciao Mauro,
    Sono riuscito a portare il Sketch su Arduino ma se apro il monitor seriale mi dice che non è connesso perchè?
    Aiutooo!!!

    1. Ciao Gianluca,
      Se provi con un’altro sketch che scrive sulla seriale, funziona?

      Mauro

        • gianluca on 12 Set 2013 at 13:15
        • Reply

        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…

        1. Ciao Gianluca,
          attendiamo fiduciosi l’intervento degli autori, io non ho mai provato quella shield, non saprei da dove iniziare, ne come aiutarti.

          Mauro

    • gianluca on 13 Set 2013 at 10:28
    • Reply

    Grazie mille!!!!

    • gianluca on 13 Set 2013 at 12:26
    • Reply

    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 ?

    • gianluca on 14 Set 2013 at 22:15
    • Reply

    Ciao Mauro,
    Funziona alla meraviglia grazie mille di tutto…

    1. 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

        • gianluca on 17 Set 2013 at 20:36
        • Reply

        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…

        1. 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

    • waqas on 20 Dic 2013 at 15:53
    • Reply

    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.

    • volpato on 6 Feb 2014 at 10:54
    • Reply

    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

    1. 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

    • Cocciolo Roberto on 16 Feb 2014 at 22:12
    • Reply

    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 .

    1. 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

    • luca on 14 Ago 2014 at 14:39
    • Reply

    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

    1. 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.

    • Filippo on 8 Feb 2016 at 11:56
    • Reply

    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!!!

    1. 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

    • Alessandro on 19 Feb 2016 at 10:55
    • Reply

    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

    • Luca on 27 Dic 2016 at 21:41
    • Reply

    Ciao Mauro volevo chiederti se questa scheda permette di leggere i valori analogici e ripetterli?
    Se no esiste una scheda che faccia questo?

    1. Ciao Luca,
      non ho compreso la tua esigenza.

    • pierpaolo on 10 Mag 2017 at 14:42
    • Reply

    salve qualcuno puo dpiegarmi il codice gentilmente
    grazie mille

    1. Ciao Pierpaolo,
      hai ragione in questo articolo manca 🙂 Chiederò all’autore pubblicare una descrizione dello sketch.

    • mirco on 15 Gen 2018 at 21:58
    • Reply

    Ciao per cortesia qualcuno ha fatto uno sketch che colleghi la scheda easyvr 3 ad una scheda arduino ed una scheda con relè
    Grazie

    1. Ciao Mirco,
      lascio on-line la tua richiesta perché chi ha già realizzato quanto chiedi possa aiutarti.

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.