Expérimentation Raspberry PI – épisode 2

Dans le premier épisode, nous avons vu le montage et un premier programme.

Les résultats étaient globalement bons une fois la sensibilité du capteur PIR réglée au minimum. Il restait trois problèmes :

  • Le capteur PIR lance des signaux à la fois à l’entrée et à la sortie du sujet, il n’y a hélas pas grand chose à faire à part augmenter le délais, mais cela peut nuire à la détection. Étant donné que dans de bonnes conditions le nombre de détections par nuit reste faible, on ne changera rien.
  • Le chargeur « intelligent » choisi est susceptible de couper l’alimentation s’il considère que l’équipement branché est complètement chargé, afin de le protéger… Il faudrait trouver un modèle « bête » mais ayant déjà celui-ci, on le garde pour l’instant.
  • Fixer framerate et ISO empêche une utilisation polyvalente jour / nuit. On va s’attaquer à ce dernier point.

Ajustement automatique ISO et framerate

Nous avons déjà mentionné que la caméra était une bonne source de mesure de lumière, donc inutile de rajouter une photorésistance ou autre dispositif.

Voici la fonction de réglage utilisée.

# Globales
isos = [100, 200, 400, 800]
isoi = 3 # favorise les conditions de faible lumiere pour demarrage rapide
framerates = [30, 15, 10, 5]
frameratei = 2

def ajustement():
 global isos, isoi, framerates, frameratei
 print "Ajustement sensibilite, valeurs initiales " + str(isos[isoi]) + " / " + str(framerates[frameratei])
 GPIO.output(ILL_PIN, GPIO.HIGH)
 with picamera.PiCamera() as camera:
  camera.resolution = (2592, 1944)
  while 1:
   camera.framerate = framerates[frameratei]
   camera.iso = isos[isoi]
   time.sleep(0.5)
   gain = camera.analog_gain
   print "mesure iso " + str(camera.iso) + ", framerate " + str(camera.framerate) + ", shutter " + str(camera.exposure_speed) + ", gain " + str(gain)
   if gain <= 1:
    # besoin de moins de sensibilite
    if isoi > 0:
     # diminution iso
     isoi -= 1
     print "Diminution iso " + str(isos[isoi])
    else:
     # iso deja au min, augmentation framerate
     if frameratei > 0:
      frameratei -= 1
      print "Diminution framerate " + str(framerates[frameratei])
     else:
      # framerate deja au max, rien a faire
      print "iso et framerate deja au minimum..."
      break
   elif gain >= 10:
    # besoin de plus de sensibilite
    if isoi < (len(isos) - 1):
     isoi += 1
     print "Augmentation iso " + str(isos[isoi])
    else:
     # iso deja au max
     if frameratei < (len(framerates) -1):
      frameratei += 1
      print "Augmentation framerate " + str(framerates[frameratei])
     else:
      # framerate deja au max
      print "iso et framerate deja au maximum..."
      break
   else:
    # gain dans la bonne plage, pas de changement
    break
 GPIO.output(ILL_PIN, GPIO.LOW)

On définit deux tableaux de paramètres de réglage : ISO et framerate. On éclaire avec les LED puis on laisse la caméra effectuer une exposition. Si le gain résultant est inférieur ou égal à 1 cela signifie qu’il y a trop de lumière, et qu’il faut diminuer ISO et / ou augmenter le framerate (ce qui permettra à la caméra de diminuer le shutter speed). A l’inverse si le gain est supérieur à 10 (valeur arbitraire) il manque de lumière et il faut augmenter l’ISO et / ou diminuer le framerate.

Cette fonction sera appelée toutes les 5 minutes dans la boucle principale.

Premiers résultats

Enfin on peut placer tout le dispositif, programme lancé, dans un endroit propice au passage des rôdeurs de la nuit 😉

Et à la deuxième nuit (la première ayant vu l’extinction du PI), on attrape notre premier coupable (bien connu par ailleurs et gentil comme tout).

Il ne semble pas être dérangé outre mesure par l’infrarouge.

15-07-27 01

15-07-27 02

15-07-27 03

La dernière image a été capturée une heure après les autres et on voit que le jour commence à se lever, malgré cela l’exposition reste bonne grâce à notre ajustement automatique.

Sur environ 11h de fonctionnement le PI aura capturé une vingtaine d’images, dont 5 avec notre petit tigre, le taux de faux positifs reste gérable.