自制“盒中怪兽”万圣节道具:Arduino 机器人项目完整指南
项目简介
“盒中怪兽”是一个经典的万圣节互动道具:一个看似普通的木箱,内部潜伏着“怪兽”。当路人靠近触发红外传感器时,箱盖剧烈跳动、红光闪烁、烟雾喷涌、咆哮声大作,营造出极具冲击力的惊悚效果。本项目基于 Arduino UNO,结合 Wave Shield 音频扩展板、继电器模块、雨刮电机、烟雾机等模块,实现声、光、动、烟多维联动。代码采用状态机架构,时序精准、扩展性强,适合进阶 Maker 与万圣节爱好者复刻或二次开发。
核心组件清单
| 组件 | 数量 | 关键参数/备注 |
|---|---|---|
| 木箱(自制) | 1 | 约 90×75×75 cm,松木拼接,内部加固螺丝 |
| Arduino UNO | 1 | 主控板 |
| Adafruit Wave Shield | 1 | 音频播放,占用引脚 2,3,4,5,10,11,12,13 |
| 4 路继电器模块 | 1 | 控制电机、红灯、烟雾机,**需使用常开(NO)触点** |
| 汽车雨刮电机 | 1 | 12 V,带曲柄臂,扭矩大,适合驱动凸轮 |
| 红色 LED 串灯(100 粒) | 1 | 箱内“地狱之光”效果 |
| 烟雾机(400 W) | 1 | 改装接收板,并联继电器触发 |
| 功放/音箱(30 W 以上) | 1 | 接 Wave Shield 3.5 mm 音频输出 |
| PIR 人体红外传感器 | 1 | 唤醒触发,藏于箱外灌木丛 |
| ATX 电源 | 1 | 取 12 V 轨供电机、烟雾机、灯带 |
| 暂停按钮、指示 LED | 若干 | 外部面板,便于现场控制 |
机械结构制作要点
1. 木箱制作与做旧
- 用 15 根 6 英尺松木栅栏板,台锯切料,气动钉枪组装,后补 1 英寸干墙螺丝内攻外出加固。
- 红茶+醋+钢丝绒反应液刷涂做旧,喷漆模板贴纸增加真实感。
2. 箱盖跳动机构(凸轮+滚轮)
- 雨刮电机固定箱侧壁,输出轴装 12 英寸直径 12 mm 厚胶合板凸轮。
- 凸轮用曲线锯随机切割“锯齿”,制造非周期性跳动节奏。
- 箱盖底部用 L 型支架+尼龙隔离柱+马车螺栓安装滚轮,压在凸轮顶端。
- 反复微调电机高度与滚轮位置,直到箱盖起伏约 5 cm、运行平稳。
3. 烟雾与灯光集成
- 烟雾机原装遥控接收板焊接两根导线并联至继电器常开触点,Arduino 控制触发。
- 加装旧吸尘器软管导流烟雾至箱盖缝隙,减少箱内冷凝。
- 红色 LED 串灯剪断电源线接入另一路继电器,实现全亮/全灭。
4. 音频系统
- Wave Shield 读取 SD 卡上的 WAV 文件(打呼噜、低吼、咆哮)。
- 3.5 mm 音频线接入贝斯功放,保证低音下潜,增强威慑力。
电子原理图与接线逻辑
详见项目附件原理图(Schematics 部分)。关键引脚分配如下:
- D6: 烟雾机继电器
- D7: 红灯继电器
- D8: 箱盖电机继电器
- A0: PIR 传感器输入
- A1: 运动检测指示 LED
- A2: 暂停状态指示 LED
- A3: 就绪待机指示 LED
- A4: 暂停按钮(上拉输入)
- A5: 调试按钮(上拉输入)
Wave Shield 占用引脚不可更改,其余模拟口均可作数字 I/O 使用。
固件架构亮点(Ver 4)
- 状态机主循环:INIT → PAUSED → SLEEPING → READY_TO_WAKE → AWAKE,逻辑清晰、易维护。
- 非阻塞定时:全部采用
millis()差值判断,彻底移除delay(),解决串口占用导致无法烧录问题。 - 继电器改常开触点:掉电/复位时默认断开,更安全。
- 多层指示灯:实时显示运动检测、就绪、暂停三种状态。
- 效果延时分离:红灯与烟雾可比箱盖电机多运行 1~2 秒,视觉层次更丰富。
- 可配置参数:唤醒冷却、最小/最大清醒时长、延时时长均在宏定义处修改,无需改动逻辑。
核心代码片段(状态机与效果控制)
enum States { STATE_INITIALIZE, STATE_PAUSED, STATE_SLEEPING,
STATE_READY_TO_WAKE, STATE_AWAKE };
States state = STATE_INITIALIZE;
void loop() {
bool pausePressed = digitalRead(PAUSE_BUTTON) == LOW;
bool motionDetected = digitalRead(PIR_SENSOR) == HIGH;
digitalWrite(MOTION_LED, motionDetected);
switch (state) {
case STATE_INITIALIZE:
pausePressed ? goToPause() : goToSleep(); break;
case STATE_PAUSED:
if (!pausePressed) { goToSleep(); digitalWrite(PAUSED_LED, LOW); }
else digitalWrite(PAUSED_LED, HIGH); break;
case STATE_SLEEPING:
if (pausePressed) goToPause();
else if (isAllowedToWake()) goToReadyToWake();
else processSleeping(); break;
case STATE_READY_TO_WAKE:
if (pausePressed) { goToPause(); digitalWrite(READY_LED, LOW); }
else if (motionDetected) { goToAwake(); digitalWrite(READY_LED, LOW); }
else processSleeping(); break;
case STATE_AWAKE:
if (pausePressed) goToPause();
else if (processAwakeAnimation()) goToSleep(); break;
}
}
// 非阻塞效果控制示例:箱盖电机
inline void bounceLid(unsigned long duration) {
if (duration == 0) { energizeRelay(LID_BOUNCER); lidBounceDuration = 0; }
else { de_energizeRelay(LID_BOUNCER); lidBounceTimer = millis(); lidBounceDuration = duration; }
}
// 继电器常开触点:LOW 导通,HIGH 断开
inline void de_energizeRelay(int ch) { digitalWrite(ch, LOW); }
inline void energizeRelay(int ch) { digitalWrite(ch, HIGH); }
调试与实战技巧
- 机械对中:凸轮-滚轮同心度直接影响寿命,建议先用手转电机轴试运行,再上电。
- 烟雾机改装:焊接前用万用表确认触点极性,避免短路烧毁接收板。
- PIR 灵敏度:电位器调节至约 5 英尺触发,避免误触发。
- 暂停按钮:仅切断信号电压,主电源保持通电,重启更快。
- 链条快拆:弹簧卡扣+螺丝眼,单手即可拆卸链条检修内部。
未来扩展方向
- 加入 RC 遥控模块,远程暂停/触发。
- 箱盖位置反馈(限位开关或编码器),防止卡在开启位置暴露内部结构。
- 环境频闪灯接入 Arduino 统一编排。
- 升级为 ESP32 实现 Wi-Fi 远程监控与 OTA 固件更新。
资源下载
- 完整固件、原理图、3D 打印锁模型:GitHub 仓库
- Wave Shield 库安装:
Arduino IDE → 库管理器 → 搜索 "WaveHC"
安全提示:12 V/120 V 混合供电务必做好绝缘;烟雾机加热芯高温,勿触碰;现场运行时确保行人有足够躲避空间,避免跌倒受伤。
制造工艺
- 脑电图仪:设计、制造与新兴应用
- 果汁盒革命:历史、设计与环境影响
- 自动售货机:美国366亿美元的产业巨头
- 现代换币机专家指南:设计、组件与未来趋势
- 缝纫机演进:从19世纪创新到现代自动化制造
- 连裤袜:优雅女性长筒袜终极指南
- 自制家用作业书写机:Arduino + GRBL 控制的笔绘仪
- Giftduino:面向极客与教育者的终极 Arduino 礼物盒
- 用 Arduino 制作超声波悬浮装置:分步指南
- 紧凑型气象站:Arduino Nano + ESP8266 双核方案 (BMP280 + OLED/Nokia 双屏)
- 基于有限状态机的 Arduino 电子表 – YAKINDU Statechart Tools 实战
- 利用 Arduino Nano R3 自制全功能 CNC 雕刻机