Помогите разобраться с EasyVR-шилд 3.0

Тема в разделе "Arduino & Shields", создана пользователем redven, 4 апр 2016.

  1. redven

    redven Нерд

    Купил EasyVR-шилд 3.0

    В проекте на ВИКИ есть голосовой тир, где используется

    EasyVR-шилд 2.0, там есть пример кода.

    Вот вроде разобрался с заливкой и т.д. (позже выложу статью со своими мытарствами), но хочу вместо сервы использовать
    Relay Shield .

    Но что-то ничего не получается. Я не так давно изучаю программирование, по этому не судите строго. Удаляю весь код связанный с библиотекой servo, прописываю всё как нужно..но ничего не работает. Подскажите пожалуйста, что нужно удалить, а что добавить!

    Код (C++):
    #include <EasyVR.h>

    EasyVR easyvr(Serial);
    Servo* srv;
    // Номер пина для светодиода, индицирующего ожидание команды
    const int LED_WAIT = 13;
    // Номер группы команд
    enum
    {
        GROUP_MAIN = 1,
    };
    // Коды команд из группы 1
    enum
    {
        G1_SHIRT = 0,
        G1_PEAR = 1,
        G1_ORANGE = 2,
    };
    // Соответствие команд индексам в массиве серв srv
    enum
    {
        // Если значение элемента перечисления не задано, то оно принимается
        // равным <значение предыдущего элемента>+1. Если элемент первый, то ему
        // присваивается значение 0.
        SRV_SHIRT,
        SRV_PEAR,
        SRV_ORANGE,
        // Эту константу держите всегда последней и не меняйте её значение:
        SRV_COUNT
    };
    // Соостветствие серв пинам
    enum
    {
        SRV_SHIRT_PIN  = 4,
        SRV_PEAR_PIN   = 5,
        SRV_ORANGE_PIN = 6
    };
    void setup(void)
    {
        Serial.begin(9600);
        // Переводим на запись порт для индикации
        // активности микрофона
        pinMode(LED_WAIT, OUTPUT);
        digitalWrite(LED_WAIT, LOW);
        // Ожидание соединения с платой
        while(!easyvr.detect()) delay(1000);
        // Установка таймаута на распознавание
        easyvr.setTimeout(5);
        // Выбор языка (Английский)
        easyvr.setLanguage(EasyVR::ENGLISH);
        // Конфигурируем сервы
        srv = new Servo[SRV_COUNT];
        srv[  SRV_SHIRT ].attach(  SRV_SHIRT_PIN );
        srv[ SRV_ORANGE ].attach( SRV_ORANGE_PIN );
        srv[   SRV_PEAR ].attach(   SRV_PEAR_PIN );
        // По очереди протестируем все сервы
     
    }
    // Данная функция вызывается в случае успешного
    // распознавания фразы
    void action(int8_t group, int8_t idx)
    {
        // Активируем серву, соответствующую распознанному коду
        switch (group)
        {
        case GROUP_MAIN:
            switch (idx)
            {
            case G1_SHIRT:
                digitalWrite(SRV_SHIRT, HIGH);
                delay(1000);
                digitalWrite(SRV_SHIRT, LOW);
                break;
            case G1_PEAR:
                digitalWrite(SRV_PEAR, HIGH);
                delay(1000);
                digitalWrite(SRV_PEAR, LOW);

                break;
            case G1_ORANGE:
                digitalWrite(SRV_ORANGE, HIGH);
                delay(1000);
                sdigitalWrite(SRV_ORANGE, LOW);
                break;
            }
            break;
        }
    }
    void loop(void)
    {
        int8_t idx;
        // Зажигаем светодиод для индикации режима ожидания команды
        digitalWrite(LED_WAIT, HIGH);
        // Запускаем процедуру распознавания
        easyvr.recognizeCommand(GROUP_MAIN);
        // Ожидаем окончание процесса
        while(!easyvr.hasFinished());
        // Тушим светодиод - либо таймаут, либо команда распознана
        digitalWrite(LED_WAIT, LOW);
        // Если убрать эту задержку, то мы перестанем видеть, когда заканчивается
        // один период ожидания команды и начинается второй. Если произнесение команды
        // придётся на границу двух периодов, то распознавание закончится неудачей.
        delay(500);
        // Получаем код распознанной команды
        idx = easyvr.getCommand();
        if(idx >= 0)
        {
            // Выполним действие по команде
            action(GROUP_MAIN, idx);
        }
        else
        {
            // Ошибка распознавания или таймаут
        }
    }



     
    Последнее редактирование: 4 апр 2016
  2. redven

    redven Нерд

    Придумал как обойти. Оставил код как есть, но добавил в выполняемую часть вместо изменения положения сервы (функцию digitalWrite) включение диода. Все получилось.
    Но теперь другая проблема, он только мой голос распознает. Как быть? Девушка произносит туже фразу, не слышит..
     
    Последнее редактирование: 4 апр 2016
  3. ostrov

    ostrov Гуру

    Про режимы читали? Фразы произнесенные разными голосами он по русски не понимает.
     
  4. redven

    redven Нерд

    Читал) фразы на английском произносит. Фразы те-же что и в примере. Выставил в настройках минимум точности. Ещё варианты не подскажите?
     
  5. redven

    redven Нерд

    Вот ссылка промежуточного результата. Недоволен стабильностью и отсутствием универсального распознавания английского языка на заданные фразы (на видео русский язык используется только для съемки). Будем курить железку дальше и пытаться научить её общаться с нами))

    Буду очень благодарен любым советам и русскоязычным инструкциям!
     
    Последнее редактирование: 5 апр 2016
  6. redven

    redven Нерд

    Люди добрые! Столько просмотров, а совет дать некому? Помогите нубу разобраться!!!!
     
  7. Baks

    Baks Нуб

    Я тоже очень загорелся преобести себе модуль голосового управления, однако почитал форумы и пришёл к выводу что его цена не стоит данного гилда так как не работает он на распознавание как надо для различных голос и интонаций. Поэтому есть задумка использовать Гугол сервис но для начала передачи его как-то нужно активировать, не прибивать же кнопку на стену, а тоже нужно как-то во всех шумах и разговорах найти фразу начала передачи к серверу и конец. И вот пока не придумал как это сделать. А с если знакомый тоже разбирался и потом закинул его в ящик запчастей
     
  8. redven

    redven Нерд

    Вот результат тестового использования этой штуки: видео

    Английские стандартные фразы воспроизводит более стабильно. И дело не в том, что железка плохая. А в том, что технология сложная и её нужно более детально изучать! Я нашел пару серьезных исследований в русскоязычном сегменте, в которых объясняется. В этой штуке может быть две прошивки (насколько я понял) и вторая очень дорогая, к ней можно цеплять расширения памяти и она более качественно распознает языки.
     
  9. StereoMC

    StereoMC Нуб

    А как разобрались с подключением?
    У меня видимо что то похожее.
    Винда определяет что есть Arduino `Uno на COM4. В EasyVR commander говорит Could not detect device connected to port "COM4".


     
  10. redven

    redven Нерд

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

    Код (C++):
    1. Устанавливаем колодку в положение SW и
    Загружаем программу EasyVRbridge для загрузки команд (и не только) в плату EasyVR.

    Запускаем программу EasyVR Commander и в ней выбираем необходимый нам COM порт.

    Нажимаем соединиться.

    Обучаем и прописываем все необходимые слова по группам.

    Нажимаем дисконект.

    2. Далее пишем скетч в ардуино с необходимыми нами действиям и грузим его в плату.

    После успешной загрузки переставляем перемычку в положение HW

    3. Пользуемся голосвыми функциями.