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





