自制魅魔头盔
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(化名)给我提供的灵感,感谢各位同行开源的工程以及各位前辈的指导和建议,希望大家能喜欢这个作品。