Publié le 9 mars 2016 - par

Une webcam pour nichoir à base de Raspberry PI 2 pilotée par une interface web

mesange_charbonniere_250pxLorsque Pascal (bozo31) m’a proposé cet article, il était surtout axé sur les superbes images de mésanges que ce projet lui a permis de réaliser. Pour ma part c’est surtout l’utilisation de la caméra et les divers usages qu’il en fait qui ont attiré mon attention. Je suis persuadé que nombre d’entre vous en tireront profit.
C’est d’ailleurs cette partie « visualisation en streaming » qui lui a pris le plus de temps, mais Pascal voulait une possibilité de « temps-réel« , une possibilité d’enregistrement en commandant le début et la fin tout en continuant de regarder, et profiter du ralenti. D’où les 3 modes suivants :

  • 1296 x 972 à 25 images/seconde en utilisant Gstreamer : latence 115ms mais sans enregistrement possible,
  • 1296 x 972 à 25 images/seconde en utilisant VLC avec enregistrement mais latence d’environ 2s,
  • 640 x 480 à 90 images /seconde en utilisant Gstreamer, avec visualisation sur le PC à 25 images/s et enregistrement en même temps du fichier brut h264 pour conversion ultérieure en mp4 et à 25 images/s.

Merci Pascal de partager ce projet avec les lecteurs de framboise314. Je te laisse la parole 😉

 

Mon projet, mes choix

L’an passé j’avais installé une caméra IP dans un nichoir où vient s’installer chaque année un couple de mésanges charbonnières. Je fus si satisfait de suivre la nichée que j’ai décidé de remplacer cette caméra par une autre en haute résolution mais sans atteindre les prix élevés de celles du commerce. Les tests de caméra à objectif interchangeable publiés par François m’ont décidé à adopter cette solution.

camera_rehausse

D’où les choix suivants :

  • Câble Ethernet pour relier le nichoir au PC (entre 25 et 30m en passant par les combles) servant aussi à l’alimentation,
  • Visualisation de jour et de nuit,
  • Possibilité de transmission « temps-réel » , possibilité d’enregistrement en commandant le début et la fin tout en continuant de regarder, et profiter du ralenti (prise de vue à 90 images/seconde),
  • Interface web pour les commandes.

La description de l’installation de cette caméra dans un nichoir est sur le forum 1bec2ailes.

Le matériel

L’élément de départ est un Raspberry Pi2,

Caméra no-IR à objectif interchangeable

camera_waveshareIl s’agit du modèle F de Waveshare avec objectif de 3,6mm ouvrant à f/1,8. Le support d’objectif est vissé sur la plaquette du capteur CMOS ce qui permet de le remplacer par un filtre coupe infrarouge commutable.

Filtre coupe-IR commutable et circuit intégré L 293 D

plaquette-a

Cliquer pour agrandir

J’ai trouvé le modèle « IR-CUT MTV Lens Mount » en découvrant que monture MTV ou M12 c’est pareil. L’écartement des écrous de montage de ce filtre est de 20 mm alors que l’écartement du support d’objectif de la caméra est de 18 mm il faut donc limer le circuit imprimé sans abimer de piste ou composant.

Un premier essai avec le filtre vissé a montré que la lentille ne pouvait pas être réglée assez près du capteur et que de la lumière passait sur le côté et arrivait jusqu’au capteur. Il m’a fallu « sculpter » la base du filtre pour qu’il s’ajuste parfaitement sur le circuit imprimé par dessus certains composants.

filtre-a

Cliquer pour agrandir

Puis j’ai fixé le tout sur une plaquette de plexiglas :

camera-recto-a

Caméra côté recto / Cliquer pour agrandir

camera-verso-a

Caméra côté verso /Cliquer pour agrandir

La commande du filtre qui nécessite un passage de courant continu dans un sens et dans l’autre, est confiée à un des 2 ponts en H intégrés dans le circuit L 293 D.

LED blanches, LED infrarouges et circuits intégrés ULN 2803A

