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.
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.