Edge语音如何控制智能电源插头
扫描二维码
随时随地手机看文章
如今,智能插头很流行。它们通常附带一个匹配的手机应用程序,可以从App Store下载。它们有WiFi / BLE功能,应用程序有助于控制它们。他们还可以选择与Alexa等家庭助手集成。这也使得在Alexa或类似云服务的帮助下使用语音控制来控制插头成为可能。
尽管如此,这仍然需要往返于云服务和接入无线网络进行通信。将语音控制功能引入Edge,并将其与Smart Plug本身结合起来怎么样?
有许多品牌和型号的智能插头可用。其中一些使用CB2S (Tuya)或ESP02S等通信模块。这些模块上有WiFi / BLE无线电,使通信和控制成为可能。
我们的想法是打开智能插头外壳,用我们自己的一个具有本地语音控制能力的通信模块替换通信模块。
让我们开始吧!
但首先讲一些背景故事……
背景故事(可选)
几年前,当我还小的时候,我在有线电视频道上看到了一部孟加拉语的电视电影。在当时不同寻常的是,这是一部科幻剧,讲述了一个失明的人类女士和一个安卓机器人生活在一起的故事。故事的大部分我都记不起来了,除了一个特定的场景,她躺在床上,以有限的周期序列不停地说出两个词(当然是孟加拉语)……光线黑暗……
房间里的顶灯对她做出了相应的反应,在她继续走一会儿的时候不停地开关。
这个项目是对这个美丽故事的致敬,因为我试图复制语音操作的电灯开关。
谨慎
智能插头工作在交流电源上,它们将高电压转换成低电平的直流电压,以满足控制器电路的需要。如果没有适当的知识或采取必要的预防措施,使用交流电源电路是非常危险的,可能会危及生命。任何不正确的接线都可能导致短路和危及黑客或用户生命的电击危险。因此,请注意,如果您继续执行此项目,请自行承担风险。作为这个项目的作者和创造者,我不承担任何不幸的责任。
基础工作
这个项目的核心部分是一个名为“Orthosie”的定制模块,它由NINA-B306射频模块供电,并具有一个微型PDM麦克风。该模块需要使用正确的固件进行闪现,最后使用合适的语音识别机器学习模型进行编程,该模型与NINA模块的GPIO集成,以向插头继电器发送正确的驱动信号。
该模块的详细信息将在本教程的代码部分中添加。Github存储库详细介绍了该模块的构造和原理图,包括pinout
第一步
除非有智能插头,否则我们黑不了。所以我去附近的杂货店买了一个
我们必须把它打开,才能在内部电路上工作。
再次提醒你一句!不要将插头连接到交流电源,并尝试在此工作。在接通电源之前,电路必须密封并安全安装。使用暴露的dac电源电路可能会危及生命!如果您不了解与此实现相关的危险,请不要尝试处理此问题。您只应尝试自行承担此项目的风险。
考虑到前面提到的注意事项,我们可以尝试撬开塞子。我用一把马格南小刀撬开了围墙。用锋利的刀工作也是很危险的。
经过几次刺和拉刀后,侧面开始打开
在剩下的3面重复同样的动作完成工作,顶部现在是松散的
让我们把电路拿出来看看里面
让拆焊开始吧
一旦我们有电路开箱,它的时间来拆解现有的控制器模块板。像往常一样,使用助焊剂是必不可少的,以使焊料融化掉
使用烙铁和焊锡芯,焊锡可以很容易地吸收到金属网和接头清洁
一旦完成,模块就会脱落
建筑Orthosie
好吧,我们从PCB制造商制造的PCB开始(建议最好的方法,除非你在家里有6层精密PCB制造解决方案),我们让它保持静止(我称之为“Hold the Board”或“Hoboard”:))-
通过将其他未使用的电路板设置在旁边并应用锡膏,使其进一步不可移动
它只需要原理图中提到的几个部件
我们把配料放在面团上,让它烘烤!现在这一步可以通过几种方式实现,具体取决于可用的设备(回流炉,热风焊站,焊锡板等)。
一旦比赛结束,顶部就准备好了
现在我们关注底部,它只需要一个组件,PDM麦克风
为此,我使用热风焊接
完成矫形器硬件模块的组装。
我们开始谈正事吧
现在插头硬件已经准备好与Orthosie模块配合,我们需要先准备模块。这是一个引脚的模块,包括所有的接口引脚-
如前所述,该模块由uBlox的NINA-B306射频模块供电。在购买的原始形式中,射频模块没有任何固件。该模块采用北欧半导体芯片NRF52840,与“Arduino Nano BLE Sense”板相同。
我们与Orthosie的第一份工作是加载Arduino Nano BLE Sense固件。这可以在模块上的软件调试(SWD)接口引脚的帮助下完成。我们需要一个Segger J-Link调试器单元和Segger J-Flash软件来完成这项工作。
对于与SWD引脚的机械界面,我使用了如下所示的pogo引脚夹装置。左边是SWD接口(3x2引脚连接器)。右侧为USB Serial接口(4x1引脚接口)。引脚距离为2.54 mm。
“Arduino Nano BLE Sense”固件的闪烁只需要SWD接口。当使用USB接口时,SWD接口pogo连接器夹仅用于为芯片供电。
固件安装
这一步需要Segger JLink软件调试器。我使用了Arduino库文件夹中的十六进制文件“Arduino Nano BLE Sense”。使用Segger工具集中的JFlash对空白NINA-B306模块上的固件进行flash。这需要在JFlash项目上进行很少的配置。我使用的配置为NRF52840芯片
最后是编程配置
一旦启动加载程序。在JFlash窗口和连接到Orthosie模块的硬件装置上拖放十六进制文件,可以选择生产编程(这是纯粹的厚脸皮)-
一旦完成,弹出确认闪烁完成-
项目准备好了
一旦模块与固件一起闪现,该设备在Arduino IDE上显示为“Arduino Nano 33 BLE”设备。除此之外,两个pogo连接器夹到位,Orthosie模块准备使用Arduino IDE编程,就像任何其他“Arduino Nano BLE Sense”一样。
下图是该模块与NINA-B306、Arduino Nano BLE和ESP-02S对比的引脚图。
请注意。Arduino Nano BLE引脚与Orthosie模块相同
Orthosie模块在电路板的前面安装了一个PDM Mic,当我们运行预先编程的语音识别草图时,它将用于收听,并带有逻辑控制,通过智能插头接口的接口引脚发送适当的信号。
构建语音识别ML模型
Arduino文档详细说明了如何使用Arduino Nano BLE Sense构建用于语音识别的机器学习模型。我决定在这个项目中利用同样的东西。文档链接如下
边缘脉冲教程与Arduino纳米BLE感
说明说要为特定命令生成自己的语音样本。我开始了这个旅程,但在创建了大约144个语音样本后放弃了。典型的数据集每条命令至少需要100个样本。每个命令使用超过1000个样本会产生更好的结果。然而,它永远不会是最好的,因为机器学习模型只不过是对输入数据的数学猜测。
为了快速开始模型,我使用了Tensorflow语音命令数据集,该数据集具有有限数量的.wav格式语音命令样本。数据集链接如下
在整个数据集中,我决定将重点放在一些随机单词上,例如- 'marvin', ‘visual‘, ‘zero’和’on’。下面是生成的模型的结果(使用Edge Impulse studio)和使用混淆矩阵-的测试性能报告
一旦模型建立,我们就可以从边缘脉冲工作室的部署部分导出这个作为Arduino库
我冒昧地自己制作了这个模型,并把它放在Github上,同时还有一个智能插头接口的工作示例。到Github repo的链接在附件一节中提到。
了解软件
现在所有的拼图都整理出来了,我们现在可以开始准备将在Orthosie模块上运行的草图,并使用语音控制帮助控制智能插头。
样例草图构造了以下体系结构-
这意味着有两种不同的方式与智能插头进行交互,在它被预先编程的矫形器模块入侵之后。
草图运行在以下流算法上-
设备监听唤醒词。在识别唤醒字后,设备允许5秒的窗口来收听命令字,并在接收命令后相应地采取行动,并使用正确的配置更新GPIO接口,以触发继电器和智能插头上的可选led。
一旦BLE扫描仪设备与模块建立连接,该流将进入BLE子流并继续,直到扫描仪断开连接。然后,BLE接口可以选择发送命令来打开或关闭继电器。一旦断开连接,控制将返回到主流,设备将继续再次收听唤醒词。
在样例草图中,我将唤醒词配置为“Marvin”。该ML模型支持的命令字分别为“Visual”和“zero”,分别表示打开和关闭。你问为什么用这么奇怪的词?这些是我能找到的训练数据集中最不相关的样本命令。
让我们把注意力集中在草图上
草图有一个样本实现和扩展从边缘脉冲构建库,可以在这里找到
主要任务是对声音进行语音识别,并识别是否提到了唤醒词(“marvin”)。
一旦该值为true,则在有限的时间内将标志设置为true,在此期间它将侦听命令字(‘visual’或‘zero’) -
BLE连接循环在主循环内运行,等待来自BLE客户端的传入BLE连接。这只是一个原型,我没有编写任何硬安全措施。这意味着任何客户端都可以连接。一旦草图运行,设备就会标榜自己是BLE连接和智能插头服务的“Orthosie”。
一旦客户端设备(智能手机BLE应用程序,如nRFConnect或LightBlue)连接草图进入子循环,它期望一个值被覆盖为BLE特性。这个值就像0x1打开插头和0x0关闭插头一样简单。
如何编程?
如前所述,Orthosie可以在Arduino IDE的帮助下进行编程。因此,从Github下载库并配置IDE来编写草图。但是我们需要使用前面展示的相同的弹簧高跷装置来连接和编程设备。模块前面的接触点所需的连接如下图所示
草图第一次在我的计算机上编译大约5 - 10分钟,之后Arduino IDE将能够成功上传草图。
上传完成
Arduino IDE可以帮助测试/调试,这里是测试用例的序列
1. 测试唤醒字
2. 测试用语音打开插头
3. 测试用声音关闭插头
对于BLE,它有点类似,但我们需要BLE客户端连接到设备
1. 连接设备
2. 通过将特征值设置为0x1来打开插头
3. 通过将特征值设置为0x0来关闭插头
我们已经准备好进入下一阶段!
将模块焊接在插板上
把板子插到智能插头上。
这是智能插头上已安装模块的现成视图。根据品牌和型号,模块的方向可能会有所不同。
让我们来测试
这里有一个链接,视频的语音命令测试的黑客智能插头
测试BLE控件
最后是BLE控制测试的视频
我用LightBlue App测试了连接。这是非常基本的,因为它接受两个十六进制值(0x0表示关闭,0x1表示打开)来控制智能插头。
大家好……哦,等一下!
在创造者的世界里,总是有一些东西需要改进,没有什么是在最后一步。语音识别模型总是可以进一步调整和增强。根据插头的外壳,语音控制可以是距离敏感的。我不是特别满意BLE的范围(最大3米视线)渲染近距离操作。
本文编译自hackster.io





