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 !!!
Prima di inserire un commento, per favore, leggi il regolamento
43 pings
Skip to comment form