L’éclairage est assuré le jour par 6 LED en lumière blanche (Luckylight 5-05000 WS) commandées individuellement et la nuit par 12 LED en proche infrarouge (Osram SFH 487P, longueur d’onde de 880 nm) commandées 2 par 2. Elles sont alimentées en 5V et l’interfaçage avec le GPIO est réalisé par des darlingtons intégrés dans 2 circuits ULN 2803A.

Alimentation

alim-a

Cliquer pour agrandir

1= alimentation secteur /courant continu 12 à 24V, 40W sortie réglée à 22V
2 = convertisseur continu/continu sortie réglée sur 5V

Un kit de coupleurs PoE passifs permet l’alimentation en courant continu sur les 2 paires libres du câble Ethernet de 30 mètres. Comme il est bon marché sa résistance est assez élevée : 12 ohm aller/retour.
La consommation de l’ensemble est au minimum de 250mA, 410mA avec la caméra en fonction sans diode allumée et de 550mA au maximum. Le courant passant dans le câble Ethernet est d’environ 220mA.

Premiers essais et mise au point du streaming

essai-a

Cliquer pour agrandir

Les premiers essais ont été réalisés sur platine d’essai et avec un « banc optique » de mon cru et de longueur égale à la profondeur du nichoir.

A ce stade l’accès au Pi2 depuis le PC a été fait en ssh et l’envoi des commandes à la console.

Commande des LED et du filtre

Le montage est le suivant :

schéma-a

Cliquer pour agrandir

Les 2 condensateurs électrochimiques sont des 220 µF / 25V.
Les résistances ont été ajustées pour fournir un courant d’environ 20mA ; R-jour = 180 ohm ; R-nuit = 56 ohm.

J’ai commandé les GPIO et vérifié le bon fonctionnement du filtre et des LED grace à gpio l’utilitaire en ligne de commande inclus dans WiringPi  après installation sur le Raspberry Pi 2.

Retransmission vidéo

Pour une retransmission avec très peu de retard Gstreamer est tout indiqué. Par contre pour un enregistrement commandable tout en continuant de regarder, VLC est plus adapté mais introduit une grande latence.

Streaming temps réel

Sur le Raspberry il est lancé par l’exécutable cam-temps-reel :

raspivid -w 1296 -h 972 -fps 25 -b 5000000 -t 0 -o - | gst-launch-1.0 fdsrc do-timestamp=true ! video/x-h264,width=1296,height=972,framerate=25/1 ! h264parse ! rtph264pay pt=96 config-interval=5 ! udpsink host=<adresse IP du PC> port=5010 alsasrc device=plughw:1 do-timestamp=true ! audioconvert ! avenc_ac3 ! rtpac3pay ! udpsink host=<adresse IP du PC> port=5012

L’option do-timestamp=true est indispensable pour éviter que la latence n’augmente au fil du temps.
Pour connaitre le chiffre correspondant au micro pour « device=plughw: » utiliser la commande arecord -l . Dans mon cas elle renvoie

**** Liste des Périphériques Matériels CAPTURE ****
carte 1: Device [USB PnP Sound Device], périphérique 0: USB Audio [USB Audio]
Sous-périphériques: 0/1
Sous-périphérique #0: subdevice #0

Sur le PC le flux audio et vidéo est restitué par l’exécutable temps-reel :

gst-launch-1.0 -v udpsrc port=5010 ! application/x-rtp,media=video,payload=96,encoding-name=H264,clock-rate=90000 ! rtph264depay ! avdec_h264 ! autovideosink sync=false udpsrc port=5012 ! application/x-rtp,media=audio,clock=44100,encoding-name=AC3,clock-rate=44100 ! rtpac3depay ! ac3parse ! avdec_ac3 ! pulsesink sync=false

Il est préférable de lancer « temps-reel » avant de lancer la caméra,

Au cas où vous ne souhaitez pas utiliser le son il est impératif de retirer ces pipelines :

  • de « alsasrc » à « port=5012« 
  • de « udpsrc port=5012 » à « sync=false« 

Sinon Gstreamer ne se lancera pas sur le Pi2 et vous n’aurez ni son (normal ! ) ni vidéo 🙁

La latence obtenue est de 115ms à 117ms avec de temps en temps des valeurs autour de 150ms.

t-reel-a

Cliquer pour agrandir

Streaming avec enregistrement possible

Il est commandé sur le Pi2 par l’exécutable cam-enreg :

cvlc 'v4l2:///dev/video0:chroma=h264:width=1296:height=972:fps=25' --input-slave=alsa://hw:1,0 --volume=1024 --sout '#transcode{acodec=mp3,ab=128,channels=1,samplerate=44100}:http{mux=ts,dst=:5010}'

Ensuite sur le PC il suffit d’ouvrir VLC et de lire le flux réseau en entrant :
adresse IP du Pi2:5010

La latence est de quasiment 2 secondes.

Streaming pour ralenti

Ici le son n’est pas transmis et pour profiter de l’effet de ralenti il faut d’abord enregistrer sur le PC le flux filmé à 90 images par seconde pour ensuite visualiser toutes ces images à une cadence normale de 25 images/s.
L’exécutable sur le Pi2 est cam-ralenti :

raspivid -w 640 -h 480 -fps 90 -t 0 -o - | gst-launch-1.0 -e fdsrc ! udpsink host=<adresse IP du PC> port=5010

Sur le PC c’est ralenti (mon PC tourne sous Linux) :

#! /bin/bash
cd /home/pascal/Raspberry/Ralentis (ligne à modifier selon votre cas)
for i in `ls`
do
echo $i
done
echo
echo "Entrer le nom du fichier sans extension"
read FICHIER
echo
echo "Maintenant \"Moteur\" pour lancer l'enregistrement"
echo
echo "Après arrêt de cet enregistrement-ci et avant d'en commencer un nouveau, stopper ce script puis relancer le."
echo
echo
gst-launch-1.0 udpsrc -v port=5010 ! tee name=t ! queue ! filesink location=$FICHIER.h264 t. ! video/x-h264, width=640, height=460, framerate=25/1 ! h264parse ! avdec_h264 ! autovideosink sync=false

Il affiche les fichiers déjà présents et demande le nom du nouveau fichier à enregistrer. Puis il lance Gstreamer avec 2 branches (tee) : l’une enregistrant le flux brut h264, l’autre affichant ce flux à vitesse normale donc sans effet de ralenti pour savoir s’il est toujours intéressant de continuer à enregistrer.

Attention ! il est indispensable de lancer cet exécutable avant de mettre la caméra en route afin que la toute première trame h264 envoyée par le Raspberry Pi 2 soit bien enregistrée.

Le flux brut h264 n’est pas directement utilisable par les lecteurs vidéo. Il faut le transcoder, Pour ce faire j’utilise x264-10bit en ligne de commande en étant dans le répertoire du fichier enregistré :

x264h-10bit -o <nom.mp4> <nom.h264> --input-res 640x480

Le réglage par défaut des autres options convient, en particulier la cadence de 25 images/s. On peut vérifier que la durée de lecture du mp4 est plus de 3 fois supérieure à celle de l’enregistrement.

chronoCette vidéo du chronomètre en ligne au millième de seconde a été enregistrée au ralenti. Elle dure 45 secondes mais le chrono n’arrive qu’à 10s (j’ai gardé la montée du curseur pour démarrer le chrono) et on peut lire les dixièmes de seconde.

Augmentation de la profondeur de champ

diaph-1-a

Cliquer pour agrandir

Je me suis aperçu qu’aux distances de mise au point pour un nichoir la profondeur de champ était insuffisante. Aussi j’ai confectionné un diaphragme. La contre-partie est que le capteur reçoit moins de lumière.
Le support d’objectif a été dévissé du filtre coupe-IR pour un repérage le plus précis possible du centre optique.

Caméra avec diaphragme inséré mais sans l’objectif.

Mais ce diaphragme triangulaire était difficile à centrer et obligeait à totalement enlever les vis. Le diaphragme définitif s’insère par le haut en dé-serrant juste les vis.

diaph-a

Cliquer pour agrandir

diaph-2-a

Cliquer pour agrandir

Le trou a un diamètre de 1,5mm ce qui pour la focale de 3,6mm de cet objectif fait une ouverture de f/2,4.

Gain et contre-partie sont bien visibles ci-dessous : à gauche sans le diaphragme, à droite avec.

profond-champ-a

Cliquer pour agrandir

profond-champ-diaph-a

Cliquer pour agrandir

L’interface web

Principe

L’interface est partagée en 2 cadres indépendants, l’un pour commuter le filtre et allumer/éteindre les LED, l’autre pour choisir un des 3 modes de visualisation et le lancer.

Elle est écrire en HTML et PHP, avec toute la mise en forme dans une feuille de style CSS.
Pour la conservation des valeurs des variables utiles je trouvais très lourd l’utilisation d’une base de données dans ce cas précis. Comme toute commande passe par le clic sur une zone de saisie de formulaire il m’est venu l’idée d’utiliser la possibilité de cacher de telles zones tout en leur affectant une valeur. Par exemple pour la variable etat1 concernant la LED blanche 1 :

<input type="hidden" name="etat1" value="<?php echo $etat[1] ?>">

Commande des LED et du filtre coupe-IR

C’est le fichier led.php qui s’en charge grâce à la fonction exec( ) de PHP qui lance /usr/local/bin/gpio avec les paramètres voulus.
Au premier appel et seulement à celui-là la variable $_POST est vide ce qui permet d’exécuter les initialisations : GPIO utilisés mis en sortie, diodes éteintes et filtre coupe-IR inserré.
Je n’ai pas estimé utile de tester l’état des GPIO car chaque commande a un effet visuel facile à vérifier.

Commande de la caméra

Il s’agit ici de camera.phpexec( ) lancera l’exécutable pour le mode choisi mais aussi l’arrêtera en appelant la commande shell killall qui stoppe un processus en le désignant par son nom.

Préparation du Raspberry

Il tourne sous Raspbian wheezy (version 7.8).
Comme serveur PHP j’ai installé lighttpd en suivant le tutoriel de Captain Bodgit. Un nouvel utilisateur est créé : www-data, mais sans les droits de l’utilisateur pi. Cela pose problème pour l’exécution des commandes envoyées par l’interface d’où les adaptations suivantes :
– mettre www-data dans les groupes users, audio, video et gpio

pi@raspberrypi ~ $ sudo usermod -G users,audio,video,gpio

– rendre www-data propriétaire des exécutables cam-temps-reel, cam-enreg et cam-ralenti, sans oublier de les rendre effectivement exécutables

pi@raspberrypi ~ $ sudo chmod 777 /var/www/cam-temps-reel /var/www/cam-enreg /var/www/cam-ralenti
pi@raspberrypi ~ $ sudo chmown www-data /var/www/cam-temps-reel /var/www/cam-enreg /var/www/cam-ralenti

– lui permettre d’utiliser la commande killall (en fait sudo killall) par ajout de cette ligne dans /etc/sudoers
www-data ALL=NOPASSWD: /usr/bin/killall

Résultat

Je n’ai pu utiliser cette interface qu’avec Firefox avec lequel tout fonctionne bien. Voici une capture d’écran :

interface-web-a

Cliquer pour agrandir

Réalisation pratique

Les composants sont soudés sur une platine d’essai au pas de 2,54mm.

circuit-recto circuit-verso

L’intégration dans le nichoir est décrite dans le forum 1bec2ailes rubrique « construction et aménagement pour les oiseaux ».

Les fichiers

Dans le Raspberry :
– à placer dans le répertoire /var/www :
index.php, led.php, camera.php, style.css, cam-temps-reel, cam-enreg, cam-ralenti >> télécharger ici
– à placer dans le répertoire /var/www/img (à créer) tous les fichiers de cette archive >>
télécharger ici
– dans le PC à placer dans le répertoire de votre choix :
temps-reel et ralenti >>
télécharger ici

Conclusion

Un grand merci à Pascal pour cette réalisation qui servira sans doute aux amoureux des oiseaux mais également à tous ceux qui souhaite transmettre (streamer) des images et des sons à partir d’un Raspberry Pi

 Sources

Share Button

