Smartglove为骑自行车的人

318

1

介绍:自行车手专用的智能手套

在这个说明中,我将详细说明我是如何制作这个“智能手套”和它的LED面板,以便骑自行车的人或其他道路使用者可以更安全地骑/驾驶。这里有一个简短的演示,你可以看到它是如何工作的(在指导表的最后有另一个关于我的自行车的视频):

它是如何工作的:

手套由Arduino板制成,可以从陀螺仪和加速度计收集数据。Arduino代码使用了微型机器学习模型(tinyML),并与手势识别一起工作:分析和识别每只手的运动(手向左、向右、向前、向后等倾斜)。然后,这个信号通过蓝牙(BLE)发送到另一个与LED矩阵相连的微控制器(例如,放在背包上)。根据微控制器接收到的信号,LED矩阵上的一些图案会亮起来,这样其他道路使用者就可以看到骑车人在做什么(例如右、左、直箭头或文本)。

项目缘起:

这就是我做这个项目的动机:

  • 首先,我骑自行车上班,我每天骑1个多小时(大约22公里)。这总是很有趣,除了我住在法国最拥挤的城市之一,汽车和骑自行车的人之间的事故经常发生。这一点尤其正确,因为马赛是法国最不适合骑自行车的城市,自行车道非常少(你可以看到)在这里)。因此,这是一个提高骑行者安全的项目,同时也在报告城市对骑行者缺乏考虑。
  • 其次,这是一个帮助道路使用者更好地沟通和理解彼此的项目。在我看来,我看到的大多数不文明行为都是由于一些人误解了其他人的行为,吓跑了他们,导致了侵犯行为。有了这个设备,我希望道路使用者能更好地理解彼此:箭头指示方向,文本可以显示(但我严格坚持使用美观且具有建设性的文本,以避免引发冲突)。

为什么叫"smartglove"?

我最初是在冬天开始这个项目的,寒冷的天气促使我在手套上做这个装置。但我很快意识到这是一个坏主意,因为这里的夏天很热。所以把这个装置放在一个盒子里,并把它固定在手上是一个完美的解决方案。但是如何调用这样的设备呢?因为我不知道新名字,所以我保留了“glove”这个词。

“智能”来自于这个项目中使用的微型机器学习技术。

启示:

这个项目是我发现的两个主要项目的混合。我没有从零开始,而是利用这些项目走得更远,并做了一个更高级的。这些是我得到灵感的项目:

  • 手势识别与Arduino Nano 33 BLE SENSE,你可以通过点击阅读在这里
  • 灵感的另一个来源不是一个具体的项目,而是自行车的LED面板的概念。有很多这样的项目,一些是集成的LED矩阵的背包,其他一些只是在一个矩阵中,可以连接到任何地方。但在所有情况下,这些LED面板都是由遥控器控制的(而不是手势识别)。

供应:

3D打印零件:

  • 拥有3D打印机,或使用私人实验室或在线3D打印服务;
  • 中国人民解放军。

电子部分:

  • Arduino Nano 33 BLE SENSE;
  • 另一个微控制器与BLE (Arduino Nano 33 BLE, Arduino 33 BLE SENSE, Arduino Nano 33 IOT, ESP32等)。我决定使用ESP32板,稍后我会解释;
  • 领导带(WS2812B)。我用了160个LED,制作了一个20x8的LED矩阵;
  • 3 - 5V四电平移位器:74AHCT125;
  • 1000微米的电容器;
  • SPST开关(x3);
  • Perfboards;
  • 导线和跳线;
  • 9 v电池;
  • 权力的银行。

其他:

  • M3螺丝和螺母;
  • Hook-and-loop紧固件。

老师的笔记

老师!你在课堂上用过这本小册子吗?
添加一个老师笔记来分享你是如何将它融入到你的课程中的。

步骤1:必备条件(微控制器、代码)

在阅读这篇文章关于Arduino板和机器学习,我决定尝试一下。由于有新的Arduino Nano板,我做了一个表格来比较它们的特性,以便在购买之前做出更好的选择。

所有这些板都很有趣,但只有Arduino Nano 33 BLE SENSE板可以用于手势识别,因为它是唯一一个有传感器和支持Tensorflow Lite的板。另一个有趣的地方是Arduino Nano 33 IOT, BLE和BLE SENSE board都有蓝牙,所以它们都可以在LED矩阵上接收BLE信号。

稍后你会看到,我上传在Arduino板上的代码是基于我找到的很多Arduino代码。所以在开始之前,我决定用我找到的示例测试这些代码。

玩祝福

在这个项目中,蓝牙连接是至关重要的,因为它是信号从传感器发送到LED面板的方式。在做这个项目之前,我从来没有连接过2个Arduino板与BLE。所以我用下面的例子练习ArduinoBLE图书馆:

  • LedControl sketch,与Arduino Nano 33 BLE Sense一起使用,还有一个与引脚2连接的上拉电阻按钮。这个示例扫描BLE外围设备,直到找到一个UUID为“19b10000-e8f2-537e-4f6c-d104768a1214”的服务。一旦被发现并连接上,当按键被按下或释放时,它将远程控制BLE外设的LED。
  • LED素描,使用Arduino Nano 33物联网。

