Sommario:

Cat-a-way - Irrigatore per gatti con visione artificiale: 6 passaggi (con immagini)
Cat-a-way - Irrigatore per gatti con visione artificiale: 6 passaggi (con immagini)

Video: Cat-a-way - Irrigatore per gatti con visione artificiale: 6 passaggi (con immagini)

Video: Cat-a-way - Irrigatore per gatti con visione artificiale: 6 passaggi (con immagini)
Video: Oh Mickey… #fail #viral 2024, Dicembre
Anonim
Cat-a-way - Irrigatore per gatti con visione artificiale
Cat-a-way - Irrigatore per gatti con visione artificiale

Problema: i gatti usano il tuo giardino come toilette

Soluzione: dedicare troppo tempo alla progettazione di un irrigatore per gatti con la funzione di caricamento automatico su YouTube

Questo non è un passo dopo passo, ma una panoramica della costruzione e del codice

#BeforeYouCallPETA - I gatti stanno bene, è un irrigatore a bassa pressione proprio come la pioggia, che possono fuggire prima ancora che ruoti intorno a loro. Il progetto non è quello di inzuppare un gatto, ma di mostrarlo via prima che sporchi il mio giardino con la versione per gatti di Barkers Eggs.

Passaggio 1: elementi principali richiesti

Elementi principali richiesti
Elementi principali richiesti

Raspberry Pi zero e scheda SD

Fotocamera Raspberry Pi

relè

555 timer…. (o un arduino e un altro relè se i tuoi 555 timer non arrivano)

Solenoide

spruzzatore

Una sorta di alloggiamento per l'elettronica

La volontà di colpire un chiodo metaforico con una mazza da 6 tonnellate

Una fotocamera con una risoluzione così ridotta che riesci a malapena a vedere l'acqua, ma puoi ancora vedere i gatti che corrono ai ripari

Passaggio 2: il sistema

Image
Image

1, la fotocamera Pi rileva un oggetto delle dimensioni di un gatto che si muove per alcuni fotogrammi della fotocamera (spiegato nel passaggio successivo)

2, Pi fa partire l'irrigatore

3, il gatto corre ai ripari

4, video caricato automaticamente su youtube per la visualizzazione di piacere

Passaggio 3: tempo di codifica

Metterlo insieme
Metterlo insieme

Usando openCV usando la sottrazione di frame puoi trovare aree del frame che cambiano nel tempo, usando alcune funzioni ingegnose puoi capire quanto sono grandi questi cambiamenti e se persistono nel tempo e, soprattutto, scoprire se sono delle dimensioni di un gatto.

Ci sono alcuni tutorial sulla sottrazione dei fotogrammi che entrano in grande dettaglio se fai una rapida ricerca su Google.

Panoramica di come funziona il codice

1, la fotocamera continua a scattare fotogrammi e a confrontarli con l'ultimo

2, se viene rilevata una forma delle dimensioni di un gatto, viene notato

3, se il cambiamento della dimensione del gatto persiste per circa 4 frame, il pi usa il suo GPIO per alimentare il relè per avviare arduino

4, l'arduino invia un segnale per alimentare il secondo relè per 5 secondi che attiva il solenoide

5, il solenoide quando alimentato consente l'acqua all'irrigatore

6, mentre l'irrigatore è attivo, la fotocamera smette di rilevare e registra video

7, il video viene caricato su Youtube

8, immagini fisse caricate su Dropbox per il sistema di messa a punto fine

Nota - Perché ho finito per usare 2 relè e un arduino per accendere un solenoide per 5 secondi…

1, il pi non può avviare e arrestare il solenoide durante la registrazione del video mentre gli script Python si mettono in pausa fino al termine del video, da qui la necessità che l'arduino (o il timer 555) consenta al solenoide di aprirsi e chiudersi indipendentemente dallo script mentre il il video sta ancora registrando.

2, il primo relè e arduino possono essere sostituiti con un timer 555 ma questo non è arrivato nel post in tempo per questo progetto, 555 farebbe risparmiare un sacco di tempo, denaro e passaggi.

