Göra en röst kontrollerat fordon! (2 / 3 steg)
Steg 2: Lägga till röststyrning
Jag använde en DFRobot röst erkännande styrelse för detta. Lagerställeenheten är DFR0177, men det är endast tillgänglig i Kina just nu!
Tyvärr när jag försöker att lägga till röst kontroll funktioner, jag upplevt problem. Efter att få kontakt med en av ingenjörerna på DFRobot, sa de att Romeo V2 styrelsen baserades på ett ATmega32u4 chip, som inte skulle stödja min röst erkännande modul. Detta var irriterande, men jag låta inte det stoppar mig. Jag bytte min Romeo V2 ombord för en DFRduino UNO R3 och sedan försökte igen.
Här är en kod jag använde:
#include
#define summa 2 //variable inte är större än 50
uint8 nAsrStatus = 0;
char sRecog [SUM] [80] = {"Aktivera ljus", "stänga av lampor"}; //variable inte är större än 79, användare kan ändra
int state = 7. statusindikator
int ledde = 8. Kontrollera digitala port
Annullera slutligen (unsigned char n)
{
Switch(n) //array motsvarande sökord serienummer, såsom arrayer erkänna det första nyckelordet är "Aktivera ljus" och motsvarande löpnummer är 0.
{
fall 0:
Serial.println ("vända på lampor");
Serial.println ("");
digitalWrite(led,LOW);
bryta;
fall 1:
Serial.println ("stänga av lampor");
digitalWrite(led,HIGH);
bryta;
standard:
Serial.println ("fel");
Serial.println ("");
bryta;
}
}
void ExtInt0Handler)
{
Voice.ProcessInt0(); Skicka en avbrottssignal
}
void setup()
{
Serial.BEGIN(9600);
Voice.Initialise (MIC, VoiceRecognitionV1); //Initialise läge MIC eller MONO, standard är MIC
VoiceRecognitionV1 är VoiceRecognitionV1.0 sköld
VoiceRecognitionV2 är VoiceRecognitionV2.1 modul
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)
{
fall LD_ASR_RUNING:
fall LD_ASR_ERROR:
bryta;
fall LD_ASR_NONE:
{
nAsrStatus = LD_ASR_RUNING;
om (Voice.RunASR(SUM,80,sRecog)==0) //incorrect identifiering
{
nAsrStatus = LD_ASR_ERROR;
Serial.println ("ASR_ERROR");
}
digitalWrite(state,LOW);
Serial.println ("ASR_RUNING...");
bryta;
}
fall LD_ASR_FOUNDOK:
{
digitalWrite(state,HIGH);
nAsrRes = röst. LD_GetResult (); //once asr erkännande bearbeta ändar, plocka upp asr tolkningsresultaten
finally(nAsrRes);
nAsrStatus = LD_ASR_NONE;
bryta;
}
fall LD_ASR_FOUNDZERO:
standard:
{
nAsrStatus = LD_ASR_NONE;
bryta;
}
} / / Växla
Delay(500);
} / / medan
}
char sRecog [SUM] [80] = {"Aktivera ljus", "stänga av lampor"} kan användas för att ge fordonet röst kontrollfunktioner. Vi kan ändra detta avsnitt för att lägga till funktioner som vi vill, såsom "gå fram", "gå tillbaka", "sväng vänster", "sväng höger", "stop", etc. Vi måste också ändra funktionen "Ogiltig finally()". I fallet 0 är det första kommandot förskott, så vi kan mata "gå fram" från "Serial.println()" och samtal till funktionen "advance" på samma gång. När röst erkännande modulen upptäcker funktionen "advance", det kommer produktionen gå framåt och fordonet kommer att gå framåt. Detsamma gäller för de andra riktningarna.
En av begränsningarna i detta projekt är att modulen röst erkännande är inte alltid korrekt, på grund av olika användares röster, omgivande buller och andra faktorer. Detta kommer att förbättras i framtiden exemplen.
Koden är följande:
#include
#include //ruan chuankou
#define summan 5 //SUM
uint8 nAsrStatus = 0;
SoftwareSerial mySerial (10, 11); RX, TX
char sRecog [SUM] [80] = {"qian jin", "hou tui", "zuo zhuan", "du zhuan", "ting zhi"} ;//
int E1 = 5; M1 Varvtalsreglering
int E2 = 6; M2 Varvtalsreglering
int M1 = 4; M1 Riktning kontroll
int M2 = 7. M1 Riktning kontroll
void stop(void) //Stop
{
digitalWrite(E1,0);
digitalWrite(E2,0);
}
void advance (char, char b) //Move fram
{
analogWrite (E1, en); PWM varvtalsreglering
digitalWrite(M1,HIGH);
analogWrite (E2, b);
digitalWrite(M2,HIGH);
}
void back_off (char, char b) //Move bakåt
{
analogWrite (E1, en);
digitalWrite(M1,LOW);
analogWrite (E2, b);
digitalWrite(M2,LOW);
}
void turn_L (char, char b) //Turn vänster
{
analogWrite (E1, en);
digitalWrite(M1,LOW);
analogWrite (E2, b);
digitalWrite(M2,HIGH);
}
void turn_R (char, char b) //Turn höger
{
analogWrite (E1, en);
digitalWrite(M1,HIGH);
analogWrite (E2, b);
digitalWrite(M2,LOW);
}
Annullera slutligen (unsigned char n)
{
Switch(n) / /
{
fall 0:
Serial.println ("qian jin");
Serial.println ("");
förskott (255,255);
bryta;
fall 1:
Serial.println ("hou tui");
back_off (255,255);
bryta;
fall 2:
Serial.println ("zuo zhuan");
turn_L (100.100);
bryta;
fall 3:
Serial.println ("du zhuan");
turn_R (100.100);
bryta;
fall 4:
Serial.println ("ting zhi");
Stop();
bryta;
standard:
Serial.println ("fel");
Serial.println ("");
bryta;
}
}
void ExtInt0Handler)
{
Voice.ProcessInt0(); //
}
void setup(void)
{
int i;
för (jag = 4; jag < = 7; i ++)
pinMode (i, matas);
Serial.BEGIN(19200); Ange baudvärde
Voice.Initialise (MIC, VoiceRecognitionV1); //Initialise läge MIC eller MONO, standard är MIC
VoiceRecognitionV1 är VoiceRecognitionV1.0 sköld
VoiceRecognitionV2 är VoiceRecognitionV2.1 modul
attachInterrupt(0,ExtInt0Handler,LOW);
}
void loop()
{
uint8 nAsrRes;
nAsrStatus = LD_ASR_NONE;
While(1)
{
Switch(nAsrStatus)
{
fall LD_ASR_RUNING:
fall LD_ASR_ERROR:
bryta;
fall LD_ASR_NONE:
{
nAsrStatus = LD_ASR_RUNING;
om (Voice.RunASR(SUM,80,sRecog)==0) / /
{
nAsrStatus = LD_ASR_ERROR;
Serial.println ("ASR_ERROR");
}
Serial.println ("ASR_RUNING...");
bryta;
}
fall LD_ASR_FOUNDOK:
{
nAsrRes = röst. LD_GetResult(); / /
finally(nAsrRes);
nAsrStatus = LD_ASR_NONE;
bryta;
}
fall LD_ASR_FOUNDZERO:
standard:
{
nAsrStatus = LD_ASR_NONE;
bryta;
}
} / / Växla
Delay(500);
} / / medan
}
Förverkliga functionDownload programmet på kortet på bordet att genomföra test. När vi säger "förskott", fordonet kommer att kalla "advance" ()-funktionen, då rör sig framåt. Det är samma sak med andra rörelser. När det fungerar på ett tillfredsställande sätt, kan vi koppla ur USB-kabeln och installera ett litiumbatteri så att fordonet är mer rörlig.