7 réflexions au sujet de « Une webcam pour nichoir à base de Raspberry PI 2 pilotée par une interface web »

  1. Dodutils

    sympa, il faut que je vois cette histoire de profondeur de champs car j’ai ce problème avec des webcam endoscopiques (15€ sur amazon) bien pratiques avec leur câble usb de 10 ou 15m et leur lumière (toute relative) intégrée mais dont la profondeur de champs vraiment trop limitée du coup c’est un peu la galère, par exemple : https://www.youtube.com/watch?v=lQG3vvbXLME

    Répondre
  2. testa

    Bonjour,

    en voyant ce tuto, je me demande dans quelle mesure il serait possible d’utiliser un Pi Zero avec un hub USB pour y connecter une clé WiFi et une simple camera USB et ce, alimenté avec une banque de recharge solaire. Un peut comme ici : https://hackaday.io/project/6287-wifi-camera-timelapseme

    Cela permettrait d’avoir en WiFi, la vision caméra et le tout alimenté par une batterie solaire.
    http://www.gearbest.com/mobile-power-bank/pp_15138.html

    Le Pi Zero alors monté de sa caméra USB et un DHT22 donnera aussi l’info de température et d’humidité.

    D’avance merci pour le retour d’info.

    Répondre
    1. Dodutils

      Google est ton ami, il existe des dizaines de pages traitant du sujet particulier « raspi solar » ou « raspi solaire » si tu vises le français.

      Tout cela est possible mais il va falloir prévoir « gros » pour la cellule solaire et la batterie car il faut alimenter le RasPi ET maintenir/recharger la batterie en tenant compte de l’ensoleillement qui peut être très mauvais plusieurs jours de suite (après tout dépend du type de cellule solaire choisie et si tu vies au Nord ou au Sud), après si tu n’as pas besoin du RasPi la nuit tu peux ajouter un petit module (voir une carte parfaitement intégrée au RasPi) pour qu’il s’éteigne la nuit et se rallume automatiquement le jour ce qui du coup permet de mieux tenir la charge niveau batterie, sauf si bien sûr tu veux utiliser le RasPi la nuit avec la RasPiCam noIR et des LED IR ce qui du coup consommera encore plus.

      Répondre
  3. Sebelectronique

    Salut,
    Très belle réalisation !

    J’ai également construit un nichoir du même type avec un RPI A+ avec prise de température et humidité. L’interface principal est une page web de ma conception combiné avec RPi-Cam-Web-Interface : http://elinux.org/RPi-Cam-Web-Interface

    J’ai même gagné le second prix sur un concours de Instructables : http://www.instructables.com/id/Raspberry-with-cam-in-birdhouse/

    Cela fait un an que mon nichoir est installé dehors et toujours en fonctionnement : avec les beaux jours en ce moment j’ai plein de visite de mésanges, j’en ai même une qui a passé la nuit à l’intérieur.

    Un commentaire sur ma vidéo youtube m’a expliqué que le bois que j’ai utilisé n’était pas assez épais pour que la mésange s’installe pour y faire son nid et avoir des petits.

    J’attends encore, on verra bien…

    Répondre
    1. pascal- bozo31 Auteur de l’article

      Bonjour,
      Merci pour le retour.

      J’avais vu votre réalisation quand je cherchais. Elle est très bien et m’avait donné l’idée du capteur de température et humidité mais j’ai été pris par le temps. Ce sera pour l’an prochain.
      J’avais aussi vu RPI-Cam-Web-Interface mais si j’ai bien compris la transmission en direct se fait en mjpeg et je souhaitais que ce soit en h264. De plus l’enregistrement sur la carte SD du Raspberry m’ennuyait un peu. Par contre c’est clé en main et très complet.

      Je ne saisis pas le commentaire sur l’épaisseur du bois. D’après vos photos elle semble très proche de celle des 2 nichoirs achetés à La Hulotte il y a longtemps et qui ont une nichée chaque année.
      Effectivement ça s’approche : l’an passé, ici (banlieue toulousaine) le nid a été commencé le 22 Mars.
      Bonne chance !

      Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP * Time limit is exhausted. Please reload CAPTCHA.