Ticker

6/recent/ticker-posts

Указатель поворота управляемый с помощью перчатки






В этой статье мастер подробно расскажет, как сделал «умную перчатку» и светодиодную панель, для сигнализации направления поворота велосипедистами. 
Давайте посмотрим небольшое видео.


Как это работает:
Перчатка изготовлена на плате Arduino, которая собирает данные с гироскопа и акселерометра. Код Arduino работает с распознаванием жестов: каждое движение руки анализируется и распознается (рука наклонена влево, вправо, вперед, назад и т. д.). Затем этот сигнал отправляется через Bluetooth на другой микроконтроллер, подключенный к светодиодной матрице. В соответствии с сигналом, полученным микроконтроллером, некоторые светодиоды загораются, так что другие участники дорожного движения могут видеть, что делает или собирается делать велосипедист (например, стрелки вправо, влево и вправо, или текст).

Инструменты и материалы:
-3D-принтер или доступ к нему;
-Arduino Nano 33 BLE SENSE;
-Микроконтроллер ESP32 с BLE или (Arduino Nano 33 BLE, Arduino 33 BLE SENSE, Arduino nano 33 IOT);
-Светодиодная лента WS2812B - 160 светодиодов;
-Микросхема 74AHCT125;
-Конденсатор 1000 мкФ;
-SPST переключатели - 3 шт;
-Монтажная плата;
-Провода и перемычки;
-Батарея 9 В;
-Повербанк;
-Винты и гайки;
-Застежка на липучке;



Шаг первый: выбор материалов, коды
Перед покупкой платы Arduino Nano мастер составил таблицу для сравнения их характеристик и выбора наиболее подходящей для этих целей.


После сравнения характеристик единственной платой, которая может быть использована для распознавания жестов, является плата Arduino Nano 33 BLE SENSE, поскольку она единственная, на которой есть датчики и поддержка платформы Tensorflow Lite. Еще одним интересным моментом является то, что платы Arduino Nano 33 IOT, BLE и BLE SENSE имеют Bluetooth.

Коды, которые мастер загрузил, основаны на уже готовы кодах Arduino. Поэтому, прежде чем начать сборку, мастер решил проверить эти коды. 
Подключение по каналу Bluetooth в этом проекте имеет решающее значение, поскольку именно так сигнал передается от датчиков на светодиодную панель. Мастер никогда не делал сопряжение двух плат Arduino по Bluetooth, поэтому он решил попрактиковался на следующем примере из библиотеки ArduinoBLE :
-Эскиз LedControl, используемый с Arduino Nano 33 BLE Sense и кнопкой с подтягивающим резистором, подключенным к контакту 2. В этом примере выполняется поиск периферийных устройств блютус до тех пор, пока один с адресом "19b10000-e8f2-537e-4f6c-d104768a1214" UUID не будет найден. После обнаружения и подключения можно будет дистанционно управлять светодиодом BLE Peripheral, с помощью кнопки.
-Светодиодный эскиз, используемый с Arduino Nano 33 IoT.

К сожалению, у мастера возникло много проблем с эскизом, и 3 попытки загрузки кода оказались не удачными. Тогда мастер решил заменить плату Arduino другим микроконтроллером с BLE: платой ESP32. С этой новой платой мастер использовал эскиз BLE_write:

-Эскиз BLE_write из библиотеки BLE ESP32 ARDUINO. Он добавил несколько изменений, чтобы код работал с платой Arduino Nano 33 BLE SENSE. Мастер предлагает нам сравнить эскиз BLE_write и эскиз Smartglove_BLE_LED, который он написал.

Играйте со встроенными светодиодами RGB
Знаете ли вы, что платы Arduino Nano 33 BLE SENSE имеют встроенные светодиоды RGB? Но почему мы используем их в этом проекте? Чтобы проверить, работает ли распознавание жестов. Для проверки работы распознавания жестов мастер использует штатные светодиоды Ардуино. 
Мастер немного изменил код Blink. Как можно увидеть ниже, на плате есть красный светодиод на контакте 22, зеленый светодиод на контакте 23 и синий светодиод на контакте 24. Обратите внимание, что выход «LOW» включает светодиод, а выход «HIGH» выключает светодиод.

/* Blink example modified for built-in RGB LEDs (Arduino Nano 33 BLE sense).[url=http://www.arduino.cc/en/Tutorial/Blink]http://www.arduino.cc/en/Tutorial/Blink [/url] */
const int LED_BUILTIN_RED = 22;
const int LED_BUILTIN_GREEN = 23;
const int LED_BUILTIN_BLUE = 24;

//the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN_RED, OUTPUT);
  pinMode(LED_BUILTIN_GREEN, OUTPUT);
  pinMode(LED_BUILTIN_BLUE, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN_RED, LOW);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN_RED, HIGH);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second 

digitalWrite(LED_BUILTIN_GREEN, LOW);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN_GREEN, HIGH);    // turn the LED off by making the voltage LOW
  delay(1000);   // wait for a second
  
  digitalWrite(LED_BUILTIN_BLUE, LOW);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN_BLUE, HIGH);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}


Так же, в работе над этим проектом мастер руководствовался статьей « Начало работы с машинным обучением на Arduino»и попрактиковался с примером распознавания жестов.
Этот пример разделен на 3 основные части:
Запись данных с помощью кода IMU_Capture.
Обучение модели с ранее записанными данными в Google Colab.
Использование обученной модели Arduino с IMU_Classifier, для распознавания жестов.

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


Схема перчатки проста:
Плата Arduino;
Батарея 9 В (мастер использовал аккумуляторную батарею 9 В);
SPST-переключатель.



Указатель поворота управляемый с помощью перчатки


Шаг третий: перчатка - корпус


Корпус просто из двух 3D-печатных частей:
Первая часть желтого цвета содержит плату Arduino, батарею и переключатель. В этой части есть отверстия для разъема зарядки и разъема платы Arduino.



Вторая часть черного цвета (крышка). 






На крышку приклеивается логотип. Корпус крепится к руке с помощью застежки-липучки. 



Glove_box_bottom.stl
Glove_box_top.stl
Glove_logo.stl
Шаг четвертый: перчатка - запись данных


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

Жесты, которые мастер записал:
Рука, указывающая налево (обычный жест для велосипедистов, указывающий поворот налево);
Тормоз (движение пальцами, как сжимаешь ручной тормоз);
Рука наклонена назад;
Рука наклонена вперед;
Рука наклонена влево;
Рука наклонена вправо;
По желанию можно добавить и другие жесты.
Для записи этих данных мастер создал программу, которая каждые 20 движений зажигает светодиод разного цвета. Таким образом, можно понять, когда нужно поменять жесты. 

Мастер подключил Ардуино к ноутбуку, загрузил его в рюкзак и совершил велосипедную прогулку, одновременно записывая жесты.
После того, как все жесты записаны, последнее, что нужно сделать, это скопировать данные, отображаемые на мониторе, и сохранить их в файлах «csv» (см. Файлы, загруженные на следующем шаге).
Smartglove_IMU_Capture.ino








Шаг пятый: перчатка - обучение


Для обучения мастер использовал код по этой ссылке и изменил несколько строк кода. 
В «Загрузить данные» загрузите все свои файлы.
В «Данные графика» добавьте одно из ваших имен файлов:
filename = "Arm_left.csv"
Затем измените эту часть для отображения только данных гироскопа:

#index = range (1, len (df ['aX']) + 1) 
index = range (1, len (df ['gX']) + 1)


Измените следующие строки, чтобы они выглядели так:

#plt.plot(index, df['aX'], 'g.', label='x', linestyle='solid', marker=',')
#plt.plot(index, df['aY'], 'b.', label='y', linestyle='solid', marker=',')
#plt.plot(index, df['aZ'], 'r.', label='z', linestyle='solid', marker=',')
#plt.title("Acceleration")
#plt.xlabel("Sample #")
#plt.ylabel("Acceleration (G)")
#plt.legend()
#plt.show()


В разделе «Анализ и подготовка данных» добавьте все имена, которые вы использовали для данных:

#GESTURES = ["punch", "flex",] 
GESTURES = ["Arm_left", "Brake", "Hand_back-tilt", "Hand_front-tilt", "Hand_left-tilt", "Hand_right-tilt"]


Измените номера жестов, если они изменены в исходном коде Arduino:

# normalize the input data, between 0 to 1:
# - acceleration is between: -4 to +4
# - gyroscope is between: -2000 to +2000
      tensor += [
          #(df['aX'][index] + 4) / 8,
          #(df['aY'][index] + 4) / 8,
          #(df['aZ'][index] + 4) / 8,
          (df['gX'][index] + 2000) / 4000,
          (df['gY'][index] + 2000) / 4000,
          (df['gZ'][index] + 2000) / 4000
      ]


Сохраните и запустите каждую строку этой страницы.



Шаг шестой: перчатка - код Ардуино


Последний код, который мастер использует на устройстве, представляет собой сборку следующих кодов:
Пример "LED" из библиотеки "ArduinoBLE" (Периферийные устройства> LED), и "IMU_Classifier".
Добавьте свою новую модель в код, и можно начинать тестировать.
model.h
Smartglove_BLE_IMU-Classifier.ino
Шаг седьмой: перчатка - тест





Как видно на фото, и на видео ниже, в зависимости от жестов светодиоды светят разным цветом.

Шаг восьмой: светодиодная панель - электроника
Как мастер уже говорил ранее, он столкнулся с несколькими проблемами при загрузке эскиза светодиодов из библиотеки ArduinoBLE на плате Arduino Nano 33 и решил вместо этого использовать плату ESP32. Поэтому на фото можно увидеть обе платы.
Так как обе платы Arduino Nano 33 BLE SENSE и ESP32 взаимодействуют с 3,3 В, мастер добавил конвертер 3 В - 5 В (74AHCT125), как рекомендовано в Руководстве по оптимальной практике Adafruit.
Мастер также добавил конденсатор емкостью 1000 мкФ.
Питание светодиодной матрицы и платы будет от повербанка, от разных входов.






Шаг девятый: корпус светодиодной панели
Для светодиодной панели был сделан модульный корпус. Мастер напечатал корпус (файлы можно скачать ниже) и установил светодиодную ленту и всю электронику.











Для крепления панели используется застежка-липучка.


Для одновременного включения светодиодной панели и платы мастер напечатал специальный колпачок для двух переключателей.



LED-panel_attachment.stl
LED-panel_button.stl
LED-panel_case_part1.stl
LED-panel_case_part2.stl
LED-panel_case_part3.stl
LED-panel_frame_attachment.stl
LED-panel_frame_part1.stl
LED-panel_frame_part2.stl
Шаг десятый: код для светодиодной панели
Окончательный код представляет собой сборку следующих кодов после нескольких модификаций:
Код "BLE_Write" из библиотеки "BLE ESP32 ARDUINO".
Код "MatrixGFXDemo64" из библиотеки "FastLED NeoMatrix".
Smartglove_BLE_LED-matrix.ino
Шаг одиннадцатый: тест
Теперь обе части готовы и мастер тестирует работу устройства. 








Далее нужно проверить как устройство работает при езде на велосипеде и удобно ли им управлять.


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

Корпус для светодиодной панели немного не удачный. Нет быстрого доступа к Ардуино и повербанку.
Иногда сигнал подается ошибочно. Или не распознаются жесты, или определяются неправильно. Он думает, что это можно исправить, увеличив количество жестов при обучении (изначально 20 движений).



ПОДХОДИТ К САМОДЕЛКЕ

Отправить комментарий

0 Комментарии