Table des matières:

Cat-a-way - Arroseur pour chat par vision par ordinateur : 6 étapes (avec photos)
Cat-a-way - Arroseur pour chat par vision par ordinateur : 6 étapes (avec photos)

Vidéo: Cat-a-way - Arroseur pour chat par vision par ordinateur : 6 étapes (avec photos)

Vidéo: Cat-a-way - Arroseur pour chat par vision par ordinateur : 6 étapes (avec photos)
Vidéo: Ce son va te hanter... 2024, Novembre
Anonim
Cat-a-way - Arroseur pour chat par vision par ordinateur
Cat-a-way - Arroseur pour chat par vision par ordinateur

Problème - Les chats utilisent votre jardin comme toilette

Solution - Passez trop de temps à concevoir un arroseur pour chat avec la fonction de téléchargement automatique sur youtube

Ce n'est pas une étape par étape, mais un aperçu de la construction et du code

#BeforeYouCallPETA - Les chats vont bien, c'est un arroseur à basse pression tout comme la pluie, qu'ils peuvent dépasser avant même qu'il ne pivote autour d'eux. Le projet n'est pas de faire tremper un chat, mais de le montrer avant qu'il ne jonche mon jardin avec la version pour chat de Barkers Eggs.

Étape 1: Principaux éléments requis

Éléments principaux requis
Éléments principaux requis

Raspberry Pi zéro & carte SD

Caméra Raspberry Pi

Relais

555 minuterie…. (ou un arduino et un autre relais si vos 555 timers n'arrivent pas)

Solénoïde

Arroseur

Une sorte de boîtier pour l'électronique

Une volonté de frapper un clou métaphorique avec un marteau de 6 tonnes

Une caméra avec si peu de résolution que vous pouvez à peine voir l'eau, mais pouvez toujours voir les chats courir pour se mettre à l'abri

Étape 2: Le système

Image
Image

1, la caméra Pi détecte un objet de la taille d'un chat se déplaçant pendant quelques images de la caméra (expliqué à l'étape suivante)

2, Pi déclenche l'arroseur

3, le chat court pour se mettre à l'abri

4, vidéo automatiquement téléchargée sur youtube pour le plaisir de visionner

Étape 3: Temps de codage

Mettre ensemble
Mettre ensemble

En utilisant openCV en utilisant la soustraction de cadre, vous pouvez trouver des zones du cadre qui changent au fil du temps, en utilisant quelques fonctions astucieuses, vous pouvez déterminer l'ampleur de ces changements et s'ils persistent dans le temps, et surtout savoir s'ils sont de la taille d'un chat.

Il existe de nombreux tutoriels sur la soustraction d'images qui entrent dans les moindres détails si vous effectuez une recherche rapide sur Google.

Présentation du fonctionnement du code

1, la caméra continue de prendre des images et de les comparer à la dernière

2, si une forme de la taille d'un chat est détectée, elle est notée

3, si le changement de taille du chat persiste sur environ 4 images, le pi utilise son GPIO pour alimenter le relais pour démarrer l'arduino

4, l'arduino envoie un signal pour alimenter le deuxième relais pendant 5 secondes qui active le solénoïde

5, le solénoïde lorsqu'il est alimenté permet à l'eau de l'arroseur

6, pendant que l'arroseur est actif, la caméra arrête de détecter et enregistre la vidéo

7, la vidéo est téléchargée sur Youtube

8, images fixes téléchargées dans la boîte de dépôt pour le système de réglage fin

Remarque - Pourquoi j'ai fini par utiliser 2 relais et un arduino pour allumer un solénoïde pendant 5 secondes…..

1, le pi ne peut pas démarrer et arrêter le solénoïde pendant l'enregistrement de la vidéo car les scripts python s'interrompent jusqu'à ce que la vidéo soit terminée, d'où la nécessité pour l'arduino (ou la minuterie 555) de permettre au solénoïde de s'ouvrir et de se fermer indépendamment du script pendant que le la vidéo est toujours en cours d'enregistrement.

2, le premier relais et l'arduino peuvent être remplacés par une minuterie 555 mais cela n'est pas arrivé à temps pour ce projet, 555 permettrait d'économiser beaucoup de temps, d'argent et d'étapes.