不幸的是,我的LED草图出现了很多问题,在上传这个草图时,有3块板“坏了”。我不知道这个问题从何而来,但我决定用另一个微控制器BLE代替Arduino板:一个ESP32板。有了这个新板,我使用了以下:

  • 来自BLE ESP32 ARDUINO库的BLE_write草图。我添加了一些变化,使其工作与Arduino Nano 33 BLE SENSE板。我邀请您比较BLE_write草图和我在第10步中编写和上传的Smartglove_BLE_LED-matrix草图。
使用内置的RGB led

你知道Arduino Nano 33 BLE感应板有RGB内置led吗?但是我们为什么要在这个项目中使用它们呢?来验证手势识别是否有效。这里的想法是检查信号是否已发送到LED面板,但由于面板可能是附加在骑车人的背部,很难确保手势识别工作和信号发送到面板。

没什么复杂的,我只是稍微修改了一下眨眼的例子。如图所示,22引脚处有一个红色LED, 23引脚处有一个绿色LED, 24引脚处有一个蓝色LED。请注意,“低”输出打开LED,“高”输出关闭LED。

/*眨眼的例子修改为内置RGB led (Arduino Nano 33 BLE sense)。http://www.arduino.cc/en/Tutorial/Blink "const int LED_BUILTIN_GREEN = 23;int LED_BUILTIN_BLUE = 24;//设置函数运行一次当你按复位或电源板void setup(){//初始化数字pin LED_BUILTIN作为输出。pinMode (LED_BUILTIN_RED、输出);pinMode (LED_BUILTIN_GREEN、输出);pinMode (LED_BUILTIN_BLUE、输出);{digitalWrite(LED_BUILTIN_RED, LOW);//打开LED灯(高为电压电平)延时(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 }
玩手势识别和tinyML

最后,我读了开始在Arduino上进行机器学习指导,并用手势识别的例子练习。本例分为三个主要部分:

  • 数据记录用IMU_Capture代码(带有Arduino Nano 33 BLE sense);
  • 用之前记录的数据训练模型,在谷歌colab上:在这里找到(电脑)。
  • 并使用Arduino上的训练模型IMU_Classifier,以识别手势(再次使用Arduino板)。

第二步:手套(1/6):电子

从第2步到第7步,我使用一个方案来帮助你更好地理解制作手套的过程。方案中突出显示的部分对应于当前步骤中描述的项目部分。

关于手套的回路,很简单:

  • Arduino电路板;
  • 9V电池(我用的是可充电的9V电池);
  • 一个SPST开关。

步骤3:手套(2/6):装箱

外壳仅由两个3D打印部件组成:

  • 第一部分黄色部分是Arduino板,电池和开关。我在这部分设计了孔,这样就可以给电池充电,不用打开盖子就可以编程Arduino板;
  • 第二部分在黑色(盖子),以保护电池和板。

我用一条带钩环的扣环把这个盒子固定在手上。

最后,我还设计了一个logo,我把它粘在了盖子上。它代表一个从上往下看的自行车,有3个箭头(直、左、右)。第4个箭头与其他箭头分离,因为自行车不会倒着走。

步骤4:手套(3/6):数据记录

一旦设备准备好,就该记录数据了:目标是多次记录所有手势。我在陀螺仪上设置了一个阈值,所以当陀螺仪的值超过这个阈值时,Arduino板开始在监视器上显示记录的数据。

这些是我录下来的手势:

  • 手臂向左(骑单车者惯用的手势,表示要左转);
  • 刹车(手指触摸刹车的动作);
  • 交还倾斜;
  • 手前倾斜;
  • 手左倾斜;
  • 手对倾斜。

当然,您可以添加其他手势。

为了记录这些数据,我制作了一个程序,每20次运动就会点亮一个不同颜色的LED灯。这样我就知道什么时候该改变手势了。我打开Arduino监视器,把Arduino板连接到我的电脑上,然后把我的电脑放在我的背包里。

一旦所有的手势都被记录下来,最后要做的就是复制监视器上显示的数据,并将它们保存到“csv”文件中(参见下一步上传的文件)。

第五步:手套(4/6):训练

对于训练,我使用这个链接我只修改了几行代码。在开始培训之前,我建议您绘制您的数据,并确保每个动作都类似于一个“csv”手势文件。

在“上传数据”中,上传你所有的文件。

在“图形数据(可选)”中,添加一个文件名:

文件名= " Arm_left.csv "

然后修改这条线,只绘制陀螺仪数据:

#指数=范围(len (df [' aX ']) + 1)指数=范围(1,len (df [' gX ']) + 1)

注释下面的代码行,使它们看起来像这样(同样,我没有使用加速度计数据):

# plt。情节(指数、df(“斧头”)、“g。”,标签= ' x ',线型= '固体,标志= ',')# plt。情节(指数、df(“是的”)、“b。”,标签= ' y ',线型= '固体,标志= ',')# plt。情节(指数、df (“aZ”)、“r。', label='z', linestyle='solid', marker=',') # pt .title("Acceleration") #plt。样本包含(“#”)# plt。ylabel("Acceleration (G)")

在“解析和准备数据”中,添加所有你使用的数据名称:

#手势= ["Arm_left", "Brake", " hand - backwards ", " hand - front-tilt", " hand - left-tilt", " hand - right-tilt"]

如果在最初的Arduino代码中改变了,也改变了每个手势的样本:

#SAMPLES_PER_GESTURE = 119

最后要更改的是注释加速:

#规范化输入数据,在0到1之间:# -加速度之间:4 + 4 # -陀螺仪之间:-2000 + 2000张量+ = [# (df(“斧头”)(指数)+ 4)/ 8 # (df('是的'][指数]+ 4)/ 8 # (df (“aZ”)(指数)+ 4)/ 8,(df (“gX”)(指数)+ 2000)/ 4000 (df (“gY)(指数)+ 2000)/ 4000 (df(“广州”)(指数)+ 2000)/ 4000)

阅读并运行这个页面的每一行,最后,您可以下载训练过的模型。

第六步:手套(5/6):Arduino代码

最后的代码,我使用的smartglove是以下代码的混合:

我不会对它们进行描述,因为这个说明太长了,但是我鼓励您阅读原始代码以更好地理解它们。

将您的新模型添加到代码中,您就可以准备测试它了!

第七步:手套(6/6):测试

正如你在下面的视频中看到的,led灯根据识别的手势不同发光:

步骤8:LED面板(1/4):电子

正如我之前所说的,我在Arduino Nano 33板上从ArduinoBLE库上传LED草图时遇到了几个问题,于是我决定使用ESP32板来代替。因此,在上面的图片,你可以看到两个板。

由于Arduino Nano 33 BLE SENSE和ESP32板都能与3.3V逻辑电平通信,所以我添加了一个四电平移位器3V到5V (74AHCT125)来做电平移位,这是在the上推荐的Adafruit最佳实践指南

我还增加了一个1000微米的电容器,以防止初始冲击电流损害像素。

我在演奏板上做了这个电路。

你还可以看到,我使用了powerbank的两个插头,因为我担心LED矩阵会需要太多电流。因此,矩阵和微控制器由不同的powerbank输出供电。

步骤9:LED面板(2/4):外壳

对于LED面板,我想要一个模块化的外壳。所以表壳是由几个部件组成的(也是因为我有一个微型3D打印机),我在表壳上打了很多孔,以便于使用螺丝。

为了连接面板,我再次使用了钩环紧固件。

你可以下载我设计的所有文件。

步骤10:LED面板(3/4):Arduino代码

最后的代码是以下代码的混合,经过一些修改:

  • 来自“BLE ESP32 ARDUINO”库的“BLE_Write”示例。
  • “MatrixGFXDemo64”示例来自“FastLED NeoMatrix”库。
我再次强调,我不会描述它们,但我鼓励您阅读并比较原始代码和我编写的代码。但请随意在评论区提出任何问题!

步骤11:LED面板(4/4):测试

是时候测试一下了!每当一个手势被识别,一个信号被发送到LED面板和一个模式显示。你还可以注意到,根据识别的手势,smartglove上的LED会亮起来。

如果你错过了,这是介绍中的视频:

第12步:最终测试和结论

这是我骑自行车时的视频!

最后,我对这个装置非常满意。它帮助我在使用tinyML和BLE时更加自信。从那以后,我又买了一个Arduino Nano 33物联网板,现在我正在用它做一个非常激动人心的项目,很快就会发布(别错过了)!但如果我再做一个版本,我也会改变一些事情:

  • 更适合智能手套的盖子。当前的一个只是放在盒子上,并保持固定,因为它是紧的。但是在路上,我的手碰到了一个东西,盖子掉下来摔碎了。所以在下一个版本中,我可能会用螺丝来做盖子。
  • LED面板更好的外壳。我很快发现,我做的情况缺乏方便访问的微控制器USB端口,以调试它或改变其代码,无需拧下整个情况。此外,如果不拆下螺丝,就无法进入powerbank并充电。
  • 培训的更多数据。有几次,有些手势有时没有被认出来,而有些却被认出来了。这可能是由于缺乏数据(每个手势只有20个动作)。因此,动作越多,手势识别的模型越好,错误越少。

我花了好几个月的时间来制作和编写这个指导表,所以如果它不清楚或文件丢失了,请在下面留下评论,我将尽力回答最好的我可以。

我希望您喜欢它,并很快看到您其他令人兴奋的项目!:)

Arduino比赛2020

这是。中的一个条目
Arduino比赛2020

第一个分享

    建议

    • 后院的比赛

      后院的比赛
    • 第一次作家大赛

      第一次作家大赛
    • Tinkercad学生设计大赛

      Tinkercad学生设计大赛

    讨论