Фразы "О'кей, Google" и "Привет, Siri" прочно вошли в обиход у пользователей смартфонов. Голосовое управления это удобно — не надо нажимать кнопки, двигать курсором мыши в нужную область и т.д. Просто произносишь команду и ждешь ее исполнения.
Наверное каждый человек хотел бы иметь у себя дома возможность включать\выключать свет в комнате по команде, чтобы не приходилось вставать и идти к выключателю. Вариантов применения у данной технологии неизмеримое множество.
В данной статье рассмотрим один из самых простых способов научить Arduino понимать голосовые команды — Elechouse Voice Recognition Module. В качестве примера будем управлять светодиодом. Голосовой командой мы сможем его включить, выключить или заставить мигать.
Для работы нам потребуется:
Устройство собиралось на макетной плате MB-102 с джамперами.
Подключение модуля очень простое. Всего два пина: TX и RX. Их надо подключить к выходам Arduino 2 и 3 соответственно. Запитать модуль следует от 5V.
Итак, первым делом надо наш модуль обучить командам. Как было сказано выше, всего у нас три команды:
Откройте проект vr_simple_train, поставляем в комплекте с библиотекой VoiceRecognitionV3.
Файл — Примеры — VoiceReocgnitionV3 — vr_simple_train
Залейте этот скетч в Arduino и откройте Монитор порта (Сервис — Монитор порта или нажмите Ctrl + Shift + M на клавиатуре)
Обязательно надо выставить скорость обмена (baud rate) 115200 и отправку по новой строке.
Перед нами интерфейс управления голосовыми командами. Введите в верхнее поле settings и нажмите кнопку "Послать".
Модуль ответит нам своими текущими настройками. Это значит, что все хорошо и можно приступать непосредственно к обучению команд.
За обучение командам отвечает функция sigtrain.
Введите в поле команду sigtrain 0 On и нажмите на кнопку "Послать". Команда означает, что в ячейку памяти 0 мы хотим записать команду с сигнатурой On. Сигнатура это некий уникальный ярлык, который описывает вашу команду.
Когда в окне появится фраза "Speak now", то следует проговорить в микрофон нашу команду "Зажгись".
После появления фразы "Speak again", проговорите фразу еще раз.
Если оба слова совпали, то модуль выдаст Success: 1, что означает, что мы только успешно записали команду On.
Если же модуль не смог сопоставить две голосовых команды (например, было шумно в помещении или вы произносили просто разные слова), то модуль ответит фразой "Cann't match" и предложит начать процесс записи команды еще раз до тех пор, пока не будут предоставлены верные данные.
То же самое надо проделать и с другими нашими командами "Выключись" и "Мигай", но использовать надо другие ячейки памяти (1 и 2) и другие сигнатуры (Off и Blink)
sigtrain 1 Off
sigtrain 2 Blink
Модуль настроен и знает целых три команды. Залейте в Arduino следующий скетч:
#include <SoftwareSerial.h>
#include <TimerOne.h>
#include "VoiceRecognitionV3.h"
VR myVR(2, 3); // 2:RX 3:TX, you can choose your favourite pins.
uint8_t records[7];
uint8_t buf[64];
int led = 13;
#define onRecord (0)
#define offRecord (1)
#define blinkRecord (2)
/**
@brief Print signature, if the character is invisible,
print hexible value instead.
@param buf --> command length
len --> number of parameters
*/
void printSignature(uint8_t *buf, int len)
{
int i;
for(i = 0; i < len; i++) {
if (buf[i]>0x19 && buf[i]<0x7F) {
Serial.write(buf[i]);
} else {
Serial.print("[");
Serial.print(buf[i], HEX);
Serial.print("]");
}
}
}
/**
@brief Print signature, if the character is invisible,
print hexible value instead.
@param buf --> VR module return value when voice is recognized.
buf[0] --> Group mode(FF: None Group, 0x8n: User, 0x0n:System
buf[1] --> number of record which is recognized.
buf[2] --> Recognizer index(position) value of the recognized record.
buf[3] --> Signature length
buf[4]~buf[n] --> Signature
*/
void printVR(uint8_t *buf)
{
Serial.println("VR Index\tGroup\tRecordNum\tSignature");
Serial.print(buf[2], DEC);
Serial.print("\t\t");
if (buf[0] == 0xFF) {
Serial.print("NONE");
} else if (buf[0]&0x80) {
Serial.print("UG ");
Serial.print(buf[0]&(~0x80), DEC);
} else {
Serial.print("SG ");
Serial.print(buf[0], DEC);
}
Serial.print("\t");
Serial.print(buf[1], DEC);
Serial.print("\t\t");
if (buf[3] > 0) {
printSignature(buf+4, buf[3]);
} else {
Serial.print("NONE");
}
Serial.println("\r\n");
}
void setup()
{
myVR.begin(9600);
Serial.begin(115200);
Serial.println("Elechouse Voice Recognition V3 Module\r\nControl LED sample");
pinMode(led, OUTPUT);
if (myVR.clear() == 0) {
Serial.println("Recognizer cleared.");
} else {
Serial.println("Not find VoiceRecognitionModule.");
Serial.println("Please check connection and restart Arduino.");
while(1);
}
if (myVR.load((uint8_t)onRecord) >= 0) {
Serial.println("onRecord loaded");
}
if (myVR.load((uint8_t)offRecord) >= 0) {
Serial.println("offRecord loaded");
}
if (myVR.load((uint8_t)blinkRecord) >= 0) {
Serial.println("blinkRecord loaded");
}
Timer1.initialize(100000);
}
void timerIsr()
{
digitalWrite(13, digitalRead(13) ^ 1);
}
void loop()
{
int ret;
ret = myVR.recognize(buf, 50);
if (ret > 0) {
switch(buf[1]){
case onRecord:
digitalWrite(led, HIGH);
Timer1.detachInterrupt();
break;
case offRecord:
digitalWrite(led, LOW);
Timer1.detachInterrupt();
break;
case blinkRecord:
Timer1.attachInterrupt(timerIsr);
break;
default:
Timer1.detachInterrupt();
Serial.println("Record function undefined");
break;
}
printVR(buf);
}
}
Скетч ожидает от модуля голосовую команду и исполняет ее.
Видео-демонстрация работы:
Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.
Комментарии