Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Portrait possédé – Mise à jour

Portrait d'effarouchement DIY à partir de zéro à l'aide de Raspberry Pi 3 B, Python et AtmosFX Videos portraits sans vie. Nous sommes à nouveau en octobre et je voulais proposer un projet Halloween en utilisant un Raspberry Pi. J'ai vu quelques portraits hantés éparpillés ici et là mais aucun d'entre eux ne présentait vraiment beaucoup de peur, juste un simple mouvement.

J'ai décidé de développer cette idée et j'ai commencé à chercher de bonnes vidéos de type jump scare que je pourrais utiliser. Cela m'a conduit à AtmosFx, ils ont des vidéos Unliving Portrait vraiment sympas qui ne coûtent que 7,99 $ chacune. Celles-ci étaient parfaites pour ce que j'avais en tête et m'ont permis d'avoir plus d'une vidéo de peur du saut que je pouvais sélectionner manuellement ou les exécuter chacune au hasard.

Voici une vidéo du projet terminé.

Je ne voulais pas écrire le code PIR à partir de zéro, j'ai donc cherché sur le Web des exemples d'accès au PIR avec Python. J'ai trouvé un ancien article de Arc Software qui présentait un projet similaire.

Le code que je présente est principalement de leur exemple mais j'y ai apporté plusieurs modifications pour répondre à mes besoins.

ÉTAPE 1 :Construisez le cadre LCD

Après avoir démonté le moniteur LCD et retiré le panneau LCD et l'électronique, je mesure la taille exacte de l'écran 17 X 11, en orientation portrait.

J'ai utilisé cet outil en ligne pour déterminer la mesure de mes coupes de cadre pour s'adapter à mon écran LCD.

J'ai construit un cadre en bois en utilisant du bois de 1″ x 2″ qui aurait une dimension intérieure de 17″ x 11″, qui tiendrait l'écran LCD. J'ai coupé 4 morceaux qui, une fois encadrés ensemble, auraient la taille exacte de mon écran LCD et j'ai monté l'écran LCD dans le cadre et j'ai fait en sorte que l'écran LCD affleure le cadre de l'écran LCD. Le cadre photo se fixe au cadre LCD et laisse toute l'électronique accessible par l'arrière.

Après avoir teint le cadre photo et l'avoir laissé sécher, j'ai utilisé une cloueuse pour fixer le cadre photo au cadre LCD.

Cadre LCD assemblé

Ensuite, j'ai monté le Raspberry Pi à l'aide d'un joli petit support de Thingiverse.com (Pi Side Mount) que j'ai imprimé avec mon imprimante 3D.

J'ai utilisé des supports de miroir pour boulonner l'écran LCD en place afin de l'empêcher de bouger et de le maintenir au même niveau que l'avant du cadre contre le cadre photo.

La dernière étape de l'assemblage consistait à percer un tout pour le capteur PIR et à le fixer à l'en-tête GPIO du Pi. Le PIR est assez simple, il a une broche chaude, de masse et de capteur.

ÉTAPE 2 :Images, vidéos et code

J'ai utilisé trois des vidéos Unliving Portrait d'AtmosFX dans mon projet.

Le premier obstacle était de faire en sorte que la vidéo soit lue lorsqu'un mouvement était détecté et pas seulement en boucle constamment sur l'écran. Je pourrais charger la vidéo, puis la mettre en pause sur la première image, puis, lorsqu'il y a un mouvement, continuer à jouer et, une fois terminée, réinitialiser et tout recommencer.

Il serait plus simple d'afficher une image fixe de la première image, puis, lorsqu'un mouvement est détecté, de lancer OMXPlayer pour lire le fichier vidéo approprié. L'avantage de ceci est que lorsque OMXPlayer est sorti, l'image fixe chargée serait toujours dans le tampon d'images et à l'écran.

Pour afficher l'image initiale, j'ai utilisé le Linux FBI (framebuffer imageviewer).

Le lecteur utilisé est OMXPlayer et bien qu'il prenne en charge la pause, il n'y a pas de commande de ligne de commande que je pourrais appeler en Python pour mettre en pause et jouer sans implémenter quelque chose comme DBuscontrol qui compliquerait excessivement le projet.

Structure des dossiers :

La structure des dossiers ci-dessous correspond aux chemins du script pour accéder aux images et aux vidéos. Le chemin peut être modifié tant que les chemins dans les scripts sont mis à jour pour correspondre.

Structure de dossier requise pour correspondre aux chemins de script

Images :

Donc, pour chaque vidéo, je l'ai chargée dans VLC et j'ai fait une capture d'écran de la première image dans la même résolution que la vidéo afin qu'elle se superpose parfaitement à l'écran avec la vidéo lors de la lecture .

Les trois vidéos représentaient un homme, une femme et un enfant. J'ai donc pris une capture d'écran de chacun et les ai nommées MaleStart.png, FemaleStart.png et ChildStart.png. J'ai créé un dossier dans mon projet Halloween appelé ScareMedia et téléchargé les 3 images fixes.

Vidéos :

Ensuite, j'ai nommé chaque vidéo MaleScare.mp4, FemaleScare.mp4 et ChildScare.mp4, et je les ai téléchargées dans le dossier ScareMedia.

Code :

Il y a 2 scripts nécessaires pour automatiser les vidéos sur la détection de mouvement.

pirDetect.py

#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import os
class detect(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( "La broche GPIO {0} est {1}".format(self.sensor, "HIGH" si self. currState else "LOW"))
def subscription(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)
#Puisque fbi ne restaure pas correctement la console wh une fois l'application terminée, nous effectuons un petit nettoyage et gérons l'événement KeyboardInterrupt.
sauf (KeyboardInterrupt, SystemExit) :
os.system(‘stty sane’)

scare.py

#!/usr/bin/python
import sous-processus en tant que sp
heure d'import
import os
from pirDetect import *
import sys
video =[“ omxplayer", "nom de fichier", "-o", "both", "-win", "0 0 1280 720", "-aspect-mode", "fill", "-no-osd", "-orientation" ,“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)
tandis que subVideo.poll() est Aucun :
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 =detecteur(7)
objDetect.subscribe(onMotion)
objDetect.start()
os.system("sudo killall -9 fbi")

Tout rassembler :

Le script de peur peut être passé un seul paramètre avec la séquence vidéo que vous souhaitez jouer. Plus tard, j'automatiserai cela pour jouer l'un des trois au hasard.

Il y a aussi une modification pour ajouter une caméra Pi et prendre une vidéo de 5 secondes de la personne activant le mouvement et l'enregistrer sur le Pi chaque fois qu'un mouvement est détecté. (Pas encore implémenté).

Lire plus de détails : Portrait possédé – Mise à jour


Processus de fabrication

  1. Tableau (vue portrait)
  2. Monture de lunettes
  3. Affichage à cristaux liquides (LCD)
  4. CDS :écrans LCD transparents 3D
  5. Exhibit :The Primal Display
  6. Animation LCD et jeux
  7. Ami LCD AI !
  8. Esquivez les défenses !
  9. Réveil simple avec DS1302 RTC