пятница, 7 марта 2014 г.

Автономное голосовое распознавание

Так-с, ну что могу сказать, модулек автономного голосового распознавания Voice Recognition Module от дядюшки Али приехал. Зашил голосовые команды в три банка памяти, всего 15 получается и отлично работает с буратино-нано. Теперича надо прокошачить к релейному блоку, вместо микрофона выход УКВ приемника и можно с радиомикрофоном по дому ходить командовать домашней автоматизацией без всяких гуглов )

Скетч:
#include "SoftwareSerial.h"

SoftwareSerial mySerial(2, 3); // RX, TX
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
// лампа печь включить выключить
// 21,22,23,24,25
// туалет бойлер включить выключить
// 31,32,33,34,35
// 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}
};


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);

  // 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);
                 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();// читаем входящие байты
       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();
  }

 
// включить светодиод
void ledOn(int pin)
  {
  digitalWrite(pin,HIGH);
  }
// выключить светодиоды
void ledsOff()
  {
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  }
Зашиваем:


Подключаем модуль:

И работаем.

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.