Пусть волшебство наполнит это Рождество 2019 года и предстоящий Новый год. Для этого я соорудил волшебную палочку :) И использую ее, чтобы как следует встречать праздники по-гиковски.

Что «волшебного» в этой палочке, так это то, что она использует машинное обучение (ML) для изучения и распознавания жестов палочки только на основе данных, собранных с датчика акселерометра (который измеряет силу ускорения). При использовании машинного обучения движение палочки не обязательно должно быть точным, его все равно можно распознать как жест.

Плата Arduino Nano 33 BLE Sense в качестве основного оборудования с микроконтроллером ARM Cortex M4 (MCU) прикреплена к палочке, которая собирает данные об ускорении от встроенного датчика акселерометра, затем обрабатывает и делает вывод (следовательно, вывод ) выполненного жеста прямо на самом микроконтроллере (MCU). Для выполнения такого вывода необходима программная среда машинного обучения на базе TensorFlow Lite, оптимизированная для работы на микроконтроллерах с низким энергопотреблением, которые работают только на частоте 64 МГц и 256 КБ ОЗУ.

Никакого волшебства, только чистый код :)
Однако возможность запускать TensorFlow для вывода машинного обучения на микроконтроллерах с низким энергопотреблением просто волшебна.

Примечания:

Если поискать Magic Wand — например, в коллекции проектов hackster.io — можно найти несколько похожих проектов, но пока ни одного из них, что:

  • Позволяет «правильную» или удобную ориентацию доски для выполнения жестов.
  • Использует PlatformIO. Я объясню, почему это важно. Продолжайте читать.
  • Избавляет вас от некоторых неприятностей, описанных ниже.

Мой проект предлагает лучший опыт — как для пользователей палочки, так и для разработчиков или создателей, таких как вы.

Оригинальная работа

Некоторые говорят, что нет ничего нового под солнцем, и этот проект не исключение. Он основан на оригинальном образце кода Magic Wand от TensorFlow Lite для микроконтроллера. Авторы TensorFlow были достаточно любезны, чтобы предоставить простой, но полный и забавный пример того, как сделать вывод о физическом движении с помощью акселерометра, все работает на MCU без ОС, не на Android, не на Linux. Что-то, что я искал довольно долгое время.

Оригинальный пример Magic Wand можно запустить на плате Arduino Nano 33 BLE (или более дорогой, Nano 33 BLE Sense) и плате SparkFun Edge. Все это работает, но мне было довольно сложно настроить и запустить его в первый раз, особенно для начинающих. Это включает в себя клонирование всего репозитория TensorFlow и некоторые «создания» материалов для сортировки вещей и создания кода. Использование Arduino IDE проще и работает только с платой Arduino Nano 33 BLE из коробки. Тем не менее, поскольку я намереваюсь заниматься более сложным и дальнейшим программированием с помощью TensorFlow на микроконтроллере, Arduino IDE на самом деле не соответствует моим потребностям. Это только я, хотя, я не чувствую необходимости объяснять, почему.

Еще одна вещь, которая меня очень беспокоит, — это ориентация доски, поэтому она может правильно определять жесты. Вы должны держать вот так (рис. 1), когда выполняете жест. Мне трудно прикрепить доску к палке. Я думаю, это легко исправить.

Что нового

Код моего проекта опубликован в этом репозитории. Некоторые улучшения, которые я сделал по сравнению с исходным примером, следующие.

1. «Правильная» ориентация доски

Правильно или нет, зависит от ваших потребностей. Но поскольку плата Arduino Nano 33 BLE имеет вытянутый форм-фактор и мне нужно прикрепить ее на палочке, я считаю эту ориентацию (рис. 2) правильной.

Мне удалось исправить это очень простым изменением кода в исходном файле accelerometer_handler.cpp в этих строках, которые ранее:

save_data[begin_index++] = y * 1000; 
save_data[begin_index++] = x * 1000; 
save_data[begin_index++] = z * 1000;

to:

save_data[begin_index++] = -x * 1000; 
save_data[begin_index++] = y * 1000; 
save_data[begin_index++] = z * 1000;

Помните: это исправление относится только к Arduino Nano 33 BLE.

2. Использование PlatformIO

Как упоминалось выше, поскольку я намереваюсь заниматься более сложным и дальнейшим программированием с помощью TensorFlow на MCU, Arduino IDE на самом деле не соответствует моим потребностям. Судя по выбору платы nRF52840, исходный выбор будет с nRF5 SDK или с SDK более высокого уровня на основе ARM mbed OS (не путайте его с полнофункциональной ОС, как линукс). Хотя я хорошо знаком с ОС mbed и пишу с ней некоторый производственный код, она требует некоторой настройки. Я хочу быстро приступить к работе с помощью простых в использовании инструментов, но не таких простых, как использование Arduino IDE. Опять же, это только мой выбор.

К счастью, поверх PlatformIO существует платформа Arduino, предназначенная для nRF52840, которая называется Nordic nRF52 Platform для PlatformIO. К сожалению, на момент написания статьи стабильная версия (главная ветка) еще не поддерживала плату Arduino Nano 33 BLE. Судя по всему, это не так просто, как просто добавить новый json-файл платы для платформы, так как Arduino Core для Nano 33 BLE написан на основе ОС mbed. Но время подходит, так как некоторые замечательные люди уже работают над этой поддержкой, которая теперь работает в ветке develop. Итак, на данный момент нам нужно ссылаться на URL-адрес репо ( https://github.com/platformio/platform-nordicnrf52.git) в platformio.ini, а не просто так: nordicnrf52.

Поискав похожие проекты для «Волшебной палочки», некоторые из них выпали. Но пока я не нашел проектов, использующих PlatformIO.

3. Объединение TensorFlow Lite с библиотекой микроконтроллеров

Если вы прочитали руководство TensorFlow Lite, чтобы подготовить библиотеку для платформы Arduino, чтобы она была основана на последнем коде, вам потребуется клонировать репозиторий TensorFlow и выполнить предоставленный скрипт, что в конечном итоге потребует от вас установки некоторых материалов.

Я взял на себя смелость собрать для вас библиотеку TensorFlow Lite для микроконтроллеров и весь необходимый код, который можно найти в моем репозитории. Библиотека находится в папке lib, совместимой с PlatformIO. Вы можете использовать его и для других проектов.

Это как раз одна из причин, почему я использую PlatformIO, так как вы можете связывать свои собственные библиотеки, не завися от глобальных библиотек, как если бы вы использовали Arduino IDE. Так что, если позже вы воспользуетесь другой версией библиотеки TensorFlow Lite, подходящей для других проектов, текущий проект не пострадает.

4. Комплектация модифицированной версии библиотеки Arduino LSM9DS1

LSM9DS1 — это датчик инерциального измерительного блока (IMU), который включает в себя акселерометр, необходимый в этом проекте для сбора данных об ускорении. Чтобы легко получить к нему доступ, вам нужна программная библиотека, а не связь с ней по I2C путем чтения значения регистров. По-видимому, для правильной работы этого проекта — из-за характера данных ускорения, которые необходимо вводить в модель машинного обучения — LSM9DS1 должен работать по принципу FIFO.

Уже есть Arduino_LSM9DS1, который вы можете использовать. По умолчанию он не включает буфер FIFO, который требуется проекту, поэтому нам нужно внести некоторые изменения в исходный код библиотеки.

Но не волнуйтесь, я уже включил модифицированную библиотеку в этот репозиторий проекта. Опять же, в этом и прелесть PlatformIO, что вы можете объединить любые библиотеки, которые хотите использовать, в автономный проект.

Демонстрационное видео

Я сделал демонстрационное видео, чтобы показать, как это работает.

Архитектура системы

Архитектура высокого уровня, изображающая аппаратное и программное обеспечение, используемое в системе, выглядит следующим образом.

Предпосылки

К настоящему времени вы должны знать, что вам нужно подготовить для запуска кода проекта.

Оборудование

Arduino Nano 33 BLE Sense. Вы можете использовать более дешевый, без других датчиков, кроме IMU.

Программное обеспечение

  • PlatformIO, Core или IDE. Если вы похожи на меня, я использую Visual Studio Code с расширением PlatformIO IDE.
  • платформа-нордикнрф52. Должен устанавливаться автоматически, как указано в platformio.ini. Обратите внимание, что я использую версию/ветвь develop, которая уже поддерживает плату Arduino Nano 33 BLE.

Управляй своим собственным

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

Профессиональный совет

При использовании PlatformIO с VS Code после завершения загрузки прошивки, скорее всего, вы немедленно открываете Serial Monitor, чтобы увидеть сообщения журнала, которые MCU выдает через Serial. Если вы повторно загрузите прошивку (например, после некоторой модификации кода) без закрытия/завершения Serial Monitor, она будет автоматически повторно открыта почти сразу, как и должно быть. Но в этот момент вы можете столкнуться с тем, что последовательный порт платы не найден, например:

Не беспокойтесь. Что вы можете сделать, так это либо закрыть Serial Monitor, нажав кнопку «x», либо нажав «ctrl + c», или, что лучше, отложить повторное открытие Serial Monitor. Чтобы добавить задержку, вы можете перейти к: Preferences -> Settings, затем найти PlatformIO IDE Configuration и изменить значение (указано красной стрелкой) Reopen Serial Monitor Delay, как показано ниже.

Я использую 2000, значит 2000 мс = 2 секунды. Вы можете попробовать другое значение.

Обучите ИИ

Чтобы распознавать больше или разные жесты, нам нужно обучить модель ML с новыми данными. Эта страница не так подробно объясняет, как проводить обучение, и она предназначена для платы для разработки SparkFun Edge, а не для Arduino Nano 33 BLE.

Не обещаю, но найду время написать пост о том, как провести обучение на плате Arduino Nano 33 BLE. Оставайтесь с нами.

Закрытие

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

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

Моя компания DycodeX использует аналогичный подход в нашем продукте SMARTernak — платформе помощи животноводческим фермам на основе AIoT — для прогнозирования активности коров, чтобы лучше понять поведение коровы.

Если вам нужно решить свой собственный вариант использования с помощью ИИ на периферии или ИИ на устройстве, просто напишите нам по электронной почте: hi at dycodex dot com.

Это все на данный момент. Наслаждаться.

С Новым 2020 годом!

Первоначально опубликовано на https://www.hackster.io.