2WD röst kontrollerat Robot med Arduino och BitVoicer Server (5 / 7 steg)
Steg 5: Ladda upp koden till Arduino
I det här steget måste du ladda upp koden nedan till Arduino. Du kan också hämta den Arduino skissen från länken nedan koden. Kom ihåg att för att skicka koden till Arduino måste du ange växeln på Sparkfun sköld DLINE position som beskrivs i steg 3. Innan du överför koden, måste du korrekt installera BitVoicer Server och Pololu motorn förarens biblioteken i Arduino IDE (Importera .zip bibliotek).
#include < BVSP.h >
#include < BVSMic.h >
#include < DualMC33926MotorShield.h >
Definierar Arduino stiften som används för att kontrollera
Lysdioder och fånga ljud
#define BVS_RUNNING 2
#define BVS_SRE 5
#define BVS_DATA_FWD 3
#define BVS_ACT_PERIOD 6
#define BVSM_AUDIO_INPUT 3
Definierar de konstanter som ska skickas som parametrar till
funktionen BVSP.begin
CONST osignerade långa STATUS_REQUEST_INTERVAL = 2000.
CONST osignerade långa STATUS_REQUEST_TIMEOUT = 1000;
Definierar storleken på bufferten som mic
CONST int MIC_BUFFER_SIZE = 64;
Initierar en ny global instans av klassen BVSP
BVSP bvsp = BVSP();
Initierar en ny global instans av klassen BVSMic
BVSMic bvsm = BVSMic();
Initierar en ny global instans av den
DualMC33926MotorShield klass
DualMC33926MotorShield ms = DualMC33926MotorShield();
Skapar en buffert som används för att läsa registrerade värden
från klassen BVSMic
byte micBuffer [MIC_BUFFER_SIZE];
Skapar en global variabel som anger om den
Arduino är ansluten till BitVoicer Server
Boolean ansluten = false;
Definierar vissa konstanter för motor inställningarna
CONST int SPEED_STOP = 0;
CONST int SPEED_SLOW = 100;
CONST int SPEED_NORMAL = 250;
CONST int SPEED_FAST = 400.
CONST int DIRECTION_FRONT = -1;
CONST int DIRECTION_BACK = 1;
Deklarerar en globala variabler att hålla den aktuella varvtal.
Standard är SPEED_NORMAL, men det finns röst
kommandon som ändrar den här inställningen.
int motorSpeed = SPEED_NORMAL;
Lagrar den kommando tid i millisekunder
osignerade långa cmdDuration = 0;
Lagrar den tiden kommandot började springa
osignerade långa cmdStartTime = 0;
Lagras om ett kommando körs eller inte
bool cmdRunning = false;
Lagrar det senaste MOVE_FORWARD-kommandot. Denna variabel
används endast för kommandot COME_BACK.
byte lastFwdCmd = 0;
Definierar vissa konstanter för kommandot namn/värden
Bara för att göra koden mer läsbar
CONST byte CMD_STOP = 0;
CONST byte CMD_MOVE_FORWARD = 1;
CONST byte CMD_MOVE_FORWARD_1_CM = 2;
CONST byte CMD_MOVE_FORWARD_2_CM = 3;
CONST byte CMD_MOVE_FORWARD_5_CM = 4;
CONST byte CMD_MOVE_FORWARD_10_CM = 5;
CONST byte CMD_MOVE_FORWARD_25_CM = 6;
CONST byte CMD_MOVE_FORWARD_50_CM = 7.
CONST byte CMD_MOVE_FORWARD_1_M = 8;
CONST byte CMD_MOVE_BACKWARD = 9;
CONST byte CMD_MOVE_BACKWARD_1_CM = 10;
CONST byte CMD_MOVE_BACKWARD_2_CM = 11;
CONST byte CMD_MOVE_BACKWARD_5_CM = 12;
CONST byte CMD_MOVE_BACKWARD_10_CM = 13.
CONST byte CMD_MOVE_BACKWARD_25_CM = 14.
CONST byte CMD_MOVE_BACKWARD_50_CM = 15.
CONST byte CMD_MOVE_BACKWARD_1_M = 16.
CONST byte CMD_TURN_AROUND = 17;
CONST byte CMD_TURN_AROUND_RIGHT = 18;
CONST byte CMD_TURN_AROUND_LEFT = 19.
CONST byte CMD_DO_360 = 20;
CONST byte CMD_TURN_RIGHT = 21;
CONST byte CMD_TURN_RIGHT_10 = 22.
CONST byte CMD_TURN_RIGHT_25 = 23.
CONST byte CMD_TURN_RIGHT_45 = 24.
CONST byte CMD_TURN_LEFT = 25;
CONST byte CMD_TURN_LEFT_10 = 26.
CONST byte CMD_TURN_LEFT_25 = 27.
CONST byte CMD_TURN_LEFT_45 = 28;
CONST byte CMD_DO_CIRCLE = 29.
CONST byte CMD_COME_BACK = 30.
CONST byte CMD_MOVE_FORWARD_2_M = 31;
CONST byte CMD_MOVE_FORWARD_3_M = 32.
CONST byte CMD_MOVE_BACKWARD_2_M = 33.
CONST byte CMD_MOVE_BACKWARD_3_M = 34.
CONST byte CMD_SET_SPEED_SLOW = 35.
CONST byte CMD_SET_SPEED_NORMAL = 36.
CONST byte CMD_SET_SPEED_FAST = 37.
CONST byte CMD_TURN_LEFT_45_BACKWARD = 38.
CONST byte CMD_TURN_RIGHT_45_BACKWARD = 39.
void setup()
{
Börjar seriell kommunikation på 115200 bps
Serial.BEGIN(115200);
Anger de Arduino pin lägen
pinMode (BVS_RUNNING, OUTPUT);
pinMode (BVS_SRE, OUTPUT);
pinMode (BVS_DATA_FWD, OUTPUT);
pinMode (BVS_ACT_PERIOD, OUTPUT);
AllLEDsOff();
Ställer Arduino seriell port som ska användas för
kommunikation, hur lång tid det tar innan en statusbegäran
gånger ut och hur ofta ska status förfrågningar skickas till
BitVoicer Server
BVSP.BEGIN (serienummer, STATUS_REQUEST_TIMEOUT,
STATUS_REQUEST_INTERVAL);
Anger den funktion som kommer att hantera frameReceived
händelse
bvsp.frameReceived = BVSP_frameReceived;
Förbereder BVSMic klassen timer
bvsm.BEGIN();
Förbereder klassen motor sköld (stift och timer1)
MS.init();
}
void loop()
{
Om det inte är ansluten till servern, öppnas en TCP/IP
anslutning, apparater anslutna till true och återställer BVSP
klass
om (! ansluten)
{
Connect(Serial);
anslutna = sant;
BVSP.Reset();
}
Kontrollerar om status begäran intervallet har förflutit och om det
har, skickar en statusbegäran till BitVoicer Server
bvsp.keepAlive();
Kontrollerar om det finns data på den seriella port buffert
och bearbetar dess innehåll enligt specifikationerna
för BitVoicer servern protokoll
BVSP.Receive();
Får respektive status från klassen BVSP och sätter
Lysdioderna på eller av
digitalWrite (BVS_RUNNING, bvsp.isBVSRunning());
digitalWrite (BVS_DATA_FWD, bvsp.isDataFwdRunning());
Kontrollerar om det finns en SRE tilldelats Arduino
om (bvsp.isSREAvailable())
{
Vänder på SRE tillgängliga LED
digitalWrite (BVS_SRE, hög);
Om klassen BVSMic inte spelar in, ställer in ljud
ingång och startar inspelning
om (! bvsm.isRecording)
{
bvsm.setAudioInput (BVSM_AUDIO_INPUT, yttre);
bvsm.startRecording();
}
Kontrollerar om klassen BVSMic har tillgängliga prover
om (bvsm.available)
{
Ser till att de inkommande läge är STREAM_MODE innan
överföring av dataströmmen
om (bvsp.inboundMode == FRAMED_MODE)
bvsp.setInboundMode(STREAM_MODE);
Läser de ljud proverna från klassen BVSMic
int bytesRead = bvsm.read (micBuffer, MIC_BUFFER_SIZE);
Skickar ljudströmmen till BitVoicer Server
bvsp.sendStream (micBuffer, bytesRead);
}
}
annat
{
Det finns ingen SRE
Stänger av SRE och ACT_PERIOD lysdioder
digitalWrite (BVS_SRE, låg);
digitalWrite (BVS_ACT_PERIOD, låg);
Om klassen BVSMic inspelning, avbryts det
om (bvsm.isRecording)
bvsm.stopRecording();
}
Om status har gått ut, anses anslutningen
förlorade
om (bvsp.hasStatusTimedOut())
{
Om BVSMic inspelning, avbryts det
om (bvsm.isRecording)
bvsm.stopRecording();
Stänger den TCP/IP förbindelsen
Disconnect(Serial);
AllLEDsOff();
anslutna = false;
}
Om ett kommando körs kontrollerar om dess varaktighet har
upphört att gälla. Om det har, stoppa motorerna.
om (cmdRunning)
om (millis() - cmdStartTime > = cmdDuration)
RunCommand(CMD_STOP);
}
Hanterar frameReceived händelsen
void BVSP_frameReceived (byte dataType, int payloadSize)
{
Utför lämpliga åtgärder baserade på ramen
datatyp. Om datatypen är byte, är det ett kommando.
Om datatypen är int, ändras den aktiverade
under LED.
Switch (datatyp)
{
fall DATA_TYPE_BYTE:
RunCommand(bvsp.getReceivedByte());
bryta;
fall DATA_TYPE_INT16:
digitalWrite (BVS_ACT_PERIOD, bvsp.getReceivedInt16());
bryta;
}
}
Kör kommandot fick från servern
void RunCommand(byte cmd)
{
Switch (cmd)
{
fall CMD_STOP:
ms.setSpeeds (SPEED_STOP, SPEED_STOP);
cmdRunning = false;
hemkomst.
fall CMD_MOVE_FORWARD:
lastFwdCmd = cmd;
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 60000;
bryta;
fall CMD_MOVE_FORWARD_1_CM:
lastFwdCmd = cmd;
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 23.
bryta;
fall CMD_MOVE_FORWARD_2_CM:
lastFwdCmd = cmd;
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 47;
bryta;
fall CMD_MOVE_FORWARD_5_CM:
lastFwdCmd = cmd;
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 117;
bryta;
fall CMD_MOVE_FORWARD_10_CM:
lastFwdCmd = cmd;
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 234;
bryta;
fall CMD_MOVE_FORWARD_25_CM:
lastFwdCmd = cmd;
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 468;
bryta;
fall CMD_MOVE_FORWARD_50_CM:
lastFwdCmd = cmd;
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 1170;
bryta;
fall CMD_MOVE_FORWARD_1_M:
lastFwdCmd = cmd;
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 2339;
bryta;
fall CMD_MOVE_FORWARD_2_M:
lastFwdCmd = cmd;
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 4678;
bryta;
fall CMD_MOVE_FORWARD_3_M:
lastFwdCmd = cmd;
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 7018;
bryta;
fall CMD_MOVE_BACKWARD:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_BACK);
cmdDuration = 60000;
bryta;
fall CMD_MOVE_BACKWARD_1_CM:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_BACK);
cmdDuration = 23.
bryta;
fall CMD_MOVE_BACKWARD_2_CM:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_BACK);
cmdDuration = 47;
bryta;
fall CMD_MOVE_BACKWARD_5_CM:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_BACK);
cmdDuration = 117;
bryta;
fall CMD_MOVE_BACKWARD_10_CM:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_BACK);
cmdDuration = 234;
bryta;
fall CMD_MOVE_BACKWARD_25_CM:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_BACK);
cmdDuration = 468;
bryta;
fall CMD_MOVE_BACKWARD_50_CM:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_BACK);
cmdDuration = 1170;
bryta;
fall CMD_MOVE_BACKWARD_1_M:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_BACK);
cmdDuration = 2339;
bryta;
fall CMD_MOVE_BACKWARD_2_M:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_BACK);
cmdDuration = 4678;
bryta;
fall CMD_MOVE_BACKWARD_3_M:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_BACK);
cmdDuration = 7017;
bryta;
fall CMD_TURN_AROUND:
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_BACK);
cmdDuration = 540;
bryta;
fall CMD_TURN_AROUND_RIGHT:
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_BACK);
cmdDuration = 540;
bryta;
fall CMD_TURN_AROUND_LEFT:
() ms.setSpeeds
motorSpeed * DIRECTION_BACK,
motorSpeed * DIRECTION_FRONT);
cmdDuration = 540;
bryta;
fall CMD_DO_360:
() ms.setSpeeds
motorSpeed * DIRECTION_FRONT,
motorSpeed * DIRECTION_BACK);
cmdDuration = 1065;
bryta;
fall CMD_TURN_RIGHT:
ms.setSpeeds (motorSpeed * DIRECTION_FRONT, 0);
cmdDuration = 503 och Bull.
bryta;
fall CMD_TURN_RIGHT_10:
ms.setSpeeds (motorSpeed * DIRECTION_FRONT, 0);
cmdDuration = 56.
bryta;
fall CMD_TURN_RIGHT_25:
ms.setSpeeds (motorSpeed * DIRECTION_FRONT, 0);
cmdDuration = 140;
bryta;
fall CMD_TURN_RIGHT_45:
ms.setSpeeds (motorSpeed * DIRECTION_FRONT, 0);
cmdDuration = 252;
bryta;
fall CMD_TURN_LEFT:
ms.setSpeeds (0, motorSpeed * DIRECTION_FRONT);
cmdDuration = 503 och Bull.
bryta;
fall CMD_TURN_LEFT_10:
ms.setSpeeds (0, motorSpeed * DIRECTION_FRONT);
cmdDuration = 56.
bryta;
fall CMD_TURN_LEFT_25:
ms.setSpeeds (0, motorSpeed * DIRECTION_FRONT);
cmdDuration = 140;
bryta;
fall CMD_TURN_LEFT_45:
ms.setSpeeds (0, motorSpeed * DIRECTION_FRONT);
cmdDuration = 252;
bryta;
fall CMD_DO_CIRCLE:
() ms.setSpeeds
SPEED_NORMAL * DIRECTION_FRONT,
SPEED_NORMAL * DIRECTION_FRONT * 0,60);
cmdDuration = 4587;
bryta;
fall CMD_COME_BACK:
RunCommand(lastFwdCmd);
hemkomst.
fall CMD_SET_SPEED_SLOW:
motorSpeed = SPEED_SLOW;
hemkomst.
fall CMD_SET_SPEED_NORMAL:
motorSpeed = SPEED_NORMAL;
hemkomst.
fall CMD_SET_SPEED_FAST:
motorSpeed = SPEED_FAST;
hemkomst.
fall CMD_TURN_LEFT_45_BACKWARD:
ms.setSpeeds (motorSpeed * DIRECTION_BACK, 0);
cmdDuration = 252;
bryta;
fall CMD_TURN_RIGHT_45_BACKWARD:
ms.setSpeeds (0, motorSpeed * DIRECTION_BACK);
cmdDuration = 252;
bryta;
}
Anger starttiden kommando
cmdStartTime = millis();
Anger cmdRunning till true
cmdRunning = sant;
}
Öppnar en TCP/IP anslutning med BitVoicer servern
Ogiltigt Connect (HardwareSerial & serialPort)
{
serialPort.print("$$$");
Delay(500);
Använda IP-adressen till servern och den TCP-port som
i egenskaperna för
serialPort.println ("öppna 192.168.0.11 4194");
Delay(1000);
serialPort.println("exit");
Delay(500);
}
Stänger den TCP/IP förbindelsen med BitVoicer servern
void frånkoppling (HardwareSerial & serialPort)
{
serialPort.print("$$$");
Delay(500);
serialPort.println("close");
Delay(1000);
serialPort.println("exit");
Delay(500);
}
Inaktiverar alla lysdioder
void AllLEDsOff()
{
digitalWrite (BVS_RUNNING, låg);
digitalWrite (BVS_SRE, låg);
digitalWrite (BVS_DATA_FWD, låg);
digitalWrite (BVS_ACT_PERIOD, låg);
}
Vissa delar av denna skiss liknar delar jag använde i en av mina tidigare Instructables och erbjudanden med kommunikationen med BitVoicer Server (BVSP och BVSMic klasser). I detta Instructable, jag skall hålla mig till förklaringen av de nya delarna av skiss. Om du vill få mer information om hur du använder BVSP och klasserna BVSMic, föreslår jag att din avse Instructable jag nämnde ovan.
- Konstanter förklaring: i början av skiss, jag förklarar en rad konstanter som används under hela koden. Gruppen för konstanter med motor inställningarna definierar den standard motor hastigheten och två riktning konstanter. Pololu motor driver library accepterar värden från-400 till + 400 för det varvtal där noll betyder off. Negativa värden anger omvänd rotation eller, om du har inverterad motoriska trådarna som jag, vidarebefordra rotation. Gruppen för konstanter med kommandot värden avser de kommandon som skickas från BitVoicer Server. I denna skiss jag har definierat endast 40 grundläggande kommandon av byte typ, men mer komplicerade rörelser kan utföras kombinera dessa kommandon.
- Utförande kontroll variabler: fem variabler definieras i början av koden för att kontrollera utförandet av kommandon (motorSpeed, cmdDuration, cmdStartTime, cmdRunning e lastFwdCmd). Variabeln motorSpeed innehar den aktuella varvtal. Denna variabel är uppdaterad med en av de standardvärden som definieras av hastighet konstanterna om Arduino tar emot ett kommando från BitVoicer Server uppdatera motor rusar. Variabeln cmdDuration innehar den totala varaktigheten för den aktuella kommandot. Denna variabel kontrolleras mot cmdStartTime variabeln i alla iterationer av loop funktion om cmdRunning är Sant. Om kommandot utförande tid som förflutit, kallas funktionen Kör kommando för att stoppa motorerna. Variabeln lastFwdCmd innehar det senaste "go/flytta framåt" kommandot. Variabeln används veta sista rest avståndet så att "komma tillbaka" kommandot kan utföras. Observera att om du vill använda kommandot måste du först berätta roboten att vända.
- WiFi-anslutning: i slutet av skissen jag definierar två funktioner för att ansluta och koppla från BitVoicer Server (Anslut och koppla från). Dessa funktioner sätta mikrochip WiFi modul i kommando-läge, öppna eller stänga en TCP/IP anslutning och tillbaka modulen till data-läge. Inuti loop funktion, om den anslutna variabeln inte är Sant, anropar jag funktionen Anslut . Om klassen BVSP rapporterar serverstatus har upphört att gälla, med andra ord inget svar har inkommit för den senaste statusbegäran, jag antar att anslutningen har försvunnit och jag anropar funktionen koppla från . Detta kommer att tvinga ett nytt anslutningsförsök i nästa slinga iteration.
- Kör kommando funktion: denna funktion kallas varje gång ett kommando tas emot från BitVoicer Server. Det tar ett byte -värde som motsvarar en av de grundläggande kommandon definieras av konstanterna i början av skissen. Varje grundläggande kommandot identifieras inne i växeln så lämplig motor rusar kan sättas samt kommandot varaktighet. I slutet av funktionen, variabeln cmdRunning har värdet true och den tid som returneras av funktionen millis lagras i variabeln cmdStartTime . Detta gör Arduino att styra exekvering av kommandon som beskrivs ovan. Tider, i millisekunder, för varje kommando erhölls som beskrivs i föregående steg.