W dzisiejszym wpisie zajmiemy się interfejsem EasyVR z Arduino UNO. W poprzednim poście, zobaczyliśmy jak wygląda rozpoczęcie pracy z programem EasyVR Commander. Było to dość proste i jeśli postępuje się zgodnie z przedstawionymi tam krokami, nie da się utknąć. Mimo tego, w wypadku napotkania jakichś kłopotów, jestem tutaj.
Ten poradnik jest dość szybki i ważny, ponieważ zawiera prawdziwy kod, za pomocą którego będziemy kontrolować naszego robota. Po dodaniu komend głosowych należy zamknąć program EasyVR Commander i otworzyć oprogramowanie Arduino. Podłączamy płytkę Arduino do komputera i sprawdzamy czy zworka J12 jest w pozycji SW. Należy również przeczytać Błąd szkolenia: Rozpoznanie nie powiodło się w EasyVR jeśli natrafimy na taki błąd podczas pracy z EasyVR. Tak więc, zacznijmy od połączenia EasyVR z Arduino UNO.
Połączenie EasyVR z Arduino UNO
Po pierwsze, pobierzmy biblioteki Arduino dla EasyVR Shield. Można je łatwo znaleźć na oficjalnej stronie EasyVR.
Wystarczy połączyć Arduino UNO z komputerem.
Otwieramy oprogramowanie Arduino i wklejamy do niego poniższy kod.
Należy wypalić (wgrać) swój kod na płytce Arduino.
Teraz otwieramy nasz Monitor Szeregowy w Arduino UNO i zobaczymy najpierw komunikat mówiący "EasyVR Detected” (Pl. wykryto EasyVR).
Teraz wypowiadamy do mikrofonu dowolną komendę, którą zapisaliśmy w tablicy i zobaczymy, że gdy komenda pasuje, terminal szeregowy wyśle określony znak.
Można zmienić ten znak, jeśli chcemy, dokonując prostej zmiany w kodzie.
#if defined(ARDUINO) && ARDUINO >= 100
#include “Arduino.h”
#include “SoftwareSerial.h”
SoftwareSerial port(12,13);
#else // Arduino 0022 – użyj zmodyfikowanego NewSoftSerial
#include “WProgram.h”
#include “NewSoftSerial.h”
NewSoftSerial port(12,13);
#endif
#include “EasyVR.h”
EasyVR easyvr(port);
// Grupy i komendy
enum Groups
{
//GROUP_0 = 0,
GROUP_1 = 1,
};
enum Group0
{
G0_ARDUINO = 0,
};
enum Group1
{
G1_FORWARD = 0,
G1_REVERSE = 1,
G1_LEFT = 2,
G1_RIGHT = 3,
G1_STOP = 4,
};
EasyVRBridge bridge;
int8_t group, idx;
void setup()
{
// bridge mode? (Pl. tryb mostkowy?)
if (bridge.check())
{
cli();
bridge.loop(0, 1, 12, 13);
}
// uruchom normalnie
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(EasyVR::ENGLISH);
group = EasyVR::TRIGGER; // < – uruchom grupę (dostosuj)
pinMode(2, OUTPUT);
digitalWrite(2, LOW); // wyłączenie LEDa
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
pinMode(5, OUTPUT);
digitalWrite(5, LOW);
pinMode(6, OUTPUT);
digitalWrite(6, LOW);
}
void action();
void loop()
{
easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED włączony (nasłuch)
Serial.print(“Say a command in Group”);
Serial.println(group);
easyvr.recognizeCommand(group);
do
{
// może wykonywać pewne przetwarzanie w oczekiwaniu na ustne polecenie
}
while (!easyvr.hasFinished());
easyvr.setPinOutput(EasyVR::IO1, LOW); // LED wyłączony
idx = easyvr.getWord();
if (idx >= 0)
{
// wbudowany wyzwalacz (ROBOT)
// group = GROUP_X; <– jump to another group X
return;
}
idx = easyvr.getCommand();
if (idx >= 0)
{
// wyświetl komunikat debugowania
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);
// wykonaj jakąś akcję
action();
}
else // błędy lub 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);
}
group = GROUP_1;
}
}
void action()
{
switch (group)
{
// case GROUP_0:
// switch (idx)
// {
// case G0_ARDUINO:
// tutaj wpisujemy swój kod akcji
// group = GROUP_1; //< – lub przechopdzimy do innej grupy X dla poleceń złożonych
// break;
// }
// break;
case GROUP_1:
switch (idx)
{
case G1_FORWARD:
Serial.print(“9”);
digitalWrite(2, HIGH);
break;
case G1_REVERSE:
Serial.print(“Q”);
digitalWrite(3,HIGH);
break;
case G1_LEFT:
Serial.print(“X”);
digitalWrite(4,HIGH);
break;
case G1_RIGHT:
Serial.print(“Y”);
digitalWrite(5,HIGH);
break;
case G1_STOP:
Serial.print(“Z”);
digitalWrite(6,HIGH);
break;
}
break;
}
}
To wszystko na dzisiaj. Mam nadzieję, że teraz możecie łatwo połączyć EasyVR z Arduino UNO.