Webcam : V1

2009 : la webcam de départ est un modèle bureautique très basique en USB 1.0 avec une résolution de 640×480.

Webcam d'origine

La webcam doit être disposée au milieu du jardin au même niveau que la mangeoire, l'ensemble doit être le plus petit possible pour ne pas trop diminuer le WAF. La webcam étant USB, il faut la brancher à un ordinateur mais les câbles USB sont habituellement limités à 5m, 10-12m en utilisant des répéteurs actifs. La webcam est connectée à Popeye, il se trouve à plus de 30m de câble de la webcam… Il faut donc trouver une solution pour palier à cette longueur importante. J'ai trouvé des prolongateurs USB 1.0 utilisant un câble Ethernet pour transporter le signal USB, ils sont constitués d'un côté d'une prise USB et de l'autre d'une prise Ethernet.

Prolongateur USB sur câble réseau

Ils fonctionnent par paire : d'un côté, l'adaptateur femelle se branche sur le périphérique USB et sur le câble Ethernet. De l'autre côté du câble Ethernet, l'adaptateur sort une prise USB mâle à connecter sur l'ordinateur. Le câble Ethernet est utilisé comme support physique de transmission de signal, ce système n'est pas compatible TCP/IP.

Schéma de câblage

Le défi suivant est d'installer la webcam dehors au gré des intempéries. En enlevant sa coque en plastique ainsi que celle du prolongateur, il est possible diminuer fortement leurs encombrement. Je les ai également raccordé directement ensemble en enlevant les prises USB et minimisant la longueur de câble.

Prolongateur + Webcam

J'ai choisi d'installer l'ensemble dans un petit boitier électrique étanche. J'ai découpé une ouverture avec ma dremel puis coller une morceau de plexiglas transparent avec du mastic et fixé la webcam derrière. Une petite ouverture sur le bas du boitier permet de faire passer le câble Ethernet.

Boitier

 

Boitier fermé

Le tout est monté sur un poteau de 2,5m de haut avec une vue directe sur la mangeoire. Le câble passe dans une gaine plastique enterrée dans le jardin et ressortant au niveau du le garage.

Webcam et mangeoire sur le poteau

Malheureusement, cette webcam n'est pas conçue pour fonctionner à l'extérieur mais en intérieur avec peu de lumière : dehors, lorsqu'il y a un peu de soleil, elle est éblouit et affiche une image toute blanche. Après plusieurs essais, j'ai installé un verre de lunette de soleil devant l'objectif. 8-) Cela permet désormais d'avoir une image non brulée mais avec une perte de couleur et de netteté.

Webcam et lunette de soleil

La webcam est reconnue à l'aide des drivers gspca (intégré depuis la mainline du noyau) comme un périphérique v4l :

[   33.150000] Linux video capture interface: v2.00
[   33.400000] gspca: main v2.5.0 registered
[   33.530000] gspca: probing 046d:08a2
[   35.420000] zc3xx: probe sensor -> 000e
[   35.430000] zc3xx: Find Sensor PAS202B
[   35.440000] gspca: probe ok
[   35.730000] usbcore: registered new interface driver snd-usb-audio
[   35.740000] usbcore: registered new interface driver zc3xx
[   35.740000] zc3xx: registered

J'ai choisi d'utiliser mjpg-streamer pour la capture d'image et la publication en http. Le paquet Debian n'existe pas, il faut donc le compiler à partir des sources :

svn co -r 94 https://mjpg-streamer.svn.sourceforge.net/svnroot/mjpg-streamer/mjpg-streamer
cd mjpg-streamer
make clean all
export LD_LIBRARY_PATH=.
./mjpg_streamer -b -i "input_uvc.so" -o "output_http.so -w ./www"

Puis ouvrir un navigateur sur http://popeye.home:8080 pour constater le bon fonctionnement.

Après quelques ajustements d'orientation de la webcam, voici quelques images capturées :

Le rendu n'est pas extraordinaire, la qualité de la webcam y est pour beaucoup, elle n'est pas adaptée à être dans un environnement aussi lumineux, le verre de lunette de soleil altère également les couleurs.

01/2010 : après plusieurs jours d'utilisation, de nombreux kernel oops ont fait leur apparition dans les logs du noyau. Le driver USB de la webcam était en cause et une fois planté, un rmmod ne suffisait pas à remettre les choses en ordre, un reboot était obligatoire. Ces erreurs étaient surement liées à une instabilité de la connexion USB du fait de la très grande longueur de câble malgré la présence des prolongateurs. Je n'ai pas trouvé de solution logicielle à mettre en oeuvre pour palier à ce problème.

J'ai alors ressortit d'un de mes tiroirs mon NSLU2 pour l'installer le plus proche possible de la webcam tout en le laissant dans le garage à l'abri des intempéries et proche d'une source de courant. 10 m sépare alors la webcam du slug.

 NSLU2

Ce dernier sera alors en charge d'exécuter mjpeg-streamer pour rendre accessible la webcam sur mon réseau. Comme pour le serveur en i386, il n'existait pas de paquet Debian mjpg-streamer compilé pour armel, je l'ai donc compilé avec la même procédure que précédemment. Par contre et pour corser le tout, le NSLU2 n'a pas beaucoup de RAM, j'ai dû mettre en place une swap sur NFS pour que la compilation aboutisse. Après s'être armé de patience, étant terminée, il est possible de lancer le programme :

export LD_LIBRARY_PATH=/opt/mjpg-streamer
${MJPG_PATH}/mjpg_streamer -b -i 'input_uvc.so -fps 10' -o "output_http.so -w ${MJPG_PATH}/www"

Par contre, lors du boot du slug, les modules noyaux de la webcam ne montent pas systématiquement, il faut les charger de la manière suivante avant de lancer mjpg-streamer :

# création du périphérique
mknod /dev/video0 c 81 0
# chargement des modules
modprobe usbcore
modprobe videodev
modprobe gspca_zc3xx

Voici les logs du noyau lorsque la webcam est branchée :

[   15.619846] Linux media interface: v0.10
[   15.770726] IXP4xx MII Bus: probed
[   15.819800] eth0: MII PHY 1 on NPE-B
[   15.973385] Linux video capture interface: v2.00
[   16.004020] gspca_main: v2.14.0 registered
[   16.048776] gspca_main: zc3xx-2.14.0 probing 046d:08a2
[   16.973189] input: zc3xx as /devices/pci0000:00/0000:00:01.0/usb2/2-1/input/input1
[   17.064290] usbcore: registered new interface driver zc3xx
[ 1213.743279] usb 2-1: new full-speed USB device number 3 using ohci_hcd
[ 1213.961052] usb 2-1: New USB device found, idVendor=046d, idProduct=08a2
[ 1213.967980] usb 2-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 1213.979954] gspca_main: zc3xx-2.14.0 probing 046d:08a2
[ 1214.741868] input: zc3xx as /devices/pci0000:00/0000:00:01.0/usb2/2-1/input/input2

Puis il faut faire pointer le navigateur sur http://slug.home:8080 et voila !

Schéma de l'ensemble

Après plusieurs semaines de tests, cette configuration fonctionnait très bien et ne plantait plus. =)

03/2010 : j'ai installé un logiciel de détection de mouvement motion sur le NSLU2 pour qu'il prenne une photo lorsqu'un animal picore. Il stocke sur le NFS de Popeye les images.

La configuration de motion est un peu délicate. Au début, la détection était trop sensible, puis après l'application de différents réglages, le nombre d'images produite était toujours très important (~1000 / jours) j'ai diminué le nombre de fps au minimum : 2. Au final, voici les parties essentielles du fichier /etc/motion/motion.conf :

