Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Робот с голосовым управлением 2WD с Arduino и сервером BitVoicer

Компоненты и расходные материалы

Arduino UNO
× 1
Двойной щиток драйвера двигателя Pololu MC33926
× 1
SparkFun XBee Shield
× 1
Модуль Microchip RN171VX
× 1
Электретный микрофонный прорыв SparkFun
× 1
2WD шасси робота-автомобиля
× 1
Регулятор напряжения Texas Instruments LM1117 (TO-220)
× 1
Конденсатор 10 мкФ
× 1
LED (общий)
× 4
Резистор 330 Ом
× 4
Батарейки AA
× 4
Батарея 9 В (стандартная)
× 1
9 В для адаптера Barrel Jack
× 1
Перемычки (общие)
× 17
Обычный медный провод
× 1
Винты и гибкий пластиковый зажим для крепления
× 1

Необходимые инструменты и машины

Паяльник (общий)
Плоскогубцы
Отвертка

Приложения и онлайн-сервисы

BitVoicer Server 1.0

Об этом проекте

В этом уроке я покажу, как построить 2WD робота с голосовым управлением. Хотя я управляю только двигателями постоянного тока для перемещения робота, тот же подход можно использовать для голосового управления шаговыми двигателями и серводвигателями, поэтому, если вы планируете построить любого робота с голосовым управлением, который выполняет механические движения, это руководство может служить в качестве ссылка для вашего проекта.

Чтобы построить этого робота, вам понадобится одно двухколесное шасси, одна плата Arduino, одна защита двигателя постоянного тока, одна лицензия BitVoicer Server, один модуль WiFi и один микрофон с предварительным усилением. Что касается компонентов, то на рынке их огромное количество, и вы можете добиться тех же результатов, используя разные комбинации. На шаге 1 я подробно рассказываю о некоторых компонентах, используемых в роботе, поэтому, если вам нужно изменить некоторые из них, просто ищите компоненты с похожими функциями.

Для преобразования голосовых команд в движения робота будут выполнены следующие процедуры:

  • 1. Звуковые волны будут улавливаться и усиливаться платой Sparkfun Electret Breakout;
  • 2. Усиленный сигнал будет оцифрован и буферизован в Arduino с помощью его аналого-цифрового преобразователя (АЦП);
  • 3. Аудиосэмплы будут передаваться на сервер BitVoicer Server с помощью модуля Microchip WiFi;
  • 4. BitVoicer Server обработает аудиопоток и распознает содержащуюся в нем речь;
  • 5. Распознанная речь будет сопоставлена ​​предопределенным командам, которые будут отправлены в Arduino;
  • 6. Arduino определит команду и определит, какие двигатели постоянного тока будут использоваться, как долго и с какой скоростью;
  • 7. Драйвер двигателя будет активирован, чтобы обеспечить необходимое напряжение и ток для движения двигателей.

Список материалов:

  • Arduino UNO:~ 25 долларов США.
  • Pololu Dual MC33926 Motor Driver Shield:29,95 США
  • SparkFun XBee Shield:14,95 доллара США.
  • Модуль Microchip RN171VX с антенной:34,95 доллара США.
  • Электретный микрофон SparkFun Breakout:7,95 долларов США.
  • BitVoicer Server 1.0:8,90 долларов США.
  • 2WD роботизированное автомобильное шасси:15,95 долларов США.
  • Стабилизатор напряжения Texas Instruments LM1117 (TO-220):~ 1,95 доллара США.
  • Электролитический конденсатор 10 мкФ:~ 0,35 доллара США.
  • 4 светодиода:~ 1,00 долл. США
  • Резисторы 4 x 330 Ом:~ 0,75 долл. США.
  • 4 батарейки типа AA 1,5 В:~ 2,00 доллара США.
  • Батарея 9 В:~ 2,00 доллара США.
  • Переходник с 9 В на цилиндрический разъем:~ 2,50 доллара США.
  • Провода-перемычки и обычные провода:~ 2 доллара США.
  • Винты и гибкий пластиковый зажим для фиксации.
  • Паяльник и припой

ШАГ 1. Знакомство с компонентами

На этом этапе я даю важную информацию о компонентах робота и о том, как подготовить их к установке.

Во-первых, сердце робота:Arduino UNO R3. Хотя я использую Arduino UNO, вы можете использовать другие платы Arduino для установки своего робота. Я решил использовать Arduino UNO, потому что это, безусловно, самая популярная плата Arduino, и больше людей смогут восстановить этого робота. Если у вас есть Arduino DUE, вы также можете добавить голосовые ответы своему роботу, как я сделал в этом руководстве.

Для перемещения двигателей постоянного тока я использовал этот щит Pololu. Это двойной драйвер двигателя, способный управлять двигателями постоянного тока от 5 до 28 В и обеспечивать постоянный ток до 3 А на каждый двигатель. Хотя я считаю, что это очень хороший щит, что меня больше всего поразило в продуктах Pololu, так это их четкая и подробная документация. Кроме того, Pololu предоставляет библиотеку Arduino, которая упрощает управление двигателями. Вам просто нужно передать скорость и направление (отрицательные или положительные значения) в setSpeeds функция. Если вы решите использовать другой драйвер двигателя постоянного тока, обратите внимание на контакты, используемые драйвером, потому что они не могут конфликтовать с любым другим контактом, используемым роботом. Щит Pololu использует следующие выводы Arduino:цифровые 4, 7, 8, 9, 10 и 12; аналогичные 0 и 1; земля; и 5В. Наиболее важным аспектом здесь является то, что только контакты 9 и 10 используются в качестве контактов PWM, и таймер, используемый для генерации импульсов на этих контактах, не тот же таймер (таймер 2 на UNO), который используется классом BVSMic от BitSophia.

Для установления связи с сервером и доступа к сервисам BitVoicer Server я использую модуль Microchip WiFi RN171VX. В этом модуле выделяются две основные особенности:вся связь может осуществляться через последовательный порт простым способом; и модуль имеет тот же форм-фактор, что и большинство популярных модулей XBee. Другими словами, если у вас уже есть щит XBee, вам, скорее всего, не нужно будет покупать щит Sparkfun, который я использую в этом роботе.

Использование экрана XBee с WiFi-модулем Microchip значительно упростило установку робота. Однако я обнаружил проблему в этой комбинации. Известно, что работа с радио чрезвычайно сложна и рассматривается некоторыми как «магия вуду». Что ж, я заметил, что пока адаптер WiFi включен и передает данные, в аудиосигнале, измеряемом АЦП Arduino, возникают сильные помехи. Мне не удалось точно определить источник этих помех, но у меня есть два возможных источника:пиковый ток, потребляемый модулем (до 240 мА), не развязан должным образом и снижает опорное напряжение, подаваемое на АЦП Arduino; или сигнал, излучаемый антенной, улавливается открытыми контактами прямо под модулем. Обычно производители модулей Wi-Fi рекомендуют дизайнерам избегать размещения чего-либо (даже заземляющих поверхностей) рядом с антенной именно для предотвращения такого рода проблем.

Чтобы исправить описанную выше проблему, я припаял стабилизатор напряжения 3,3 В и один электролитический конденсатор емкостью 10 мкФ к экрану Sparkfun, чтобы они могли обеспечивать опорное напряжение на АЦП Arduino. Такой же источник питания используется в электретном микрофоне Sparkfun. Это решило проблемы с пиковым объемом, которые я видел в BitVoicer Server Manager. Даже во время периодов тишины уровень звука достигал 35 (0-100) в мониторе сервера. Если вы видите, что то же самое происходит в вашем проекте, исследуйте, что происходит со звуковым сигналом, измеренным АЦП Arduino.

Я решил, что я также собираюсь использовать пространство для прототипирования, доступное в щите Sparkfun, чтобы припаять несколько светодиодов, которые сообщают о состоянии некоторых функций BitVoicer Server. На рисунке ниже слева направо светодиоды отображают следующую информацию:

  • Указывает, запущен ли BitVoicer Server и / или остается ли соединение активным;
  • Указывает, запущена ли служба пересылки данных;
  • Указывает, назначен ли Arduino механизм распознавания речи;
  • Указывает, находимся ли мы в периоде активации слова активации. Этот светодиод загорается только тогда, когда определяется слово активации.

Что касается электретного микрофона с предусилителем, на рынке доступно множество вариантов:Sparkfun, Adafruit, RoboCore, Hackerstore и, вероятно, многие другие. Чтобы использовать код, который я публикую в этом руководстве, убедитесь, что микрофон, который вы покупаете, аналоговый, необходимое напряжение доступно на вашей плате Arduino, а усиление достаточно велико (обычно 100x для электретных микрофонов) для АЦП Arduino.

Шасси 2WD, используемое в роботе, является одним из самых дешевых и популярных на ebay. Полный комплект включает одну акриловую платформу, два колеса из пластика и резины, одно колесо на 360º, два двигателя постоянного тока с редуктором (соотношение 1:48), один аккумуляторный отсек 4xAA, два диска датчика скорости и набор винтов.

ШАГ 2:Монтаж

Давай приступим к работе! На этом этапе вы должны установить все компоненты на шасси, как показано на рисунках ниже.

Если вы не хотите припаивать светодиоды и регулятор напряжения к экрану XBee, вы можете установить их на небольшой макет, как показано на рисунке ниже. В этом случае выберите макетную плату уменьшенного размера, чтобы вы могли без проблем закрепить ее где-нибудь на шасси.

На фотографиях выше вы можете заметить, что я сделал опору из железной проволоки для крепления микрофона. Вы также можете видеть, что я приклеил полоску войлочной ткани вокруг колеса 360º. Я принял эти две меры, чтобы попытаться уменьшить шум, создаваемый роботом и улавливаемый микрофоном при движении робота. Я даже отрезал небольшой кусок губки, чтобы изолировать провода микрофона от опоры. Конечно, это не было на 100% эффективным, но немного уменьшило шум и повысило точность распознавания речи.

ШАГ 3. Настройка модуля WiFi

Как я сказал на шаге 1, WiFi-модулем Microchip RN171VX можно полностью управлять через последовательный порт. Это чрезвычайно упрощает настройку модуля, поскольку все команды представляют собой простые строки, отправляемые через последовательный порт Arduino. Вам просто нужно отправить строку, содержащую «$$$», чтобы войти в командный режим, отправить команды, а затем отправить строку, содержащую «exit», чтобы вернуться в режим данных.

Кодовое название Настройка модуля WiFi . внизу этого руководства находится код, который я использовал для настройки модуля WiFi в моей домашней сети. Вам нужно будет заменить части кода, помеченные как «XXXXXX», на информацию из вашей сети Wi-Fi. Придется изменить три команды:

  • установить SSID беспроводной сети XXXXXX :замените XXXXXX именем своей сети (SSID);
  • установить фразу для беспроводной сети XXXXXX :замените XXXXXX своим сетевым паролем;
  • установить IP-адрес XXXXXX :замените XXXXXX IP-адресом (статическим), который вы хотите установить для своего модуля WiFi.

В моей сети Wi-Fi метод аутентификации - WPA2-PSK. Если в вашей сети используется другой метод аутентификации, вам также придется изменить установить аутентификацию по беспроводной сети . команда. Ознакомьтесь с документацией к модулю WiFi (раздел 4.3 «Установить команды»), чтобы узнать, какое значение является правильным для вашей сети.

Есть важный Подробная информация о щите Sparkfun и его маленьком переключателе (рисунок ниже). Чтобы загрузить код в Arduino с помощью интерфейса USB, переключатель должен быть установлен в положение DLINE. Чтобы Arduino мог отправлять / получать данные через модуль WiFi через свой последовательный порт, переключатель должен быть установлен в положение UART. Это необходимо, потому что модуль WiFi и USB-чип на Arduino UNO используют один и тот же последовательный порт в микроконтроллере ATmega. Если переключатель установлен в положение UART и вы попытаетесь загрузить код в Arduino, в Arduino IDE отобразится сообщение об ошибке.

Чтобы загрузить Настройка модуля Wi-Fi код для Arduino и разрешите Arduino настроить модуль WiFi, выполните следующие действия:

  • 1. Установите переключатель в положение DLINE;
  • 2. Откройте IDE Arduino, вставьте и загрузите код в Arduino;
  • 3. Как только загрузка завершится, у вас будет 5 секунд (задержка в начале кода), чтобы переключить переключатель в положение UART перед отправкой команд на модуль WiFi. Если первая команда потеряна, все остальные работать не будут. В этом случае просто перезагрузите Arduino, чтобы скетч можно было запустить с самого начала.

Во время настройки модуля, которая занимает около 25 секунд, светодиоды модуля будут мигать не так, как обычно. В этот момент вы узнаете, что модуль WiFi настраивается.

После настройки модуля попробуйте выполнить эхо-запрос (Командная строка -> «ping [IP-адрес]» -> нажмите Enter) модуля, используя IP-адрес, указанный в поле Установить IP-адрес . команда. Если вы не получаете ответа от модуля, значит, что-то пошло не так на предыдущих этапах.

ШАГ 4. Планирование движений робота

Хотя у робота всего два двигателя постоянного тока, он способен выполнять серию сложных движений. Чтобы сделать это руководство как можно более простым, я решил определить только около трех десятков базовых единообразных движений и несколько сложных движений, образованных комбинацией базовых движений.

Как вы можете видеть на изображениях в шаге 2, я не использую датчики вращения в колесах, ультразвуковые датчики или датчики любого другого типа для измерения расстояния до объектов или пройденного расстояния. Это не позволяет роботу выполнять высокоточные движения. Однако, управляя только направлением и скоростью двигателей, вы можете достичь уровня точности, достаточного для перемещения робота.

Первое, что вам нужно знать, чтобы рассчитать необходимое время выполнения для каждого движения, - это средняя скорость робота. Для этого поместите рулетку параллельно роботу и активируйте оба двигателя одновременно на одну или две секунды, измерьте пройденное расстояние и определите скорость. В моей конфигурации я получил 13,7 сантиметра в секунду при 62,5% максимальной скорости двигателя (250/400, см. Библиотеку Pololu Arduino). Другими словами, чтобы переместить робота на 1 метр (100 см) вперед, двигатели должны были быть задействованы одновременно на 7,299270… секунд. Я решил вести отсчет времени с разрешением в миллисекундах, но если вы хотите добиться более высокой точности движения, подумайте о повышении разрешения до микросекунд. Короче говоря, чтобы переместить робота на 1 метр, я должен активировать оба мотора одновременно на 7299 миллисекунд. С этого числа все становится правилом трех для других расстояний. Чтобы выполнять дуговые или круговые движения, одно колесо должно двигаться быстрее, чем другое. Чтобы повернуть робота в стороны, нужно активировать только одно колесо или оба в противоположных направлениях (чтобы вращаться вокруг своей оси). Здесь вам нужно будет использовать некоторую тригонометрию, чтобы вычислить расстояние, пройденное каждым колесом, и как долго каждый двигатель должен быть активирован. Хорошую отправную точку для этих концепций можно найти по следующим ссылкам (я не собираюсь здесь углубляться):http://rossum.sourceforge.net/papers/CalculationsForRobotics/CirclePath.htm и http:// math .stackexchange.com / questions / 60176 / move-two-wheeled-robot-from-one-point-to-another.

Как вы можете видеть в конце видео ниже, я также заставляю робота «рисовать» некоторые основные геометрические формы (квадрат, треугольник и круг) на полу. Эти движения достигаются комбинацией основных движений (например, идти вперед, поворачивать, идти вперед, поворачивать и т. Д.). Комбинация этих движений выполняется в голосовой схеме BitVoicer Server, и вы не увидите их в скетче Arduino, представленном на следующем шаге.

ШАГ 5:Загрузка кода в Arduino

На этом этапе вам нужно будет загрузить эскиз под названием Исходный код робота . , Расположенный в нижней части этого руководства, к Arduino. Вы также можете скачать скетч Arduino по ссылке ниже. Помните, что для отправки кода в Arduino вы должны установить переключатель на щите Sparkfun в положение DLINE, как описано в шаге 3. Перед загрузкой кода вы должны правильно установить BitVoicer Server и библиотеки драйверов двигателей Pololu в Arduino IDE. (Импорт библиотеки .zip).

Исходный код робота :BVS_Demo3.ino

Некоторые части этого эскиза похожи на части, которые я использовал в одном из моих предыдущих руководств, и посвящены взаимодействию с BitVoicer Server (классы BVSP и BVSMic). В этом уроке я остановлюсь на объяснении новых частей эскиза. Если вы хотите получить больше информации о том, как использовать классы BVSP и BVSMic, я предлагаю вам обратиться к руководству, которое я упомянул выше.

  • Объявление констант :в начале скетча я объявляю ряд констант, используемых во всем коде. Группа констант с настройками двигателя определяет скорость двигателя по умолчанию и две константы направления. Библиотека драйверов двигателей Pololu принимает значения от -400 до +400 для скорости двигателя, где ноль означает отключение. Отрицательные значения указывают на обратное вращение или, если вы перевернули провода двигателя, как я, на прямое вращение. Группа констант со значениями команд относится к командам, которые будут отправлены с BitVoicer Server. В этом скетче я определил только 40 основных команд размером байт . типа, но можно выполнять более сложные движения, комбинируя эти команды.
  • Переменные управления выполнением :пять переменных определены в начале кода для управления выполнением команд ( motorSpeed ​​ , cmdDuration , cmdStartTime , cmdRunning e lastFwdCmd ). motorSpeed ​​ переменная содержит текущую скорость двигателя. Эта переменная обновляется одним из значений по умолчанию, определенных константами скорости, если Arduino получает команду от BitVoicer Server на обновление скорости двигателя. cmdDuration переменная содержит общую продолжительность текущей команды. Эта переменная проверяется на соответствие cmdStartTime переменная во всех итерациях цикла функция, если cmdRunning верно . Если время выполнения команды истекло, RunCommand функция вызывается для остановки двигателей. lastFwdCmd переменная содержит последнюю команду «идти / двигаться вперед». Эта переменная используется для определения последнего пройденного расстояния, чтобы можно было выполнить команду «вернуться». Обратите внимание, что для использования этой команды вы должны сначала приказать роботу развернуться.
  • Подключение к Wi-Fi :в конце скетча я определяю две функции для подключения и отключения от BitVoicer Server ( Connect и отключить ). Эти функции переводят модуль Microchip WiFi в командный режим, открывают или закрывают соединение TCP / IP и возвращают модуль в режим данных. Внутри цикла функция, если связанная переменная не истина , Я вызываю Connect функция. Если класс BVSP сообщает, что статус сервера истек, другими словами, на последний запрос статуса не получено ответа, я предполагаю, что соединение было потеряно, и вызываю Disconnect функция. Это вызовет новую попытку подключения на следующей итерации цикла.
  • Выполнить команду функция :эта функция вызывается каждый раз при получении команды от BitVoicer Server. Требуется байт значение, соответствующее одной из основных команд, определенных константами в начале эскиза. Каждая основная команда идентифицируется внутри переключателя, поэтому можно установить соответствующие скорости двигателя, а также продолжительность команды. В конце функции cmdRunning переменная установлена ​​в true и время, возвращаемое миллис функция хранится в cmdStartTime Переменная. Это позволяет Arduino контролировать выполнение команд, как описано выше. Время в миллисекундах для каждой команды было получено, как описано на предыдущем шаге.

