入门教程
Arduino团队的SandeepMistry&DominicPajak的客座帖子。
作者:TensorFlow原文链接:https://medium.com/tensorflow/how-to-get-started-with-machine-learning-on-arduino-7daf95b4157
Arduino的任务是让机器学习变得简单,任何人都可以使用。在过去的几个月里,我们一直在与TensorFlowLite团队合作,并很高兴向您展示我们的合作成果:将TensorFlowLiteMicro应用于ArduinoNano33BLESense。在本文中,我们将向您展示如何安装和运行几个新的TensorFlowLiteMicro示例,这些示例现在可以在Arduino库管理器(ArduinoLibraryManager)中找到。
下面的第一个教程将向您展示如何在Arduino板上安装一个神经网络来识别简单的语音命令。
接下来,我们将介绍一个更深入的教程,您可以使用该教程来训练您自己的自定义手势识别模型,使用Colab中的TensorFlow为Arduino创建手势识别模型。本材料基于SandepMistry和DonColeman举办的实践研讨会,该研讨会的更新版本现已在线。
如果你以前有过Arduino的经验,你可以在几个小时内完成这些教程。如果你对微控制器(microcontrollers)还不太熟悉,可能需要更长的时间。
我们很高兴与大家分享一些最初的例子和教程,并看看您将从这里构建什么。我们开始吧!
注:以下项目基于TensorFlowLiteforMicroscular,目前在TensorFlowrepo中进行实验。这仍然是一个新兴的领域!
微控制器(Microcontrollers)和TinyML
微控制器,如Arduino板上使用的微控制器,是低成本、单芯片、独立的计算机系统。它们是隐藏在数十亿件日常用品中的隐形电脑,如可穿戴设备、无人机、3D打印机、玩具、电饭煲、智能插头、电动滑板车、洗衣机。连接这些设备的趋势是所谓物联网的一部分。
Arduino是一个开源平台和社区,致力于让每个人都可以访问微控制器应用程序开发。我们使用的主板有一个ArmCortex-M4微控制器,运行频率为64MHz,内存为1MB,内存为256KB。与云、PC或移动设备相比,这是很小的,但以微控制器标准来看是合理的。
可能有一些实际原因需要在微控制器上压缩ML,包括:
功能-希望智能设备在本地快速运行(独立于互联网)
成本-用简单、低成本的硬件实现这一点
隐私-不想在外部共享所有传感器数据
效率-更小的设备形状系数,能量收集或更长的电池寿命
有一个最终目标,我们正在朝着这个目标努力,这是非常重要的:
机器学习可以使微控制器对具有嵌入式开发背景的开发者开放
在机器学习方面,可以使用一些技术将神经网络模型拟合到内存受限的设备(如微控制器)中。其中一个关键步骤是将权重从浮点量化为8位整数。这也有助于使推断更快地计算,并且更适用于较低的时钟速率设备。
TinyML是一个新兴的领域,还有很多工作要做——但令人兴奋的是,它有一个巨大的未经探索的应用空间。数以亿计的微控制器和各种各样的传感器结合在一起,在未来可能会带来一些非常有创意和价值的微型ML应用。
你需要开始做什么
一块ArduinoNano33BLE感应板。
一条连接Arduino板和台式机的微型USB电缆。
要为您的电路板编程,您可以使用arduinoWeb编辑器或安装ArduinoIDE。我们将在下一节详细介绍如何设置这些
ArduinoNano33BLESense具有多种车载传感器,这意味着可能用于一些凉爽的微型ML应用:
语音-数字麦克风
运动-9轴IMU(加速度计、陀螺仪、磁强计)
环境-温度、湿度和压力
光-亮度、颜色和物体距离
与经典的ArduinoUno不同,该板将微控制器与板载传感器结合在一起,这意味着您可以在不需要额外硬件或接线的情况下处理许多用例。该板也足够小,可以用于终端应用,如可穿戴设备。顾名思义,它具有蓝牙LE连接,因此您可以将数据(或推断结果)发送到笔记本电脑、移动应用程序或其他BLE板和外围设备。
提示:U盘上的传感器
通过USB连接BLESense板是一种简单的方式,可以捕获数据并将多个传感器添加到单板计算机中,而无需额外布线或硬件,例如,这是对RaspberryPi的一个很好的补充。
TensorFlowLiteforMicrocontrollers示例
现在,TensorFlowLiteforMicrocontrollers的示例已经打包并通过Arduino库管理器提供,这样就可以在Arduino上include并运行它们。在本节中,我们将向您展示如何运行它们。例如:
micro_speech—使用车载麦克风的语音识别。
magic_wand—使用机载IMU进行手势识别。
person_detection—使用外部ArduCam摄像头进行人身检测。
有关示例的更多背景信息,您可以查看tensorflow存储库中的源代码。这些例子中的模型是以前训练过的。下面的教程将向您展示如何在Arduino上部署和运行它们。在下一节中,我们将讨论培训。
如何使用ArduinoCreateweb编辑器运行示例
使用USB电缆将ArduinoNano33BLESense连接到桌面计算机后,您将能够使用ArduinoCreateweb编辑器在板上编译并运行以下TensorFlow示例:
聚焦语音识别实例:micro_speech
使用Arduino板的第一步是让LED闪烁。在这里,我们将通过使用TensorFlowLiteMicro识别语音关键字来实现。它有一个简单的“是”和“否”的词汇表记住这个模型是在一个只有256KB内存的微控制器上本地运行的,所以不要期望商业语音助手的级别精度,它没有互联网连接,并且只有2000倍的本地内存可用。
注意,电路板也可以用电池供电。由于Arduino可以连接到电机、执行器等,这为语音控制项目提供了潜力。
如何使用ArduinoIDE运行示例
您可以使用ArduinoIDE应用程序尝试相同的推理示例
首先,按照下一节中的说明设置ArduinoIDE。
在ArduinoIDE中,您将看到通过ArduinoIDE中的File>Examples>Arduino_TensorFlowLite菜单提供的示例.
选择一个示例,草图将打开。要compile、upload和运行板上的示例,请单击箭头图标:
对于更喜欢命令行的高级用户,还有arduino-cli。
为Arduino训练TensorFlowLiteMicro模型
接下来,我们将使用ML使Arduino板能够识别手势。我们将从ArduinoNano33BLESenseboard中捕获运动数据,将其导入TensorFlow以训练模型,并将生成的分类器部署到board上。
本教程的想法基于CharlieGerard的《使用Arduino和Tensorflow.js进行身体运动的街头拳击手》。在Charlie的例子中,电路板将所有传感器数据从Arduino传输到另一台机器,该机器在Tensorflow.js中执行手势分类。我们通过在Arduino板上执行手势分类来进一步理解和表达它。我们使用的ArduinoNano33BLE感应板有一个更强大的ArmCortex-M4处理器和一个板上IMU,因此这在我们的案例中更容易实现。
我们已经修改了下面的教程,因此不需要额外的硬件采样从检测板的移动开始。本教程的原始版本添加了一个实验板和一个硬件按钮来按下以触发采样。如果你想进入一个小硬件,你可以遵循这个版本。
设置ArduinoIDE
按照以下步骤设置ArduinoIDE应用程序,该应用程序用于将推理模型上载到您的电路板,并在下一节中从电路板下载培训数据。与使用ArduinoCreateweb编辑器相比,还需要执行一些步骤,因为我们需要在ArduinoIDE中下载并安装特定的板和库。
从**https://arduino.cc/downloads**下载并安装ArduinoIDE
打开刚才安装的Arduino应用程序
在ArduinoIDE菜单中,选择Tools>Board>BoardsManager
搜索“NanoBLE”并点击install将其安装到板子上
安装需要几分钟时间。
完成后,关闭BoardsManager窗口。
现在转到LibraryManagerTools>ManageLibraries
搜索并安装Arduino_TensorFlowLite库
下一步搜索并安装Arduino_LSM9DS1库。
最后,将micro-USB电缆插入主板和计算机。
选择电路板Tools>Board>ArduinoNano33BLE
选择端口Tools>Port>COM5(ArduinoNano33BLE)
请注意,计算机上的实际端口名可能不同
如果需要帮助,Arduino网站上有更详细的入门和故障排除指南
来自Arduino板的流式传感器数据(Streamingsensordata)
首先,我们需要获取一些训练数据。您可以从Arduino板上捕获传感器数据日志,所用USB电缆与笔记本电脑或PC程序板相同。
Arduino板运行小型应用程序(也称为草图),这些应用程序由*.ino*格式的Arduino源代码编译而成,并使用ArduinoIDE或Arduino创建程序编程到板上。
我们将使用一个预先制作的草图IMU_Capture.ino,它执行以下操作:
监控电路板的加速度计和陀螺仪
触发检测电路板显著线性加速度的采样窗口
以119Hz采样1秒,通过USB输出CSV格式数据
回圈并监视下一个手势
我们选择从电路板读取的传感器、采样率、触发阈值,以及我们是否将数据流输出为CSV、JSON、二进制或其他格式,都可以在Arduino上运行的草图中自定义。在数据输出到日志之前,还可以在设备上执行信号预处理和过滤,我们可以在另一个博客中讨论这个问题。现在,您只需上传草图并开始采样。
要在ArduinoIDE中使用此草图对电路板进行编程:
下载IMU_Capture.ino并在ArduinoIDE中打开它
用Sketch>upload编译并上传到板上
从Arduino板可视化实时传感器数据日志
完成后,我们现在可以看到从板上下来的数据。我们还没有捕获数据这只是让您了解传感器数据捕获是如何触发的,以及采样窗口有多长。这将有助于收集训练样本。
在ArduinoIDE中,打开串行绘图仪Tools>SerialPlotter如果出现主板不可用的错误,请重新选择端口:
Tools>Port>portname(ArduinoNano33BLE)
拿起板子,练习你的击打和弯曲动作
你只会在一秒钟的窗口中看到它的样本,然后等待下一个手势。
您应该可以看到传感器数据捕获的实时图形(请参见下面的GIF)
ArduinoIDE串行绘图仪将显示从板输出的CSV数据的实时图形
完成后,请确保关闭“串行绘图仪”窗口-这很重要,否则下一步无法工作。
获取手势训练数据
要将数据捕获为CSV日志并upload到TensorFlow,可以使用ArduinoIDE>Tools>SerialMonitor来查看数据并将其导出到桌面计算机:
通过按下顶部的白色小按钮重置电路板
一只手捡起木板(稍后捡起会触发取样)
在ArduinoIDE中,打开串行监视器Tools>SerialMonitor
如果您遇到主板不可用的错误,请重新选择端口:
Tools>Port>portname(ArduinoNano33BLE)
用手中的板做一个打孔手势(做这个动作时要小心!)
以足够快的速度向外击打以触发捕捉
缓慢回到空档位置,以免再次触发捕捉
重复手势捕捉步骤10次或更多次以收集更多数据
将串行控制台中的数据复制并粘贴到名为punch.csv的新文本文件中
清除控制台窗口输出并重复上述所有步骤,这次在名为flex.csv的文件中使用flex手势
使向内弯曲足够快,以触发每次缓慢返回的捕获
注意,两个csv文件的第一行应该包含字段aX、aY、aZ、gX、gY、gZ
Linux提示:如果您愿意,可以将传感器日志输出从Arduino直接重定向到命令行上的.csv文件。关闭串行绘图仪/串行监视器窗口时使用:
$cat/dev/cu.usbmodem[nnnnn]>sensorlog.csv
在TensorFlow中训练
我们将使用GoogleColab使用我们在上一节中从Arduino板收集的数据来训练我们的机器学习模型。Colab提供了一个Jupyter笔记本,允许我们在web浏览器中运行TensorFlow培训。
Colab将引导您完成以下步骤:
设置Python环境
上传punch.csv和flex.csv数据
分析和准备数据
建立和训练模型
将训练模型转换为TensorFlowLite
在Arduino头文件中编码模型
colab的最后一步是生成要下载的model.h文件,并将其包含在下一节的ArduinoIDE手势分类器项目中:
让我们打开Colab的notebook,在单元格中浏览步骤—arduino_tinyml_workshop.ipynb
ClassifyingIMUData
接下来,我们将使用刚刚在ArduinoIDE项目的上一节中从Colab下载的model.h文件:
在ArduinoIDE中打开IMU_Classifier.ino
在IDE中创建一个新的选项卡。当被问到model.h时
打开model.h选项卡并粘贴到从Colab下载的版本中
上传草图:Sketch>Upload
打开串行监视器:Tools>SerialMonitor
做些手势
每个手势的置信度(confidence)将打印到串行监视器上(0=lowconfidence,1=highconfidence)
恭喜你,你刚刚为Arduino训练了第一个ML应用程序!
为了增加乐趣,Emoji_Button.ino示例演示了如何在Linux和macOS中创建打印Emoji字符的USB键盘。尝试将Emoji_Button.ino示例与IMU_Classifier.ino草图结合起来,创建一个手势控制的Emoji键盘
一次制作写字机器人的过程(含制作教程)
由于在家上网课的原因,老师让开学交学习笔记,内容为网课课上所讲的所有内容(意思就是把整个课本抄下来QAQ),然后我就萌生出了做个写字机器人的想法(买一个太贵了,只能自己做)
由于网上的写字机器人种类和样式都非常多,我就挑了个结构相对简单的,如下:
制作教程其中包含完整的所需零配件清单,机器人运动原理,零配件安装指南,arduino烧录代码,机器人控制软件及软件教程等信息下载链接(当时设置的1积分,不知道为什么自己往上涨)
结构原理机器人结构如图:A、B均为一个步进电机,两个电机通过同步带链接并带动整个写字机器人的X、Y轴运动
A顺时针旋转,B逆时针旋转,机器人向+Y轴运动;A逆时针旋转,B顺时针旋转,机器人向-Y轴运动;A顺时针旋转,B顺时针旋转,机器人向+X轴运动;A逆时针旋转,B逆时针旋转,机器人向-X轴运动
遇到的问题打印件扩孔写字机器人需要购买打印件作为框架,在打印件上安装零件,当我买到打印件后,兴冲冲地网上按零件时发现根本安不上去如图,将一个光轴导轨按到打印件上:我买来的打印件与光轴并不匹配,询问卖家才知道打印件还需要扩孔(吃了没文化的亏)
直线轴承安装后并不顺滑,直线轴承的上下翻盖弯曲不能重和扩孔需要一定的技术,比如下面这个安装直线轴承的操作:如果扩孔不当,就会导致直线轴承塞不进去,硬塞就会使得打印件弯曲,然后再合并两个翻盖的时候发生空位对不准的情况
将光轴按到直线轴承里后,有可能会发现不顺滑甚至有卡顿情况,有可能是因为直线轴承本身坏了,也可能是因为两个指向轴承没有对齐,在安装指向轴承到翻盖的时候,一定要使得四个指向轴承处于同一个水平面,不然光轴就会变形
将轴承套到打印件时套不进去或者打印件损坏为了固定同步带,不让其跑偏,需要将轴承推入打印件之中,如:当时打印件可能和轴承并不匹配,压根塞不进去,甚至有可能至极把打印件崩裂。。
可以使用带法兰(凸缘轴承)轴承,比如我就将原本的624zz轴承使用两个f624zz轴承替换
抬笔角度过大导致舵机烧毁写字机器人需要一个舵机用于抬笔落笔操作,舵机将会被安装在写字机器人头部:主要作用是将笔抬起:抬笔由舵机完成,落笔由弹簧或皮筋完成由于舵机是可以旋转180度的,而安装后的舵机的旋转范围不足180度,所以如果控制写字机器人的软件不能设置舵机角度,从而导致舵机无法转向就会烧毁
软件问题我使用的软件是inkscape矢量绘图工具,然后使用inkscape的插件生成G代码,然后在GrblController中执行G代码
使用inkscape的原因是inkscape的插件可以控制舵机角度,不至于将舵机烧毁,但是inkscape画图还行,使用其中自带的文字输入会发生只能写轮廓字的现象
这个现象我看网上有解决方法,但是我不会QAQ,想要写出单线字可以使用微雕大师这个软件,我试了试确实可以写出来单线字,但是界面过于简练,堪称傻瓜操作,我实在找不到在哪设置舵机角度,写了几个字舵机就发烫的不行。。。。
也许想真的写出手写字体就只能用奎享了吧,看网上说的解决方法最后都变成了奎享。。由于没钱买奎享,我也无从得知奎享到底好不好用(==),不过写字机器人确实已经做出来了