Avec le confinement, je voies et entends dans mon jardin encore plus d’oiseaux que d’habitude, notamment des oiseaux que je n’ai jamais vu chez moi ou uniquement dans des livres. Les 2 spots principaux sont les gamelles des chiens et le bassin.
J’ai donc décidé de me fabriquer une petite trap-cam pour essayer de filmer les oiseaux qui viennent dans le jardin ou près du bassin
Je partage dans cet article mon 1er prototype qui utilise un capteur de mouvement infrarouge. Ce prototype utilise un transfo raspi pour l’alimentation et le WiFi + SSH pour communiquer avec la caméra et récupérer les fichiers.
Matériel
J’ai utilisé des fonds de tiroir
- un raspberry pi (j’ai pris un modele raspi3 B+ pour avoir le wifi, mais je changerai peut-être de modèle plus tard)
- un transfo rasperry Pi (je verrai pour passer au solaire pour une prochaine version)
- un capteur de mouvement infrarouge (PIR motion sensor)
- une pi-cam
- une boîtte à glace pour le boîtier
- qq fils de connexion
- de la colle chaude
- une lamelle de microscope pour protéger la caméra
Connexion des éléments sur le Raspberry pi
Ci-après le branchement que j’ai effectué. J’ai utilisé le GPIO 23, mais n’importe quel GPIO convient parfaitement.
Environnement logiciel
OS: Raspbian-lite
Pour le système d’exploitation, j’ai utilisé une image minimal de Raspbian sans bureau : Raspbian-lite
Pour que la camera fonctionne, il faut l’activer via raspi-config (section interfacing)
VLC et stream pour placer la caméra
Pour faciliter le placement et la position de la caméra pour le cadrage des vidéos, j’utilise VLC comme décrit dans l’article Utilisation de VLC pour visualiser le stream de la picam
$ sudo apt install vlc
$ raspivid -t 0 -n --width 640 --height 480 -o - | cvlc stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264 --h264-fps=10
Python Pi-trap-cam
L’utilisation du capeur IR de detection dans un script est très simple : if detected then capture
Ce script utilise la librairie picamera. Cette 1ere version est en mode Quick and Dirty, mais toute la logique et les principaux paramètres sont déjà présents : mode photo ou vidéo, format, résolution …
Installation des composants nécessaires :
$ sudo apt install python3-pip git
$ sudo pip3 install rpi.gpio picamera
Téléchargement du script
Le script est diffusé sous licence GPLV3 et disponible sur github.
$ git clone https://github.com/owatte/pi_trapcam.git
Paramètres de capture
Toutes les variables de paramétrage sont accessible après le section import du script.
La variable la plus importante est certainement PIRSENSOR_GPIO
qui correspond au GPIO utilisé par vore montage. Le script utilise le GPIO 24, comme sur le montage présenté.
import time
from datetime import datetime
import locale
import picamera
import RPi.GPIO as GPIO
PIRSENSOR_GPIO = 24
LOCALE = 'fr_FR.UTF-8'
ANNOTATION_STRFTIME = '%-d %B %Y %H:%M'
RECORD_MODE = 'video' # set type as 'video' or 'picture'
VIDEO_DURATION = 30 # duration in sec
VIDEO_ANNOTATION = True # show text with date on capture
VIDEO_FORMAT = 'h264' # set type as 'h264' or 'mjpeg'
VIDEO_RESOLUTION = (1296, 972) # (1920, 1080), (640, 480) …
PICTURE_FORMAT = 'png' # set type as 'jpeg', 'png', 'gif', 'bmp' …
PICTURE_RESOLUTION = VIDEO_RESOLUTION
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIRSENSOR_GPIO, GPIO.IN)
locale.setlocale(locale.LC_TIME, LOCALE)
def set_filename(ext):
''' Set filename based on capture time YYYYMMDD '''
nowtime = now.strftime('%Y%m%d%-H%M%S') filename = "trapcam_{nowtime}.{ext}".format(nowtime=nowtime, ext=ext) return filename
while True:
if GPIO.input(PIRSENSOR_GPIO):
print("Intruder detected")
now = datetime.now()
if RECORD_MODE == 'video':
filename = set_filename(VIDEO_FORMAT)
with picamera.PiCamera() as camera:
camera.resolution = VIDEO_RESOLUTION
camera.annotate_background = picamera.Color('black')
camera.annotate_text = now.strftime(ANNOTATION_STRFTIME)
camera.start_recording(filename, format=VIDEO_FORMAT)
camera.wait_recording(VIDEO_DURATION)
camera.stop_recording()
elif RECORD_MODE == 'picture':
filename = set_filename(PICTURE_FORMAT)
with picamera.PiCamera() as camera:
camera.resolution = PICTURE_RESOLUTION
camera.start_preview()
time.sleep(2)
camera.annotate_text = now.strftime(ANNOTATION_STRFTIME)
camera.capture(filename, format=PICTURE_FORMAT)
time.sleep(0.1)
Lancement du script
$ cd pi_trapcam $ python3 trapcam.py
Réglages de la zone de détection
Le détecteur infrarouge est extrèmement sensible : en extérieur, il réagit à la simple présence d’un papillon ou au mouvement du vent dans la végétation.
Il y a 2 moyens de restreindre la zone de détection
Réduction de la distance de détection
Sur le capteur se trouve 2 vis de réglage du détecteur, dont une permettant de réduire la détection à environ 3 mètres
Réduction du champ de détection
La lentille de Fresnel est super efficace, il faut donc réduire son champ d’action. Le plus simple est d’ajouter un anneau autour de la lentille.
Conversion des vidéos H264 en MP4
Les vidéos enregistrées avec picamera sont au format h264, non lisible sur la plupart des périphériques. Il faut donc l’encoder en mp4, même en l’absence de flux son.
L’outil MP4Box est parfaitement adapté et fonctionne parfaitement sur un rasperry pi
$ sudo apt install gpac
$ MP4Box -add input.h264 output.mp4
$ for i in ls *.h264
; do o=${i:0:22}; MP4Box -add $i ${o}.mp4; rm $i; done;
Sources et ressources
- Raspberry Pi downloads : téléchargement des images Raspbian (anglais)
- Documentation officielle raspberry pi : Usage des GPIO (anglais)
- Composant Fritzing : PIR sensor
- Framboise 314 : Module détecteur de présence PIR (français)
- Pypi : Librairie RPi.GPIO (anglais)
- Readthedocs : Documentation picamera (anglais)
- GitHub : dépot du projet pi_trapcam
2 Comments for “Raspberry Pi + picam + PIR sensor + python = trap-cam DIY”