daemon on
process_id_file /var/run/motion/motion.pid
setup_mode off
v4l2_palette 8
input 8
norm 0
frequency 0
rotate 0
width 640
height 480
framerate 2
minimum_frame_time 5
netcam_url http://localhost:8080/?action=stream
netcam_http 1.0
netcam_tolerant_check off
auto_brightness off
brightness 0
contrast 0
saturation 0
hue 0
roundrobin_frames 1
roundrobin_skip 1
switchfilter off
threshold 3500
threshold_tune on
noise_level 110
noise_tune on
despeckle  EedDl
mask_file /root/mask-2012.pgm
smart_mask_speed 8
lightswitch 60
minimum_motion_frames 5
pre_capture 0
post_capture 0
gap 5
max_mpeg_time 0
output_all off
output_normal on
output_motion off
quality 100
ppm off
text_right %Y-%m-%d\n%T
text_changes on
text_event %Y%m%d%H%M%S
text_double off
target_dir /mnt/media/webcam/
snapshot_filename %Y%m%d-%H%M%S
jpeg_filename %m-%d/%Y%m%d-%H.%M.%S

J'ai écrit une IHM très simple en PHP pour parcourir les prises de vues et les afficher.

12/2010 : j'ai mis en place du POE (Power Over Ethernet) passif à l'aide d'un connecteur spécifique utilisant les paires de fils inutilisées d'un câble Ethernet pour alimenter l'appareil.

Sur un câble Ethernet, en 100 Mbits, seul 2 paires sur les 4 sont utilisées. De nombreuses bidouilles sont alors possibles : POE, double Ethernet :)

Pour se faire il existe des adaptateurs POE auprès de sites d'enchères en ligne : d'un côté, il y a l'alimentation + réseau en entrée et de l'autre, le câble Ethernet de transport. Le frère jumeau de l'adaptateur se retrouve de l'autre côté et sépare le courant de la data.

Connecteur POE passif

Le l'assemblage ressemble alors à cela :

Schéma de la webcam alimentée en POE

Il faut faire attention à ne pas brancher le câble de transport directement sur un ordinateur sans passer pas un adaptateur au risque de griller la carte réseau.

Calculs de résistance

Le câble Ethernet mesure 15 mètres environ et les brins sont de très faible section. La chute de tension en courant continu dans un câble éléctrique se calcule avec les formules suivantes :

  • loi d'Ohm : $U= R*I$
    • avec U la tension exprimée en Volt (V), R la résistance en Ohm (Ω), I l'intensité en Ampère (A)
  • résistance d'un câble : $R=\frac{ρ*L}{S}$
    • avec R la résistance du câble, ρ la résistivité en Ω/m, L longueur du câble aller / retour, S section du câble
  • la section d'un câble à partir de son diamètre est le calcul d'une aire d'un cercle : $S=π*r^2$
    • avec S aire du cercle, r rayon du cercle.

Avec un câble Ethernet de catégorie 5e, nous avons :

La section du câble est de : $$S=π*(\frac{D}{2})^2 \approx0.327\,mm^2$$

La résistance du conducteur est de : $$R=\frac{ρ*L}{S} \Rightarrow \frac{17 * 10^{-9} * 30}{0.327 * 10^{-6}}\approx1.56\,Ω$$

Le NSLU2 est donné pour consommer environ 5 W, soit 1 Ampère avec son alimentation de 5 V. La chute de tension est donc : $1.56*1=1.59\,V$. En l'alimentant directement avec son transformateur à l'extrémité du câble, il ne recevra que $5-1.56=3.44\,V$, il ne fonctionne pas avec si peu de courant. La phase de boot étant la plus gourmande, au final, il ne démarre même pas. De plus, avec une section aussi petite et un courant aussi important, le cable mettra pas longtemps à fondre… :hot:

Pour pallier à ce problème, il faut mettre une tension plus importante en entrée, le courant sera plus faible et donc il y aura moins de perte. Je me suis branché directement sur le 12 V de l'alimentation de Popeye.

La puissance de 5 W sous 12 V requiert 0.625 A. En reprenant le calcul ci dessus, nous obtenons une chute de tension de : $1.56*0.625\approx0.98\,V$. Donc en bout de câble, nous avons $12-0.98=11.2\,V$. Le 12 V d'une alimentation de PC n'est pas la tension la mieux régulée, cela peut être 12.2 V ou 11.8 V. Le cas le plus défavorable nous donne donc : 10.82 V. Ceci est bien supérieur à la tension nominale du NSLU2.

