Edge語(yǔ)音如何控制智能電源插頭
如今,智能插頭很流行。它們通常附帶一個(gè)匹配的手機(jī)應(yīng)用程序,可以從App Store下載。它們有WiFi / BLE功能,應(yīng)用程序有助于控制它們。他們還可以選擇與Alexa等家庭助手集成。這也使得在Alexa或類(lèi)似云服務(wù)的幫助下使用語(yǔ)音控制來(lái)控制插頭成為可能。
盡管如此,這仍然需要往返于云服務(wù)和接入無(wú)線(xiàn)網(wǎng)絡(luò)進(jìn)行通信。將語(yǔ)音控制功能引入Edge,并將其與Smart Plug本身結(jié)合起來(lái)怎么樣?
有許多品牌和型號(hào)的智能插頭可用。其中一些使用CB2S (Tuya)或ESP02S等通信模塊。這些模塊上有WiFi / BLE無(wú)線(xiàn)電,使通信和控制成為可能。
我們的想法是打開(kāi)智能插頭外殼,用我們自己的一個(gè)具有本地語(yǔ)音控制能力的通信模塊替換通信模塊。
讓我們開(kāi)始吧!
但首先講一些背景故事……
背景故事(可選)
幾年前,當(dāng)我還小的時(shí)候,我在有線(xiàn)電視頻道上看到了一部孟加拉語(yǔ)的電視電影。在當(dāng)時(shí)不同尋常的是,這是一部科幻劇,講述了一個(gè)失明的人類(lèi)女士和一個(gè)安卓機(jī)器人生活在一起的故事。故事的大部分我都記不起來(lái)了,除了一個(gè)特定的場(chǎng)景,她躺在床上,以有限的周期序列不停地說(shuō)出兩個(gè)詞(當(dāng)然是孟加拉語(yǔ))……光線(xiàn)黑暗……
房間里的頂燈對(duì)她做出了相應(yīng)的反應(yīng),在她繼續(xù)走一會(huì)兒的時(shí)候不停地開(kāi)關(guān)。
這個(gè)項(xiàng)目是對(duì)這個(gè)美麗故事的致敬,因?yàn)槲以噲D復(fù)制語(yǔ)音操作的電燈開(kāi)關(guān)。
謹(jǐn)慎
智能插頭工作在交流電源上,它們將高電壓轉(zhuǎn)換成低電平的直流電壓,以滿(mǎn)足控制器電路的需要。如果沒(méi)有適當(dāng)?shù)闹R(shí)或采取必要的預(yù)防措施,使用交流電源電路是非常危險(xiǎn)的,可能會(huì)危及生命。任何不正確的接線(xiàn)都可能導(dǎo)致短路和危及黑客或用戶(hù)生命的電擊危險(xiǎn)。因此,請(qǐng)注意,如果您繼續(xù)執(zhí)行此項(xiàng)目,請(qǐng)自行承擔(dān)風(fēng)險(xiǎn)。作為這個(gè)項(xiàng)目的作者和創(chuàng)造者,我不承擔(dān)任何不幸的責(zé)任。
基礎(chǔ)工作
這個(gè)項(xiàng)目的核心部分是一個(gè)名為“Orthosie”的定制模塊,它由NINA-B306射頻模塊供電,并具有一個(gè)微型PDM麥克風(fēng)。該模塊需要使用正確的固件進(jìn)行閃現(xiàn),最后使用合適的語(yǔ)音識(shí)別機(jī)器學(xué)習(xí)模型進(jìn)行編程,該模型與NINA模塊的GPIO集成,以向插頭繼電器發(fā)送正確的驅(qū)動(dòng)信號(hào)。
該模塊的詳細(xì)信息將在本教程的代碼部分中添加。Github存儲(chǔ)庫(kù)詳細(xì)介紹了該模塊的構(gòu)造和原理圖,包括pinout
第一步
除非有智能插頭,否則我們黑不了。所以我去附近的雜貨店買(mǎi)了一個(gè)
我們必須把它打開(kāi),才能在內(nèi)部電路上工作。
再次提醒你一句!不要將插頭連接到交流電源,并嘗試在此工作。在接通電源之前,電路必須密封并安全安裝。使用暴露的dac電源電路可能會(huì)危及生命!如果您不了解與此實(shí)現(xiàn)相關(guān)的危險(xiǎn),請(qǐng)不要嘗試處理此問(wèn)題。您只應(yīng)嘗試自行承擔(dān)此項(xiàng)目的風(fēng)險(xiǎn)。
考慮到前面提到的注意事項(xiàng),我們可以嘗試撬開(kāi)塞子。我用一把馬格南小刀撬開(kāi)了圍墻。用鋒利的刀工作也是很危險(xiǎn)的。
經(jīng)過(guò)幾次刺和拉刀后,側(cè)面開(kāi)始打開(kāi)
在剩下的3面重復(fù)同樣的動(dòng)作完成工作,頂部現(xiàn)在是松散的
讓我們把電路拿出來(lái)看看里面
讓拆焊開(kāi)始吧
一旦我們有電路開(kāi)箱,它的時(shí)間來(lái)拆解現(xiàn)有的控制器模塊板。像往常一樣,使用助焊劑是必不可少的,以使焊料融化掉
使用烙鐵和焊錫芯,焊錫可以很容易地吸收到金屬網(wǎng)和接頭清潔
一旦完成,模塊就會(huì)脫落
建筑Orthosie
好吧,我們從PCB制造商制造的PCB開(kāi)始(建議最好的方法,除非你在家里有6層精密PCB制造解決方案),我們讓它保持靜止(我稱(chēng)之為“Hold the Board”或“Hoboard”:))-
通過(guò)將其他未使用的電路板設(shè)置在旁邊并應(yīng)用錫膏,使其進(jìn)一步不可移動(dòng)
它只需要原理圖中提到的幾個(gè)部件
我們把配料放在面團(tuán)上,讓它烘烤!現(xiàn)在這一步可以通過(guò)幾種方式實(shí)現(xiàn),具體取決于可用的設(shè)備(回流爐,熱風(fēng)焊站,焊錫板等)。
一旦比賽結(jié)束,頂部就準(zhǔn)備好了
現(xiàn)在我們關(guān)注底部,它只需要一個(gè)組件,PDM麥克風(fēng)
為此,我使用熱風(fēng)焊接
完成矯形器硬件模塊的組裝。
我們開(kāi)始談?wù)掳?/strong>
現(xiàn)在插頭硬件已經(jīng)準(zhǔn)備好與Orthosie模塊配合,我們需要先準(zhǔn)備模塊。這是一個(gè)引腳的模塊,包括所有的接口引腳-
如前所述,該模塊由uBlox的NINA-B306射頻模塊供電。在購(gòu)買(mǎi)的原始形式中,射頻模塊沒(méi)有任何固件。該模塊采用北歐半導(dǎo)體芯片NRF52840,與“Arduino Nano BLE Sense”板相同。
我們與Orthosie的第一份工作是加載Arduino Nano BLE Sense固件。這可以在模塊上的軟件調(diào)試(SWD)接口引腳的幫助下完成。我們需要一個(gè)Segger J-Link調(diào)試器單元和Segger J-Flash軟件來(lái)完成這項(xiàng)工作。
對(duì)于與SWD引腳的機(jī)械界面,我使用了如下所示的pogo引腳夾裝置。左邊是SWD接口(3x2引腳連接器)。右側(cè)為USB Serial接口(4x1引腳接口)。引腳距離為2.54 mm。
“Arduino Nano BLE Sense”固件的閃爍只需要SWD接口。當(dāng)使用USB接口時(shí),SWD接口pogo連接器夾僅用于為芯片供電。
固件安裝
這一步需要Segger JLink軟件調(diào)試器。我使用了Arduino庫(kù)文件夾中的十六進(jìn)制文件“Arduino Nano BLE Sense”。使用Segger工具集中的JFlash對(duì)空白NINA-B306模塊上的固件進(jìn)行flash。這需要在JFlash項(xiàng)目上進(jìn)行很少的配置。我使用的配置為NRF52840芯片
最后是編程配置
一旦啟動(dòng)加載程序。在JFlash窗口和連接到Orthosie模塊的硬件裝置上拖放十六進(jìn)制文件,可以選擇生產(chǎn)編程(這是純粹的厚臉皮)-
一旦完成,彈出確認(rèn)閃爍完成-
項(xiàng)目準(zhǔn)備好了
一旦模塊與固件一起閃現(xiàn),該設(shè)備在Arduino IDE上顯示為“Arduino Nano 33 BLE”設(shè)備。除此之外,兩個(gè)pogo連接器夾到位,Orthosie模塊準(zhǔn)備使用Arduino IDE編程,就像任何其他“Arduino Nano BLE Sense”一樣。
下圖是該模塊與NINA-B306、Arduino Nano BLE和ESP-02S對(duì)比的引腳圖。
請(qǐng)注意。Arduino Nano BLE引腳與Orthosie模塊相同
Orthosie模塊在電路板的前面安裝了一個(gè)PDM Mic,當(dāng)我們運(yùn)行預(yù)先編程的語(yǔ)音識(shí)別草圖時(shí),它將用于收聽(tīng),并帶有邏輯控制,通過(guò)智能插頭接口的接口引腳發(fā)送適當(dāng)?shù)男盘?hào)。
構(gòu)建語(yǔ)音識(shí)別ML模型
Arduino文檔詳細(xì)說(shuō)明了如何使用Arduino Nano BLE Sense構(gòu)建用于語(yǔ)音識(shí)別的機(jī)器學(xué)習(xí)模型。我決定在這個(gè)項(xiàng)目中利用同樣的東西。文檔鏈接如下
邊緣脈沖教程與Arduino納米BLE感
說(shuō)明說(shuō)要為特定命令生成自己的語(yǔ)音樣本。我開(kāi)始了這個(gè)旅程,但在創(chuàng)建了大約144個(gè)語(yǔ)音樣本后放棄了。典型的數(shù)據(jù)集每條命令至少需要100個(gè)樣本。每個(gè)命令使用超過(guò)1000個(gè)樣本會(huì)產(chǎn)生更好的結(jié)果。然而,它永遠(yuǎn)不會(huì)是最好的,因?yàn)闄C(jī)器學(xué)習(xí)模型只不過(guò)是對(duì)輸入數(shù)據(jù)的數(shù)學(xué)猜測(cè)。
為了快速開(kāi)始模型,我使用了Tensorflow語(yǔ)音命令數(shù)據(jù)集,該數(shù)據(jù)集具有有限數(shù)量的.wav格式語(yǔ)音命令樣本。數(shù)據(jù)集鏈接如下
在整個(gè)數(shù)據(jù)集中,我決定將重點(diǎn)放在一些隨機(jī)單詞上,例如- 'marvin', ‘visual‘, ‘zero’和’on’。下面是生成的模型的結(jié)果(使用Edge Impulse studio)和使用混淆矩陣-的測(cè)試性能報(bào)告
一旦模型建立,我們就可以從邊緣脈沖工作室的部署部分導(dǎo)出這個(gè)作為Arduino庫(kù)
我冒昧地自己制作了這個(gè)模型,并把它放在Github上,同時(shí)還有一個(gè)智能插頭接口的工作示例。到Github repo的鏈接在附件一節(jié)中提到。
了解軟件
現(xiàn)在所有的拼圖都整理出來(lái)了,我們現(xiàn)在可以開(kāi)始準(zhǔn)備將在Orthosie模塊上運(yùn)行的草圖,并使用語(yǔ)音控制幫助控制智能插頭。
樣例草圖構(gòu)造了以下體系結(jié)構(gòu)-
這意味著有兩種不同的方式與智能插頭進(jìn)行交互,在它被預(yù)先編程的矯形器模塊入侵之后。
草圖運(yùn)行在以下流算法上-
設(shè)備監(jiān)聽(tīng)喚醒詞。在識(shí)別喚醒字后,設(shè)備允許5秒的窗口來(lái)收聽(tīng)命令字,并在接收命令后相應(yīng)地采取行動(dòng),并使用正確的配置更新GPIO接口,以觸發(fā)繼電器和智能插頭上的可選led。
一旦BLE掃描儀設(shè)備與模塊建立連接,該流將進(jìn)入BLE子流并繼續(xù),直到掃描儀斷開(kāi)連接。然后,BLE接口可以選擇發(fā)送命令來(lái)打開(kāi)或關(guān)閉繼電器。一旦斷開(kāi)連接,控制將返回到主流,設(shè)備將繼續(xù)再次收聽(tīng)喚醒詞。
在樣例草圖中,我將喚醒詞配置為“Marvin”。該ML模型支持的命令字分別為“Visual”和“zero”,分別表示打開(kāi)和關(guān)閉。你問(wèn)為什么用這么奇怪的詞?這些是我能找到的訓(xùn)練數(shù)據(jù)集中最不相關(guān)的樣本命令。
讓我們把注意力集中在草圖上
草圖有一個(gè)樣本實(shí)現(xiàn)和擴(kuò)展從邊緣脈沖構(gòu)建庫(kù),可以在這里找到
主要任務(wù)是對(duì)聲音進(jìn)行語(yǔ)音識(shí)別,并識(shí)別是否提到了喚醒詞(“marvin”)。
一旦該值為true,則在有限的時(shí)間內(nèi)將標(biāo)志設(shè)置為true,在此期間它將偵聽(tīng)命令字(‘visual’或‘zero’) -
BLE連接循環(huán)在主循環(huán)內(nèi)運(yùn)行,等待來(lái)自BLE客戶(hù)端的傳入BLE連接。這只是一個(gè)原型,我沒(méi)有編寫(xiě)任何硬安全措施。這意味著任何客戶(hù)端都可以連接。一旦草圖運(yùn)行,設(shè)備就會(huì)標(biāo)榜自己是BLE連接和智能插頭服務(wù)的“Orthosie”。
一旦客戶(hù)端設(shè)備(智能手機(jī)BLE應(yīng)用程序,如nRFConnect或LightBlue)連接草圖進(jìn)入子循環(huán),它期望一個(gè)值被覆蓋為BLE特性。這個(gè)值就像0x1打開(kāi)插頭和0x0關(guān)閉插頭一樣簡(jiǎn)單。
如何編程?
如前所述,Orthosie可以在Arduino IDE的幫助下進(jìn)行編程。因此,從Github下載庫(kù)并配置IDE來(lái)編寫(xiě)草圖。但是我們需要使用前面展示的相同的彈簧高蹺裝置來(lái)連接和編程設(shè)備。模塊前面的接觸點(diǎn)所需的連接如下圖所示
草圖第一次在我的計(jì)算機(jī)上編譯大約5 - 10分鐘,之后Arduino IDE將能夠成功上傳草圖。
上傳完成
Arduino IDE可以幫助測(cè)試/調(diào)試,這里是測(cè)試用例的序列
1. 測(cè)試喚醒字
2. 測(cè)試用語(yǔ)音打開(kāi)插頭
3. 測(cè)試用聲音關(guān)閉插頭
對(duì)于BLE,它有點(diǎn)類(lèi)似,但我們需要BLE客戶(hù)端連接到設(shè)備
1. 連接設(shè)備
2. 通過(guò)將特征值設(shè)置為0x1來(lái)打開(kāi)插頭
3. 通過(guò)將特征值設(shè)置為0x0來(lái)關(guān)閉插頭
我們已經(jīng)準(zhǔn)備好進(jìn)入下一階段!
將模塊焊接在插板上
把板子插到智能插頭上。
這是智能插頭上已安裝模塊的現(xiàn)成視圖。根據(jù)品牌和型號(hào),模塊的方向可能會(huì)有所不同。
讓我們來(lái)測(cè)試
這里有一個(gè)鏈接,視頻的語(yǔ)音命令測(cè)試的黑客智能插頭
測(cè)試BLE控件
最后是BLE控制測(cè)試的視頻
我用LightBlue App測(cè)試了連接。這是非?;镜?,因?yàn)樗邮軆蓚€(gè)十六進(jìn)制值(0x0表示關(guān)閉,0x1表示打開(kāi))來(lái)控制智能插頭。
大家好……哦,等一下!
在創(chuàng)造者的世界里,總是有一些東西需要改進(jìn),沒(méi)有什么是在最后一步。語(yǔ)音識(shí)別模型總是可以進(jìn)一步調(diào)整和增強(qiáng)。根據(jù)插頭的外殼,語(yǔ)音控制可以是距離敏感的。我不是特別滿(mǎn)意BLE的范圍(最大3米視線(xiàn))渲染近距離操作。
本文編譯自hackster.io





