В предыдущей статье я рассказал, как мы делали робота с искусственным интеллектом в Летней компьютерной школе на базе детского лагеря в Новгородской области. Ребята собрали робота, который управляется голосом с помощью специального AI-модуля для Ардуино.
Этот модуль натренирован распознавать голосовые команды прямо на устройстве, без подключения к интернету и тут же отправлять их по нескольким интерфейсам (мы использовали I2C) для преобразования в команды управления напряжением двигателей.
Одна из проблем в работе робота – сильное влияние окружающего шума на его способность распознавать команды. На соревнованиях модуль, установленный на самом роботе, «слышал» сторонние звуки: шум двигателей, крики болельщиков и не слышал «водителя».
При этом, как мы позже узнали, модуль выдаёт распознанные команды не только по проводам, но и также дублирует команды по Bluetooth, который в него встроен.
Это даёт возможность реализовать другую схему управления роботом, когда «водитель» держит модуль распознавания голосовых команд в руке, говорит команды как в рацию, модуль их распознаёт, отправляет по Bluetooth роботу, который их принимает и переводит в команды управления двигателями.
Плюсы такого решения – возможность дистанционно управлять роботом с использованием голосовых команд для управления, при этом минимизируется проблема окружающего шума, так как «водитель робота» находится ближе всех к микрофону.
Ребята из лагеря продолжили свои проекты и уже на базе наших занятий в учебное время реализовали схему работы с Bluetooth. Сейчас расскажу, было ли это сложно.
Модуль
На стороне модуля дополнительно ничего настраивать не нужно, всё работает «из коробки», модуль автоматически подключается к Bluetooth. Когда модуль распознаёт голосовую команду, то отправляет её в виде текстовой строки по нескольким интерфейсам: SPI, I2C, UART и по Bluetooth. В предыдущей версии мы принимали команды по I2C, подключаясь проводами к Ардуино-плате на самом роботе.
Чтобы начать работать с Bluetooth, нужно сделать пару действий с самим модулем.
Во-первых, желательно присоединить динамик к встроенному разъёму модуля, чтобы он мог «озвучивать» свои действия, повторять голосовые команды. Можно обойтись и без него, ориентироваться на цвет светодиода, но с динамиком удобнее – становится сразу понятно, какую команду распознал модуль.
Мы использовали динамик DXI30N-A 0,5 Вт с сопротивлением 8 Ом, всё отлично работает, но, думаю, можно использовать практически что угодно.
Во-вторых, желательно докупить и поставить антенну. Модуль будет передавать данные и без неё, но на очень короткую дистанцию, всего на пару метров. С антенной – гораздо дальше, в пределах класса для занятий и коридора ловит везде.
Подключается антенна сверху платы, круглый разъем IPX.
Подойдет любая антенна с соответствующим разъемом, я брал первую попавшуюся на Озоне за 250 руб.
В-третьих, так как модуль мы «забрали» с робота, то питание на него нужно подавать отдельно. Удобнее всего через Type-C разъём на плате любым стандартным проводом от USB-порта компьютера/ноутбука, зарядки для телефона или пауэрбанка (для мобильности).
В-четвертых, и это самое главное, нужно узнать MAC-адрес модуля, который потребуется указать в прошивке для Ардуино. Посмотреть его можно, например, используя известную программу BLE Scanner.
Подключите модуль к питанию, запустите сканнер и ищите устройство с именем «Robot».
Изменения в конструкции робота
Так как робот у нас уже был собран, то мы просто внесли изменения в его конструкцию. Сняли AI-модуль с робота, а «вместо» него подключили Bluetooth-модуль HM-10.
Выбор HM-10 был обусловлен его ценой и доступностью в продаже, а также его достаточно просто его подключить к Ардуино-плате, есть доступные библиотеки и мануалы.
Подключаем RX и TX контакты Bluetooth-модуля к контактам 2 и 3 платы Arduino. Питание 5V, также берём прямо с платы. Больше никаких изменений в конструкцию робота вносить не пришлось.
Скетч
Так как для подключения Bluetooth мы выбрали контакты 2 и 3, то выполняем следующие действия:
Подключаем библиотеку для последовательной связи (Software Serial Library), с помощью которой программным способом будем организовывать последовательный порт, который неоригинально назовём «HM10».
Объявляем переменные с номерами контактов.
Объявляем переменную с мак-адресом AI-модуля, который мы получили через BLE Scanner.
Вызываем класс Software Serial с указанием этих контактов для получения и отправки последовательных данных для порта «HM10».
Также нужно объявить переменные для выводов платы, к которым подключен драйвер двигателей для управления движением.
Далее инициализируем последовательную связь со скоростью 9600 бод с компьютером для вывода логов и с модулем HM-10.
Так как модуль распознавания голосовых команд выступает в роли ведущего устройства, то для робота устанавливаем режим подключения к серверу и подключаемся к модулю. И инициализируем контакты для управления двигателями как выходы для подачи напряжения на контакты драйвера двигателей.
Наши дальнейшие действия:
Организуем обработку поступающих команд по Bluetooth с помощью функции HM10.available(), которая проверяет количество непрочитанных байт (символов), принятых через программный последовательный порт. Непрочитанные данные накапливаются во входном последовательном буфере.
Если данные есть, то считываем поступившую команду с помощью readString() в переменную command и отправляем в лог информацию для отладки с помощью println.
Сверяем с командами из списка («вперед», «назад», «влево», «вправо») и вызываем соответствующую функцию движения.
Само движение организуем просто подачей напряжения на соответствующие контакты, подключенные к драйверу двигателей.
В будущем можно функции движения усложнить для более чёткой и плавной работы двигателей и более предсказуемого движения робота. Например, добавить постепенный разгон и торможение двигателей, как это описано в этой статье.
Пример функции движения вперед
Итоги
В результате несложных манипуляций с уже имеющимся устройством (могли бы использовать любого Ардуино-робота, из собранных ранее на занятиях или вообще купленных-готовых), получили робота, который дистанционно управляется голосовыми командами.
Как дальше развивать изделие, зависит от фантазии ребят, можно придумать большое количество использований, и не только в качестве игрушки. Возможность передавать с помощью модуля простые голосовые команды по Bluetooth — значит возможность подключиться практически куда угодно.
Особенно, что порадовало — всё удалось реализовать достаточно просто. Мы получили устройство со встроенным AI и распознаванием голосовых команд, которое производит везде WOW-эффект, при этом вообще не погружались в нейросети и искусственный интеллект.
Такая возможность (быстро создавать эффектные интересные устройства) мотивирует детей изучать эту тему дальше и продолжать заниматься робототехникой и программированием.