3, le pi ne peut pas déclencher le solénoïde directement car le Pi GPIO fonctionne sur 3.3v et 51mA max, et le solénoïde veut 5V et bien plus que 51mA pour se déclencher.

4, chaque image peut être recadrée pour supprimer la détection de mouvement dans les zones indésirables, telles que le jardin des voisins. Si vous ne le faites pas, le voisin donnera un regard confus sur votre jardin, car l'arroseur se déclenche à chaque fois qu'il veut entrer dans son cabanon.

5, j'ai probablement raté quelque chose d'évident et j'ai perdu mon temps à le configurer comme ça.

Code ci-dessous

importer cv2import numpy as np import argparse #cat import time importer RPi. GPIO as GPIO importer os importer dropbox depuis picamera.array importer PiRGBArray depuis picamera importer PiCamera #------------------ -------------------------------Télécharger sur youtube----------------- ---------------------- def HDtoYoutube(): ctime = time.strftime("_%H-%M-%S") cdate = time.strftime ("_%d-%m-%Y") vidname = ctime + cdate #Trigger relay GPIO.output(11, True) time.sleep(.5) GPIO.output(11, False) print("Taking Video") essayez: #Take Video os.system('raspivid -w 1640 -h 922 -o vid{0}.h264 -t 15000'.format(vidname)) #Upload to youtube print("Uploading to YouTube") os. system('sudo youtube-upload --title="Cat Got Wet {0}" --client-secrets=client_secret.json vid{0}.h264'.format(vidname)) #Supprimer le fichier vidéo une fois terminé os.remove ('vid{0}.h264'.format(vidname)) print("Vidéo téléchargée et supprimée de Pi") sauf: pass #-------------------- ----------------------------Toujours dans la boîte de dépôt------------------- -------------------- def St illsToDropbox(): print("Téléchargement de toujours vers la fonction Dropbox") access_token = 'Ah ah ah, tu n'as pas dit le mot magique…Ah ah ah, tu n'as pas dit le mot magique' ctime = time.strftime(" %H:%M:%S") cdate = time.strftime("%d-%m-%Y") essayez: filename = "/Motion/{0}/DetectedAt_{1}.jpg".format(cdate, ctime) print(nom de fichier) client = dropbox.client. DropboxClient(access_token) image = open("ToDropbox.jpg", 'rb') client.put_file(nom de fichier, image) image.close() os.remove("ToDropbox.jpg") sauf: pass #------------------------------------------- ------Détecter le mouvement---------------------------- def DetectMotion(): #Define vars min_area = 400 tolarance = 25 #change in pixel bluramount = 21 timetoforget = 0.5 kernel = np.ones((5, 5), np.uint8) #used for dialate MotionCounter = 0 MinTargetArea = 600 # plus petite taille à détecter MaxTargetArea = 5000 #Plus grande taille à détecter maintenant = time.time() then = time.time() #initialiser la caméra camera = PiCamera() camera.resolution = (640, 480) camera.framerate = 10 raw Capture = PiRGBArray(camera, size=(640, 480)) #warmup camera time.sleep(1) #Saisissez la première image et préparez-la à aller dans cv2.acumulate weight camera.capture(rawCapture, format="bgr") avg = rawCapture.array #Recadrer la région indésirable PolyCrop = np.array(

#HowToTriggerRealProgrammersWithBadCode

Étape 4: Assembler

Mettre ensemble
Mettre ensemble
Mettre ensemble
Mettre ensemble
Mettre ensemble
Mettre ensemble

Enfoncez l'électricité dans un boîtier étanche, vissez les choses dans les murs et utilisez beaucoup de ruban adhésif et de colle chaude

Étape 5: Résultats

Image
Image
Résultats
Résultats

Quand ça marche ça marche

Étape 6: Faux positifs

Faux positifs
Faux positifs

Quand ce n'est pas le cas, il pulvérise des ombres de chat, votre femme et votre fille.

Astuce de pro - Placez un interrupteur près de la porte qui met en pause le programme de détection de mouvement….. puis oubliez de l'utiliser et soyez trempé en sortant les poubelles.

J'espère que j'ai fait grincer des dents à tous les experts en programmation, en électronique et en bricolage avec toutes les erreurs que j'ai probablement commises, et surtout j'espère que vous avez apprécié toutes mes fautes d'orthographe.

Conseillé: