Étape 2: Ajouter la commande vocale
J’ai utilisé une planche de reconnaissance vocale DFRobot pour cela. La référence est DFR0177, mais il n’est dès maintenant disponible en Chine !
Malheureusement en essayant d’ajouter des fonctionnalités de contrôle de voix, j’ai rencontré des problèmes. Après avoir obtenu en contact avec un des ingénieurs à DFRobot, ils m’ont dit que le jury de Romeo V2 a été fondé sur une puce ATmega32u4, qui ne supporterait pas mon module de reconnaissance vocale. Cela a causé une irritation, mais je ne laisse pas que m’arrêter. J’ai troqué ma planche Romeo V2 pour un DFRduino UNO R3 et ensuite essayé à nouveau.
Voici un code que j’ai utilisé :
#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 [somme] [80] = {"allumer de lumière", "éteindre lumières"} peut être utilisé pour donner au véhicule de fonctions de contrôle de voix. Nous pouvons changer cette section pour ajouter les fonctionnalités que nous voulons, comme « aller de l’avant », "go back", "tourner à gauche", "tourner à droite", "stop", etc.. Nous aurons également besoin de modifier la fonction « Sub finally() ». Dans le cas 0, la première commande est avance, donc nous pouvons sortie « aller de l’avant » de « Serial.println() » et appelle à la fonction « avance » en même temps. Lorsque le module de reconnaissance vocale détecte la fonction « avance », il va afficher aller vers l’avant et le véhicule seront déplace vers l’avant. Il en va de même pour les autres directions.
Une des limites de ce projet est que le module de reconnaissance vocale n’est pas toujours précis, en raison de différents utilisateurs voices, bruit ambiant et d’autres facteurs. Cela sera amélioré dans futurs exemples.
Le code est comme suit :
#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 }
Réaliser le functionDownload le programme sur la carte d’effectuer le test. Quand nous disons « advance », le véhicule appellera la fonction () « avance », puis se déplace vers l’avant. C’est la même chose avec d’autres mouvements. Quand cela fonctionne de manière satisfaisante, nous pouvons débrancher le câble USB et installez une pile au lithium pour que le véhicule est plus mobile.