基于MPM3519供电的吓人姬 作者:
一、作品简介
基于MPM3519供电的吓人姬。系统通过人体存在雷达传感器检测人体接近后,自动触发LED双眼发光、恐怖语音播放及舵机驱动面罩抬升的联动响应。MPS电源模块(MPM3519+MPM54304)为多电压域负载提供稳定供电,整体框架支持后期扩展48V电机平台。
物料清单:
| 类型 | 型号/名称 | 数量 | 功能说明 |
|---|---|---|---|
| 主控制器 | 树莓派5 | 1 | 核心计算、Web服务器及数据库管理 |
| 协处理器 | ESP32S3 | 1 | 传感器数据采集与轻量AI分析 |
| 必选电源模块 | MPM3519 | 1 | 36V/10A同步降压,为电机组提供稳定供电 |
| 必选电源模块 | MPM54304 | 1 | I²C控制4路输出(0.5-5.5V/3A),管理舵机及传感器阵列 |
| 传感器 | 人体感应雷达传感器 | 1 | 检测人体接近 |
| 执行器 | 舵机 | 2 | 控制机械姬面罩抬升动作 |
| 显示 | LED灯珠 | 2 | 实现双眼可变光效 |
| 采集设备 | 摄像头 | 1 | 触发时自动抓拍图像 |
二、系统框图
本方案围绕“智能交互场景下的多模态感知与执行”展开,核心逻辑是通过传感器感知环境与人体状态,经由核心控制器(XIAO ESP32S3 Sense)处理数据并决策,最终驱动执行器完成交互动作,实现“感知→决策→执行”的闭环智能控制。
供电逻辑:MPM3519为XIAO ESP32S3 Sense、传感器、执行器提供电源,保障系统运行。
传感器输入:人体雷达感应、光照传感器的信号输入XIAO ESP32S3 Sense,作为“是否触发交互”的判断依据。
执行器输出:XIAO ESP32S3 Sense通过GPIO输出控制信号,驱动舵机(抬起/放下面罩)、RGB灯带(闪烁)、喇叭(发声)。
三、各部分功能说明
(一)硬件架构
方案以XIAO ESP32S3 Sense为核心控制器,整合“传感器→核心控制器→执行器”的硬件链路,各模块功能如下:
传感器模块
人体人体存在雷达感应:检测是否存在人体,触发交互逻辑的“触发条件”。
光照传感器:检测环境是否为夜晚,辅助判断“场景模式”(如夜晚触发特定交互)。
核心控制器
选用XIAO ESP32S3 Sense,其核心硬件特性为:
集成2.4GHz Wi-Fi与Bluetooth 5(LE),支持远距离通信与低功耗蓝牙;
搭载Xtensa® 32位双核处理器(主频240MHz),内置512KB SRAM,支持AI加速(向量指令);
配备45个可编程GPIO,支持SPI、I2S、I2C等丰富外设接口,满足传感器与执行器的连接需求。
执行器模块
舵机:驱动“抬起面罩/放下面罩”动作,实现物理交互;
RGB灯带(WS2811芯片):通过GPIO控制灯带颜色与闪烁模式,营造视觉氛围;
喇叭(音频芯片):播放声音(如“吓人一跳”的音效),实现听觉交互。
电源模块
MPM3519:为系统提供供电,保障各模块稳定运行。
(二)软件架构(逻辑层)
软件层面围绕“传感器数据采集→处理→执行器控制”展开,核心逻辑为:
传感器数据采集:通过GPIO读取人体人体存在雷达感应、光照传感器的信号,判断“是否有人”“是否夜晚”等状态;
核心控制器决策:基于传感器状态,通过ESP32S3的程序逻辑判断是否触发交互动作(如夜晚有人时触发“吓人”逻辑);
执行器控制:通过GPIO输出控制信号,驱动舵机动作、RGB灯带闪烁、喇叭发声,完成交互。
四、作品源码
import time
import board
import digitalio
import neopixel_write
import busio
import espcamera
import sdcardio
import storage
import pwmio
from adafruit_motor import servo
import os
# 硬件初始化
input_pin = digitalio.DigitalInOut(board.A1)
input_pin.direction = digitalio.Direction.INPUT
led_pin = digitalio.DigitalInOut(board.A3)
led_pin.direction = digitalio.Direction.OUTPUT
BLUE = bytearray([0, 255, 255])
OFF = bytearray([0, 0, 0])
# 摄像头初始化
i2c = busio.I2C(scl=board.CAM_SCL, sda=board.CAM_SDA)
cam = espcamera.Camera(
data_pins=board.CAM_DATA,
external_clock_pin=board.CAM_XCLK,
pixel_clock_pin=board.CAM_PCLK,
vsync_pin=board.CAM_VSYNC,
href_pin=board.CAM_HREF,
pixel_format=espcamera.PixelFormat.JPEG,
frame_size=espcamera.FrameSize.QVGA,
i2c=i2c,
external_clock_frequency=20_000_000,
framebuffer_count=1
)
def init_sd_card():
try:
busio.SPI(clock=board.D8, MOSI=board.D10, MISO=board.D9).deinit()
except:
pass
sd_spi = busio.SPI(clock=board.D8, MOSI=board.D10, MISO=board.D9)
sd_cs = board.LED
sdcard = sdcardio.SDCard(sd_spi, sd_cs)
vfs = storage.VfsFat(sdcard)
storage.mount(vfs, "/sd")
return (sd_spi, sdcard)
def release_sd_card(sd_spi, sdcard):
storage.umount("/sd")
sdcard.deinit()
sd_spi.deinit()
def get_next_filename(base_path="/sd", prefix="img", extension="jpg"):
max_num = 0
try:
files = os.listdir(base_path)
for f in files:
if f.startswith(prefix) and f.endswith(extension):
try:
num = int(f[len(prefix):-len(extension)-1])
max_num = max(max_num, num)
except ValueError:
continue
except OSError:
pass
return f"{base_path}/{prefix}{max_num+1:04d}.{extension}"
def take_photo():
sd_spi, sdcard = init_sd_card()
filename = get_next_filename()
frame = cam.take(1)
if isinstance(frame, memoryview):
with open(filename, "wb") as f:
f.write(frame)
print(f"Saved photo to {filename}")
release_sd_card(sd_spi, sdcard)
return filename
def set_servo_angle(angle):
try:
busio.SPI(clock=board.D8, MOSI=board.D10, MISO=board.D9).deinit()
except:
pass
pwm = pwmio.PWMOut(board.D10, frequency=50)
my_servo = servo.Servo(pwm, min_pulse=500, max_pulse=2500)
if 0 <= angle <= 180:
my_servo.angle = angle
print(f"Servo moved to {angle}°")
my_servo.angle = None
pwm.deinit()
def process_high_trigger():
print("High level detected - starting sequence")
take_photo()
set_servo_angle(60)
neopixel_write.neopixel_write(led_pin, BLUE)
take_photo()
time.sleep(10)
set_servo_angle(0)
neopixel_write.neopixel_write(led_pin, OFF)
take_photo()
print("Sequence completed")
last_trigger_time = 0
set_servo_angle(0)
#上电稳定时间
time.sleep(20)
while True:
current_time = time.monotonic()
if input_pin.value and (current_time - last_trigger_time) > 30:
process_high_trigger()
last_trigger_time = current_time
time.sleep(0.1)
五、 作品功能演示视频
https://www.bilibili.com/video/BV1oayeBeEnx/
六、项目总结
本项目以XIAO ESP32S3 Sense为核心,通过光照传感器和人体雷达感应模块实现环境与人体状态检测,结合舵机、RGB灯带(WS2811驱动)及音频芯片构成执行系统,由MPM3519统一供电。系统基于“感知-决策-执行”逻辑,夜晚检测到人体时,通过舵机快速抬放面罩、RGB灯带环绕闪烁及喇叭发声实现惊吓效果,模块化设计确保低功耗与高可靠性。






