骑自行车的人的智能手套





该项目的作者译者: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 ). – , .


我花了几个月的时间完成了项目并撰写了这段文字。如果不清楚,或缺少某些文件,请在原始文章注释中写上



也可以看看:






All Articles