【2025电源模块创意大赛】基于MPM3519供电的吓人姬

基于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灯带环绕闪烁及喇叭发声实现惊吓效果,模块化设计确保低功耗与高可靠性。