3, il pi non può attivare il solenoide direttamente poiché il Pi GPIO funziona a 3,3 V e 51 mA max e il solenoide richiede l'attivazione di 5 V e molto più di 51 mA.

4, ogni fotogramma può essere ritagliato per rimuovere il rilevamento del movimento in aree indesiderate, come un giardino dei vicini. In caso contrario, il vicino di casa farà sguardi confusi nel tuo giardino perché l'irrigatore si spegne ogni volta che vuole entrare nel suo capannone.

5, probabilmente mi sono perso qualcosa di ovvio e ho perso tempo a configurarlo in questo modo.

Codice sotto

import cv2import numpy as np import argparse #cat import time import RPi. GPIO as GPIO import os import dropbox from picamera.array import PiRGBArray from picamera import PiCamera #------------------ ---------------Carica su 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("Ripresa video") prova: #Take Video os.system('raspivid -w 1640 -h 922 -o vid{0}.h264 -t 15000'.format(vidname)) #Upload to youtube print("Upload to YouTube") os. system('sudo youtube-upload --title="Cat Got Wet {0}" --client-secrets=client_secret.json vid{0}.h264'.format(vidname)) #Rimuovi il file video al termine os.remove ('vid{0}.h264'.format(vidname)) print("Video caricato e rimosso da Pi") tranne: pass #-------------------- -------------Alambicchi nella casella personale----- -------------------- def St illsToDropbox(): print("Uploading Still To Dropbox Function") access_token = 'Ah ah ah, non hai detto la parola magica…Ah ah ah, non hai detto la parola magica' ctime = time.strftime(" %H:%M:%S") cdate = time.strftime("%d-%m-%Y") try: filename = "/Motion/{0}/DetectedAt_{1}.jpg".format(cdate, ctime) print(filename) client = dropbox.client. DropboxClient(access_token) image = open("ToDropbox.jpg", 'rb') client.put_file(filename, image) image.close() os.remove("ToDropbox.jpg") eccetto: pass #-------------------------------------------------------- ------Rileva movimento------------------------------------------------------- def DetectMotion(): #Definisci vars min_area = 400 tolarance = 25 #change in pixel bluramount = 21 timetoforget = 0.5 kernel = np.ones((5, 5), np.uint8) #usato per dialate MotionCounter = 0 MinTargetArea = 600 # dimensione più piccola da rilevare MaxTargetArea = 5000 #Dimensione più grande da rilevare ora = time.time() then = time.time() #inizialise camera camera = PiCamera() camera.resolution = (640, 480) camera.framerate = 10 raw Capture = PiRGBArray(camera, size=(640, 480)) #warmup camera time.sleep(1) #Prendi il primo fotogramma e preparalo per andare in cv2.acumulate weight camera.capture(rawCapture, format="bgr") avg = rawCapture.array #Ritaglia la regione indesiderata PolyCrop = np.array(

#HowToTriggerRealProgrammersWithBadCode

Passaggio 4: metterlo insieme

Metterlo insieme
Metterlo insieme
Metterlo insieme
Metterlo insieme
Metterlo insieme
Metterlo insieme

Metti l'impianto elettrico in un alloggiamento impermeabile, avvita le cose nei muri e usa molto nastro adesivo e colla a caldo

Passaggio 5: risultati

Image
Image
Risultati
Risultati

Quando funziona, funziona

Passaggio 6: falsi positivi

Falsi positivi
Falsi positivi

Quando non lo fa spruzza ombre di gatto, tua moglie e tua figlia.

Suggerimento: metti un interruttore vicino alla porta che metta in pausa il programma di rilevamento del movimento… poi dimentica di usarlo e bagnati quando metti fuori i bidoni.

Spero di aver fatto rabbrividire gli esperti di programmazione, elettronica e fai-da-te con tutti gli errori che probabilmente ho commesso, e soprattutto spero che ti siano piaciuti tutti i miei errori di ortografia.

Consigliato: