Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Retrato poseído - Actualizado

Retrato de bricolaje saltar y asustar desde cero con Raspberry Pi 3 B, Python y AtmosFX Videos retratos sin vida. Estamos en octubre de nuevo y quería idear un proyecto de Halloween usando una Raspberry Pi. Vi algunos retratos encantados esparcidos aquí y allá, pero ninguno de ellos presentaba mucho en forma de susto, solo un simple movimiento.

Decidí expandir esa idea y comencé a buscar algunos videos buenos del tipo de miedo a saltar que pudiera usar. Esto me llevó a AtmosFx, tienen algunos videos de Unliving Portrait realmente geniales que cuestan solo $ 7.99 cada uno. Estos eran perfectos para lo que tenía en mente y me permitieron tener más de un video de miedo a saltar que podía seleccionar manualmente o ejecutar cada uno al azar.

Aquí hay un video del proyecto terminado.

No quería escribir el código PIR desde cero, así que busqué en la web ejemplos de cómo acceder al PIR con Python. Encontré un artículo antiguo de Arc Software que mostraba un proyecto similar.

El código que estoy presentando es principalmente de su ejemplo, pero le hice varias modificaciones para satisfacer mis necesidades.

PASO 1:Construya el marco de la pantalla LCD

Después de desmontar el monitor LCD y quitar el panel LCD y los componentes electrónicos, mido el tamaño exacto de la pantalla 17 X 11, en orientación vertical.

Usé esta herramienta en línea para averiguar cómo medir los cortes de mi marco para que se ajusten a mi panel LCD.

Construí un marco de madera usando madera de 1 ″ x 2 ″ que tendría una dimensión interior de 17 ″ x 11 ″, que sostendría la pantalla LCD. Corté 4 piezas que enmarcadas juntas serían del tamaño exacto de mi LCD y monté la LCD en el marco e hice que la LCD quedara al ras con el marco de la LCD. El marco de la imagen se adhiere al marco de la pantalla LCD y deja todos los componentes electrónicos accesibles desde la parte posterior.

Después de teñir el marco de la imagen y dejarlo secar, utilicé una clavadora para sujetar el marco de la imagen al marco de la pantalla LCD.

Marco LCD ensamblado

Luego monté la Raspberry Pi usando un pequeño y agradable soporte de Thingiverse.com (Pi Side Mount) que imprimí con mi impresora 3D.

Usé soportes de espejo para atornillar la pantalla LCD en su lugar para evitar que se mueva y mantenerla alineada con la parte frontal del marco contra el marco de la imagen.

El paso final del ensamblaje fue perforar un todo para el sensor PIR y adjuntarlo al encabezado GPIO del Pi. El PIR es bastante simple, tiene un pin de sensor, tierra y caliente.

PASO 2:Imágenes, videos y código

Usé tres de los videos de Unliving Portrait de AtmosFX en mi proyecto.

El primer obstáculo fue lograr que el video se reprodujera cuando se detectó movimiento, no solo en bucle constante en la pantalla. Podría cargar el video y luego pausarlo en el primer cuadro y luego, cuando haya movimiento, hacer que continúe reproduciéndose y, cuando se complete, reiniciar y comenzar de nuevo.

Sería más sencillo mostrar una imagen fija del primer cuadro y luego, cuando se detecte movimiento, encienda OMXPlayer para reproducir el archivo de video apropiado. La ventaja de esto es que cuando OMXPlayer saliera, la imagen cargada todavía estaría en el framebuffer y en la pantalla.

Para mostrar la imagen inicial utilicé el FBI de Linux (visor de imágenes framebuffer).

El reproductor utilizado es OMXPlayer y, aunque admite pausas, no hay un comando de línea de comandos que pueda llamar en Python para pausar y jugar sin implementar algo como DBuscontrol que complicaría demasiado el proyecto.

Estructura de carpetas:

La estructura de carpetas a continuación coincide con las rutas en el script para acceder a las imágenes y videos. La ruta se puede cambiar siempre que las rutas en los scripts se actualicen para que coincidan.

Estructura de carpeta requerida para que coincida con las rutas de la secuencia de comandos

Imágenes:

Entonces, para cada video, lo cargué en VLC e hice una captura de pantalla del primer fotograma con la misma resolución en la que estaba el video para que se superpusieran perfectamente en la pantalla con el video cuando se reproducía. .

Los tres videos eran de un hombre, una mujer y un niño, así que tomé una captura de pantalla de cada uno y los nombré MaleStart.png, FemaleStart.png y ChildStart.png. Creé una carpeta en mi proyecto de Halloween llamada ScareMedia y cargué las 3 imágenes fijas.

Vídeos:

Luego nombré a cada video MaleScare.mp4, FemaleScare.mp4 y ChildScare.mp4, y los cargué en la carpeta ScareMedia.

Código:

Se necesitan 2 secuencias de comandos para automatizar los videos en la detección de movimiento.

pirDetect.py

#! / usr / bin / python
importar RPi.GPIO como GPIO
tiempo de importación
importar os
detector de clases (objeto):
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 ("GPIO pin {0} is {1}". format (self.sensor, "HIGH" if self. currState else "LOW"))
def subscribe (self, callBack):
self.callBacks.append (callBack)
def callBack (self, state):
para fn en self.callBacks:
fn (estado)
def start (self):
prueba:
self.read ()
self.printState ()
while True:
self.read ()
if self.currState! =self.prevState:
self.printState ()
self.callBack (self.currState)
time.sleep (.1)
#Dado que el fbi no restaura la consola correctamente wh Cuando se sale de la aplicación, hacemos una pequeña limpieza y manejamos el evento KeyboardInterrupt.
excepto (KeyboardInterrupt, SystemSalir):
os.system ('stty sane')

scare.py

#! / usr / bin / python
importar subproceso como sp
tiempo de importación
importar os
desde pirDetect importar *
importar sys
video =[“ omxplayer ”,“ nombre de archivo ”,“ -o ”,“ ambos ”,“ –win ”,“ 0 0 1280 720 ”,“ –modo-aspecto ”,“ relleno ”,“ –no-osd ”,“ –orientación ” , "180", "- vol", "-600"]
scareFile ="/home/pi/Projects/Halloween/ScareMedia/{0}ScareV.mp4”.format(sys.argv[1])
print (scareFile)
def onMotion (currState):
if currState:
video [1] =scareFile
subVideo =sp.Popen (video)
mientras que subVideo.poll () es None:
time.sleep (.1)
def showImage ():
os.system (“sudo fbi -T 1 -d / dev / fb0 -noverbose -once /home/pi/Projects/Halloween/ScareMedia/{0}Start.png ”.format (
sys.argv [1]))
showImage ()
objDetect =detector (7)
objDetect.subscribe (onMotion)
objDetect.start ()
os.system (“sudo killall -9 fbi”)

Uniendo todo:

A la secuencia de comandos de miedo se le puede pasar un solo parámetro con la secuencia de video que desea reproducir. Más tarde, automatizaré esto para reproducir cualquiera de los tres al azar.

También hay una modificación para agregar una cámara Pi y tomar un video de 5 segundos de la persona que activa el movimiento y guardarlo en el Pi cada vez que se detecta movimiento. (Aún no implementado).

Leer más detalles:Retrato poseído - Actualizado


Proceso de manufactura

  1. Tabla (vista vertical)
  2. Marco de gafas
  3. Pantalla de cristal líquido (LCD)
  4. CDS:pantallas LCD transparentes en 3D
  5. Exposición:La pantalla principal
  6. Animación LCD y juegos
  7. ¡Amigo de AI LCD!
  8. Estación meteorológica Arduino
  9. Videojuego LCD Arduino
  10. ¡Esquiva las Defs!
  11. Reloj despertador simple con DS1302 RTC