Expérimentation Raspberry PI

Après avoir joué avec un Arduino, il était temps de passer au niveau supérieur. Intrigué par la caméra NoIR, j’ai trouvé sur le Web un projet sympa de caméra de capture des animaux nocturnes et je me suis dit : c’est un super projet de vacances avec les enfants.

Le cerveau

On commence par le matériel de base : un Raspberry PI. J’ai choisi le modèle A+ pour les raisons suivantes :

  • faible consommation (100 à 140 mA seul)
  • petite taille
  • pas besoin de multiples ports USB.

Le problème du A+ c’est son port USB unique, qui ne permet de brancher qu’un clavier, et son absence de port réseau. La solution : un adaptateur sans fil USB et SSH.

DSC02041

La caméra

Donc voilà pour la base. Ensuite la caméra NoIR. Cette caméra est la même que le modèle standard mais sans le filtre IR qui empêche la capture de l’infrarouge proche. Elle n’est donc pas sensible aux infrarouges thermiques et ne permet pas de voir dans le noir, en tout cas pas sans aide.

Lumière ! Ou pas.

Pour « voir dans le noir » il faut donc éclairer la scène avec une lumière infrarouge, la meilleure solution étant l’utilisation de LED IR. Il en existe de deux longueurs d’onde : 850 nm et 940 nm. Les premières ont l’inconvénient d’émettre un peu de lumière visible mais sont plus proches de la plage de sensibilité de la caméra (laquelle chute rapidement avec les nm). J’ai commandé les deux pour voir. Il existe des illuminateurs tout faits pour les caméra de sécurité, mais elles sont alimentées en 12v et allumées tout le temps (la nuit). Bref pas portable et pas subtil.

Les LED seront pilotées par le PI, ce qui pose un problème : les GPIO du PI ne peuvent délivrer plus de 16 mA chaque, et 50 mA au total. Or l’idée initiale est d’utiliser 8 LED supportant 60 mA, en limitant à 50 pour les ménager et compenser les possibles déviations des spécifications des composants. L’alimentation en 5V limite le nombre de LED par chaîne à 2 (elles sont données pour 1,5V en fonctionnement, plus la résistance de limitation du courant), il faudra 4 chaînes de 2 LED donc 4 x 50 mA = 200 mA, bien plus que le pauvre PI ne peut fournir. La solution est d’utiliser un transistor pour piloter tout cela.

J’ai donc joué du fer à souder pour monter une petite carte contenant le transistor (2N2222) en émetteur commun et 4 séries de 2 LED. Le tout se branche avec trois fils : +5, terre et port GPIO. Rien de plus simple !

Montage LED

Petit test : le courant sur le GPIO est 12mA, le courant dans les LED 210mA, tout est bon. Effectivement les LED (840nm) émettent un léger rouge visible mais c’est très faible et même pratique pour savoir si elles sont allumées.

DSC02043

Et surtout 8 LED 60mA c’est suffisant pour illuminer !

Détection de mouvement

Bien sûr le but n’est pas de filmer toute la nuit puis de passer la journée à regarder une image fixe pour éventuellement trouver une bestiole. Une option serait d’utiliser un algorithme de détection de changement dans l’image, mais c’est assez bourrin (il faut illuminer en permanence) et intensif en CPU, donc énergivore. L’autre option est d’utiliser une forme de détection de mouvement. La solution qui semble la plus efficace est la même que celle généralement utilisée dans les systèmes d’alarme, porte automatiques : un capteur PIR. De l’infrarouge encore mais thermique cette fois. J’ai opté pour un module tout fait, réglable en sensibilité et délais, économique (environ 5 euros) : HC-SR501. Il est alimenté en 5V et sort du logique donc se connecte directement à un port GPIO du PI. Bref trois fils et c’est réglé.

Le tout monté sur le panneau avant (caméra, détecteur PIR, LED). C’est collé à la colle chaude.

DSC02042

Alimentation

Pour alimenter tout ça on peut bien sûr utiliser un chargeur USB (disons 1A pour avoir de la marge) mais ce n’est pas très portable. Une solution pratique et économique est d’utiliser une de ces nombreuses batterie / chargeur Li-Ion chargeur USB pour smartphone. J’ai choisi un 10400 mAh, ce qui avec une consommation estimée à 150 mA en moyenne (puisque pas d’écran sur le HDMI, pas de périphérique USB, et utilisation très intermittente de la caméra et des LED IR) devrait donner au moins 2 jours d’autonomie, bref plus qu’il n’en faut.

Edit : ce chargeur possède un ennuyant circuit qui détecte la « charge » de l’appareil connecté. Il finit par couper l’alimentation du PI dans des conditions pour l’instant non identifiées (après plusieurs heures de fonctionnement). C’est gênant…

DSC02045

C’est dans la boîte

Finalement voici le tout fini. La boîte retenue est une simple boite alimentaire, robuste et de taille idéale. Il reste de la place pour une autre série de 8 LED au cas ou.

DSC02040DSC02039

Le programme

C’est bien beau tout ça mais il faut orchestrer. Voici le programme python qu’il suffit de lancer.

import time
import RPi.GPIO as GPIO
import picamera

GPIO.setmode(GPIO.BCM)
# Preparation capteur PIR
PIR_PIN = 14
GPIO.setup(PIR_PIN, GPIO.IN)
# Preparation illumination LED
ILL_PIN = 15
GPIO.setup(ILL_PIN, GPIO.OUT)

# Fonction mouvement detecte
def mouvement(canal):
 heure = time.strftime("%y-%m-%d %H:%M:%S")
 print "Mouvement " + heure
 fichier = "/home/pi/capture/" + heure + ".jpg"
 with picamera.PiCamera() as camera:
  camera.resolution = (2592, 1944)
  GPIO.output(ILL_PIN, GPIO.HIGH)
  time.sleep(0.2)
  camera.capture(fichier)
  GPIO.output(ILL_PIN, GPIO.LOW)

# Boucle principale
print "Demarrage (CTRL+C pour sortir)"
try:
 GPIO.add_event_detect(PIR_PIN, GPIO.RISING, callback = mouvement)
 while 1:
  time.sleep(100)
except KeyboardInterrupt:
 print "Sortie"
 GPIO.cleanup()

Quelques petites notes :

  • On utilise le mode interruption, la fonction mouvement est appelée lorsque le capteur PIR déclenche, la boucle principale est donc vide
  • La caméra n’est initialisée que lorsque nécessaire, ce qui pose toutefois un problème, il lui faut un peu de temps pour définir les paramètres d’exposition (on peut régler l’ISO et le shutter speed mais la caméra doit définir le gain), d’où la petite attente de 0,2 seconde avant la capture
  • Les LED ne sont allumées que lorsque nécessaire, soit avant la pause de 0,2 seconde nécessaires au réglage de la caméra
  • Les images sont stockées dans un dossier capture et nommées d’après la date et l’heure pour identifier la moment de la prise.

Test 1

Les premiers tests sont plutôt concluants avec des grosses bêtes. Bien sûr il ne faut pas qu’elles bougent trop vite vue le peu de « lumière », on va jouer avec le shutter speed pour limiter.

En intérieur dans une pièce noire :

15-07-23 10:28:02

Les LED sont assez directionnelles (20-30 degrés) et l’illumination est surtout centrale mais c’est acceptable.

En extérieur par nuit noire :

15-07-23 23:08:21

Pour cette série de tests j’ai forcé la caméra en iso 800, le framerate à 10 et le shutter speed à 50 ms. Le problème c’est que la seule détection de la nuit s’est produite à 5h30, le jour était levé et l’image… toute blanche.

Modif 1

Nous avons un superbe capteur d’intensité lumineuse : la caméra ! Il y a deux options pour éviter les problèmes d’exposition :

  • Ne pas fixer le shutter speed (juste le ISO) et laisser la caméra faire : le problème est que le 800 iso en plein jour est une mauvaise idée
  • Réveiller la caméra de temps en temps (par exemple toutes les 5mn) pour effectuer une mesure et décider d’ajuster iso et éventuellement shutter speed manuellement.

Pour rappel, fixer le shutter speed est une bonne idée pour éviter que la caméra ne choisisse des valeurs trop élevées qui conduisent à un flou.

La suite par ici.