Stap 2: Het toevoegen van controle van de stem
Ik gebruikte een DFRobot stem erkenning board voor deze. De SKU is DFR0177, maar het is slechts beschikbaar in China nu!
Helaas wanneer trying voor toevoegen van de functies van de voice control, ik problemen ondervonden. Na het krijgen van contact met een van de ingenieurs van DFRobot, vertelde ze me dat de Raad van bestuur van Romeo V2 was gebaseerd op een ATmega32u4 chip, die mijn stem erkenning module niet zou steunen. Dit was irritant, maar ik niet laat dat mij stoppen. Ik ruilde mijn Romeo V2-board voor een DFRduino UNO R3 en vervolgens probeerde opnieuw.
Hier is een code die ik gebruikt:
#include #define SUM 2 //variable no greater than 50 uint8 nAsrStatus=0; char sRecog[SUM][80] = {"turn on lights", "turn off lights"};//variable not greater than 79, user can modify int state=7; //status indicator int led=8; //control digital port void finally (unsigned char n) { switch(n) //array corresponding keyword serial number, such as arrays recognise the first keyword is “turn on lights” and corresponding sequence number is 0; { case 0: Serial.println( "turn on lights"); Serial.println( " "); digitalWrite(led,LOW); break; case 1: Serial.println( "turn off lights"); digitalWrite(led,HIGH); break; default: Serial.println( "error"); Serial.println( " "); break; } } void ExtInt0Handler () { Voice.ProcessInt0(); //send an interrupt signal } void setup() { Serial.begin(9600); Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield //VoiceRecognitionV2 is VoiceRecognitionV2.1 module attachInterrupt(0,ExtInt0Handler,LOW); pinMode(led,OUTPUT); pinMode(state,OUTPUT); digitalWrite(state,HIGH); digitalWrite(led,HIGH); } void loop() { uint8 nAsrRes; nAsrStatus = LD_ASR_NONE; while(1) { switch(nAsrStatus) { case LD_ASR_RUNING: case LD_ASR_ERROR: break; case LD_ASR_NONE: { nAsrStatus=LD_ASR_RUNING; if (Voice.RunASR(SUM,80,sRecog)==0) //incorrect identification { nAsrStatus= LD_ASR_ERROR; Serial.println( "ASR_ERROR"); } digitalWrite(state,LOW); Serial.println( "ASR_RUNING....."); break; } case LD_ASR_FOUNDOK: { digitalWrite(state,HIGH); nAsrRes =Voice. LD_GetResult();//once asr recognition process ends, pick up asr recognition results finally(nAsrRes); nAsrStatus = LD_ASR_NONE; break; } case LD_ASR_FOUNDZERO: default: { nAsrStatus = LD_ASR_NONE; break; } }// switch delay(500); }// while }
char sRecog [bedrag] [80] = {"aanzetten lichten", "uitschakelen van lichten"} kunnen worden gebruikt om het voertuig controle spraakfuncties. Wij kunnen veranderen dit gedeelte als u wilt toevoegen van de functies die we, zoals "vooruit", "Ga terug", "links afslaan", "rechts", "stop", enz willen. Ook zullen we de "ongeldig finally()"-functie te wijzigen. In geval 0 is de eerste opdracht vooraf, zodat we kunnen uitgang "gaan" van "Serial.println()" en de oproep voor de functie "voorschot" op hetzelfde moment. Wanneer de stem-erkenning module de "voorschot"-functie detecteert, het zal output ga vooruit en het voertuig zal vooruit. Hetzelfde geldt voor de andere richtingen.
Een van de beperkingen van dit project is dat de stem-erkenning-module is niet altijd accuraat, vanwege verschillende gebruikers stemmen, omgevingsgeluid en andere factoren. Dit zal worden verbeterd in toekomstige voorbeelden.
De code is als volgt:
#include //#include //ruan chuankou #define SUM 5 //SUM uint8 nAsrStatus=0; //SoftwareSerial mySerial(10, 11); // RX, TX char sRecog[SUM][80] = {"qian jin", "hou tui","zuo zhuan", "you zhuan","ting zhi"};// int E1 = 5; //M1 Speed Control int E2 = 6; //M2 Speed Control int M1 = 4; //M1 Direction Control int M2 = 7; //M1 Direction Control void stop(void) //Stop { digitalWrite(E1,0); digitalWrite(E2,0); } void advance(char a,char b) //Move forward { analogWrite (E1,a); //PWM Speed Control digitalWrite(M1,HIGH); analogWrite (E2,b); digitalWrite(M2,HIGH); } void back_off (char a,char b) //Move backward { analogWrite (E1,a); digitalWrite(M1,LOW); analogWrite (E2,b); digitalWrite(M2,LOW); } void turn_L (char a,char b) //Turn Left { analogWrite (E1,a); digitalWrite(M1,LOW); analogWrite (E2,b); digitalWrite(M2,HIGH); } void turn_R (char a,char b) //Turn Right { analogWrite (E1,a); digitalWrite(M1,HIGH); analogWrite (E2,b); digitalWrite(M2,LOW); } void finally (unsigned char n) { switch(n) // { case 0: Serial.println( "qian jin"); Serial.println( " "); advance (255,255); break; case 1: Serial.println( "hou tui"); back_off (255,255); break; case 2: Serial.println( "zuo zhuan"); turn_L (100,100); break; case 3: Serial.println( "you zhuan"); turn_R (100,100); break; case 4: Serial.println( "ting zhi"); stop(); break; default: Serial.println( "error"); Serial.println( " "); break; } } void ExtInt0Handler () { Voice.ProcessInt0(); // } void setup(void) { int i; for(i=4;i<=7;i++) pinMode(i, OUTPUT); Serial.begin(19200); //Set Baud Rate Voice.Initialise(MIC,VoiceRecognitionV1);//Initialise mode MIC or MONO,default is MIC //VoiceRecognitionV1 is VoiceRecognitionV1.0 shield //VoiceRecognitionV2 is VoiceRecognitionV2.1 module attachInterrupt(0,ExtInt0Handler,LOW); } void loop() { uint8 nAsrRes; nAsrStatus = LD_ASR_NONE; while(1) { switch(nAsrStatus) { case LD_ASR_RUNING: case LD_ASR_ERROR: break; case LD_ASR_NONE: { nAsrStatus=LD_ASR_RUNING; if (Voice.RunASR(SUM,80,sRecog)==0) // { nAsrStatus= LD_ASR_ERROR; Serial.println( "ASR_ERROR"); } Serial.println( "ASR_RUNING....."); break; } case LD_ASR_FOUNDOK: { nAsrRes =Voice. LD_GetResult();// finally(nAsrRes); nAsrStatus = LD_ASR_NONE; break; } case LD_ASR_FOUNDZERO: default: { nAsrStatus = LD_ASR_NONE; break; } }// switch delay(500); }// while }
Het realiseren van de functionDownload het programma op de kaart van de Raad van bestuur uit te voeren test. Als we zeggen "verder", het voertuig noem "voorschot" () functie, en vervolgens gaat vooruit. Het is hetzelfde met andere bewegingen. Wanneer het naar tevredenheid werkt, kunnen we Verwijder de USB-kabel en een lithiumbatterij installeren, zodat het voertuig mobieler is.