自制魅魔頭盔
60 多年過去了,盡管輝光管已經停產,有很多工程師仍然對它情有獨鐘。我用 8 塊液晶顯示屏制作了一個擬輝光管時鐘,感受復古元素的美感,表達對過去經典的敬意。
“聽說在很久以前的原始人時期,有一只形跡可疑的魔獸。它在待命時可以偽裝成路邊的霓虹燈來隱藏自己,用陰暗的閃光恐嚇對手,還能放出迷霧和泡泡困住敵人,令其無處可逃,最終難逃被抓住的命運。”
這段文字來自我一個好朋友的小說設定。當我第一次看到這個設定的時候,我剛剛和同學玩過一場密室游戲。所以我的第一反應是這不就是一個可以在密室游戲里用上的小玩具嘛!所以,我就有了制作一個具有以上功能的可穿戴設備的想法。
設計方案
首先是外觀設計。在我們看到的神話故事中,大部分魔獸(見圖 1)顯著的特征就是兩眼閃著綠光。所以我第一時間就想到了制作一個眼鏡,在上面增加兩個全彩 LED 發出綠光,同時在左右眼鏡腿上分別放置噴霧模塊和泡泡機用于實現放出迷霧和泡泡的功能。但是在制作魅魔眼鏡完原型機(見圖 2)后,我放棄了這個想法。兩個 LED 能實現的綠光光效有限,相對于上面說到的霓虹燈功能差了不少,眼鏡片有限的面積也很難增加 LED。自制的眼鏡框結構不太合理,戴上眼鏡不太穩定,最要命的是泡泡機過于沉重,導致眼鏡經常會從鼻梁上滑下來,在奔跑的時候會更明顯,使用體驗極差。
圖 1 魔獸
圖 2 魅魔眼鏡原型機
基于上面的痛點,我決定在第二版中使用常見的電動車頭盔(見圖 3)進行改造。頭盔前面的半透明面罩足夠大,可以用于放置燈環。頭盔上面有一個3D 打印的小盒子,里面集成了噴霧模塊、泡泡機和主控系統。經過實測,戴上頭盔以后視野會受限,但只能靠摸頭盔頂部的開關來控制頭盔。所以我給它加上了 MPU6050 加速度傳感器,實現點頭切換燈效、左偏開啟 / 關閉泡泡機、右偏開啟 / 關閉噴霧的功能,方便操作。
圖 3 電動車頭盔
硬件設計
燈環
魅魔頭盔共有兩個燈環(見圖 4),每個燈環裝有 12 個 LED,分別安裝在頭盔左右眼的位置,中間鏤空方便使用者觀察外界。
圖 4 燈環
在 LED 的選擇上,為了降低體積、提高 LED密度,我使用了 WS2812-2020(2mm×2mm)封裝的全彩 LED。這種 LED 分為兩種,一種是正常的全彩 LED,里面有 RGB 三色 LED,它的優點是自由度高、價格低,缺點是極其占用單片機的 I/O 接口;魅魔頭盔的 24 個 LED 一共需要 72 個 I/O 接口,而且為了調光調色,這 72 個接口還需要是 PWM 接口,這顯然浪費了資源,所以我使用的是 WS2812 LED(見圖 5),它的內部除了 RGB 三色 LED,還集成了控制芯片,能以級聯的方式控制 24 個 LED,不僅節約了單片機的 I/O 接口,還簡化了布線。同時該LED 支持 Adafruit_NeoPixel、Freenove WS2812等多種驅動庫,方便后期開發。選購 LED 的時候建議選擇霧面 LED,發光效果更好。
圖 5 WS2812 LED
噴霧模塊
魅魔頭盔的噴霧功能使用加濕模塊(見圖 6)實現。加濕模塊一般由超聲波片、驅動模塊以及外圍的結構件組成。通電以后,超聲波片高速震動,把棉棒上的水霧化形成噴霧。
圖 6 加濕模塊
在選購噴霧模塊時,要注意噴霧模塊的開啟方式。大部分市售的噴霧模塊通電以后不會立即噴霧,需要按一下開關才能噴霧,增加了我們用單片機控制的難度。有些模塊的背面有短接點,短接焊盤可以實現上電就噴霧。所以在選購時要買這種帶短接點的模塊,這樣就可以通過供電來控制噴霧模塊了。此外,還要注意噴霧模塊的電壓,大部分噴霧模塊是用 5V 電壓供電的,但是在 3.7V 鋰電池電壓下也能正常工作。
泡泡機
魅魔頭盔的吹泡泡功能采用泡泡機(見圖 7)實現。通電后電機轉動從 A 口吸入空氣,D 口吸入泡泡液,經混合以后從 B 口吹出泡泡。C 口會返回多余的泡泡液和空氣,維持泡泡液瓶內氣壓平衡。我也建議選購成品泡泡機拆出里面的機芯來使用。因為這種泡泡機內置了一個 3.7V 500mAh 鋰電池,可以直接作為本項目的電池,性價比極高。
圖 7 泡泡機
主板上燈環、泡泡機、噴霧模塊的驅動電路是典型的三極管驅動電路,大家可以掃描目錄頁電子資源二維碼獲取電路圖。
主控
魅 魔 頭 盔 的 主 控 對 性 能 要 求 不 高, 常 見 的Arduino、ESP32、STM32 等芯片都能勝任,只要芯片支持單總線通信和I2C通信即可。我選擇了相對比較熟悉的 ESP32 作為主控。為了便于焊接,我用的是 ESP32-WROOM-32E 模塊(見圖 8)。它集成了雙核 240MHz 的 ESP32-D0WD-V3 芯片,原生支持 FreeRTOS 操作系統,對后續開發有所幫助。該模塊有 4MB、8MB、16MB 這 3 種 Flash 可供選擇。頭盔的功能比較簡單,使用 4MB Flash 的版本就可以完全滿足需要。
圖 8 ESP32-WROOM-32E 模塊
MPU6050
前面提到魅魔頭盔使用點頭和偏頭來控制各功能,這一功能可以使用水銀開關(傾斜開關)來實現,但誤觸率較高,我在本項目中用了 MPU6050 加速度傳感器(見圖 9)來測量傾角。MPU6050 使用3.3V 供電,通過 I2C 接口和單片機通信。
圖 9 加速度傳感器
USB轉串口電路
USB 轉串口電路用于給 ESP32 上傳程序,主要 使 用 CH340 模 塊,USB Type-C 接 口 用 于 電源輸入和上傳程序,電阻 R10、R11 用于兼容雙頭USB Type-C 數據線。
相比傳統的 USB Type-C 數據線,雙頭 USB Type-C 數據線從物理上無法區分供電端和受電端,如果不加電阻 R10、R11,使用雙頭 USB Type-C數據線充電時充電器就識別不到是什么設備,加上這2 個電阻后,魅魔頭盔就可以被標識為受電設備,能順利充電。
充電和供電電路
充電部分使用 TP4056 模塊,這是一個很常用的線性降壓充電芯片,只需要很少的外圍元器件就可以實現完整的鋰電池充電功能,支持 5~6.5V 電壓輸入,最大電流可達 1.2A。
XC6206P332MR 是一款壓差在 100mV 以內、最大電流 600mA 的低壓差 LDO,用于將鋰電池的電壓降到 3.3V 給 ESP32 及 CH340 供電。同時兼顧鋰電池低壓保護功能,當電池電壓下降到 3.4V 時,XC6206P332MR 會停止輸出,保護電池不過度放電。
電源開關 SK-3260D-01-L3 如圖 10 左側所示,比較少見。你也可以買圖 10 右側所示的常規開關,然后彎折引腳來實現同樣的效果。
圖 10 兩種開關
在此基礎上使用立創 EDA 專業版設計好魅魔頭盔主板和燈板,PCB 設計如圖 11 和圖 12 所示,3D預覽如圖 13 和圖 14 所示。
圖 11 主板 PCB 設計
圖 12 燈板 PCB 設計
圖 13 主板 3D 預覽
圖 14 燈板 3D 預覽
PCB焊接
首先焊接燈板(見圖 15),在燈板上涂抹錫膏,隨后使用加熱臺完成焊接。
圖 15 焊接燈板
WS2812-2020 封裝的 LED 比較小,且 EDA軟件里面的絲印符號與實物不一致,焊接時需要仔細對照 EDA 和廠商給出的引腳圖,避免焊反。此外,在打板時建議選擇普通的 FR4 硬板,如果選擇了 FPC 軟板,焊接時比較容易彈飛 LED 或者虛焊。尤其是對于級聯設計的 WS2812-2020,如果存在虛焊,后面的 LED 都亮不了,實測后果慘重。
主板的焊接相對比較簡單,先使用加熱臺和錫膏焊接貼片元器件,再用電烙鐵焊接開關,焊接完成的主板如圖 16 所示。
圖 16 焊接完成的主板
頭盔主控部分外殼(見圖 17)采用 Autodesk 123D Design 設計,包括一個外殼和一個上蓋。
圖 17 頭盔主控部分外殼
組裝
1.組裝噴霧部分,將噴霧片壓入模塊外殼,裝上棉棒,塞入 3D 打印外殼。將超聲波片的導線通過外殼上的預留孔穿到中間倉。
2.組裝泡泡機部分,用電烙鐵在 3D 打印外殼適當位置鉆孔,然后用熱熔膠固定泡泡機。
3.連接超聲波霧化片和噴霧驅動模塊,并裝入電池。
4.在主板上焊接 MPU6050 模塊(注意方向),連接各個組件,并用熱熔膠固定主板。
5.在外殼后部開一個小口,引出連接燈板的導線(注意區分線序),合上上蓋,將 3D 打印外殼粘到頭盔上。
6.使用熱熔膠粘貼燈板,并焊接燈板導線,為了提升顯示效果、隱藏燈板本身,我把透明的頭盔面罩換成了茶色的。
7.魅魔頭盔就組裝完成了。
程序設計
完整程序可掃描目錄頁電子資源二維碼獲取,在此僅講解幾個重要部分。
角度傳感
首先在程序開頭添加程序 1,調用 MPU6050庫并設置 3 個變量用于儲存 3 軸角度值。
然后初始化 MPU6050,并設置相應的量程,如程序 2 所示。
最后,循環獲取 3 軸角度數據,如程序 3 所示。
注意程序最后的 delay(20),角度采集程序每 20ms 運行一次。
角度判斷
采集到角度后,需要對其進行判斷。如程序 4所示,dx<-70 時代表點頭,當前光效的 LED 變量加 1,7 種光效都循環后回到 1;dy>25 時代表左偏頭,會改變 Paopao 變量的值,實現偏頭開啟泡泡機,再偏一次關閉泡泡機;dy<25 時代表右偏頭,判斷方式同理。
millis1、millis2、millis3 變量用于實現延時。點頭時有可能因為程序運行過快導致點一次頭被識別成多次的情況。而加入 delay 延時又會導致程序卡在這里,使燈光和角度采集暫停,影響正常使用。所以加入了一個變量 millis1 記錄上一次點頭的上電運行時間。如果下一次點頭比這個時間多 1s,才會認為是正常點頭,否則會視為是同一次點頭。millis2、millis3 變量同理。
角度判斷完畢后,還要執行對應的動作,如程序 5 和程序 6 所示,這部分比較簡單。其中程序 5負責控制噴霧和泡泡的開關,程序 6 負責控制燈效。
燈效
燈效程序太長暫時省略,在此僅介紹必要程序。首先在程序開頭增加程序 7,用于初始化 LED 和設置參數。
然后初始化 LED 并清屏,如程序 8 所示。注意每次清屏后都要更新 LED 顯示狀態,否則無法實現清屏。
程序 9 可實現燈光控制,a 代表控制的是幾號燈(0~23),(x,y,z) 為 RGB 值。注意每次設置顏色后都要更新 LED 顯示狀態。
我設置了多種燈光效果,其中動感霓虹如圖 18所示,流光浮華如圖 19 所示。
圖 18 動感霓虹
圖 19 流光浮華
程序調試
在編寫完程序上傳以后,會出現切換燈效、開關泡泡機、開關噴霧反應很慢的問題。這是因為燈效中用到了延時,導致一個燈效運行完才能采集一次MPU6050 角度數據,也就是說需要一直低頭,直到當前光效顯示完畢后才能切換光效,不符合我們輕輕點一下頭就能切換光效的初衷。
這個問題最好的解決方案是使用 FreeRTOS操作系統,將角度采集、數據轉換、燈效等幾個場景作為獨立的線程并行運行。FreeRTOS 的用戶程序只能運行在一個核心上,意味著低優先級任務是在高優先級任務的延遲時間內完成的,會遇到任務先后執行混亂的問題,導致某些光效始終無法觸發。
我采用了一個更簡單的方法。角度采集程序每20ms 運行一次,我們只要把所有的延時換成角度采集程序就可以了。比如延時 200ms 就重復執行 10次角度采集程序,延時 1000ms 就重復執行 50 次角度采集程序,同時把角度判斷程序中的程序 4 和程序 5 放在角度采集程序中,就完美解決了燈效顯示時無法傳感角度的問題。
成果展示
制作完成的魅魔頭盔如圖 20 所示,怎么樣,還不錯吧!
圖 20 成品圖
結語
從一段小說到一個成品,從一個想法到最后的實現,中間失敗了很多次,也學到了很多知識。最后感謝我的好朋友小 ai(化名)給我提供的靈感,感謝各位同行開源的工程以及各位前輩的指導和建議,希望大家能喜歡這個作品。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.