DIY «Оживлённый портрет» на Raspberry Pi: проект с прыжковым скачком (обновлено)
Обзор проекта
Превратите обычный LCD-монитор в жуткий, активируемый движением «оживлённый портрет». Используя Raspberry Pi 3 B, Python и видео AtmosFX Unliving Portrait, можно создать реалистичный скачок, реагирующий на движение. Это пошаговое руководство охватывает сборку железа, подготовку изображений/видео и Python-скрипты для оживления страха.
Аппаратная часть
Шаг 1: Сборка рамки LCD
После разборки монитора я измерил размеры панели: 17″ × 11″ (портрет). С помощью онлайн-инструмента для рамок выпилил раму 1″ × 2″ с внутренними размерами, соответствующими панели. LCD вставляется плотно, а внешняя рамка остаётся доступной сзади. Раму тонировал, затем закрепил гвоздезабивателем.
Затем закрепил Raspberry Pi на 3D-печатном боковом креплении (Thingiverse). Держатели зеркала фиксируют LCD, и я просверлил отверстие для PIR-датчика для подключения к GPIO Pi (пин 7).
Шаг 2: Подготовка изображений, видео и кода
Я выбрал три видео AtmosFX Unliving Portrait (Мужчина, Женщина, Ребёнок) для разнообразия. Каждое видео стоит $7.99 и содержит высококачественный контент для скачков. AtmosFX предоставляет скачиваемые 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-камеру для записи Eindringling. Модульная архитектура сохраняет гибкость для будущих улучшений.
Для визуальной демонстрации смотрите готовый «оживлённый портрет» в действии: YouTube Video.
Полное техническое описание: Possessed Portrait – Updated
Производственный процесс
- Периодическая таблица — портретная ориентация
- Оправы очков: главный модный аксессуар
- Жидкокристаллические дисплеи (LCD): технология, производство и перспективы
- CDS представляет ClearVue3DP: высокояркие 3D прозрачные LCD для бесшовной интеграции
- Primal Display: создайте монитор температуры на Raspberry Pi с LCD
- Создание анимации и игр на LCD 16×2 с Arduino UNO
- Создайте ИИ-компаньона на LCD: интерактивный друг на Arduino
- Надежная погодная станция на Arduino с датчиками DHT
- DIY-проект Arduino LCD: сборка с резисторами, кнопкой и дисплеем 16x2
- Надёжные будильник на DS1302 RTC и Arduino UNO — сборка и код