Cette semaine, nous avons reçu une caméra Raspberry Pi High Quality Camera et pour la tester nous avons décidé de réaliser un petit piège photographique. Le but de ce piège était de filmer et peser un oiseau quand il mange mais, comme vous allez le voir, chez Yoctopuce on est plus doué avec l'électronique qu'avec les animaux.
Pour réaliser ce système, nous avons utilisé un Raspberry Pi 3+ auquel nous avons branché la caméra officielle Raspberry Pi High Quality et un Yocto-Bridge. Le Yocto-Bridge permet de détecter les variations de poids et donc la présence d'un oiseau, ce qui déclenche l'enregistrement vidéo.
Le piège photographique
La caméra Raspberry Pi HQ
La caméra Raspberry Pi High Quality Camera est vendue en plusieurs parties. Il y a le senseur et différents objectifs qui peuvent être montés sur le senseur. Dans notre cas, nous avons utilisé l'objectif 16mm téléphoto.
La caméra n'a pas d'autofocus ni de réglage automatique de l'ouverture. Pour certains scénarios, cela peut être un problème mais pour notre piège ce n'en est pas un car la caméra est fixe. Il faut juste ne pas oublier de régler le focus chaque fois que l'on déplace la caméra.
Un fois l'objectif monté sur le senseur, il faut relier la caméra au Raspberry Pi à l'aide du câble nappe. Ce câble se branche sur le port dédié au milieu du Raspberry Pi. Notez qu'il faut utiliser un adaptateur pour les Raspberry Pi Zero.
La caméra Raspberry PI Zero HQ
Une fois connecté, il faut activer la caméra dans les paramètres système d'OS à l'aide de la commande raspi config. Le paramètre pour activer l'interface caméra se situe dans la section Interfacing Options. Il est ensuite possible de vérifier le fonctionnement de la caméra à l'aide de la commande raspvid -f -t 0 qui ouvre une fenêtre de preview. Cette commande est aussi très pratique pour régler manuellement le focus et l'ouverture de l'objectif.
Le Yocto-Bridge
Pour mesurer le poids de l'oiseau nous avons utilisé cellule de charge par cisaillement ("Shear beam") que nous avons branchée au Yocto-Bridge. Ce type de cellules est un "simple" bloc métallique qui doit être fixé à une extrémité et la charge à mesurer à l'autre extrémité.
La cellule de charge connectée au Yocto-Bridge
Pour le branchement, il suffit de brancher les 4 fils dans le bornier du Yocto-Bridge. Dans notre cas, c'est trivial car la cellule de charge utilise les couleurs standard pour les quatre fils. Il suffit donc de brancher chaque fil en suivant le marquage indiqué au dos du Yocto-Bridge.
La cellule de charge connectée, il faut configurer le Yocto-Bridge. Pour ce faire, nous utilisons le VirtualHub et nous rentrons les paramètre de notre cellule, à savoir l’excitation AC, la charge maximum et le zero tracking.
Les paramètre de configuration pour notre cellule de charge
L'application
Un fois que tout est installé, il ne "reste plus" qu'à écrire l'application qui va déclencher l'enregistrement quand le système détecte un poids supplémentaire.
Nous avons décidé d'écrire l'application en Python car il existe déjà une librairie toute faite pour contrôler la caméra.
La librairie Python pour contrôler la caméra est très simple et
bien documentée. Voici par exemple comment enregistrer une vidéo d'une seconde avec le message "hello world" en surimpression.
camera = picamera.PiCamera()
camera.start_recording("myvideo.h264")
camera.annotate_text = "hello world"
sleep(1000)
camera.stop_recording()
Le code de notre application est relativement simple, et s'inspire grandement de l'exemple de la documentation du Yocto-Bridge.
Note: Pour cette application, nous avons installé notre librairie Python à l'aide de PyPi. Si vous n'avez jamais utilisé notre librairie avec Python, vous pouvez lire notre tutoriel sur le sujet.
Au début de l'application, on initialise l'API Yoctopuce à l'aide de YAPI.RegisterHub, on vérifie qu'un Yocto-Bridge est présent, on vérifie que l'excitation est bien sur AC et pour finir on tare la valeur mesurée.
from yoctopuce.yocto_api import *
from yoctopuce.yocto_weighscale import *
# Setup the API to use local USB devices
errmsg = YRefParam()
if YAPI.RegisterHub("usb", errmsg) != YAPI.SUCCESS:
sys.exit("init error" + errmsg.value)
# Retrieve any YWeighScale sensor
sensor = YWeighScale.FirstWeighScale()
if sensor is None:
die('No <product>Yocto-Bridge</product> connected on USB')
# On startup, enable excitation and tare weigh scale
print("Resetting tare weight...");
sensor.set_excitation(YWeighScale.EXCITATION_AC);
YAPI.Sleep(3000);
sensor.tare();
unit = sensor.get_unit();
if not os.path.isdir("videos"):
os.mkdir("videos")
La boucle principale récupère la valeur mesurée toutes les 0.1 seconde et démarre l’enregistrement si le poids dépasse 5 grammes. On continue à enregistrer tant que le poids est supérieur à 5 grammes ou au maximum 30 seconds. Comme nous avons le poids nous affichons en surimpression l'heure courante et le poids mesuré.
while sensor.isOnline():
weight = sensor.get_currentValue()
if weight > 5:
print("Object on the scale take a video of it");
starttime = datetime.datetime.now().strftime("%Y-%m-%d_%H.%M.%S")
video_file = "videos/" + starttime + ".h264"
camera.start_recording(video_file)
count = 0
while weight > 5 and count < 30:
weight = sensor.get_currentValue()
prefix = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S ")
msg = "%s : weight = %d %s" % (prefix, weight, unit)
camera.annotate_text = msg
print(msg)
count += 1
YAPI.Sleep(1000)
camera.stop_recording()
YAPI.Sleep(100)
Cette version de l'application fonctionne mais soufre de quelques limitations. Premièrement, à la longue les vidéos vont remplir la carte SD du Raspberry Pi et risquent de saturer le disque. Deuxièmement, l'enregistrement ne se déclenche que lorsque l'oiseau est posé sur la balance. Il nous manque donc les quelques secondes avant que l'oiseau ne se pose sur la balance.
Nous avons donc amélioré le code de cette petite application pour que la caméra fonctionne en continu et que l'application garde en mémoire les 5 dernières secondes filmées. De cette manière, quand un oiseau est détecté à l'aide du Yocto-Bridge, il est possible de récupéré les 5 secondes précédentes.
Nous avons aussi modifié l'application pour qu'elle upload automatiquement la vidéo sur YouTube. Une fois que la vidéo est correctement uploadée sur YouTube, le fichier local est effacé et un email est envoyé.
Expliquer en détail le code de ces deux fonctionnalités rendrait cet article indigeste, mais nous avons comme à notre habitude publié le code complet sur GitHub: https://github.com/yoctopuce-examples/picam.
Vous pouvez aussi regarder la documentation de la librairie Python pour contrôler la caméra et la documentation de la librairie Google pour Python.
Oui mais...
Nous avons réalisé notre application en peu de temps. La partie qui nous a pris le plus de temps a été de comprendre comment fonctionne l'API de la caméra Raspberry Pi et l'API Google qui permet d'uploader une vidéo sur YouTube. Au final, nous avions un POC qui fonctionnait parfaitement dans nos bureau.
Voici par exemple une vidéo de test:
Mais c'était sans compter sur notre méconnaissance des oiseaux... Nous avons essayer 3 types de graines, 4 emplacements mais rien n'y a fait. Après 4 jours d'essais nous n'avons toujours pas eu un seul oiseau qui s'est posé sur notre mangeoire. Et la météo est aussi venue mettre son petit caillou dans l'engrenage, en annonçant 10 jours de pluie.
Différents systèmes de fixation des graines
Bref, soit les voisins ont des meilleures graines que nous, soit on a j'ai clairement sous estimé la méfiance de ces petits animaux.
On va quand même continuer notre expérience, à un moment on va bien trouver un truc qui leur fait envie, d'ici là voici quelque vidéos d'essais que nous avons fait avec le système en place.
Un "pas oiseau":
Un autre "pas oiseau":