Модуль распознавания голоса Voice Recognition Module V2




Голосовое управление радиорозетками UNIEL

В статье описывается устройство для голосового управления розетками UNIEL на базе контроллера Arduino, трансмиттера 433 МГц и модуля распознавания голоса Voice Recognition Module V2 фирмы elechouse (сайт - https://www.elechouse.com).

Розетки UNIEL

Непосредственно устанавливаются в любую розетку и к ним уже подключается электроприбор, включением и выключением которого можно управлять с дистанционного пульта. Радиус действия на открытой местности до 25м, частота приемо-передачи команд 433.9 Мгц. В ассортименте есть разные для нагрузок 300Вт, 1000Вт, 3600 Вт. Весь ассортимент можно посмотреть на странице официального сайта https://www.uniel.ru/ru/catalog/1235.

В пульте устанавливается код группы. В каждой розетке код группы = код группы пульта и код розетки

Радиомодули

Наша задача - заменить пульт для управления розетками UNIEL. Нужны радиомодули, работающие на частоте 433 МГц. Я приобретал FS1000A

В комплекте ресивер и трансмиттер. Цена на ebay меньше 100 руб.

Для Arduino имеются библиотеки для работы с разными управляемыми по 433/315 МГц исполнительными устройствами. Я использовал такую:
rc-switch - Arduino library to operate low cost 315 MHz / 433 MHz remote control devices - https://code.google.com/p/rc-switch/

Скачиваем, распаковываем в папку libraries

Для начала подключим приемник

Arduino----- модуль
+5V ----------VCC
GND ----------GND
DATA (любой)------------2

запустим пример из библиотеки RCswitch пример ReceiveDemo_Advanced

Нажимаем на пульт и смотрим что выдает скетч в последовательный порт

Запомним параметры 24Bit, PulseLength - 309 microseconds, Protocol 1

Они нам понадобятся при написании скетча. Коды запоминать НЕОБЯЗАТЕЛЬНО!!! Для отправки кодов достаточно знать код группы и код устройства!!!

Подключаем к Arduino проверки работы розеток

Arduino----- модуль
+5V ----------VCC
GND ----------GND
DATA ------------10

Пишем скетч следующего содержания

?

  include "RCSwitch.h" RCSwitch mySwitch = RCSwitch();   void setup() {   Serial.begin(9600); mySwitch.enableTransmit(10); mySwitch.setPulseLength(309); mySwitch.setProtocol(1); // mySwitch.setRepeatTransmit(15);   }   void loop() { // включение // группа 11000 код розетки A mySwitch.switchOn("11000", "10000"); Serial.print("A - on"); delay(5000); // группа 11000 код розетки B mySwitch.switchOn("11000", "01000"); Serial.print("B - on"); delay(5000); // группа 11000 код розетки B mySwitch.switchOn("11000", "00100"); Serial.print("C - on"); delay(5000); // выключение mySwitch.switchOff("11000", "10000"); Serial.print("A - off"); delay(5000); mySwitch.switchOff("11000", "01000"); Serial.print("В - off"); delay(5000); mySwitch.switchOff("11000", "00100"); Serial.print("C - off"); delay(5000); }

Запускаем, и смотрим как розетки по кругу включаются, а затем выключаются.

Из контроллера при желание можно управлять 32x32 розетками

Модуль распознавания голоса Voice Recognition Module V2

Модуль распознавания голоса Voice Recognition Module V2 был куплен на ebay по очень приемлемой цене. При заказе не смотрел даташит и напрасно. Модуль не совсем оправдал ожидания:

1) Объявленная работа с 15 заранее записанными голосовыми командами одновременно невозможна (модуль распознает только по 5 команд каждого блока (блоков 3)).Можно подгрузить только 1 блок, затем другой и т.д. Поэтому было решено использовать цепочки слов (2-3) с паузами, необходимыми для загрузки следующего блока, например

Кафе - лампа - выключить

Фонтан - включить

2) Модуль не реагирует на голос другого человека, для двух человек придется дублировать команды

Сначала расскажу как работать с модулем, а потом как была решена задача

Вид модуля

Для обучения модуля необходимо посылать модулю по последовательному порту команды и произносить фразы. Скачиваем на компьютер (Windows) рекомендуемую производителем программe работы с com-портом (AccessPort - страница загрузки), подключаем модуль к Arduino

Arduino----- модуль
+5V ----------VCC
GND ----------GND
TX ------------3
RX ------------2

Arduino подключаем к компьютеру. В Arduino загружаем скетч

?

  #include "SoftwareSerial.h"   SoftwareSerial mySerial(2, 3); // RX, TX   void setup() { Serial.begin(9600); mySerial.begin(9600); }   void loop() { if (mySerial.available()) Serial.write(mySerial.read()); if (Serial.available()) mySerial.write(Serial.read()); }

В программе AccessPort выставляем следующие настройки

Теперь все команды и ответы идут от компа к модулю

Смотрим даташит - прикреплен в конце

и посылаем команды

AABB - информация о модуле

V2.0
By ELECHOUSE
www.elechouse.com

Далее - обучение первого блока - AA11

После команды START в окне терминала произносим в микрофон ПЕРВУЮ фразу, появляется надпись Again, ждем, молчим, снова появляется команда START. Второй раз произносим в микрофон ПЕРВУЮ фразу для подтверждения. В случае удачной записи появляется надпись Finish one, говорящая о том, что первая команда успешно записана. Надпись Different говорит о том, что вторая команда звучала не так, как первая и модуль ее не распознал. Надпись Too loud говорит о том, что вы слишком громко говорите в микрофон (> 1300 мс).
Аналогично записываем 4 оставшихся фразы. Надпись Group1 finished! говорит о том, что первый блок успешно записан.

Для проверки распознавания вызываем блок 1 - командой AA21 и произносим фразы в микрофон. При распознавании выводится подтверждение в терминал

Затем обучаем блоки 2 и 3 посылая команды AA12, AA13 соответственно. Для вызова из памяти блоков 2 и 3 команда в терминал AA22 и AA23 соответственно.

Еще один момент - если мы хотим получать ответ от голосового модуля в кратком виде (не "Result:15" а 15) необходимо отправить модулю команду AA37

В блоки заносим следующие команды (участвуют 2 человека) для посиделок на кухне - чайник(электрический) + освещение (огни RGB, лампа возле кухонного стола, ночник)

  блок 1 блок 2 блок 3
  "Кафе" (1 голос) "Огни" (1 голос) "Включить" (1 голос)
  "Фонтан" (1 голос) "Лента" (1 голос) "Выключить" (1 голос)
  "Тест" (1 голос) "Ночник" (1 голос) "Огни" (2 голос)
  "Кафе" (2 голос) "Включить" (2 голос) "Лента" (2 голос)
  "Фонтан" (2 голос) "Выключить" (2 голос) "Ночник" (2 голос)

В соответствии с обученным командам и будем строим цепочки в программе

Вот примеры правильных цепочек

"Кафе" (1 голос) -- "Ночник" (1 голос) -- "Выключить" (1 голос)

"Фонтан" (2 голос) -- "Включить" (2 голос)

"Кафе" (2 голос) -- "Огни" (2 голос) -- "Включить" (2 голос)

и т.д.

Для наглядности добавим индикацию 3 светодиода к пинам 7,8,9

(красный - загружен 1 блок

желтый - загружен 2 блок

зеленый - загружен 3 блок

горят 3 светодиода (1 сек) - комбинация слов верная)

Вот схема устройства

А устройство выглядит так (будет позже украшено искусственными цветами)

И скетч для Arduino. К сказанному выше еще добавлю, что если

после загрузки второго или третьего блоков в течении FRAZA_TIME=2000 мс нет опознанного слова -

подгружается банк 1.

И весь скетч

?

  #include "RCSwitch.h" #include "SoftwareSerial.h"   SoftwareSerial mySerial(2, 3); // RX, TX RCSwitch mySwitch = RCSwitch(); byte com = 0; char* kod_group="11000";   unsigned long FRAZA_TIME=2000; unsigned long millis1=0;   int fraza_poz=1; int var1; int offset[4]={0,1,10,100}; unsigned int kod=0; int id_do=0; // фразы // 1 банк // 11,12,13,14,15 // кафе(1),фонтан(1),тест(1),кафе(2),фонтан(2) // 21,22,23,24,25 // огни(1),лента(1),ночник(1),включить(2),выключить(2) // 31,32,33,34,35 // включить(1),выключить(1),огни(2),лента(2),ночник(2), // все возможные комбинации // 1,2,3 - выбор банка // 4 - ok end unsigned int var_ok[29][4]={ // 1 голос {1,2,0,0},{2,2,0,0}, {11,3,0,0},{21,3,0,0},{31,3,0,0},{42,4,1,1},{52,4,2,2}, {111,4,3,1},{121,4,4,1},{131,4,5,1},{211,4,6,2},{221,4,7,2},{231,4,8,2}, // тест {3,2,0,0},{43,3,0,0},{243,4,9,3}, // 2 голос {4,3,0,0},{5,3,0,0}, {304,2,0,0},{404,2,0,0},{504,2,0,0},{105,4,10,1},{205,4,11,2}, {344,4,12,1},{354,4,13,1},{444,4,14,1},{454,4,15,2},{544,4,16,2},{554,4,17,2} }; // коды отправки по RF char kodModule[][6] = {"00000", "00010","00010", // чайник вкл-выкл 1 голос "10000","01000","00100","10000","01000","00100", // огни,лампа, ночник вкл-выкл 1 голос "00000", // тест "00010","00010", // чайник вкл-выкл 2 голос "10000","01000","00100","10000","01000","00100" // огни,лампа, ночник вкл-выкл 2 голос };   void setup() {   Serial.begin(9600); mySerial.begin(9600); pinMode(13, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); digitalWrite(7,HIGH); digitalWrite(8,HIGH); digitalWrite(9,HIGH); // радиомодуль mySwitch.enableTransmit(10); mySwitch.setPulseLength(309); mySwitch.setProtocol(1); // mySwitch.setRepeatTransmit(15); // Voice Recognition Module V2 delay(2000); mySerial.write(0xAA);//избавляемся от текста mySerial.write(0x37);// и оставляем байты delay(1000); mySerial.write(0xAA); // вызываем из памяти mySerial.write(0x21);// команды 1-ой группы delay(2000); digitalWrite(7,LOW); digitalWrite(8,LOW); digitalWrite(9,LOW); Serial.println("okey");   }   void loop() {   var1=fraza_poz; if(get_word(fraza_poz)!=var1) { switch(fraza_poz) { case 0: Serial.print("false=");Serial.println(kod); kod=0;fraza_poz=1; break; case 4: Serial.print("ok=");Serial.println(kod); ledOn(7);ledOn(8);ledOn(9); command_UNIEL(id_do); kod=0;fraza_poz=1;id_do=0; delay(1000);ledsOff(); break; case 1: Serial.print("wait=");Serial.println(kod); kod=0; break; default: Serial.print("wait=");Serial.println(kod); break; } new_bank(fraza_poz); } if(millis()-millis1>FRAZA_TIME && fraza_poz>1) {kod=0;fraza_poz=1;new_bank(fraza_poz);} digitalWrite(13, LOW); //Serial.print("fraza_poz====");Serial.println(fraza_poz);   } // получить id слова из банка int get_word(int bank) { while(mySerial.available()) { com = mySerial.read();// читаем входящие байты и присваиваем значение переменной com digitalWrite(13, HIGH); Serial.print("word_id=");Serial.println(com,HEX); if(com>0x10*bank && com<0x16*bank) { kod=kod+offset[bank]*(int(com & 7)); fraza_poz=0; for(int i=0;i<29;i++) {if(kod==var_ok[i][0]) {fraza_poz=var_ok[i][1]; if(fraza_poz==4) id_do=i+1; } } Serial.print("fraza_poz=");Serial.println(fraza_poz); } } return fraza_poz; } // выбор нового банка Voice Recognition Module V2 int new_bank(int bank) { Serial.print("NEW=");Serial.println(fraza_poz); mySerial.write(0xAA); // вызываем из памяти byte bank1=0x20+bank; mySerial.write(0x20+bank);// команды 1-ой группы delay(1000); mySerial.flush(); ledsOff(); ledOn(6+bank); millis1=millis(); } // отправка команды розетке UNIEL по rf void command_UNIEL(int id) { Serial.print("id=");Serial.print(id-1); Serial.print(" id[3]=");Serial.println(var_ok[id-1][3]); Serial.print(" kod=");Serial.println(var_ok[id-1][2]); if(var_ok[id-1][3]==1) mySwitch.switchOn(kod_group, kodModule[var_ok[id-1][2]]); else if(var_ok[id-1][3]==2) mySwitch.switchOff(kod_group, kodModule[var_ok[id-1][2]]); else if(var_ok[id-1][3]==3) { for(int i=3;i<6;i++) {mySwitch.switchOn(kod_group, kodModule[3]); delay(1000);} for(int i=3;i<6;i++) {mySwitch.switchOff(kod_group, kodModule[3]); delay(1000);} } else; } // включить светодиод void ledOn(int pin) { digitalWrite(pin,HIGH); } // выключить светодиоды void ledsOff() { digitalWrite(7,LOW); digitalWrite(8,LOW); digitalWrite(9,LOW); }

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин
Arduino Контроллер Arduino mini pro     Поиск в Utsource
Voice Module Контроллер Voice Recognition Module V2     Поиск в Utsource
R1-R3 Резистор 220 Ом     Поиск в Utsource
HL1 Светодиод красный     Поиск в Utsource
HL2 Светодиод желтый     Поиск в Utsource
HL3 Светодиод зеленый     Поиск в Utsource
RF Трансивер 433 Мгц FS1000A     Поиск в Utsource
  Розетка радиоуправляемая UNIEL     Поиск в Utsource

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-03-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: