Подключение EasyVR shield и написание скетча для управления различными внешними устройствами.

Тема в разделе "Arduino & Shields", создана пользователем Den1975, 1 фев 2015.

  1. Den1975

    Den1975 Нерд

    Здравствуйте уважаемые коллеги.
    Приобрел EasyVR Shield 2.0 (фото прилагается) и пытаюсь заставить его работать с Arduino Uno для выполнения ряда банальных задач (например включить/выключить свет).
    Собственно с самим шилдом и программированием распознавания голосовых команд через EasyVR Commander 3.8.0., созданием и заливкой в шилд собственной Голосовой Таблицы с использованием голосовых файлов WAF полученных в программе Balabolka (с подгруженным голосом Acapela Group Alena) и их компрессией через программу Quick Synthesis 5.2.6. разобрался полностью. Спасибо толковому описанию устройства на сайте производителя и информации на сайте Амперки.

    Что до сих пор не могу понять:
    1. Есть два положения джампера на шилде - HW (осуществляет контроль работы модуля Easy VR с использование пинов 0 и 1 ардуино (RX, TX) и SW (осуществляет контроль работы модуля Easy VR скетчем залитым в Ардуино через пины 12-13 с использованием bridge mode.
    Последовательность моих действий следующая - устанавливаю шилд поверх ардуино, ставлю джампер в положение HW, подключаю USB к компу и ничего не подключается.
    Отключаю, джампер ставлю его в SW, подключаю - Ок. Ардуино подключена и в нее можно заливать скетч.
    Таким образом, первый вопрос - в чем проблема - почему в одном положении ардуина подключается к COM порту, в другом нет ?

    2. Произвел настройку голосовых команд через EasyVR Commander (фото прилагается) - с этим проблем нет.


    Далее, полазив на просторах интернета нашел и подработал такой вот скетч:

    Заливаю вот такой скетч:
    #include "Arduino.h"
    #include "SoftwareSerial.h"
    SoftwareSerial port(12,13);
    #include "EasyVR.h"
    EasyVR easyvr(port);

    int ledsvet = 8;

    //Groups and Commands
    enum Groups
    {
    GROUP_1 = 1,
    };
    enum Group1
    {
    G1_SVET = 0,
    G1_VIKL = 1,
    };
    EasyVRBridge bridge;
    int8_t group, idx;

    void setup()
    {
    // initialize the digital pin as an output.
    pinMode(ledsvet, OUTPUT);
    // bridge mode?
    if (bridge.check())
    {
    cli();
    bridge.loop(0, 1, 12, 13);
    }
    // run normally
    Serial.begin(9600);
    port.begin(9600);
    if (!easyvr.detect())
    {
    Serial.println("EasyVR not detected!");
    for (;;);
    }
    easyvr.setPinOutput(EasyVR::IO1, LOW);
    Serial.println("EasyVR detected!");
    easyvr.setTimeout(5);
    easyvr.setLanguage(0);
    group = EasyVR::TRIGGER; //<-- start group (customize)
    }

    void action();

    void loop()
    {
    easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening)
    Serial.print("Say a command in Group ");
    Serial.println(group);
    easyvr.recognizeCommand(group);
    do
    {
    // can do some processing while waiting for a spoken command
    }
    while (!easyvr.hasFinished());
    easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off
    idx = easyvr.getWord();
    if (idx >= 0)
    {
    // built-in trigger (ROBOT)
    // group = GROUP_X; <-- jump to another group X
    return;
    }
    idx = easyvr.getCommand();
    if (idx >= 0)
    {
    // print debug message
    uint8_t train = 0;
    char name[32];
    Serial.print("Command: ");
    Serial.print(idx);
    if (easyvr.dumpCommand(group, idx, name, train))
    {
    Serial.print(" = ");
    Serial.println(name);
    }
    else
    Serial.println();
    easyvr.playSound(0, EasyVR::VOL_FULL);
    // perform some action
    action();
    }
    else // errors or timeout
    {
    if (easyvr.isTimeout())
    Serial.println("Timed out, try again...");
    int16_t err = easyvr.getError();
    if (err >= 0)
    {
    Serial.print("Error ");
    Serial.println(err, HEX);
    }
    }
    }
    void action()
    {
    switch (group)
    {
    case GROUP_1:
    switch (idx)
    {
    case G1_SVET:
    // write your action code here
    // group = GROUP_X; <-- or jump to another group X for composite commands
    digitalWrite(ledsvet, HIGH); // turn the LED on (HIGH is the voltage level)

    break;
    case G1_VIKL:
    // write your action code here
    // group = GROUP_X; <-- or jump to another group X for composite commands
    digitalWrite(ledsvet, LOW); // turn the LED off (LOW is the voltage level)
    break;
    }
    break;
    }
    }

    В итоге после загрузки в ардуино монитор порта пишет следующее:

    EasyVR detected!
    Say a comand in Group 0
    Time out, try again...
    Say a comand in Group 0
    Time out, try again
    и т.д.
    на голосовые команды не реагирует. Говорил ей Robot (думая что группа 0 это группа-триггер, но ничего не выходит. На подключенные команды в группе 1 - SVET (голос-Свет), VIKL (голос -Выключи) также ноль реакции.

    Вопрос - что не так и что ей не нравится ? Может в коде какая ерунда не указана ? Хотя он компилируется и в итоге модуль то он распознает.

    3. Подскажите, как понимать код в следующей его части:

    void setup()
    {
    // bridge mode?
    if (bridge.check())
    {
    cli(); - Что происходит здесь?
    bridge.loop(0, 1, 12, 13); - Что происходит здесь?
    }
    // run normally
    Serial.begin(9600);
    port.begin(9600);
    if (!easyvr.detect())
    {
    Serial.println("EasyVR not detected!"); - Что происходит здесь?
    for (;;);
    }



    4. И наконец последний вопрос - подскажите как можно создать или еще лучше где можно посмотреть готовые скетчи с подгрузкой записанных в EasyVR shield в Sound table голосовых фраз для оживления диалога . Я обращаюсь - Робот, Ардуино отвечает - Слушаю и повинуюсь, я- свет, она - выполняю повелитель, я - выключи, она выполняю. Как и куда нужно все это прописать ?

    Буду весьма благодарен за Ваши мудрые советы. Много голов всегда лучше чем одна.

    Заранее благодарю.
     
  2. Den1975

    Den1975 Нерд

  3. Den1975

    Den1975 Нерд

    Да, и что должно быть подключено к порту IO1 EasyVR Shield - светодиод через R=180-200 Ом?
    И какую функцию при этом выполняет светодиод D6 (около джампера микрофона) на шилде - он вроде как показывает состояние приема команды - или я не прав ?
     
  4. Den1975

    Den1975 Нерд

    Здравствуйте уважаемые коллеги.
    Приобрел EasyVR Shield 2.0 (фото прилагается) и пытаюсь заставить его работать с Arduino Uno для выполнения ряда банальных задач (например включить/выключить свет).
    Собственно с самим шилдом и программированием распознавания голосовых команд через EasyVR Commander 3.8.0., созданием и заливкой в шилд собственной Голосовой Таблицы с использованием голосовых файлов WAF полученных в программе Balabolka (с подгруженным голосом Acapela Group Alena) и их компрессией через программу Quick Synthesis 5.2.6. разобрался полностью. Спасибо толковому описанию устройства на сайте производителя и информации на сайте Амперки.

    Что до сих пор не могу понять:
    1. Есть два положения джампера на шилде - HW (осуществляет контроль работы модуля Easy VR с использование пинов 0 и 1 ардуино (RX, TX) и SW (осуществляет контроль работы модуля Easy VR скетчем залитым в Ардуино через пины 12-13 с использованием bridge mode.
    Последовательность моих действий следующая - устанавливаю шилд поверх ардуино, ставлю джампер в положение HW, подключаю USB к компу и ничего не подключается.
    Отключаю, джампер ставлю его в SW, подключаю - Ок. Ардуино подключена и в нее можно заливать скетч.
    Таким образом, первый вопрос - в чем проблема - почему в одном положении ардуина подключается к COM порту, в другом нет ?

    2. Произвел настройку голосовых команд через EasyVR Commander (фото прилагается) - с этим проблем нет.


    Далее, полазив на просторах интернета нашел и подработал такой вот скетч:

    Заливаю вот такой скетч:
    #include "Arduino.h"
    #include "SoftwareSerial.h"
    SoftwareSerial port(12,13);
    #include "EasyVR.h"
    EasyVR easyvr(port);

    int ledsvet = 8;

    //Groups and Commands
    enum Groups
    {
    GROUP_1 = 1,
    };
    enum Group1
    {
    G1_SVET = 0,
    G1_VIKL = 1,
    };
    EasyVRBridge bridge;
    int8_t group, idx;

    void setup()
    {
    // initialize the digital pin as an output.
    pinMode(ledsvet, OUTPUT);
    // bridge mode?
    if (bridge.check())
    {
    cli();
    bridge.loop(0, 1, 12, 13);
    }
    // run normally
    Serial.begin(9600);
    port.begin(9600);
    if (!easyvr.detect())
    {
    Serial.println("EasyVR not detected!");
    for (;;);
    }
    easyvr.setPinOutput(EasyVR::IO1, LOW);
    Serial.println("EasyVR detected!");
    easyvr.setTimeout(5);
    easyvr.setLanguage(0);
    group = EasyVR::TRIGGER; //<-- start group (customize)
    }

    void action();

    void loop()
    {
    easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening)
    Serial.print("Say a command in Group ");
    Serial.println(group);
    easyvr.recognizeCommand(group);
    do
    {
    // can do some processing while waiting for a spoken command
    }
    while (!easyvr.hasFinished());
    easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off
    idx = easyvr.getWord();
    if (idx >= 0)
    {
    // built-in trigger (ROBOT)
    // group = GROUP_X; <-- jump to another group X
    return;
    }
    idx = easyvr.getCommand();
    if (idx >= 0)
    {
    // print debug message
    uint8_t train = 0;
    char name[32];
    Serial.print("Command: ");
    Serial.print(idx);
    if (easyvr.dumpCommand(group, idx, name, train))
    {
    Serial.print(" = ");
    Serial.println(name);
    }
    else
    Serial.println();
    easyvr.playSound(0, EasyVR::VOL_FULL);
    // perform some action
    action();
    }
    else // errors or timeout
    {
    if (easyvr.isTimeout())
    Serial.println("Timed out, try again...");
    int16_t err = easyvr.getError();
    if (err >= 0)
    {
    Serial.print("Error ");
    Serial.println(err, HEX);
    }
    }
    }
    void action()
    {
    switch (group)
    {
    case GROUP_1:
    switch (idx)
    {
    case G1_SVET:
    // write your action code here
    // group = GROUP_X; <-- or jump to another group X for composite commands
    digitalWrite(ledsvet, HIGH); // turn the LED on (HIGH is the voltage level)

    break;
    case G1_VIKL:
    // write your action code here
    // group = GROUP_X; <-- or jump to another group X for composite commands
    digitalWrite(ledsvet, LOW); // turn the LED off (LOW is the voltage level)
    break;
    }
    break;
    }
    }

    В итоге после загрузки в ардуино монитор порта пишет следующее:

    EasyVR detected!
    Say a comand in Group 0
    Time out, try again...
    Say a comand in Group 0
    Time out, try again
    и т.д.
    на голосовые команды не реагирует. Говорил ей Robot (думая что группа 0 это группа-триггер, но ничего не выходит. На подключенные команды в группе 1 - SVET (голос-Свет), VIKL (голос -Выключи) также ноль реакции.

    Вопрос - что не так и что ей не нравится ? Может в коде какая ерунда не указана ? Хотя он компилируется и в итоге модуль то он распознает.

    3. Подскажите, как понимать код в следующей его части:

    void setup()
    {
    // bridge mode?
    if (bridge.check())
    {
    cli(); - Что происходит здесь?
    bridge.loop(0, 1, 12, 13); - Что происходит здесь?
    }
    // run normally
    Serial.begin(9600);
    port.begin(9600);
    if (!easyvr.detect())
    {
    Serial.println("EasyVR not detected!"); - Что происходит здесь?
    for (;;);
    }



    4. И наконец последний вопрос - подскажите как можно создать или еще лучше где можно посмотреть готовые скетчи с подгрузкой записанных в EasyVR shield в Sound table голосовых фраз для оживления диалога . Я обращаюсь - Робот, Ардуино отвечает - Слушаю и повинуюсь, я- свет, она - выполняю повелитель, я - выключи, она выполняю. Как и куда нужно все это прописать ?

    Буду весьма благодарен за Ваши мудрые советы. Много голов всегда лучше чем одна.

    Заранее благодарю. IMG_4684.JPG IMG_4685.JPG IMG_4686.JPG
     
  5. Den1975

    Den1975 Нерд

    Здравствуйте уважаемые коллеги.
    Приобрел EasyVR Shield 2.0 (фото прилагается) и пытаюсь заставить его работать с Arduino Uno для выполнения ряда банальных задач (например включить/выключить свет).
    Собственно с самим шилдом и программированием распознавания голосовых команд через EasyVR Commander 3.8.0., созданием и заливкой в шилд собственной Голосовой Таблицы с использованием голосовых файлов WAF полученных в программе Balabolka (с подгруженным голосом Acapela Group Alena) и их компрессией через программу Quick Synthesis 5.2.6. разобрался полностью. Спасибо толковому описанию устройства на сайте производителя и информации на сайте Амперки.

    Что до сих пор не могу понять:
    1. Есть два положения джампера на шилде - HW (осуществляет контроль работы модуля Easy VR с использование пинов 0 и 1 ардуино (RX, TX) и SW (осуществляет контроль работы модуля Easy VR скетчем залитым в Ардуино через пины 12-13 с использованием bridge mode.
    Последовательность моих действий следующая - устанавливаю шилд поверх ардуино, ставлю джампер в положение HW, подключаю USB к компу и ничего не подключается.
    Отключаю, джампер ставлю его в SW, подключаю - Ок. Ардуино подключена и в нее можно заливать скетч.
    Таким образом, первый вопрос - в чем проблема - почему в одном положении ардуина подключается к COM порту, в другом нет ?

    2. Произвел настройку голосовых команд через EasyVR Commander (фото прилагается) - с этим проблем нет.


    Далее, полазив на просторах интернета нашел и подработал такой вот скетч:

    Заливаю вот такой скетч:
    #include "Arduino.h"
    #include "SoftwareSerial.h"
    SoftwareSerial port(12,13);
    #include "EasyVR.h"
    EasyVR easyvr(port);

    int ledsvet = 8;

    //Groups and Commands
    enum Groups
    {
    GROUP_1 = 1,
    };
    enum Group1
    {
    G1_SVET = 0,
    G1_VIKL = 1,
    };
    EasyVRBridge bridge;
    int8_t group, idx;

    void setup()
    {
    // initialize the digital pin as an output.
    pinMode(ledsvet, OUTPUT);
    // bridge mode?
    if (bridge.check())
    {
    cli();
    bridge.loop(0, 1, 12, 13);
    }
    // run normally
    Serial.begin(9600);
    port.begin(9600);
    if (!easyvr.detect())
    {
    Serial.println("EasyVR not detected!");
    for (;;);
    }
    easyvr.setPinOutput(EasyVR::IO1, LOW);
    Serial.println("EasyVR detected!");
    easyvr.setTimeout(5);
    easyvr.setLanguage(0);
    group = EasyVR::TRIGGER; //<-- start group (customize)
    }

    void action();

    void loop()
    {
    easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening)
    Serial.print("Say a command in Group ");
    Serial.println(group);
    easyvr.recognizeCommand(group);
    do
    {
    // can do some processing while waiting for a spoken command
    }
    while (!easyvr.hasFinished());
    easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off
    idx = easyvr.getWord();
    if (idx >= 0)
    {
    // built-in trigger (ROBOT)
    // group = GROUP_X; <-- jump to another group X
    return;
    }
    idx = easyvr.getCommand();
    if (idx >= 0)
    {
    // print debug message
    uint8_t train = 0;
    char name[32];
    Serial.print("Command: ");
    Serial.print(idx);
    if (easyvr.dumpCommand(group, idx, name, train))
    {
    Serial.print(" = ");
    Serial.println(name);
    }
    else
    Serial.println();
    easyvr.playSound(0, EasyVR::VOL_FULL);
    // perform some action
    action();
    }
    else // errors or timeout
    {
    if (easyvr.isTimeout())
    Serial.println("Timed out, try again...");
    int16_t err = easyvr.getError();
    if (err >= 0)
    {
    Serial.print("Error ");
    Serial.println(err, HEX);
    }
    }
    }
    void action()
    {
    switch (group)
    {
    case GROUP_1:
    switch (idx)
    {
    case G1_SVET:
    // write your action code here
    // group = GROUP_X; <-- or jump to another group X for composite commands
    digitalWrite(ledsvet, HIGH); // turn the LED on (HIGH is the voltage level)

    break;
    case G1_VIKL:
    // write your action code here
    // group = GROUP_X; <-- or jump to another group X for composite commands
    digitalWrite(ledsvet, LOW); // turn the LED off (LOW is the voltage level)
    break;
    }
    break;
    }
    }

    В итоге после загрузки в ардуино монитор порта пишет следующее:

    EasyVR detected!
    Say a comand in Group 0
    Time out, try again...
    Say a comand in Group 0
    Time out, try again
    и т.д.
    на голосовые команды не реагирует. Говорил ей Robot (думая что группа 0 это группа-триггер, но ничего не выходит. На подключенные команды в группе 1 - SVET (голос-Свет), VIKL (голос -Выключи) также ноль реакции.

    Вопрос - что не так и что ей не нравится ? Может в коде какая ерунда не указана ? Хотя он компилируется и в итоге модуль то он распознает.

    3. Подскажите, как понимать код в следующей его части:

    void setup()
    {
    // bridge mode?
    if (bridge.check())
    {
    cli(); - Что происходит здесь?
    bridge.loop(0, 1, 12, 13); - Что происходит здесь?
    }
    // run normally
    Serial.begin(9600);
    port.begin(9600);
    if (!easyvr.detect())
    {
    Serial.println("EasyVR not detected!"); - Что происходит здесь?
    for (;;);
    }



    4. И наконец последний вопрос - подскажите как можно создать или еще лучше где можно посмотреть готовые скетчи с подгрузкой записанных в EasyVR shield в Sound table голосовых фраз для оживления диалога . Я обращаюсь - Робот, Ардуино отвечает - Слушаю и повинуюсь, я- свет, она - выполняю повелитель, я - выключи, она выполняю. Как и куда нужно все это прописать ?

    Буду весьма благодарен за Ваши мудрые советы. Много голов всегда лучше чем одна.

    Заранее благодарю. IMG_4684.JPG IMG_4685.JPG IMG_4686.JPG
     
  6. X-Dron

    X-Dron Гик

    Не надо постить одно и тоже сообщение в разные ветки форума. Вас и так заметят
     
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Пины 0 и 1 используются для связи с ПК. Если их же использовать для чего-то еще, работать ничего не будет - получится конфликт между шилдом и ПК.

    Чем больше одинаковых тем наплодите, тем меньше вероятность того, что кто-то захочет помогать.
     
    Последнее редактирование: 1 фев 2015
  8. Den1975

    Den1975 Нерд

    Коллеги извините, исправлюсь, думал что в разных темах будет больше шансов получить ответы на имеющиеся вопросы. Ок.
    С учетом полученного ответа от Megakoteyka получается, режим джампера shield'a HW вообще не следует использовать ? Он же как раз и использует пины 0 и 1 через которые, как указано должен контролироваться шилд.
    На сайте Амперки http://wiki.amperka.ru/projects:guessthecard прописана следующая последовательность действий к примеру создания звукового тира:
    1. Мы будем использовать плату Arduino Uno как переходник USB→UART для начальной настройки EasyVR. Извлеките микросхему ATmega из платы Arduino Uno, чтобы она не вклинивалась в канал UART. - НЕ ПОНЯЛ, ЗАЧЕМ ЭТО НУЖНО ?
    Внимательно читая указания по работе с EasyVR Shield на сайте производителя я не нашел там указаний по настройке работы shield'a через ардуино УНО со снятием микросхемы контроллера. Там четко указано, что в режиме джампера PC осуществляется прямая связь с EasyVR Commander, а Arduino в данном случае находится в режиме Reset с использованием USB/Serial для обмена информацией с компьютером.
    Здесь у меня все отлично прошслось и получилось. Shield нормально обучается, воспринимает и воспроизводит записанные в него голосовые команды.

    2. Установить на Arduino Uno шилд EasyVR.
    3. Установить перемычку на EasyVR в положение PC.
    4. Установить программу EasyVR Commander, подключите Arduino Uno к компьютеру при помощи USB-кабеля.
    5.Создайть три команды и обучите их
    6. Временно снимите EasyVR-шилд, поставьте обратно микросхему на Arduino Uno.
    7. Скачайте библиотеку EasyVR Arduino Library. В Arduino IDE добавьте бибилотеку, выбрав скачанный zip-архив (распаковывать его не нужно)
    8.Прошейте Arduino скетчем, приведённым ниже, и снова установите на неё EasyVR.
    9.Установите перемычку на EasyVR в положение HW.

    Здесь же указано, что перемычка должна быть установлена на HW ?!
    Судя по скетчу программы голосового тира для общения Arduino c EasyVR Shield используются как раз пины 0 и 1 Arduino.

    Объясните пожалуйста в чем мое не понимание ?

    В чем суть bridge mode ? Что делает команда bridge.loop(0, 1, 12, 13) ?
    Спасибо.
     
  9. Megakoteyka

    Megakoteyka Оракул Модератор

    Судя по всему, создает мост между аппаратным портом и программным.
     
  10. Den1975

    Den1975 Нерд

    Коллеги, я же прошу объяснить, поскольку хочу понимать конкретно что происходит и как осуществляется связь Комп-Ардуино-Шилд и обратно. А вы загадками пишите.
    Можете ли подсказать, где можно посмотреть команды библиотеки EasyVR Shield ?
    Я так понимаю, что Комп с Ардуиной общается по пинам 0,1 , а далее идет проброс последовательного соединения на шилд по 12 и 13 выводам Ардуино с программным управлдением через функцию Bridge.
    Но тогда я не понимаю что происходит в начале программы:
    Мы пишем Softwareserial port (12,13) - указываем что 12 и 13 пины используются для коммуникации по Serial
    далее соединяем порт ардуины через библиотеку шилда - где здесь 1 и 0 пины не понимаю
     
  11. Den1975

    Den1975 Нерд

    Разобрался
     
  12. SerhioRamos

    SerhioRamos Нуб

    Купил ИзиВр 3,
    Вопрос: есть ли где тутуориал на русском, так чтоб я смог разобраться в работе платы, как работать с ней, как работать с её программой... Вообще не понимаю, что с ней делать...
     
  13. fin

    fin Нуб

    коллеги! доброго дня. так же купил сей шилд.
    хотел поделиться первыми впечатлениями и вопросами.
    Что бы комманды распознавал надо таки ОРАТЬ в микрофон.. менял настройки перезаписывал команды, но лучшего что смог достичь это 8 из 10 распознаваний.
    пока только тренировал программ с этим "добром" не писал. После опыта с распознаванием энтузиазма использовать этот шилд поуменьшилось
    имхо за эти деньги смартфон на андроид лучше купить, повозиться с библиотекой гугла по распознаванию речи и через BT передавать команды.

    так вот вопрос, каких результатов по тренировке платы вы добились и с какими параметрами : реальным расстоянием до микрофона и настройками распознавания.