该项目的作者译者:instructionables.com,翻译为:Matlek
在本文中,我将详细介绍“智能手套”及其LED面板的制造过程,该过程旨在提高骑车者和其他在路上行驶的人的安全性。首先,您可以看一下它的工作方式的小示范:
怎么运行的
手套包含一个Arduino板,可从陀螺仪和加速度计收集数据。该代码使用“微型机器学习”的tinyML模型并识别手势:分析手的每个动作并将其转换为信号(手向左,向右,向前,向后倾斜等)。信号通过蓝牙(BLE)发送到连接了LED矩阵的另一个微控制器(例如,可以连接到背包)。根据接收到的信号,矩阵会输出某些字符序列-以便其他骑手和骑车人可以理解骑车人将要做什么(例如,可以是向左,向右或向左的箭头)。
项目起源
首先,我骑着自行车上班,每天在马鞍上度过一个多小时(行驶约22公里)。总是很有趣,但是我住在法国人口最多的城市之一,那里经常发生涉及汽车和骑自行车的事故。马赛(Marseille)是法国骑自行车者最糟糕的城市-自行车道严重短缺。因此,该项目致力于提高骑自行车者的安全性,并试图引起城市当局对这一问题的关注。
其次,该项目将帮助运动的所有成员进行交流,并更好地相互理解。从我的角度来看,道路上发生的大多数麻烦都是由于一些道路使用者误解了其他道路,导致恐惧和侵略。我希望这样一种设备可以帮助交通参与者更好地相互理解。箭头表示方向,您也可以按字母显示文本(但是,我完全和完全提倡礼貌和富建设性的题词,以避免冲突)。
为什么选择智能手套?
我从冬天开始从事该项目,寒冷的天气促使我将设备戴在手套上。但是我很快意识到这个主意不是很好,因为在我们这个地区,夏天非常热。因此,我决定最好将设备放在盒子中并固定在我的手臂上。但是由于我不知道如何使用不同的名称,所以我决定在标题中保留“手套”一词。
“智能”来自我在该项目中使用的机器学习技术。
灵感
该项目基本上是其他两个项目的混合。我不是从零开始,而是使用了他们的最佳实践,然后我进一步进行了开发。这是我在开发时受到启发的:
- Arduino Nano 33 BLE SENSE进行手势识别。
- 不是一个特定的项目,而是骑自行车的人使用LED阵列的概念。有很多类似的项目-有些背包使用带有集成面板的背包,有些只是提供可以放在任何地方的现成的矩阵。无论如何,这些LED矩阵都是通过遥控器而不是手势识别来控制的。
组件
对于3D打印-一台3D打印机或一台打印机。
电子产品
- Arduino Nano 33 BLE传感器;
- 另一个带有BLE的MI(Arduino Nano 33 BLE,Arduino 33 BLE SENSE,Arduino nano 33 IOT,ESP32等)。我决定使用ESP32开发板。
- LED灯带(WS2812B)。我使用160个LED来创建20x8矩阵;
- 3V至5V的4级缓冲器:74AHCT125。
- 电容1000 uF
- SPST开关,3个。
- 面包板。
- 电线。
- 电池9 V
- 外置电池。
- 3.
- -.
1: (, )
在阅读了有关Arduino和机器学习的文章后,我决定也尝试一下。由于最近有几块新的Arduino Nano板,我在购买前做了一个比较板,以做出最佳选择。
所有开发板都很有趣,但是我只能使用一个进行手势识别-Arduino Nano 33 BLE SENSE。只有她拥有合适的传感器和Tensorflow Lite支持。另一个有趣的一点是,Arduino Nano 33 IOT,BLE和BLE SENSE板具有自己的蓝牙,因此它们中的任何一个都可以在LED矩阵上使用以接收BLE信号。
加载到开发板上的代码基于我在开发过程中发现的许多不同的Arduino程序。因此,在开始工作之前,我决定用发现的示例对其进行测试。
让我们玩BLE
在此项目中,蓝牙通信至关重要,因为这是信号从传感器发送到LED阵列的方式。我以前从未通过BLE连接过两个Arduino板。所以我练习了ArduinoBLE库中的以下示例:
- 与Arduino Nano 33 BLE Sense板一起使用的LedControl草图以及在引脚2上连接了带有上拉电阻的按钮。该示例轮询BLE外设,直到找到具有UUID 19b10000-e8f2-537e-4f6c-d104768a1214的服务。检测到并建立连接后,它将通过按下按钮来远程控制外围BLE LED。
- LED和Arduino Nano 33 IoT的草图。
不幸的是,我的LED草图有很多问题-加载时3个板“断了”。我不知道问题出在哪里,但是我决定用另一个带BLE的MI替换Arduino板-ESP32板。在新主板上,我使用了以下工具:
- BLE ESP32 ARDUINO库中的BLE_write草图。我添加了一些更改以使其可与Arduino Nano 33 BLE SENSE板一起使用。在步骤10中,您可以比较我编写并上传的BLE_write草图和Smartglove_BLE_LED矩阵草图。
让我们玩一下内置的RGB LED
您是否知道Arduino Nano 33 BLE SENSE板具有内置RGB LED?在此项目中,它们将用于检查手势识别的正确操作。我们必须验证信号是否已发送到LED阵列-但是,由于面板很可能位于骑自行车的人的背面,因此他将很难理解手势识别是否有效以及信号是否已发送。
这里没有什么复杂的,我只是稍微调整了Blink示例。该代码显示红色LED在针脚22上,绿色在针脚23上,蓝色在针脚24上。输入信号LOW点亮LED,高电平-熄灭。
const int LED_BUILTIN_RED = 22;
const int LED_BUILTIN_GREEN = 23;
const int LED_BUILTIN_BLUE = 24;
// setup
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);
}
// loop
void loop() {
digitalWrite(LED_BUILTIN_RED, LOW); // LED (HIGH – )
delay(1000); //
digitalWrite(LED_BUILTIN_RED, HIGH); // LED, LOW
delay(1000); //
digitalWrite(LED_BUILTIN_GREEN, LOW); // LED (HIGH – )
delay(1000); //
digitalWrite(LED_BUILTIN_GREEN, HIGH); // LED, LOW
delay(1000); //
digitalWrite(LED_BUILTIN_BLUE, LOW); // LED (HIGH – )
delay(1000); //
digitalWrite(LED_BUILTIN_BLUE, HIGH); // LED, LOW
delay(1000); //
}
让我们玩手势识别和tinyML
最后,我研究了在Arduino上使用机器学习的教程,并以手势识别为例进行了练习。该示例分为三个主要部分:
- 使用IMU_Capture程序(和Arduino Nano 33 BLE感应)进行数据识别;
- 在Google colab上(在计算机上)对记录的数据进行模型训练;
- 将训练有素的Arduino模型与IMU_Classifier一起用于模式识别(同样在Arduino板上)。
步骤2:手套1/6(电子)
从第2步到第7步,我提供了相同的图,并指出了其上的步骤,以便您更轻松地了解制作手套的过程。
手套的电子电路非常简单:
- Arduino开发板。
- 9V电池(我使用充电电池)。
- SPST开关。
步骤3:手套2/6-身体
主体很简单,仅由两部分组成,并在3D打印机上打印:
- 黄色部分包含Arduino板,电池和开关。外壳上的孔可让您为电池充电并重新编程Arduino板,而无需拆卸外壳。
- 黑色部分是保护电池和电路板的盖。
我用一条维可牢尼龙搭扣将它固定在我的手上。
我还画了一个徽标,然后将其粘贴到盖子上。它代表着从上方看的自行车手,并具有三个箭头-向前,向左和向右。第四个箭头与其他三个箭头分开,因为自行车不会向后行驶。
档案
content.instructables.com/ORIG/FS2/L3M3/K9N93ZYW/FS2L3M3K9N93ZYW.stl
content.instructables.com/ORIG/F72/21NG/K9N93ZZG/F7221NGK9N93ZZG.stl
content.instructables.com/NORIG9SZFD3 stl
步骤4:手套3/6:数据记录
组装完设备后,就该写入数据了。目标是多次记录每个手势。我设置了陀螺仪的阈值,当它超过该值时,Arduino开始将记录的数据输出到监视器。
我记录了以下手势:
- 指针指向左侧(标准的骑车人手势向左转)。
- 制动(手指伸向制动杆的手势)。
- 手向后倾斜。
- 手向前倾。
- 手向左倾斜。
- 手向右倾斜。
自然,您可以记录手势。
为了记录数据,我编写了一个程序,每20个笔划就切换一次LED的颜色。它帮助我理解了何时该进行另一种手势。我将Arduino连接到计算机,打开端口跟踪程序,然后将笔记本电脑放在背包中。
记录完所有手势后,我进入了最后一个阶段-将数据输出复制到程序中并以csv格式保存。
content.instructables.com/ORIG/FC7/B0JT/K9UEA78V/FC7B0JTK9UEA78V.ino
步骤5:手套4/6:训练
为了进行培训,我使用了以下示例,仅对其中的几行进行了更正。在训练之前,值得检查的是,对于每个手势,您都有自己的csv文件,并且每个文件中的数据都引用此特定手势。
在Google Colab网站上,使用“上传数据”部分中的链接上传数据。
在“图形数据(可选)”部分中,添加文件之一的名称。
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代码中更改了采样数,则可以用一个手势更改采样数:
#SAMPLES_PER_GESTURE = 119
SAMPLES_PER_GESTURE = 64
只需注释掉加速即可:
# 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
]
完成整个程序后,您可以下载经过训练的模型。
档案
content.instructables.com/ORIG/F7A/GLEK/K9UEA8Z5/F7AGLEKK9UEA8Z5.csv
content.instructables.com/ORIG/FV1/853G/K9UEA8Z6/FV1853GK9UEA8Z6.csv
content.instructables.com/ORIG8/F CSV
content.instructables.com/ORIG/F7N/P7AG/K9UEA8Z9/F7NP7AGK9UEA8Z9.csv
content.instructables.com/ORIG/FD4/WZRM/K9UEA8ZA/FD4WZRMK9UEA8ZA.csv
content.in7EA8ForSoK9UEA8ZA.csv content.inig8Fructables.com .csv
步骤6:Glove 5/6:Arduino
代码我最后的智能手套代码是以下程序的混合:
- 来自“ ArduinoBLE”库(Peripheral> LED)的示例“ LED”。
- 从这里开始“ IMU_Classifier” 。
在这里我将不对其进行详细介绍,我只是建议阅读原始程序,以便更好地了解正在发生的事情。
将模型添加到代码中,即可对其进行测试!
档案
content.instructables.com/ORIG/F9N/4SBK/K9UEA98M/F9N4SBKK9UEA98M.h
content.instructables.com/ORIG/FKZ/ODO9/KB52VXZK/FKZODO9KB52VXZK.ino
步骤7:手套6/6:测试
从视频中可以看到,LED会根据识别出的手势不同地点亮:
步骤8:1/4 LED矩阵:电子
正如我已经提到的,当在Arduino Nano 33 BLE SENSE上从ArduinoBLE库上载LED的草图时,我遇到了一些问题。因此,我决定使用ESP32代替此开发板。因此,在以上照片中,您可以看到两个板。
由于Arduino Nano 33 BLE SENSE和ESP32板均使用3.3V逻辑进行操作,因此我按照Adafruit的说明中的建议添加了3V至5V(74AHCT125)的4级缓冲器。
我还添加了一个100uF电容器来保护LED免受突然的电涌影响。
我将整个电路组装在面包板上。
可以看出,我同时使用了外部电源的两个连接器,因为我担心LED矩阵会需要太多电流。因此,矩阵和MI由外部电源的不同连接器供电。
步骤9:LED阵列2/4:主体
我需要一个预制的LED矩阵盒。因此,它由几个部分组成(也是因为我的3D打印机非常小),我为其中的螺栓提供了孔。
我再次使用魔术贴固定面板。
档案
content.instructables.com/ORIG/FH6/TB4H/K9N93ZZJ/FH6TB4HK9N93ZZJ.stl
content.instructables.com/ORIG/FK3/BZPC/K9N93ZZK/FK3BZPCK9N93ZZK.stl
content.instructFLUK9N93ZZK.stl stl
content.instructables.com/ORIG/F38/BF1P/K9N93ZZM/F38BF1PK9N93ZZM.stl
content.instructables.com/ORIG/FJC/DQMY/K9N93ZZN/FJCDQMYK9N93ZZN.stl
content.inelqvf9qfr / .stl
content.instructables.com/ORIG/FJE/C5FG/K9N93ZZR/FJEC5FGK9N93ZZR.stl
content.instructables.com/ORIG/F55/1X43/K9N93ZZS/F551X43K9N93ZZS.stl
步骤10:3/4 LED矩阵:Arduino代码
结果代码是以下代码(及其修改)的混合:
- BLE ESP32 ARDUINO库中的BLE_Write示例。
- FastLED NeoMatrix库中的MatrixGFXDemo64示例。
在这里我将不对其进行详细介绍,我只是建议阅读原始程序,以便更好地了解正在发生的事情。
content.instructables.com/ORIG/FIR/RETZ/KB52VXP4/FIRRETZKB52VXP4.ino
步骤11:LED矩阵4/4:测试
现在该检查所有内容了!识别每个手势后,信号将发送到LED矩阵,并显示一定的模式。可以看出,手套上的LED根据识别的手势点亮。
步骤12:最终测试和结论
这是实时的样子:
我对由此产生的设备感到非常满意。多亏了这个项目,我对tinyML和BLE感到更加自信。从那时起,我购买了另一个Arduino Nano 33 IOT,现在我从事的是一个非常有趣的项目,我将在以后写。在上述设备的第二版中,我将进行哪些更改:
- «». , . - - , . .
- . , USB . , . .
- . , . , ( 20 ). – , .
我花了几个月的时间完成了项目并撰写了这段文字。如果不清楚,或缺少某些文件,请在原始文章的注释中写上。
也可以看看: