Главная » Arduino
Призовой фонд
на октябрь 2021 г.
1. Рюкзак Mean Well
Компэл
2. Инвертор авто Mean Well 150 Ватт
Компэл
3. Термос MeanWell
Компэл
4. 100 руб.
От пользователей

Умная гантель

Рассмотрим как построить систему обнаружения жестов для носимых устройств на Arduino Nano 33 BLE Sense с использованием TinyML и Edge Impulse.

ML (Machine Learning) - тренировка математической модели на некоторых данных для того, чтобы прогнозировать какое-то событие или явление на новых данных. То есть попытка заставить алгоритмы программ совершать действия на основе предыдущего опыта, а не только на основе имеющихся данных.

Для обучения нужны реальные данные (обучающая выборка) и значение целевой переменной, которое соответствует заданным данным. Модель наблюдает и находит зависимости между данными и целевой переменной. Эти зависимости используются моделью для нового набора данных, чтобы прогнозировать целевую переменную, которая неизвестна.

Каким бывает машинное обучение? Оно разделяется на три основных вида:

  1. С учителем (Supervised machine learning).
  2. Без учителя (Unsupervised machine learning).
  3. Глубокое обучение (Deep learning).

Глубокое обучение подразумевает под собой анализ Big Data – большого массива информации и использует для работы нейронные сети. Что требует больших вычислительных мощностей.

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

Мы будем использовать онлайн-платформу Edge Impulse TinyML для сбора данных, обучения модели и ее развертывания на устройстве. 

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

В качестве микроконтроллера будем использовать плату Arduino Nano 33 BLE Sense, на которой распаян IMU-модуль на 9 степеней свободы, который содержит трёхосевые сенсоры: акселерометр, гироскоп и магнитометр. Данную плату необходимо закрепить на гантеле. Для питания микроконтроллера можно использовать 2 батареи 18650.

Установка программного обеспечения

Мы будем использовать онлайн-платформу Edge Impulse TinyML (https://www.edgeimpulse.com) для сбора данных, обучения модели и ее развертывания на устройстве. Для начала необходимо создать учетную запись, перейдя по адресу https://studio.edgeimpulse.com/signup. Далее входим в профиль и создаем новый проект.

Платформа поддерживает несколько устройств, одно из которых - плата Arduino Nano 33 BLE Sense. Количество устройств со временем увеличивается, кроме того можно самостоятельно портировать другие платформы.

Чтобы настроить Arduino Nano 33 BLE Sense для работы в Edge Impulse, необходимо на компьютере установить следующее программное обеспечение

  1. Node.js v12 или выше.
  2. Arduino CLI -  интерфейс командной строки для Arduino.
  3. Edge Impuls CLI

Установщик Arduino CLI можно скачать на странице  https://arduino.github.io/arduino-cli/latest/installation.

После установки Arduino CLI работаем в командной строке (cmd.exe). И устанавливаем Edge Impuls CLI (предварительно переходим в папку, где находится командный файл arduino cli):

npm install -g edge-impulse-cli @serialport/terminal

Далее подключим плату Arduino Nano 33 BLE Sense к компьютеру с помощью micro-USB кабеля. Затем дважды нажимаем RESET, чтобы запустить загрузчик. Индикатор на плате должен начать пульсировать. На плате разработки пока нет нужной прошивки. Загрузим последнюю версию прошивки Edge Impulse (https://cdn.edgeimpulse.com/firmware/arduino-nano-33-ble-sense.zip) и разархивируем файл. Из командной строки запустим скрипт для своей операционной системы (flash_windows.bat для Windows)

Ждем пока мигание не завершится,  нажимаем кнопку RESET один раз, чтобы запустить новую прошивку.

Набираем в командной строке

edge-impulse-daemon

Это запустит мастер, который попросит вас войти в систему и выбрать проект Edge Impulse.

Теперь устройство подключено к Edge Impulse. Чтобы убедиться в этом, переходим в проект Edge Impulse и выбираем Devices. 

Сбор данных, тренировка и создание модели ML на платформе Edge Impulse

Теперь, когда все настроено, вы можете создать свою  модель машинного обучения для создания системы распознавания упражнений, которая работает на микроконтроллере. Это сложная задача, решаемая с помощью программирования на основе правил, поскольку люди не выполняют движения одинаково каждый раз. Но машинное обучение может легко справиться с этими изменениями. Мы получим высокочастотные данные с реальных датчиков (IMU-модуль ), используем обработку сигналов для очистки данных, создадим классификатор нейронной сети и как развернем полученную модель на устройстве. 

Сначала сбор данных

Подключаем плату Arduino Nano 33 BLE Sense на компьютере к API удаленного управления. На сайте переходим на вкладку Data asquisition. Мы будем собирать данные для 4 разных вариантов (упражнений) - bicepscurl, lateralraise, overheadpress и idle ((бездействие). В разделе Record new data устанавливаем значения длительности для фрагмента получаемых данных, метку жеста. И нажимаем на кнопку Start sampling. Во время записи фрагмента выполняем постоянно определенное упражнение. 

Записываем несколько фрагментов для каждого упражнения. Важно делать непрерывные движения. Для каждого фрагмента можем просмотреть необработанные данные RAW DATA.

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

 

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

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

Выбираем блок обработки сигналов – Spectral Analysis. Этот блок применяет фильтр, выполняет спектральный анализ сигнала и извлекает данные о частоте и спектральной мощности.

Затем мы будем использовать учебный блок Neural Network, который использует эти спектральные особенности и учится различать четыре  класса (bicepscurl, lateralraise, overheadpress и idle).

Нейронная сеть классифицирует каждую выборку данных, выводя оценку достоверности для каждой метки, присутствующей в наборе обучающих данных. Входом в сеть является массив функций, который выводится из блока спектрального анализа . Тип и структуру сети можно настроить в меню классификатора NN. Устанавливаем параметры обучения нейронной сети и запускаем обучение нейронной сети.

И смотрим результат (точность распознавания)  для обучающей выборки.

Инструмент тестирования моделей можно использовать для тестирования производительности модели по всему набору тестовых данных или по пакетам тестовых данных по мере необходимости. Он дает оценку точности, основанную на ожидаемом результате для каждого файла тестовых данных. Тестовые данные получаем в пункте меню Live classification.

Если результаты распознавания Вас устраивают, необходимо сформировать код для разворачивания модели на устройстве (Arduino Nano 33 BLE Sense). Сформируем Arduino-библиотеку с созданной моделью. Выбираем пункт Deployment, Arduino library и нажимаем кнопку Build. На компьютер скачивается сформированная библиотека с архиве zip.

 

Создание скетча для отправки данных с Arduino Nano 33 BLE Sense по BLE.

Приступим к созданию скетча отправки данных с Arduino Nano 33 BLE Sense при обнаружении выполненного упражнения. За основу скетча берем пример nano_ble_sense_accelerometer из скачанной библиотеки.

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

Сохраняем скетч под другим именем (dumbbell_01). Добавляем код подключения библиотеки ArduinoBLE:

#include <ArduinoBLE.h>

Определяем BLE сервиса (uuid – 0x1826 Fitness Mashine )

BLEService fitnessBLEsense("1826");

И характеристики для упражнений (Traning status):

BLEIntCharacteristic counterChar("2AD3", BLERead | BLENotify);

Данные UUID для сервиса и характеристик берем в спецификации SIG для характеристик и сервисов ((https://btprodspecificationrefs.blob.core.windows.net/assigned-values/16-bit%20UUID%20 Numbers%20Document.pdf)).

Для характеристики counterChar будем отправлять значения 1, 2, 3 в зависимости от определенного упражнения:

1 – bicepscurl;

2 – lateralraise;

3 – overheadpress;

4 – no или не опознано.

В процедуре loop() добавляем код определения максимальной значения для результата классификатора объектов.

float max_predication=0.0;

   int result_predication=0;

   ei_printf("Predictions ");

   ei_printf("(DSP: %d ms., Classification: %d ms., Anomaly: %d ms.)",

   result.timing.dsp, result.timing.classification, result.timing.anomaly);

   ei_printf(": \n");

   for (size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) {

   if(result.classification[ix].value>max_predication)

   {

   result_predication=ix+1;

   max_predication=result.classification[ix].value;

   }

   ei_printf("   %s: %.5f\n", result.classification[ix].label,

   result.classification[ix].value);

   }

  Serial.print("result_predication=");Serial.println(result_predication);

Serial.print("max_predication=");Serial.println (max_predication);



И осуществляем отправку данных по BLE, если вероятность для какого-нибудь упражнения превышает 70%.

  BLEDevice central = BLE.central();

  if (central) {

   Serial.print("Connected to central: ");

   Serial.println(central.address());

   digitalWrite(LED_BUILTIN, HIGH);

   if  (central.connected()) {

   if(max_predication>0.7) {

   counter=result_predication;

   counterChar.writeValue(counter);

   //

   Serial.println("fitness BLEsense data:");

   Serial.print("counter=");Serial.print(counter);

   Serial.println("");   //   }

   else {

   counter=4;

   counterChar.writeValue(counter);

   }

   }

  digitalWrite(LED_BUILTIN, LOW);

  Serial.print("Disconnected from central: ");

  }

Загружаем скетч на плату. На смартфоне запускаем nrfConnect. Делаем упражнения и смотрим данные, приходящие в сервис Fitness Mashine, характеристика Traning status.

 

Создание программы для смартфона

Приложение для смартфона будем создавать в App Invertor 2,
онлайн-редакторе визуального программирования для Android, доступ к которому можно получить на странице: http://ai2.appinventor.mit.edu. После авторизации (можно использовать профиль Google) или регистрации попадаем в свой профиль программы, где можем создать новый проект

Сначала в панели Designer создаем интерфейс нашего приложения, перетаскивая на экран необходимые компоненты.

Кроме визуальных компонентов необходимо добавить невизуальные:

  1. Clock — из раздела Sensors (для получения данных из Bluetooth c периодичностью, установленной в Clock);
  2. Notifer — из раздела UserInterface;
  3. BluetoothBLE.

Компонент BluetoothBLE не входит в стандартный набор компонентов. Его необходимо подгрузить. Компонент BluetoothBLE.aix (edu.mit.appinventor.ble-20200828.aix) можно скачать со страницы расширений https://mit-cml.github.io/extensions/. Для установки Выбираем пункт Extension à Import extension, в появившемся окне выбираем путь к скачанному компоненты и нажимаем на кнопку Import. Компонент BluetoothBLE появится в разделе Extension (рис. 6.102). Теперь компонент добавляем в интерфейс.

Компонент В интерфейс включаем метки для названия упражнений и и поля для отображения количества упражнений. Добавим кнопку для сброса количества упражнений. Кроме этих полей нужны компоненты для организации подключения BLE. Кнопки запуска и остановки сканирования BLE-устройств. Поле списка для вывода обнаруженных при сканировании  BLE-устройств.

Затем переходим в раздел Block, где создаем код.

Создание глобальных переменных для отображения количества упражнений bicepscurl, lateralraise, overheadpress.

По нажатии кнопки Scan поиск BLE-устройств с занесением их в список ListBLE и по нажатии кнопки Stop scan – останов сканирования.

Инициализация подключения при выборе BLE-устройства из списка  

Получение и вывод данных. У характеристики counterChar активировано свойство NOTIFY (уведомление) –при помощи уведомлений получаем новые данные каждую секунду.

Обнуление данных по клику по кнопке Сброс для bicepscurl, lateralraise, overheadpress.

После чего создаем App-приложение и загружаем его на смартфон/планшет.

Запускаем на смартфоне/планшете наше приложение.

Подключение приложения по Bluetooth к плате Arduino

Получение и отображение данных

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
МикроконтроллерArduino Nano 33 BLE Sense1 Поиск в магазине ОтронВ блокнот
Аккумулятор186502 Поиск в магазине ОтронВ блокнот
Отсек для аккумуляторов 2x186501 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 5 Проголосовало: 1 чел.

Комментарии (5) | Я собрал (0) | Подписаться

0
Публикатор #
На форуме автоматически создана тема для обсуждения статьи.
Ответить
0
andro #
Не компилируется:
Прикрепленный файл: victoruni-project-1_inference.png
Ответить
0

[Автор]
victoruni #
У Вас этой библиотеки нет. Как натренируете модель в Edge Impulse, у Вас появится там сформируется своя библиотека, ее сможете скачать.
Ответить
0
andro #
А Вашу модель использовать не получится? Проект же вроде законченный, нет?
Ответить
0

[Автор]
victoruni #
Прикрепляю архив с библиотекой
Прикрепленный файл: ei-victoruni-project-1-arduino-1.0.7.zip
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Сатфайндер iMAX B6 - зарядное для Lion, LiPo, LiFe, Pb, NiCd и NiMH аккумуляторов
вверх