DIY 鬼屋肖像画:树莓派跳吓项目(更新版)
项目概述
将普通 LCD 显示器改装为运动触发的鬼屋肖像画。使用树莓派 3B、Python 与 AtmosFX Unliving Portrait 视频素材,打造逼真的跳吓效果。本指南涵盖硬件组装、素材准备、Python 脚本编写全流程。
硬件搭建
步骤 1:制作 LCD 画框
拆解 LCD 显示器,测得面板尺寸 17″×11″(竖屏)。使用在线装裱工具定制 1″×2″ 木框,内径匹配面板。面板嵌入框内,外框背部可拆卸。刷木器漆上色,气钉枪固定。
树莓派安装在 3D 打印侧装支架 (Thingiverse) 上。镜架固定 LCD,钻孔引出 PIR 传感器连接树莓派 GPIO 第 7 脚。
步骤 2:准备图片、视频与代码
选用三段 AtmosFX Unliving Portrait 视频(男性、女性、儿童),每段 $7.99,高冲击力跳吓素材。下载 MP4 后重命名为 MaleScare.mp4、FemaleScare.mp4、ChildScare.mp4。
用 VLC 截取各视频首帧作为静态图,保存为 MaleStart.png、FemaleStart.png、ChildStart.png,所有素材置于 ScareMedia 文件夹。
目录结构
/home/pi/Projects/Halloween/
├─ ScareMedia/
│ ├─ MaleStart.png
│ ├─ FemaleStart.png
│ ├─ ChildStart.png
│ ├─ MaleScare.mp4
│ ├─ FemaleScare.mp4
│ └─ ChildScare.mp4
Python 脚本
两个脚本协作:pirDetect.py 读取 PIR 传感器,scare.py 检测到运动时播放视频。
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import os
class detector(object):
def __init__(self, sensor):
self.callBacks = []
self.sensor = sensor
self.currState = False
self.prevState = False
GPIO.setmode(GPIO.BOARD)
GPIO.setup(self.sensor, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
def read(self):
self.prevState = self.currState
self.currState = GPIO.input(self.sensor)
def printState(self):
print(f"GPIO pin {self.sensor} is {'HIGH' if self.currState else 'LOW'}")
def subscribe(self, callBack):
self.callBacks.append(callBack)
def callBack(self, state):
for fn in self.callBacks:
fn(state)
def start(self):
try:
self.read()
self.printState()
while True:
self.read()
if self.currState != self.prevState:
self.printState()
self.callBack(self.currState)
time.sleep(.1)
except (KeyboardInterrupt, SystemExit):
os.system('stty sane')
#!/usr/bin/python
import subprocess as sp
import time
import os
from pirDetect import *
import sys
video = ["omxplayer", "filename", "-o", "both", "--win", "0 0 1280 720",
"--aspect-mode", "fill", "--no-osd", "--orientation", "180", "--vol", "-600"]
scareFile = "/home/pi/Projects/Halloween/ScareMedia/{0}Scare.mp4".format(sys.argv[1])
print(scareFile)
def onMotion(currState):
if currState:
video[1] = scareFile
subVideo = sp.Popen(video)
while subVideo.poll() is None:
time.sleep(.1)
def showImage():
os.system(f"sudo fbi -T 1 -d /dev/fb0 -noverbose -once /home/pi/Projects/Halloween/ScareMedia/{sys.argv[1]}Start.png")
showImage()
objDetect = detector(7)
objDetect.subscribe(onMotion)
objDetect.start()
os.system("sudo killall -9 fbi")
检测到运动时,scare.py 先用 fbi 显示静态图,再用 omxplayer 播放对应视频。视频结束后静态图保留,等待下一次触发。
整合运行
单参数运行选择角色:
python scare.py Male
后续可扩展为随机选段、接入 Pi Camera 记录入侵者。模块化设计便于后续功能迭代。
成品演示视频:YouTube。
技术详情:Possessed Portrait – Updated
制造工艺
- 眼镜框:终极时尚配饰
- 液晶显示器(LCD):技术、制造与未来展望
- Primal Display:树莓派 LCD 温度监测仪
- Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
- 自制 AI LCD 陪伴机器人:你的互动小伙伴
- 打造可靠的 Arduino 气象站:DHT 传感器 + LCD + RTC
- 用蜂鸣器和摇杆制作经典 Arduino LCD 街机游戏
- 用 XOD 可视化编程为 Arduino 快速构建 LCD 菜单系统,零代码实现
- DIY Arduino LCD 游戏机:16x2 字符屏打造“躲避防守队员”足球小游戏
- 用 DS1302 RTC 和 Arduino UNO 制作可靠闹钟
- 元素周期表——纵向视图
- CDS 推出 ClearVue3DP:高亮度 3D 透明 LCD,无缝集成