ШАГ 6. Настройка сервера BitVoicer

На этом этапе вам нужно создать голосовую схему BitVoicer Server с предложениями, которые нужно распознать, и командами, которые будут отправлены в Arduino. В конце этого шага есть две ссылки на файлы, содержащие все объекты решения BitVoicer Server, используемые в этом руководстве. Если вы не хотите создавать все объекты решения один за другим, вы можете импортировать их (Импорт объектов решения) с помощью этих файлов.

Прежде чем вы начнете строить голосовую схему, вы должны создать устройство, которое будет представлять Arduino на сервере BitVoicer. Создайте смешанное устройство и назовите его ArduinoUnoWiFi. На вкладке «Связь» выберите TCP / IP и введите IP-адрес, назначенный модулю WiFi на шаге 3. На вкладке «Сигналы» включите параметр Начало периода активации . и Конец активированного периода подсказки. Выберите команды Int16 SendData для обоих сигналов и выберите устройство ArduinoUnoWiFi в качестве цели команд. В поле «Данные» введите 1 для начала активированного периода . cue и 0 для конца активированного периода реплика. Эти сигналы заставят Arduino включать один светодиод каждый раз, когда распознается слово активации. По истечении активированного периода (определенного в голосовой схеме) этот светодиод погаснет.

Теперь давайте создадим схему голоса. Хотя у робота всего 40 основных команд, вы можете создать множество словосочетаний, запускающих одну и ту же команду. Например, вы можете захотеть, чтобы предложения «продвинуться на один метр» и «пройти на один метр» запустили ту же команду. Кроме того, вы можете создавать сложные команды, такие как «сделать квадрат», которые будут последовательно запускать серию отложенных команд. Из-за этого ваша голосовая схема может значительно увеличиться и содержать более 40 базовых команд. BitVoicer Server поддерживает неограниченное количество предложений, поэтому вы можете определить столько предложений, сколько вам нужно (у меня было более 80 предложений). Здесь я хотел бы дать два совета:создайте команду по умолчанию в параметрах диспетчера сервера BitVoicer; копировать и вставлять повторяющиеся команды из одного предложения в другое.

Команды предложения отправят байт типы данных в Arduino. Используйте константы, определенные в начале скетча, чтобы знать, какое значение должно быть отправлено для каждой команды. Сложные команды будут посылать много значений последовательно, и вам придется контролировать интервал (задержку) между ними, чтобы никакое значение не отправлялось, пока выполняется предыдущая команда. Используйте поле задержки, чтобы установить интервал между командами.

Файлы объектов решения :

Device.sof

VoiceSchema.sof

ШАГ 7. Заключение

Теперь все, что вам нужно сделать, это вставить батарейки AA и подключить батарею 9V к разъему питания Arduino, чтобы ваш робот ожил! После того, как вы загрузите код в Arduino, не забудьте повернуть переключатель, установленный на щите Sparkfun, в положение UART. В противном случае модуль WiFi не получит никаких данных, отправленных из последовательного порта Arduino.

После того, как вы включите робота, индикаторы состояния не сразу загорятся. Вы увидите, что модуль WiFi начинает связь, и когда соединение TCP / IP будет установлено, один из светодиодных индикаторов модуля будет гореть непрерывно. Через несколько мгновений также загорятся три из четырех светодиодных индикаторов состояния. Это означает, что для Arduino назначен один механизм распознавания речи. С этого момента робот готов принимать команды.

После некоторого тестирования с роботом я был очень доволен распознаванием речи, хотя он не всегда распознавал 100% команд. В этом плане BitVoicer Server меня очень удивил. Однако меня не особо устраивала точность движений робота. Чтобы решить эту проблему, мне пришлось бы добавить датчики вращения на колеса. Комплект шасси, который я использовал в роботе, уже поставляется с дисками декодера, которые можно прикрепить к механизму. Применение датчиков к этим дискам позволило бы мне перемещать робота на основе реального пройденного расстояния, чтобы его движение было более точным. Я мог бы также добавить ультразвуковые датчики, чтобы не наткнуться на мою мебель. Я, вероятно, сделаю это когда-нибудь, но пока оставляю это на ваше усмотрение.

Увидимся в следующий раз!


Код

  • Настройка модуля Wi-Fi
  • Исходный код робота
Настройка модуля WiFi Arduino
Настраивает модуль Microchip WiFi RN171VX с помощью последовательного порта Arduino.
 void setup () {Serial.begin (115200); pinMode (13, ВЫХОД); задержка (5000); Serial.print ("$$$"); задержка (1000); Serial.println ("установить wlan auth 4"); задержка (1000); Serial.println ("установить фразу для беспроводной сети XXXXXX"); задержка (1000); Serial.println ("установить SSID беспроводной сети XXXXXX"); задержка (1000); Serial.println («установить канал wlan 0»); задержка (1000); Serial.println ("установить соединение wlan 1"); задержка (1000); Serial.println ("установить wlan tx 0"); задержка (1000); Serial.println ("установить ip dhcp 0"); задержка (1000); Serial.println («установить IP-адрес XXXXXX»); задержка (1000); Serial.println ("установить удаленный 0"); задержка (1000); Serial.println ("установить закрытие связи 0"); задержка (1000); Serial.println ("установить связь 0"); задержка (1000); Serial.println ("установить размер связи 500"); задержка (1000); Serial.println ("установить время связи 50"); задержка (1000); Serial.println («установить скорость uart 115200»); задержка (1000); Serial.println ("установить поток uart 0"); задержка (1000); Serial.println ("сохранить"); задержка (1000); Serial.println («выход»); задержка (1000); digitalWrite (13, LOW);} void loop () {} 
Исходный код робота Arduino
Управляет движениями робота, записывает звук, управляет TCP / IP-соединением и взаимодействует с BitVoicer Server.
 #include  #include  #include  // Определяет контакты Arduino который будет использоваться для управления // светодиодами и захвата звука #define BVS_RUNNING 2 # define BVS_SRE 5 #define BVS_DATA_FWD 3 #define BVS_ACT_PERIOD 6 #define BVSM_AUDIO_INPUT 3 // Определяет константы, которые будут переданы в качестве параметров // BVSP.begin functionconst unsigned long STATUS_REQUEST_INTERVAL =2000;const unsigned long STATUS_REQUEST_TIMEOUT =1000;// Defines the size of the mic bufferconst int MIC_BUFFER_SIZE =64;// Initializes a new global instance of the BVSP classBVSP bvsp =BVSP();// Initializes a new global instance of the BVSMic classBVSMic bvsm =BVSMic();// Initializes a new global instance of the // DualMC33926MotorShield classDualMC33926MotorShield ms =DualMC33926MotorShield();// Creates a buffer that will be used to read recorded samples // from the BVSMic classbyte micBuffer[MIC_BUFFER_SIZE];// Creates a global variable that indicates whether the // Arduino is connected to BitVoicer Serverboolean connected =false;// Defines some constants for the motor settingsconst int SPEED_STOP =0;const int SPEED_SLOW =100;const int SPEED_NORMAL =250;const int SPEED_FAST =400;const int DIRECTION_FRONT =-1;const int DIRECTION_BACK =1;// Declares a global variables to hold the current motor speed.// The default is SPEED_NORMAL, but there are voice // commands that change this setting.int motorSpeed =SPEED_NORMAL;// Stores the command duration in millisecondsunsigned long cmdDuration =0;// Stores the time the command started runningunsigned long cmdStartTime =0;// Stores whether a command is running or notbool cmdRunning =false;// Stores the last MOVE_FORWARD command. This variable // is used only for the COME_BACK command.byte lastFwdCmd =0;// Defines some constants for command names/values// Just to make the code more readableconst byte CMD_STOP =0;const byte CMD_MOVE_FORWARD =1;const byte CMD_MOVE_FORWARD_1_CM =2;const byte CMD_MOVE_FORWARD_2_CM =3;const byte CMD_MOVE_FORWARD_5_CM =4;const byte CMD_MOVE_FORWARD_10_CM =5;const byte CMD_MOVE_FORWARD_25_CM =6;const byte CMD_MOVE_FORWARD_50_CM =7;const byte CMD_MOVE_FORWARD_1_M =8;const byte CMD_MOVE_BACKWARD =9;const byte CMD_MOVE_BACKWARD_1_CM =10;const byte CMD_MOVE_BACKWARD_2_CM =11;const byte CMD_MOVE_BACKWARD_5_CM =12;const byte CMD_MOVE_BACKWARD_10_CM =13;const byte CMD_MOVE_BACKWARD_25_CM =14;const byte CMD_MOVE_BACKWARD_50_CM =15;const byte CMD_MOVE_BACKWARD_1_M =16;const byte CMD_TURN_AROUND =17;const byte CMD_TURN_AROUND_RIGHT =18;const byte CMD_TURN_AROUND_LEFT =19;const byte CMD_DO_360 =20;const byte CMD_TURN_RIGHT =21;const byte CMD_TURN_RIGHT_10 =22;const byte C MD_TURN_RIGHT_25 =23;const byte CMD_TURN_RIGHT_45 =24;const byte CMD_TURN_LEFT =25;const byte CMD_TURN_LEFT_10 =26;const byte CMD_TURN_LEFT_25 =27;const byte CMD_TURN_LEFT_45 =28;const byte CMD_DO_CIRCLE =29;const byte CMD_COME_BACK =30;const byte CMD_MOVE_FORWARD_2_M =31;const byte CMD_MOVE_FORWARD_3_M =32;const byte CMD_MOVE_BACKWARD_2_M =33;const byte CMD_MOVE_BACKWARD_3_M =34;const byte CMD_SET_SPEED_SLOW =35;const byte CMD_SET_SPEED_NORMAL =36;const byte CMD_SET_SPEED_FAST =37;const byte CMD_TURN_LEFT_45_BACKWARD =38;const byte CMD_TURN_RIGHT_45_BACKWARD =39;void setup(){ // Starts serial communication at 115200 bps Serial.begin(115200); // Sets the Arduino pin modes pinMode(BVS_RUNNING, OUTPUT); pinMode(BVS_SRE, OUTPUT); pinMode(BVS_DATA_FWD, OUTPUT); pinMode(BVS_ACT_PERIOD, OUTPUT); AllLEDsOff(); // Sets the Arduino serial port that will be used for // communication, how long it will take before a status request // times out and how often status requests should be sent to // BitVoicer Server bvsp.begin(Serial, STATUS_REQUEST_TIMEOUT, STATUS_REQUEST_INTERVAL); // Sets the function that will handle the frameReceived // event bvsp.frameReceived =BVSP_frameReceived; // Prepares the BVSMic class timer bvsm.begin(); // Prepares the motor shield class (pins and timer1) ms.init();}void loop() { // If it is not connected to the server, opens a TCP/IP // connection, sets connected to true and resets the BVSP // class if (!connected) { Connect(Serial); connected =true; bvsp.reset(); } // Checks if the status request interval has elapsed and if it // has, sends a status request to BitVoicer Server bvsp.keepAlive(); // Checks if there is data available at the serial port buffer // and processes its content according to the specifications // of the BitVoicer Server Protocol bvsp.receive(); // Gets the respective status from the BVSP class and sets // the LEDs on or off digitalWrite(BVS_RUNNING, bvsp.isBVSRunning()); digitalWrite(BVS_DATA_FWD, bvsp.isDataFwdRunning()); // Checks if there is a SRE assigned to the Arduino if (bvsp.isSREAvailable()) { // Turns on the SRE available LED digitalWrite(BVS_SRE, HIGH); // If the BVSMic class is not recording, sets up the audio // input and starts recording if (!bvsm.isRecording) { bvsm.setAudioInput(BVSM_AUDIO_INPUT, EXTERNAL); bvsm.startRecording(); } // Checks if the BVSMic class has available samples if (bvsm.available) { // Makes sure the inbound mode is STREAM_MODE before // transmitting the stream if (bvsp.inboundMode ==FRAMED_MODE) bvsp.setInboundMode(STREAM_MODE); // Reads the audio samples from the BVSMic class int bytesRead =bvsm.read(micBuffer, MIC_BUFFER_SIZE); // Sends the audio stream to BitVoicer Server bvsp.sendStream(micBuffer, bytesRead); } } else { // There is no SRE available // Turns off the SRE and ACT_PERIOD LEDs digitalWrite(BVS_SRE, LOW); digitalWrite(BVS_ACT_PERIOD, LOW); // If the BVSMic class is recording, stops it if (bvsm.isRecording) bvsm.stopRecording(); } // If the status has timed out, the connection is considered // lost if (bvsp.hasStatusTimedOut()) { // If the BVSMic is recording, stops it if (bvsm.isRecording) bvsm.stopRecording(); // Closes the TCP/IP connection Disconnect(Serial); AllLEDsOff(); connected =false; } // If a command is running, checks if its duration has // expired. If it has, stop the motors. if (cmdRunning) if (millis() - cmdStartTime>=cmdDuration) RunCommand(CMD_STOP);}// Handles the frameReceived eventvoid BVSP_frameReceived(byte dataType, int payloadSize){ // Performs the appropriate actions based on the frame // data type. If the data type is byte, it is a command. // If the data type is int, changes the activated // period LED. switch (dataType) { case DATA_TYPE_BYTE:RunCommand(bvsp.getReceivedByte()); ломать; case DATA_TYPE_INT16:digitalWrite(BVS_ACT_PERIOD, bvsp.getReceivedInt16()); ломать; }}// Runs the command received from the servervoid RunCommand(byte cmd){ switch (cmd) { case CMD_STOP:ms.setSpeeds(SPEED_STOP, SPEED_STOP); cmdRunning =false; возвращение; case CMD_MOVE_FORWARD:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =60000; ломать; case CMD_MOVE_FORWARD_1_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =23; ломать; case CMD_MOVE_FORWARD_2_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =47; ломать; case CMD_MOVE_FORWARD_5_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =117; ломать; case CMD_MOVE_FORWARD_10_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =234; ломать; case CMD_MOVE_FORWARD_25_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =468; ломать; case CMD_MOVE_FORWARD_50_CM:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =1170; ломать; case CMD_MOVE_FORWARD_1_M:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =2339; ломать; case CMD_MOVE_FORWARD_2_M:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =4678; ломать; case CMD_MOVE_FORWARD_3_M:lastFwdCmd =cmd; ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_FRONT); cmdDuration =7018; ломать; case CMD_MOVE_BACKWARD:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =60000; ломать; case CMD_MOVE_BACKWARD_1_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =23; ломать; case CMD_MOVE_BACKWARD_2_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =47; ломать; case CMD_MOVE_BACKWARD_5_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =117; ломать; case CMD_MOVE_BACKWARD_10_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =234; ломать; case CMD_MOVE_BACKWARD_25_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =468; ломать; case CMD_MOVE_BACKWARD_50_CM:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =1170; ломать; case CMD_MOVE_BACKWARD_1_M:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =2339; ломать; case CMD_MOVE_BACKWARD_2_M:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =4678; ломать; case CMD_MOVE_BACKWARD_3_M:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_BACK); cmdDuration =7017; ломать; case CMD_TURN_AROUND:ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration =540; ломать; case CMD_TURN_AROUND_RIGHT:ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration =540; ломать; case CMD_TURN_AROUND_LEFT:ms.setSpeeds( motorSpeed * DIRECTION_BACK, motorSpeed * DIRECTION_FRONT); cmdDuration =540; ломать; case CMD_DO_360:ms.setSpeeds( motorSpeed * DIRECTION_FRONT, motorSpeed * DIRECTION_BACK); cmdDuration =1065; ломать; case CMD_TURN_RIGHT:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =503; ломать; case CMD_TURN_RIGHT_10:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =56; ломать; case CMD_TURN_RIGHT_25:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =140; ломать; case CMD_TURN_RIGHT_45:ms.setSpeeds(motorSpeed * DIRECTION_FRONT, 0); cmdDuration =252; ломать; case CMD_TURN_LEFT:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =503; ломать; case CMD_TURN_LEFT_10:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =56; ломать; case CMD_TURN_LEFT_25:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =140; ломать; case CMD_TURN_LEFT_45:ms.setSpeeds(0, motorSpeed * DIRECTION_FRONT); cmdDuration =252; ломать; case CMD_DO_CIRCLE:ms.setSpeeds( SPEED_NORMAL * DIRECTION_FRONT, SPEED_NORMAL * DIRECTION_FRONT * 0.60); cmdDuration =4587; ломать; case CMD_COME_BACK:RunCommand(lastFwdCmd); возвращение; case CMD_SET_SPEED_SLOW:motorSpeed =SPEED_SLOW; возвращение; case CMD_SET_SPEED_NORMAL:motorSpeed =SPEED_NORMAL; возвращение; case CMD_SET_SPEED_FAST:motorSpeed =SPEED_FAST; возвращение; case CMD_TURN_LEFT_45_BACKWARD:ms.setSpeeds(motorSpeed * DIRECTION_BACK, 0); cmdDuration =252; ломать; case CMD_TURN_RIGHT_45_BACKWARD:ms.setSpeeds(0, motorSpeed * DIRECTION_BACK); cmdDuration =252; ломать; } // Sets the command start time cmdStartTime =millis(); // Sets cmdRunning to true cmdRunning =true;}// Opens a TCP/IP connection with the BitVoicer Servervoid Connect(HardwareSerial &serialPort){ serialPort.print("$$$"); задержка (500); // Use the IP address of the server and the TCP port set // in the server properties serialPort.println("open 192.168.0.11 4194"); задержка (1000); serialPort.println("exit"); delay(500);}// Closes the TCP/IP connection with the BitVoicer Servervoid Disconnect(HardwareSerial &serialPort){ serialPort.print("$$$"); задержка (500); serialPort.println("close"); задержка (1000); serialPort.println("exit"); delay(500);}// Turns all LEDs offvoid AllLEDsOff(){ digitalWrite(BVS_RUNNING, LOW); digitalWrite(BVS_SRE, LOW); digitalWrite(BVS_DATA_FWD, LOW); digitalWrite(BVS_ACT_PERIOD, LOW);}

Схема


Производственный процесс

  1. Робот Raspberry Pi, управляемый через Bluetooth
  2. Создайте своего робота для видеостриминга, управляемого через Интернет, с помощью Arduino и Raspberry Pi
  3. Система посещаемости с использованием Arduino и RFID с Python
  4. Удовольствие от гироскопа с кольцом NeoPixel
  5. Игрушка под управлением Android с использованием Raspberry Motor Shield
  6. Робот с сервомотором избегает препятствий
  7. Управление роботом Roomba с помощью Arduino и устройства Android
  8. Роботизированная рука, управляемая нунчук (с Arduino)
  9. Робот, управляемый речью
  10. Устройства с голосовым управлением Bluetooth с OK Google