Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

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

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

Розетки UNIEL

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

Розетки UNIEL

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

Радиомодули

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

Радиомодули FS1000A

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

Для Arduino имеются библиотеки для работы с разными управляемыми по 433/315 МГц исполнительными устройствами. Я использовал такую:
rc-switch - Arduino library to operate low cost 315 MHz / 433 MHz remote control devices - http://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) Модуль не реагирует на голос другого человека, для двух человек придется дублировать команды

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

Вид модуля 

Voice Recognition Module V2

Для обучения модуля необходимо посылать модулю по последовательному порту команды и произносить фразы. Скачиваем на компьютер (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 выставляем следующие настройки

Настройки в 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 голос)
 2  "Фонтан" (1 голос)  "Лента" (1 голос)  "Выключить" (1 голос)
 3  "Тест" (1 голос)  "Ночник" (1 голос)  "Огни" (2 голос)
 4  "Кафе" (2 голос)  "Включить" (2 голос)  "Лента" (2 голос)
 5   "Фонтан" (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 pro1 Поиск в магазине ОтронВ блокнот
Voice Module КонтроллерVoice Recognition Module V21 Поиск в магазине ОтронВ блокнот
R1-R3 Резистор220 Ом3 Поиск в магазине ОтронВ блокнот
HL1 Светодиодкрасный1 Поиск в магазине ОтронВ блокнот
HL2 Светодиоджелтый1 Поиск в магазине ОтронВ блокнот
HL3 Светодиодзеленый1 Поиск в магазине ОтронВ блокнот
RF Трансивер 433 МгцFS1000A1 Поиск в магазине ОтронВ блокнот
Розетка радиоуправляемаяUNIEL4 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 12.01.2014 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (13) | Я собрал (0) | Подписаться

0
raxp #
Заказал до НГ на али такой же VR модуль, жду вот когда придет. Про банки распознаваний написано в доках, так что ожидаемо.
Ответить
0
thebonix #
Если на фоне будет музыка и или речь (телевизор/радио/люди) на сколько будет хуже распознавание?
Вряд ли в комнате/квартире постоянно тишина будет.
Ответить
0

[Автор]
victoruni #
Если легким фоном - то нестрашно. Гораздо сильнее влияет интонация произношения. Настраивать приходится несколько раз. Чуть иначе произносишь слово - не реагирует. Поэтому вывел светодиоды подгрузки следующего банка, чтобы пока привыкнуть
Ответить
0
Тм #
А этот войс модуль всегда ждет команды, или нужно предупреждать перед командой как в телефоне голосовой набор?
Ответить
0
raxp #
Снижение влияния фона решается классическим способом - двумя микрофонами и вычитающей схемой на ОУ, один микрофон около рта пользователя, второй чуть на удалении слушает все звуки. Схема простая http://img268.imageshack.us/img268/3079/sipl.gif, можно и на транзисторах.
Китайцы гарнитуры готовые продают с двумя микрофонами (ларингофон и внешний микрофон). К слову, я бы использовал радиомикрофон и FM-приемник, чтобы не привязываться к стационарному микрофону.
Ответить
0

[Автор]
victoruni #
После загрузки очередного блока модуль ВСЕГДА ждет команды. Если подгружать следующий блок (3 блока по 5 слов) уходит примерно 1 секунда, поэтому фраза (несколько слов из разных блоков) произносится с паузами).
Заказал другой модуль - там одновременно до 42 команд - https://www.sparkfun.com/products/12656
Ответить
0
raxp #
EasyVR конечно круче, сам облизывался, но цена в два раза больше.
Ответить
0
plotny #
Подскажите о совместимости работы на 433МГц?
Если сосед через стенку купил такой же набор, то его розетки сработают от моего передатчика (ведь дальность попадает в расстояние 20 метров) или существует сетка частот, где редки пересечения?
Ответить
0

[Автор]
victoruni #
У каждой розетки есть два набора переключателей - код группы (5 перекл) и код розетки (5 перекл). Если вы управляете розетками с пульта установите свой код группы (пусть 10110) - и у вас доступны только розетки с кодами 10000, 01000, 00100, 00010, 00001. Если у соседа пульт с другим кодом группы, ваши розетки недоступны, если установил такой же как у вас, тогда - да - будет управлять вашими розетками )).
А программно вы также устанавливаете код группы, а код розетки выставляете любой.
mySwitch.switchOn(kod_group, kod_rozetka])
mySwitch.switchOff("01101", "11000"])
Ответить
0
Анатолий #
Хорошая статья, спасибо за информацию! Я сейчас просто стою перед выбором - на какой основе расширять свою систему Умный Дом. Вот и думаю что лучше Ардуино или Малинка, почему то душа больше лежит к - Малинке, так как основную часть своей системы я уже построил на основе ОС Debian и простого набора Apache PHP MySQL . Поэтому как то Малинка ближе! Правда розетки у меня управляются по 1-wire. Да и с голосовым управлением как то для меня проще использовать web speech api, понятно что - только работа в online режиме, хотя на Android и в offline работает. Сейчас пока занимаюсь мультимедиа
Ответить
0
Александр Зеленский #
Отличная статья!
Воплощая замысел, изменил только один шаг - использовал терминал приложения monitor RS232 port для передачи команд КОМ порту, но все сработало. Спасибо за информацию.
Ответить
0
Алексей. Т #
Подскажите на каком расстоянии микрофон воспринимает?
Ответить
0

[Автор]
victoruni #
Этого уже нет. Но когда работало, метра 2 брало.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Raspberry Pi 2
Raspberry Pi 2
Мультиметр Mastech MS8268 Набор для сборки - УНЧ 2х60 Вт на TDA7294
вверх