查看原文
其他

教程 | 一辆听得懂指令的机器小车

郭进强 柴火创客空间 2023-11-22


当微控制器Wio Terminal遇上图形化编程平台Codecraft会擦出什么奇妙的火花呢?在社区小伙伴郭进强的“魔法加持”下,一台能够听懂指令的声控机器小汽车就诞生啦~




创作不易,开源即爱!点赞、转发、在看、留言支持创作者哟,超详细教程附上:


作|者|介|绍

郭进强Vincent Kok

SeeedStudio国际社区活跃用户,对技术充满热情,STEAM AI机器人倡导者




应用Wio Terminal的内置麦克风和嵌入式机器学习,实现语音识别功能,从而让小车听懂行驶 (Go)停止(Stop)两个指令,并识别背景噪音(Bacgkround Noise)。


在这个项目教程中,我将使用由矽递科技Seeed Studio研发的Wio Terminal的内置麦克风和支持嵌入式机器学习的图形化编程平台Codecraft制作了一个声控机器小汽车,从而实现小车能语音 识别行驶 (Go)、停止(Stop)两个指令,并识别背景噪音 Bacgkround Noise).


项目所使用的元器件与工具

• 矽递科技Wio Terminal

• 优必选uKit Explore Kit 

• 矽递科技图形化编程软件平台Codecraft 

• Edge Impulse Studio 

• Arduino IDE


我们先一起看看这个项目的演示视频:


视频1:最终项目演示视频



图片1:用优必选uKit Explore Kit搭建的机器小车


Wio Terminal上的麦克风只能检测声音的强度(请下载或查看下方图纸,了解更多细节),因此要让它识别到不同的词是很有挑战的。但我想到了一些有创意的方法来捕捉声音来源,然后用Edge Impulse训练它们,看看它是否能够做简单的语音识别。稍后我们将看到结果。


图片2: Wio Terminal的麦克风示意图


好奇我怎么做到的吗?那接下来就一起跟着我的项目教程步骤,你也可以动手做出这个项目哟。


在这个项目教程里面,将会涵盖以下内容:

• 什么是UART串行通讯?

• 如何实现Wio Terminal和uKit Explore小车之间的UART串行通讯

• 第一步:使用Codecraft训练一个嵌入式机器学习的模型

• 第二步:Arduino文本编程优化

• 第三步:对uKit Explore小车(这个小车的主控是基于Arduino Mega 2560)进行编程

• 第四步:项目成果



什么是UART串行通讯?


UART英文全称Universal Asynchronous Receiver/Transmitter,翻译为中文是:通用异步收发传输器,是最通用的设备与设备间通讯的一种协议。这篇教程将与大家分享如何通过以下步骤将UART作为一个硬件通讯协议。


正确配置后,UART可以使用多种不同类型的串行协议,包括发送和接收串行数据。在串行通信中,数据是通过单根线实现字符的逐位传输。


通俗地说,UART可以让Arduino等嵌入式设备通过 TX(发送)和 RX(接收)线,将数据发送到另一个嵌入式设备上。具体传输图示,见下图参考:



图片3: UART技术原理图

图片来源:

https://learn.sparkfun.com/tutorials/serial-communication/all


我经常使用 UART 作为嵌入式设备之间的通信协议。让我再给大家分享一个案例。Arduino UNO本身没有内置WiFi,因此无法用它直接做跟物联网相关的项目。但随着我对基本 UART 串行通信的了解,我就开始用ESP8266/ESP32 作为 Arduino UNO 的协处理器,这样的话,Arduino UNO自带的传感器收集的数据就可以通过 ESP8266/ESP32发送到云平台,如 Web 服务器、Blynk 或 FAVORIOT。


在两个嵌入式设备(例如 Arduino UNO 和 ESP8266/ESP32)之间实现了传输数据之后,做项目的创意可能性就完全没有极限了!比如参考下方的例子,我试图在 TTGO T形显示屏(Serial2 线)和 uKit Explore(串行线)之间建立简单的串行通信。


图片4: TTGO T形显示屏与uKit Explore之间的串行通信图


接下来,我还会再详细介绍如何在这个声音控制小车项目中,实现这样的数据传输。



实现UART行通讯


Wio TerminaluKit Explore小车之间实现UART串行通讯 

根据Wio Terminal的官方文档显示,Wio Terminal的第8和10个引脚即为TX发送/ RX接收引脚


图片5:Wio Terminal引脚信息图


而对于 uKit Explore小车来说,它具有与 Arduino UNO 引脚分配类似的接头,因此引脚 D0 和 D1即为TX/RX 引脚。你可以根据下图查看uKit Explore完整的引脚分配:https://ubtechedu.gitbook.io/ukit-explore/v/english/ukit-explore-quick-start/pinout


图片6:uKit Explore引脚信息图


因为这两个设备都有UART (TX/RX) 引脚,所以在它们之间实现UART串行通讯就不难了。

只要你按照下方的接线指示进行两个设备的连接,就可以实现了。


  • Wio Terminal第8引脚接 uKit Explore的0引脚(TXD接RXD)

  • Wio Terminal第10引脚接 uKit Explore的1引脚(RXD接TXD)


我会在第三步小车编程中, 详细解释软件编程如何实现。


第一步:使用Codecraft训练一个嵌入式机器学习的模型

在这个步骤,我们的目标是应用图形化编程平台Codecraft创建一个语音识别的嵌入式机器学习的模型。


1.1.0 创建和选择模型

请通过https://ide.tinkergen.com/(或文末点击“阅读原文”跳转).这个链接访问Codecraft在线编程平台。然后在“选择硬件进行编程”这个版块选择“支持嵌入式机器学习的Wio Terminal”


图片7:选择“支持嵌入式机器学习的Wio Terminal”


1.1.1 创建“内置麦克风识别唤醒词”模型

在左侧中部的标题栏中,点击“创建模型”按钮。然后选择右边“为嵌入式机器学习创建新模型”版块中的“内置麦克风识别唤醒词”选项。如下图,根据要求输入模型的名称。


图片8: 输入模型名称


1.2.0数据采集

点击“确认”按钮后,窗口会自动跳转到“数据采集”界面。


图片9:数据采集界面


1.2.1 默认标签

系统提供了3个默认标签:hi wio、background背景音和其他词。


图片10: 系统默认标签


如果你想使用其他标签,你可以直接修改。但你也可以直接使用这些标签。在这个项目中,我对其中两个默认标签进行了修改,如下所示:

• 将hi wio改成go“行驶”

• 将其他词改成stop“停止”


1.2.2 修改标签后进行数据采集和数据采集程序修改

点击"hi wio”标签,系统将提示你更改标签名称。我将标签重新命名为go“行驶”,然后单击“确定”


图片11: 重新命名标签


用同样的操作处理“other words”标签。现在你就可以看到,这个项目所使用的三个标签如下:


图片12: 重新命名后的标签


重要提示:你也一定要相应修改“默认数据采集代码”中的标签名称:


图片13: 在默认数据采集代码中修改标签1


图片14: 在默认数据采集代码中修改标签2


1.2.3 连接Wio Terminal并上传数据采集代码

使用 USB-C 线将 Wio Terminal连接到笔记本电脑。单击“上传”按钮,这样将上传默认的数据采集代码。通常,上传大约需要 10 秒钟。上传成功后,页面将出现一个弹出窗口,提示“上传成功”。

点击“好的”按钮关闭窗口,并返回到数据采集界面。


注意:

1)你需要下载“Codecraft助手”才能将Codecraft在线 IDE上连接Wio Terminal和上传代码。

2)对于网页版的 Codecraft,如果你没有安装或运行设备助手,你应该会收到下图中的提示消息,表示你尚未打开设备助手。在这种情况下,你可以查看点击下方这个链接来下载、安装“设备帮助”并了解其使用。

图片15: 如未安装设备助手,系统提示信息


1.2.4 数据采集

在上文中,你可以找到数据采集的详细步骤介绍。

你可以按照步骤介绍,并根据你前面修改的标签来进行数据采集。

可以特别注意以下事项:

• Wio Terminal的按键 (A, B, C)所在位置

• 动图 gif已被自动加速,实际变换可以稍微放慢。

• 请注意标红的提醒信息

• 将鼠标指向描述文档就可以获得更详细的信息


在给 3 个标签收集了样本数据后,数据采集这个步骤就完成了。在这个项目中,我为3个标签分别收集了 15 秒数据。


图片16: 数据采集完成时,编程界面


1.3模型训练与部署

点击“训练与部署”按钮,你就可以看到如下图所示的模型训练界面。


图片17: 点击左下角的“训练与部署”按钮


go、background 和 stop3个标签内采集的原始数据的波形如下图所示,你可以从“样本数据”这个选项卡中查看。


go

如果你观察go标签里面的数据波形,我的声音输入是“go, go, go!”在 5 秒的窗口中,我录制了两次,两次中间有大约 1 秒停顿。

图片18: go标签里面的数据波形


background

在标签“background背景音”中,我只需将 Wio Terminal拿在手上即可捕捉周围的噪声数据。因此,您可以看到声音输入电平不是 0,因为周围有一些噪音,例如风扇旋转声。


图片19: “background背景音”标签里面的数据波形


stop

对于标签“stop”,为了与“go”标签中数据的区分,我尝试将我的发音在最后的字母延长为“stoppppp…………”整体大约持续 3 秒钟。

图片20: 标签“stop”的数据波形


1.3.1选择神经网络和参数

选择合适的神经网络大小:有“小、中、大”3种可选,并设置以下参数

    • 训练循环数(正整数)

    • 学习频率(介于0到1之间)

    • 最低置信度(介于0到1之间)


这个界面默认提供50个训练周期作为参数值,但准确度不是很好。因此,我将训练周期更改为 100。


 图片21: 修改训练周期


1.3.2 开始训练模型

点击“开始训练”。当你单击“开始训练”时,窗口将显示“正在加载..”!这个时候,耐心等待训练完成即可!

“正在加载..”的持续时间取决于所选神经网络的大小(小、中、大)和训练周期数。神经网络规模越大,训练周期越多,需要的时间就越长。

你也可以通过查看“日志”来推断所需时间。在下图中,“Epoch: 68/500”表示训练总轮数为 500 轮,目前进行到第 68轮。


图片22:训练日志详情


加载完成后,你可以在“日志”中看到这个提示“训练模型完成”,界面上也会出现“模型训练报告”的选项卡。


图片23:日志中的“训练模型完成”提示


1.3.3 观察模型性能,选择最理想的模型

在“模型训练报告”窗口中,你可以观察到模型训练结果,包括模型的准确率、损失情况和性能。

如果训练效果不理想,你可以通过选择另一个大小的神经网络或调整参数后再重新训练,直到你得到一个令人满意的模型为止。如果更改参数后不起作用,你就可能需要返回到再前一个步骤,再次收集数据。


图片24:模型训练报告


我在训练过程中,因为我把训练周期设置为 100,所以我能够达到 100% 的模型准确率。


1.3.4 部署理想模型

在“模型训练报告”窗口确认完模型性能后,点击“模型部署”按钮


图片25:模型部署按钮


部署完成后,单击“确定”进入“编程”窗口,这是我们将模型部署到 Wio Terminal的最后一步。


图片26:模型部署后的确定按钮


1.4.编程和模型使用

好的,现在我们完成了模型的训练,以及使用 UART 通信协议将人工智能(在这个项目中特指机器学习)与机器小车(Robo Car)进行集成的有趣部分。

以下是Codecraft图形化编程平台上自带的示例代码:


图片27: Codecraft图形化编程平台的示例代码


我给大家解释一下这段代码具体的功能。为了便于理解,我将其分解为以下几点:

• 如前所述,我们使用 if-else 条件语句来评估每个标签数据的置信度。

• 如果“go”标签的置信度大于0.8(80%),我会在串口终端打印“1”。

• 如果“stop”标签的置信度大于0.8(80%),我会在串口终端打印“2”。

• 否则,如果“background”标签的置信度大于 0.8(80%),我将在串行终端上打印“0”。


简言之,先记住下面 3 个不同的条件即可:

“go" > 0.8,命令为'1'

 “stop”> 0.8,命令为“2”

“background”。命令为“0”


在对 Wio Terminal的 TX/RX 引脚排列进行了一些研究后,我发现了以下规律:

• Wio Terminal的第8和第10引脚 分别为 TX/RX 引脚,可用于连接到另一设备(在我这个项目中就是uKit Explore小车)。


图片28:Wio Terminal引脚信息图


• 你从 40 针接头访问的串行线是 Serial1 而不是通常的 Serial,它基本上通过串行终端显示输出。


请一定要注意上面的 2 个重要发现,因为这将是我们项目的关键部分。


如果我们查看图形化编程代码相应的文本代码,你会发现Serial.print 并没有使用 Serial1 线。因此,我们就需要进行第二个大步骤,继续在 Arduino IDE 上进行编程,从而进行自定义。


图片29: 点击右上角查看文本代码


图片30: Serial.print 细节代码


2.0 Wio Terminal 代码在Arduino IDE上进行修改

 在这个步骤中,我们首要目标是对 Arduino文本代码进行修改,让程序调用Serial1.println 而不是 Serial.println,这样数据就可以通过Wio Terminal的第8 和 10引脚上的 TX/RX 引脚进行传输。


2.1 Codecraft切换到文本代码编程界面并复制文本代码


图片31: Codecraft从图形代码切换到文本代码


在Codecraft的文本代码编程界面,按 CTRL + A 全选所有代码并复制所有代码。


打开 Arduino IDE,创建一个新文件,通过 CTRL+V 将代码粘贴到文件中。输入你想要的文件名称后,保存代码文件。


图片32: 将文本代码复制到Arduino IDE


2.2 复制 Edge Impulse TinyML Arduino 库

这个步骤的问题在于:要如何将在Codecraft 平台上包括训练好的模型数据在内的所有文件复制到Arduino IDE 上?

其实很简单,通过下面的步骤即可:

• 请通过以下路径访问这个文件夹:C:\Users\<User_Name>\AppData\Local\Programs\cc-assistant\resources\compilers\Arduino\contents\libraries

• 在里面找到与 Arduino 文本代码顶部的 Edge Impulse 头文件编号相同的文件夹名称(在我这个项目中,它的编号是 47606)


图片33: 文件夹截图


• 复制整个 ei-project_47606 文件夹并将其粘贴到C:\Users\<User_Name>\Documents\Arduino\libraries\


图片34: 复制后文件夹截图


2.3 对Serial.println函数进行修改

最后,我们可以在Arduino IDE中简单回顾一下代码,鼠标向下滚动到 void loop 部分并将 Serial.println 函数修改为 Serial1.println。


 图片35:代码修改


2.4 代码烧录

到这,我们就可以把代码烧录到 Wio Terminal了。

烧录之前,确保你已安装 Wio Terminal支持包。如果你还没有安装,可以参考Seeed Wiki 上的“Wio Terminal入门”指南(https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/)。

此外,也一定要确保你选择了正确的板子和 COM 端口。


图片36: 代码烧录前,选择正确的板子和端口


好了,到此我们已经完成了所有文本代码所需要的修改!现在,以下3个条件所对应的命令“1”、“2”和“0”,就可以从Wio Terminal的第8和10引脚 上可用的 TX/RX 引脚发送出去了。

"go" > 0.8, 命令是 '1'

"stop" > 0.8, 命令是 '2'

"background". 命令是 '0'


3.0 对uKit Explore小车(这个小车的主控是基于Arduino Mega 2560)进行编程


在这个步骤中,我们将对我用uKit Explore搭好的机器小车进行编程。


3.1 uKit Explore 介绍

首先跟大家简单介绍下 uKit Explore。它是优必选开发的一个基于Arduino生态系统的机器人套件(核心芯片为Arduino 2560)。

“uKit Explore采用兼容Arduino的开源平台的主控制器,学习资源丰富”


图片37:uKit Explore 主板


在这个教程里面,我不会涉及到这个机器小车的结构搭建。如果对这部分内容感兴趣,你可以下载 uCode软件或前往 https://ide.ubtrobot.com/,在这里你可以找到我在这个项目中使用的机器小车的 3D构建说明。


图片38: uCode软件里面的机器小车结构搭建指南


3.2 对uKit Explore进行编程,读取UART数据


现在,我们需要对 小车进行编程,让它在接收到来自 Wio Terminal的命令“1”、“2”和“0”时,可以根据不同的条件采取相应的行动。


这里的关键概念是,如果串行线路包含任何数据,我们需要让 uKit Explore 持续监听串行线路。如果它确实包含串行数据,串行读取数据并将其分配给一个变量。最后一步是,我们让程序进行变量比较并执行不同的操作。


在这个项目中,当 uKit Explore 收到命令“1”(go)时,机器小车将向前移动;当 uKit Explore 收到命令 '2'(stop) 时,小车会停止;当 uKit Explore 接收到命令 '0'(background背景音)时,它也会停止。


 图片39: 示例代码


3.3 上传代码

最后,我们将代码(请关注“柴火创客空间”公众号回复“代码”即可获得)上传到Wio Terminal。在啰嗦提醒一句:请确保你在上传前选择了正确的板卡和 COM 端口。


4.0项目成果

让我们快速看一下到目前为止我们取得的项目成果!


视频2:项目成果视频


如你所见,机器小车可以通过识别语音“'go, go, go'而往前行驶,并在识别到“stopppps....”或“background”后,自动停下。我们达到了一开始设定的目标!


小结

Codecraft(点击“阅读原文”跳转)是一个非常简单易上手并支持嵌入式机器学习的图形化编程工具,它可以训练一个简单的嵌入式机器学习模型,并将其与你的机器小车系统集成。如果你对这个教程感兴趣,那就赶快自己动手也做一个吧


图片40:Codecraft软件


其他更多教程:请点击查看





🤖️🤖️🤖️

新一代信息技术赋能|人才升级|产业创新

硬件入门|物联网应用实战|低功耗物联网方案部署


提升技能 尽在👇人才赋能 



人才升级 推动双创事业

 国际权威认证 技能加持

新基建 撬动产业数字化

柴火认证会员 享受诸多


----END----

  Chaihuo x.factory|深圳,河北  


在看和赞,都点这里


继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存