Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.01.2012, 01:02   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Голосовое управление нагрузками

В проекте использовал arduino и модуль распознавания речи EasyVR (VRBot )
Нажмите на изображение для увеличения
Название: carduino_vrbot.jpg
Просмотров: 2168
Размер:	65.8 Кб
ID:	205


Система автономна и работает без участия компьютера.
Обучается разным именам и разным голосам.
Распознает на расстоянии до 5 метров
Имеет 26 встроенных команд для управления на английском, итальянском, японском и немецком.
32 команды можно запрограммировать самому.
Распознавание работает отлично, пробовал на расстоянии 5 метров от микрофона отрабатывает без ошибок
Сделал на нем первое устройство выключатель света. В планах сделать интеллектуальную настольную роболампу



Программа для программирования команд VRBot модуля
Скетч для программирования команд VRBot модуля
PHP код:
uint8_t ETX_Pin=3//// VRbot Пин ETX
uint8_t ERX_Pin=2//// VRbot Пин ERX

void setup()
{   
  
pinMode(0INPUT);
  
pinMode(1OUTPUT);

  
pinMode(ETX_PinINPUT);
  
pinMode(ERX_PinOUTPUT); 
}

void loop()
{
        
int pc2vrbot digitalRead(0);
        
digitalWrite(ERX_Pinpc2vrbot);
    
        
int vrbot2pc digitalRead(ETX_Pin);
        
digitalWrite(1vrbot2pc);

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

Купить новую версию модуля - EasyVR можно здесь: https://duino.ru/


Нажмите на изображение для увеличения
Название: switch1.jpg
Просмотров: 1604
Размер:	90.9 Кб
ID:	206
Нажмите на изображение для увеличения
Название: switch.jpg
Просмотров: 1591
Размер:	96.0 Кб
ID:	207



Установка звуковых файлов:

Цитата:
Сообщение от Rovert
Скачиваем:
EasyVR-Commander
EasyVR-Arduino-library-1.2.zip
Среда разработки Arduino 1.0.3
Преобразование текста в голос "Балаболка"
Ну и сам голос Алена
Готовая озвучка

1) Качаем все это и ставим на комп.
2) Содержимое архива из папки arduino-0023 с библиотеками к EasyVR копируем в папку arduino-0023\libraries
3) В выключеном состоянии ардуины J12 на EasyVR Shild переключаем в режим SW. Запускаем среду разработки в ней жмем File - Examples - Basic - Blink
Это базовый скетч с миганием лампочки. Нам он пригодится, так как он не забивает никакие порты но об этом позже.
Нажимаем Ctrl+R (компилим скетч) по завершении жмем Ctrl+U (Заливаем скетч на ардуино). По завершении мы увидим как диод на ардуине мигает. Если это так то значит с ардуиной все ок и мы можем приступать.
4) Выберем File - Examles - EasyVR - EasyVrBridge
Потом Ctrl+R по завершению заливаем Ctrl+U
Запускаем EasyVr Comander выбираем Com port (у меня 4-й) на котором определилась ардуино и жмем Connect. (если с 1-го раза не подключилось ждем 10 сек и пробуем снова)
5) В группе 1 создаем строку и называем её например Computer жмем на кнопку тренировка и произносим 2-а раза слово на которое будет реагировать ардуина (это может быть любое слово)
В группе 2 создаем две строки и называем из On и Off (соответственно ON первая строка) тренируем слова включи и отключи
В группе 3 создаем строку LIGHT и тренируем слово свет (или елку)
6) Звуки ответов ардуины на наши слова их можно создать с помощью Балаболки и голоса Алены после создания звуком их необходимо упаковать с помощью QS 5.2.1 (это прога должна была установиться вместе с EasyVR Comander)
7) Воспользуемся архивом Audio (в нем уже упакованные звуки из пункта 6-ть). Распакуем содержимое в папку Audio на рабочем столе.
Зальем на ардуино скетч Blink из Examles. Выключим ардуино и переставим J12 на UP (это режим заливки звуков) включаем ардуино ждем 10 сек. D5 горит красным.
Запускаем EasyVR Comander (не нажимаем Connect если подключены то жмем Disconnect) и выбираем последний пункт Sound Table жмем Tools - Update Sound Table выбираем из папки audio на рабочем столе audio.qxp жмем Download звуки закинутся на шилд.
Отключаем ардуино и J12 на SW включаем обратно
8) Закидываем этот скетч на ардуину.
9) Подключение рэле:
VCC и GND подключаем соответственно.
CH1 на рэле подключаем к D2 на EasyVR Shild

10) Включаем! И работает!
и еще

Цитата:
Ураааа! Получилось! Сейчас расскажу что сделал.

Вот здесь "7) Воспользуемся архивом Audio (в нем уже упакованные звуки из пункта 6-ть). Распакуем содержимое в папку Audio на рабочем столе." распаковываем не на рабочий стол а в папку С:-Program Files (x86)-> Arduino-> libraries Обратить внимание на то чтоб небыло папки Audio вложенной в другую папку Audio, тоесть такой вид С:-> Program Files (x86)-> Arduino-> libraries-> Audio-> Файлы. Таким образом получилось залить голоса без проблем
Миниатюры
Нажмите на изображение для увеличения
Название: carduino_switch.jpg
Просмотров: 4884
Размер:	107.5 Кб
ID:	356  
Admin вне форума   Ответить с цитированием
Старый 12.03.2012, 01:49   #2
Bagunda
Member
 
Регистрация: 12.03.2012
Возраст: 39
Сообщений: 51
Вес репутации: 0
Bagunda is on a distinguished road
По умолчанию

В первом видео слышиться "Ева". Это не Хом Сапиенс разве?
Bagunda вне форума   Ответить с цитированием
Старый 12.03.2012, 10:22   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Нет это не зависимое от ПК и полностью автономное устройство
Admin вне форума   Ответить с цитированием
Старый 15.05.2012, 17:22   #4
sinva
Junior Member
 
Регистрация: 15.05.2012
Сообщений: 5
Вес репутации: 0
sinva is an unknown quantity at this point
Thumbs up

Вобщем, купил я дуину, EasyVR Shield, и т.д.
Если можно, пару вопросов:

1. Где и как у вас установлен микрофон?
2. Далеко ли от дуины?
3. Как лучше тренировать распознавание: на уже установленной системе, на расстоянии от микрофона или лучше ближе, говорить громко или наоборот вполголоса? Я заколебался ее тренировать. То нормально распознает, то как упрется, и как ни говори, не понимает...
4. Хотелось бы увидеть схему самосборки на симисторах. Я так понимаю, это без диммирования?

Буду благодарен за рекомендации, для себя решил обязательно сделать этот проект. Для начала и из принципа. Потом будем думать об Умном доме ))
sinva вне форума   Ответить с цитированием
Старый 15.05.2012, 19:26   #5
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

1- микрофон я установил сверху на шкафу
2- метра полтора от arduino nano
3-Тренировать лучше в тех условиях в которых он будет установлен, потому что резонансы и эхо влияет на распознавание
4-без диммирования
Схему голосового выключателя выложил в шапке, имейте ввиду что распиновка триака имеет большое значение
Если интересно , то могу выложить свой скетч
Admin вне форума   Ответить с цитированием
Старый 15.05.2012, 19:54   #6
sinva
Junior Member
 
Регистрация: 15.05.2012
Сообщений: 5
Вес репутации: 0
sinva is an unknown quantity at this point
По умолчанию

Ну да, все просто.... Спасибо, думаю, буду паять. Нареканий нет? Ничего в схеме не поменяли бы?
На будущее, все равно хочется димирование. Вопрос, делать на прерываниях или на датчике тока... Или еще как...

Скетч я написал уже, напихал то, что нужно именно мне.
Но ваш посмотреть КОНЕЧНО интересно. А если вы библиотечку допилите (работа с портами, вместо digitaWrite и т.д.), то вообще шикарно будет))
sinva вне форума   Ответить с цитированием
Старый 15.05.2012, 20:48   #7
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

С налету не нашел последний скетч, посмотри вот этот он был взят за основу

PHP код:
//void setup()  
//{     
//  pinMode(0, INPUT); //RX  
//  pinMode(1, INPUT);//TX   
//}  
//void loop() { } 

#define F_CPU 16000000UL 
#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <SmallUart.h>
#include <avr/wdt.h>
#include "listen.h"
#include "repeat.h"
#include "performed.h"
#include "protocol.h"

char cmd;
byte Lamp_Stat=0;
volatile uint16_t sample=0;
volatile uint8_t lastSampleFirstSample;
volatile byte new_data,future_data,old_data;
volatile byte stat=0;
volatile boolean light_status=false;
unsigned char *wave;
unsigned int length;
volatile uint16_t timerCountlengthImpuls;
volatile uint16_t Counter=0;
//********************************************************************
ISR(TIMER2_COMPA_vect
{        
 switch (
stat)
  { 
    case 
0:{
              
old_data pgm_read_byte(&wave[sample]);  
              
OCR2A old_data
              
stat=1;
              ++
sample;    
              if (
sample == lengthstat=4
              
future_data pgm_read_byte(&wave[sample]); 
              
new_data = (old_data+future_data)/2
            }  
      break;
    case 
1:  {OCR2A=(old_data+new_data)/2stat=2; } 
      break;  
    case 
2:   {OCR2A new_datastat=3; }
      break;    
    case 
3:   {OCR2A=(new_data+future_data)/2stat=0; }
      break;
    case 
4:   if(lastSample==0stat=5; else {--lastSampleOCR2A=lastSample;}
      break;      
    case 
5:   stopPlayback();
      break;
  }    
}
//********************************************************************
void setup()
{
    
pinMode(2INPUT);  // Вход , к фототранзистору               
    
pinMode(5OUTPUT); //выход ШИМ на ИК светодод
    
TCCR0B TCCR0B 0b11111000 3;//частота ШИМ 1000Гц
    
analogWrite(5,128 ); //запустить ШИМ
    
for (uint8_t i=11i<20; ++i) {pinMode(iOUTPUT); digitalWrite(i,LOW);}//выходы на триаки
    
digitalWrite(11LOW); //Выключить динамик
    
UART_Init(9600); 
    
VRbot_setup();
    
attachInterrupt(0Ir_sensRISING); //внешнее прерывание по фронту
    //Timer1.initialize(10);              //инициализация таймера  
    //Timer1.attachInterrupt(callback);   //прерывание таймера
    
wdt_enable (WDTO_8S);//wdt установить на 8сек    
}

void callback() { timerCount++; } 

void Ir_sens()

  
lengthImpuls timerCount
  
timerCount=0;
  if(
lengthImpuls<99 || lengthImpuls>105Counter=0
  
Counter++;
}
//********************************************************************
void loop()
{  
  
VRbot_RecognizeSD(3);  //тригер label1: 
    
cmd VRbot_CheckResult();   
    if(
cmd == || cmd == || cmd == )
    {
      
play_wave((unsigned char *)listen,  listen_length); 
      
_delay_ms(500);
    
     
VRbot_RecognizeSD(2); 
    
cmd VRbot_CheckResult();
       
    switch (
cmd)
    { 
      case -
4VRbot_Detect();  break;
      case -
3play_wave((unsigned char *)repeat,  repeat_length);   break;  
      case -
2play_wave((unsigned char *)repeat,  repeat_length);   break;
      case -
1play_wave((unsigned char *)repeat,  repeat_length);   break;
      case 
0Lamp_Stat=~Lamp_Stat;  break;//я
      
case 1Lamp_Stat=~Lamp_Stat;  break;//Кристина
      
case 2Lamp_Stat=~Lamp_Stat;  break;//Таня
      
case 3Lamp_Stat=~Lamp_Stat;  break;//Максим
      
case 4Lamp_Stat=~Lamp_Stat;  break;//Игорь
    
}
    
Lamp_Swich();
 } else if(
cmd == -4VRbot_Detect(); 
wdt_reset(); 
}
//******************************************************
void Lamp_Swich(void)
{
if(
Lamp_Stat==0)  for (int i=1320i++) digitalWrite(i,LOW); 
    else for (
int i=1320i++) digitalWrite(i,HIGH);   
}

//******************************************************
unsigned char VRbot_read(void)
{
  
uint8_t val 0;
  for (
uint16_t i 03000; ++i
    { 
      if(
UART_ReadByte(val)) break;
       
_delay_ms(2);
    } 
    return 
val;
}
//******************************************************
void VRbot_write(uint8_t b)
{
  
//Serial.print(b, BYTE);
  
UART_SendByte(b); 
 
_delay_ms(5);
}
//******************************************************
void VRbot_setup()

    if (
VRbot_Detect())                  
   {      
         
VRbot_ID();
         
//VRbot_SetBaudrate(115200);
         
VRbot_SetLanguage(0);
         
VRbot_SetTimeout(5);             
         
VRbot_SetLDelay(0);
   } else while(!
VRbot_Detect){digitalWrite(13,LOW);  _delay_ms(200); digitalWrite(13,HIGH);  _delay_ms(200); }
}
//******************************************************
boolean VRbot_Detect(void
{
  
unsigned char i;
  for (
0100; ++i
  {   
    
VRbot_write(CMD_BREAK);        
    if ( 
VRbot_read() == STS_SUCCESS) {return true; break;} else  return false;
  }
}
//******************************************************
boolean VRbot_ID(void
{
  
VRbot_write(CMD_ID);
  if (
VRbot_read() == STS_IDVRbot_write(ARG_ACK); else return 0;
 
    if (
VRbot_read() == ARG_ZERO)  return true; else  return false;
}
//******************************************************
boolean VRbot_SetTimeout(unsigned char s
{
  
VRbot_write(CMD_TIMEOUT);
  
VRbot_write(ARG_ZERO s);
    if (
VRbot_read() == STS_SUCCESS)  return true; else  return false;
}
//******************************************************
boolean VRbot_SetLanguage(unsigned char lang
{  
 
VRbot_write(CMD_LANGUAGE);
  
VRbot_write(ARG_ZERO lang);
  if (
VRbot_read() == STS_SUCCESS)  return true; else  return false;
}
//******************************************************
boolean VRbot_SetBaudrate(unsigned int bdr
{
  
unsigned char b=12;
  if (
bdr==115200)b=1;
  if (
bdr==57600b=2;
  if (
bdr==38400)b=3;
  if (
bdr==19200)b=6;
  if (
bdr==9600)b=12;
  
VRbot_write(CMD_BAUDRATE);
  
VRbot_write(ARG_ZERO b);  
    if (
VRbot_read() == STS_SUCCESS) {Serial.begin(bdr);  return true;} else  return false;
}
//******************************************************
boolean VRbot_SetLDelay(unsigned char time
{  
 
VRbot_write(CMD_DELAY);
  
VRbot_write(ARG_ZERO time);
  if (
VRbot_read() == STS_SUCCESS) return true; else  return false;
}
//******************************************************
void VRbot_RecognizeSD(unsigned char group
{
  
VRbot_write(CMD_RECOG_SD);
  
VRbot_write(ARG_ZERO group);
}
//******************************************************
void VRbot_RecognizeSI(unsigned char ws
{
  
VRbot_write(CMD_RECOG_SI);
  
VRbot_write(ARG_ZERO ws);
}
//******************************************************
char VRbot_CheckResult(void
{  
  
unsigned char rx=0;
  
rx VRbot_read();
  if (
rx == STS_SIMILAR || rx == STS_RESULT
  {
    
VRbot_write(ARG_ACK);
    return (
VRbot_read() - ARG_ZERO);
  }
    if (
rx == STS_TIMEOUT) return -2;  
     if (
rx == STS_ERROR)  return -1;
      if (
rx == STS_INVALID)  return -3;
      if (
rx == 0)  return -4;
}     
//*************************************************************************
void startPlayback()
{
    
sample=0;
    
stat=0;
    
    
ASSR |=(1<<AS2); 

   
   
TCCR2A |= ((1<<COM2A1)|(0<<COM2A0)|(1<<WGM21) | (0<<WGM20)); 

    
TCCR2B = ((<< CS22) | (<< CS21) | (<< CS20) | (0<<WGM22));  

    
lastSample pgm_read_byte(&wave[length-1]); 
    
FirstSample pgm_read_byte(&wave[0]); 
    
TCNT2 0
    
TIMSK2|=(1<<OCIE2A);
    
sei();
    
     for (
int i=0<FirstSamplei++) 
     {
       
new_data=i;
         
stat=2;
          
sample 0;             
      
_delay_us(10);
     }
   
stat=0;  
}

void stopPlayback()
{
    
TIMSK2&=(0<<OCIE2A); 
    
TCCR2B &=(0<<CS10);

//******************************************************
void play_wave(unsigned char *wave_dataunsigned int wave_length)
{
 
wave=wave_data
 
length=wave_length;
 
startPlayback(); 

Admin вне форума   Ответить с цитированием
Старый 27.05.2012, 19:51   #8
Omigovolt
Junior Member
 
Регистрация: 27.05.2012
Сообщений: 1
Вес репутации: 0
Omigovolt is an unknown quantity at this point
По умолчанию

Здравствуйте администратор. Я конечно не силен в электронике, но вот именно это я искал! Хотел применить эту технологию в автомобилестроении, по этому поводу возникает множество вопросов. Если вы не против мне бы хотелось это обсудить только не в писменном виде а в скайпе.
Omigovolt вне форума   Ответить с цитированием
Старый 30.05.2012, 14:40   #9
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Может быть Вам дать номер своего мобильного телефона?
Admin вне форума   Ответить с цитированием
Старый 30.05.2012, 23:45   #10
fess
Junior Member
 
Регистрация: 30.05.2012
Сообщений: 6
Вес репутации: 0
fess is an unknown quantity at this point
По умолчанию

Уважаемый Админ, хотелось бы узнать где брали звуковые файлы на русском (ответ врбота "Слушаю")
fess вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 37 (пользователей: 0 , гостей: 37)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:13. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика