自制魅魔頭盔
60 多年過(guò)去了,盡管輝光管已經(jīng)停產(chǎn),有很多工程師仍然對(duì)它情有獨(dú)鐘。我用 8 塊液晶顯示屏制作了一個(gè)擬輝光管時(shí)鐘,感受復(fù)古元素的美感,表達(dá)對(duì)過(guò)去經(jīng)典的敬意。
“聽(tīng)說(shuō)在很久以前的原始人時(shí)期,有一只形跡可疑的魔獸。它在待命時(shí)可以偽裝成路邊的霓虹燈來(lái)隱藏自己,用陰暗的閃光恐嚇對(duì)手,還能放出迷霧和泡泡困住敵人,令其無(wú)處可逃,最終難逃被抓住的命運(yùn)。”
這段文字來(lái)自我一個(gè)好朋友的小說(shuō)設(shè)定。當(dāng)我第一次看到這個(gè)設(shè)定的時(shí)候,我剛剛和同學(xué)玩過(guò)一場(chǎng)密室游戲。所以我的第一反應(yīng)是這不就是一個(gè)可以在密室游戲里用上的小玩具嘛!所以,我就有了制作一個(gè)具有以上功能的可穿戴設(shè)備的想法。
設(shè)計(jì)方案
首先是外觀設(shè)計(jì)。在我們看到的神話故事中,大部分魔獸(見(jiàn)圖 1)顯著的特征就是兩眼閃著綠光。所以我第一時(shí)間就想到了制作一個(gè)眼鏡,在上面增加兩個(gè)全彩 LED 發(fā)出綠光,同時(shí)在左右眼鏡腿上分別放置噴霧模塊和泡泡機(jī)用于實(shí)現(xiàn)放出迷霧和泡泡的功能。但是在制作魅魔眼鏡完原型機(jī)(見(jiàn)圖 2)后,我放棄了這個(gè)想法。兩個(gè) LED 能實(shí)現(xiàn)的綠光光效有限,相對(duì)于上面說(shuō)到的霓虹燈功能差了不少,眼鏡片有限的面積也很難增加 LED。自制的眼鏡框結(jié)構(gòu)不太合理,戴上眼鏡不太穩(wěn)定,最要命的是泡泡機(jī)過(guò)于沉重,導(dǎo)致眼鏡經(jīng)常會(huì)從鼻梁上滑下來(lái),在奔跑的時(shí)候會(huì)更明顯,使用體驗(yàn)極差。

圖 1 魔獸

圖 2 魅魔眼鏡原型機(jī)
基于上面的痛點(diǎn),我決定在第二版中使用常見(jiàn)的電動(dòng)車(chē)頭盔(見(jiàn)圖 3)進(jìn)行改造。頭盔前面的半透明面罩足夠大,可以用于放置燈環(huán)。頭盔上面有一個(gè)3D 打印的小盒子,里面集成了噴霧模塊、泡泡機(jī)和主控系統(tǒng)。經(jīng)過(guò)實(shí)測(cè),戴上頭盔以后視野會(huì)受限,但只能靠摸頭盔頂部的開(kāi)關(guān)來(lái)控制頭盔。所以我給它加上了 MPU6050 加速度傳感器,實(shí)現(xiàn)點(diǎn)頭切換燈效、左偏開(kāi)啟 / 關(guān)閉泡泡機(jī)、右偏開(kāi)啟 / 關(guān)閉噴霧的功能,方便操作。

圖 3 電動(dòng)車(chē)頭盔
硬件設(shè)計(jì)
燈環(huán)
魅魔頭盔共有兩個(gè)燈環(huán)(見(jiàn)圖 4),每個(gè)燈環(huán)裝有 12 個(gè) LED,分別安裝在頭盔左右眼的位置,中間鏤空方便使用者觀察外界。

圖 4 燈環(huán)
在 LED 的選擇上,為了降低體積、提高 LED密度,我使用了 WS2812-2020(2mm×2mm)封裝的全彩 LED。這種 LED 分為兩種,一種是正常的全彩 LED,里面有 RGB 三色 LED,它的優(yōu)點(diǎn)是自由度高、價(jià)格低,缺點(diǎn)是極其占用單片機(jī)的 I/O 接口;魅魔頭盔的 24 個(gè) LED 一共需要 72 個(gè) I/O 接口,而且為了調(diào)光調(diào)色,這 72 個(gè)接口還需要是 PWM 接口,這顯然浪費(fèi)了資源,所以我使用的是 WS2812 LED(見(jiàn)圖 5),它的內(nèi)部除了 RGB 三色 LED,還集成了控制芯片,能以級(jí)聯(lián)的方式控制 24 個(gè) LED,不僅節(jié)約了單片機(jī)的 I/O 接口,還簡(jiǎn)化了布線。同時(shí)該LED 支持 Adafruit_NeoPixel、Freenove WS2812等多種驅(qū)動(dòng)庫(kù),方便后期開(kāi)發(fā)。選購(gòu) LED 的時(shí)候建議選擇霧面 LED,發(fā)光效果更好。

圖 5 WS2812 LED
噴霧模塊
魅魔頭盔的噴霧功能使用加濕模塊(見(jiàn)圖 6)實(shí)現(xiàn)。加濕模塊一般由超聲波片、驅(qū)動(dòng)模塊以及外圍的結(jié)構(gòu)件組成。通電以后,超聲波片高速震動(dòng),把棉棒上的水霧化形成噴霧。

圖 6 加濕模塊
在選購(gòu)噴霧模塊時(shí),要注意噴霧模塊的開(kāi)啟方式。大部分市售的噴霧模塊通電以后不會(huì)立即噴霧,需要按一下開(kāi)關(guān)才能?chē)婌F,增加了我們用單片機(jī)控制的難度。有些模塊的背面有短接點(diǎn),短接焊盤(pán)可以實(shí)現(xiàn)上電就噴霧。所以在選購(gòu)時(shí)要買(mǎi)這種帶短接點(diǎn)的模塊,這樣就可以通過(guò)供電來(lái)控制噴霧模塊了。此外,還要注意噴霧模塊的電壓,大部分噴霧模塊是用 5V 電壓供電的,但是在 3.7V 鋰電池電壓下也能正常工作。
泡泡機(jī)
魅魔頭盔的吹泡泡功能采用泡泡機(jī)(見(jiàn)圖 7)實(shí)現(xiàn)。通電后電機(jī)轉(zhuǎn)動(dòng)從 A 口吸入空氣,D 口吸入泡泡液,經(jīng)混合以后從 B 口吹出泡泡。C 口會(huì)返回多余的泡泡液和空氣,維持泡泡液瓶?jī)?nèi)氣壓平衡。我也建議選購(gòu)成品泡泡機(jī)拆出里面的機(jī)芯來(lái)使用。因?yàn)檫@種泡泡機(jī)內(nèi)置了一個(gè) 3.7V 500mAh 鋰電池,可以直接作為本項(xiàng)目的電池,性價(jià)比極高。

圖 7 泡泡機(jī)
主板上燈環(huán)、泡泡機(jī)、噴霧模塊的驅(qū)動(dòng)電路是典型的三極管驅(qū)動(dòng)電路,大家可以掃描目錄頁(yè)電子資源二維碼獲取電路圖。
主控
魅 魔 頭 盔 的 主 控 對(duì) 性 能 要 求 不 高, 常 見(jiàn) 的Arduino、ESP32、STM32 等芯片都能勝任,只要芯片支持單總線通信和I2C通信即可。我選擇了相對(duì)比較熟悉的 ESP32 作為主控。為了便于焊接,我用的是 ESP32-WROOM-32E 模塊(見(jiàn)圖 8)。它集成了雙核 240MHz 的 ESP32-D0WD-V3 芯片,原生支持 FreeRTOS 操作系統(tǒng),對(duì)后續(xù)開(kāi)發(fā)有所幫助。該模塊有 4MB、8MB、16MB 這 3 種 Flash 可供選擇。頭盔的功能比較簡(jiǎn)單,使用 4MB Flash 的版本就可以完全滿足需要。

圖 8 ESP32-WROOM-32E 模塊
MPU6050
前面提到魅魔頭盔使用點(diǎn)頭和偏頭來(lái)控制各功能,這一功能可以使用水銀開(kāi)關(guān)(傾斜開(kāi)關(guān))來(lái)實(shí)現(xiàn),但誤觸率較高,我在本項(xiàng)目中用了 MPU6050 加速度傳感器(見(jiàn)圖 9)來(lái)測(cè)量?jī)A角。MPU6050 使用3.3V 供電,通過(guò) I2C 接口和單片機(jī)通信。

圖 9 加速度傳感器
USB轉(zhuǎn)串口電路
USB 轉(zhuǎn)串口電路用于給 ESP32 上傳程序,主要 使 用 CH340 模 塊,USB Type-C 接 口 用 于 電源輸入和上傳程序,電阻 R10、R11 用于兼容雙頭USB Type-C 數(shù)據(jù)線。
相比傳統(tǒng)的 USB Type-C 數(shù)據(jù)線,雙頭 USB Type-C 數(shù)據(jù)線從物理上無(wú)法區(qū)分供電端和受電端,如果不加電阻 R10、R11,使用雙頭 USB Type-C數(shù)據(jù)線充電時(shí)充電器就識(shí)別不到是什么設(shè)備,加上這2 個(gè)電阻后,魅魔頭盔就可以被標(biāo)識(shí)為受電設(shè)備,能順利充電。
充電和供電電路
充電部分使用 TP4056 模塊,這是一個(gè)很常用的線性降壓充電芯片,只需要很少的外圍元器件就可以實(shí)現(xiàn)完整的鋰電池充電功能,支持 5~6.5V 電壓輸入,最大電流可達(dá) 1.2A。
XC6206P332MR 是一款壓差在 100mV 以內(nèi)、最大電流 600mA 的低壓差 LDO,用于將鋰電池的電壓降到 3.3V 給 ESP32 及 CH340 供電。同時(shí)兼顧鋰電池低壓保護(hù)功能,當(dāng)電池電壓下降到 3.4V 時(shí),XC6206P332MR 會(huì)停止輸出,保護(hù)電池不過(guò)度放電。
電源開(kāi)關(guān) SK-3260D-01-L3 如圖 10 左側(cè)所示,比較少見(jiàn)。你也可以買(mǎi)圖 10 右側(cè)所示的常規(guī)開(kāi)關(guān),然后彎折引腳來(lái)實(shí)現(xiàn)同樣的效果。

圖 10 兩種開(kāi)關(guān)
在此基礎(chǔ)上使用立創(chuàng) EDA 專業(yè)版設(shè)計(jì)好魅魔頭盔主板和燈板,PCB 設(shè)計(jì)如圖 11 和圖 12 所示,3D預(yù)覽如圖 13 和圖 14 所示。

圖 11 主板 PCB 設(shè)計(jì)

圖 12 燈板 PCB 設(shè)計(jì)

圖 13 主板 3D 預(yù)覽

圖 14 燈板 3D 預(yù)覽
PCB焊接
首先焊接燈板(見(jiàn)圖 15),在燈板上涂抹錫膏,隨后使用加熱臺(tái)完成焊接。

圖 15 焊接燈板
WS2812-2020 封裝的 LED 比較小,且 EDA軟件里面的絲印符號(hào)與實(shí)物不一致,焊接時(shí)需要仔細(xì)對(duì)照 EDA 和廠商給出的引腳圖,避免焊反。此外,在打板時(shí)建議選擇普通的 FR4 硬板,如果選擇了 FPC 軟板,焊接時(shí)比較容易彈飛 LED 或者虛焊。尤其是對(duì)于級(jí)聯(lián)設(shè)計(jì)的 WS2812-2020,如果存在虛焊,后面的 LED 都亮不了,實(shí)測(cè)后果慘重。
主板的焊接相對(duì)比較簡(jiǎn)單,先使用加熱臺(tái)和錫膏焊接貼片元器件,再用電烙鐵焊接開(kāi)關(guān),焊接完成的主板如圖 16 所示。

圖 16 焊接完成的主板
頭盔主控部分外殼(見(jiàn)圖 17)采用 Autodesk 123D Design 設(shè)計(jì),包括一個(gè)外殼和一個(gè)上蓋。

圖 17 頭盔主控部分外殼
組裝
1.組裝噴霧部分,將噴霧片壓入模塊外殼,裝上棉棒,塞入 3D 打印外殼。將超聲波片的導(dǎo)線通過(guò)外殼上的預(yù)留孔穿到中間倉(cāng)。


2.組裝泡泡機(jī)部分,用電烙鐵在 3D 打印外殼適當(dāng)位置鉆孔,然后用熱熔膠固定泡泡機(jī)。


3.連接超聲波霧化片和噴霧驅(qū)動(dòng)模塊,并裝入電池。

4.在主板上焊接 MPU6050 模塊(注意方向),連接各個(gè)組件,并用熱熔膠固定主板。

5.在外殼后部開(kāi)一個(gè)小口,引出連接燈板的導(dǎo)線(注意區(qū)分線序),合上上蓋,將 3D 打印外殼粘到頭盔上。

6.使用熱熔膠粘貼燈板,并焊接燈板導(dǎo)線,為了提升顯示效果、隱藏?zé)舭灞旧?,我把透明的頭盔面罩換成了茶色的。

7.魅魔頭盔就組裝完成了。

程序設(shè)計(jì)
完整程序可掃描目錄頁(yè)電子資源二維碼獲取,在此僅講解幾個(gè)重要部分。
角度傳感
首先在程序開(kāi)頭添加程序 1,調(diào)用 MPU6050庫(kù)并設(shè)置 3 個(gè)變量用于儲(chǔ)存 3 軸角度值。

然后初始化 MPU6050,并設(shè)置相應(yīng)的量程,如程序 2 所示。

最后,循環(huán)獲取 3 軸角度數(shù)據(jù),如程序 3 所示。

注意程序最后的 delay(20),角度采集程序每 20ms 運(yùn)行一次。
角度判斷
采集到角度后,需要對(duì)其進(jìn)行判斷。如程序 4所示,dx<-70 時(shí)代表點(diǎn)頭,當(dāng)前光效的 LED 變量加 1,7 種光效都循環(huán)后回到 1;dy>25 時(shí)代表左偏頭,會(huì)改變 Paopao 變量的值,實(shí)現(xiàn)偏頭開(kāi)啟泡泡機(jī),再偏一次關(guān)閉泡泡機(jī);dy<25 時(shí)代表右偏頭,判斷方式同理。
millis1、millis2、millis3 變量用于實(shí)現(xiàn)延時(shí)。點(diǎn)頭時(shí)有可能因?yàn)槌绦蜻\(yùn)行過(guò)快導(dǎo)致點(diǎn)一次頭被識(shí)別成多次的情況。而加入 delay 延時(shí)又會(huì)導(dǎo)致程序卡在這里,使燈光和角度采集暫停,影響正常使用。所以加入了一個(gè)變量 millis1 記錄上一次點(diǎn)頭的上電運(yùn)行時(shí)間。如果下一次點(diǎn)頭比這個(gè)時(shí)間多 1s,才會(huì)認(rèn)為是正常點(diǎn)頭,否則會(huì)視為是同一次點(diǎn)頭。millis2、millis3 變量同理。

角度判斷完畢后,還要執(zhí)行對(duì)應(yīng)的動(dòng)作,如程序 5 和程序 6 所示,這部分比較簡(jiǎn)單。其中程序 5負(fù)責(zé)控制噴霧和泡泡的開(kāi)關(guān),程序 6 負(fù)責(zé)控制燈效。

燈效
燈效程序太長(zhǎng)暫時(shí)省略,在此僅介紹必要程序。首先在程序開(kāi)頭增加程序 7,用于初始化 LED 和設(shè)置參數(shù)。

然后初始化 LED 并清屏,如程序 8 所示。注意每次清屏后都要更新 LED 顯示狀態(tài),否則無(wú)法實(shí)現(xiàn)清屏。

程序 9 可實(shí)現(xiàn)燈光控制,a 代表控制的是幾號(hào)燈(0~23),(x,y,z) 為 RGB 值。注意每次設(shè)置顏色后都要更新 LED 顯示狀態(tài)。

我設(shè)置了多種燈光效果,其中動(dòng)感霓虹如圖 18所示,流光浮華如圖 19 所示。

圖 18 動(dòng)感霓虹

圖 19 流光浮華
程序調(diào)試
在編寫(xiě)完程序上傳以后,會(huì)出現(xiàn)切換燈效、開(kāi)關(guān)泡泡機(jī)、開(kāi)關(guān)噴霧反應(yīng)很慢的問(wèn)題。這是因?yàn)闊粜е杏玫搅搜訒r(shí),導(dǎo)致一個(gè)燈效運(yùn)行完才能采集一次MPU6050 角度數(shù)據(jù),也就是說(shuō)需要一直低頭,直到當(dāng)前光效顯示完畢后才能切換光效,不符合我們輕輕點(diǎn)一下頭就能切換光效的初衷。
這個(gè)問(wèn)題最好的解決方案是使用 FreeRTOS操作系統(tǒng),將角度采集、數(shù)據(jù)轉(zhuǎn)換、燈效等幾個(gè)場(chǎng)景作為獨(dú)立的線程并行運(yùn)行。FreeRTOS 的用戶程序只能運(yùn)行在一個(gè)核心上,意味著低優(yōu)先級(jí)任務(wù)是在高優(yōu)先級(jí)任務(wù)的延遲時(shí)間內(nèi)完成的,會(huì)遇到任務(wù)先后執(zhí)行混亂的問(wèn)題,導(dǎo)致某些光效始終無(wú)法觸發(fā)。
我采用了一個(gè)更簡(jiǎn)單的方法。角度采集程序每20ms 運(yùn)行一次,我們只要把所有的延時(shí)換成角度采集程序就可以了。比如延時(shí) 200ms 就重復(fù)執(zhí)行 10次角度采集程序,延時(shí) 1000ms 就重復(fù)執(zhí)行 50 次角度采集程序,同時(shí)把角度判斷程序中的程序 4 和程序 5 放在角度采集程序中,就完美解決了燈效顯示時(shí)無(wú)法傳感角度的問(wèn)題。
成果展示
制作完成的魅魔頭盔如圖 20 所示,怎么樣,還不錯(cuò)吧!

圖 20 成品圖
結(jié)語(yǔ)
從一段小說(shuō)到一個(gè)成品,從一個(gè)想法到最后的實(shí)現(xiàn),中間失敗了很多次,也學(xué)到了很多知識(shí)。最后感謝我的好朋友小 ai(化名)給我提供的靈感,感謝各位同行開(kāi)源的工程以及各位前輩的指導(dǎo)和建議,希望大家能喜歡這個(gè)作品。
熱門(mén)跟貼