LM7805

Pour abaisser la tension à 5 V, le composant le plus commun à utiliser est le LM7805 : c'est un régulateur linéaire de tension à tension variable d'entrée. Le schéma de câblage est simple et nécessite que 2 condensateurs.

LM7805   Schéma de câblage du LM7805

Le défaut majeur de ce composant est qu'il converti la chute de tension demandée en chaleur et donc il peut beaucoup chauffer.

Le cas le plus défavorable est lorsque l'alimentation du PC sort 12.2V soit une chute de tension à ces bornes de : $12.2-0.98-5 = 6.22 V$. La dissipation en chaleur est $P=U*I$ ce qui donne $6.22*0.625\approx3.9\,W$.

Il faut impérativement installer un dissipateur thermique sur le LM7805 et celui ci sera tout de même bouillant :hot:.

Régulateur LM2596

De nombreux autres montages existent, les régulateurs de tension à découpage sont également communs. Plutôt que d'appliquer une résistance variable comme le LM7805, ils hachent le courant avec une fréquence de 150 kHz environ en faisant varier la taille des créneaux haut et bas puis la re-linéarisent afin que la tension moyenne de sortie soit stable. Cela est beaucoup plus efficace que la solution précédente. De nombreux montages tout prêt sont disponibles sur les sites de ventes aux enchères en ligne à un coût dérisoire.

Régulateur LM2596

Ainsi, en mettant ce régulateur en bout de câble entre l'adaptateur POE et le NSLU2, je peux alors l'alimenter en 5V.

Allumage automatique

Un petit défaut du NSLU2 est qu'il faut appuyer sur le bouton power en façade pour l'allumer et il n'est pas possible d'un point de vue logiciel de forcer l'allumage dès qu'il y a du courant. De nombreuses méthodes sont décrites ici ou pour l'allumer automatiquement dès qu'il y a du courant. J'ai choisi la dernière méthode : relier le 5 V de l'USB au connecteur d'alimentation du slug.

De plus, j'ai ajouté un relais piloté par l'Arduino afin d'allumer et éteindre le NSLU2 en fonction de l'heure de lever :sun: et de coucher du soleil :night:.

La récupération de ces heures est effectuée par un script perl maison qui parse la page de météo France puis qui ajoute des entrées dans at. Pour allumer le slug, la commande à exécuter est ./pin.pl webcam on et pour l'éteindre ./pin.pl webcam off. Pour l'enregistrer dans at, il faut lancer :

echo "pin.pl webcam on" | at 2012-07-24T05:36:28

02/2011 : les trous dans le boitier étanche contenant la webcam ne sont plus étanches, des petits insectes ce sont glissés à l'intérieur. J'ai changé la boite et améliorer le système de fixation interne afin qu'il soit plus flexible en cas d'évolution.

Nouveau système de fixation

 

Ouverture arrondie

J'ai également changé la mangeoire qui se faisait vieillissante.

Nouvelle mangeoire

12/2013 : le NSLU2 se met à planter régulièrement et toujours dans la matinée. En fait, il plante quelques heures après avoir démarré ou après un certains volume de données transférer : ~1 Go. Il ne répond plus au ping et aucune trace n'est laissée dans les logs stockés sur la clé USB.

Après de longues recherches et tests infructueux, je me suis finalement branché sur le port série du slug pour tenter d'y voir un peu plus clair. Une fois la phase de boot passée et en générant du trafic, des kernel oops s'affichent en pagaille : l'USB se déconnecte régulièrement… Et comme la clé est branchée en USB, les logs ne peuvent plus s'écrire dessus.

Je pense que c'est lié à l'âge du NSLU2, les condensateurs utilisés dans la gestion de l'USB doivent être abimés mais rien n'est visible à l'œil nu. Paix à son âme. :dead: