Pour un rendu optimal, activez JavaScript

Timelapse d'un Blob

 ·  ☕ 6 min de lecture  ·  đŸ€– Hohenheim

Projet : Élùve ton Blob

Ma chĂšre et tendre est enseignante de SVT. Elle a donc inscrit son collĂšge pour participer Ă  une expĂ©rience Ă©ducative proposĂ©e par le CNES basĂ©es sur l’Ă©tude du comportement du Physarum Polycephalum (alias le Blob) en collaboration avec la mission Alpha de Thomas Pesquet.
Il s’agit de comparer le comportement du Blob sur Terre dans les conditions de pesanteur terrestre avec son comportement en microgravitĂ© dans l’ISS.
Pour Ă©tudier le comportement, des photos de son Ă©volution doivent ĂȘtre prises suivant les diffĂ©rents protocoles proposĂ©s.
Le Blob ne supportant pas la lumiĂšre, il doit ĂȘtre placĂ© dans un endroit sombre. Il faut donc Ă©clairer la scĂšne aux moments idoines lors des prises de photos.

Pour prendre les photos, plusieurs possibilitĂ©s Ă©taient offertes aux enseignants, notamment Ă  base de tablette et d’appli Android. Mais ayant un Rasperry Pi 3 et la Pi Camera Ă  la maison qui ne servent pas, j’ai proposĂ© de rĂ©aliser un montage plus original et fait maison. Ce montage comprend :

  • l’utilisation du Raspberry Pi munie de la Pi Camera, d’une LED et d’un script Bash pour la prise de photos Ă  intervalles rĂ©gulier.
  • la mise en place d’un serveur web (Apache) pour la consultation des photos prises et vĂ©rifier l’état du Blob sans ouvrir la boite pendant la durĂ©e de l’expĂ©rience.
  • l’utilisation de ffmpeg pour la rĂ©alisation d’un timelapse Ă  partir des photos.

Pré-requis :

  • 1 Raspberry Pi 3 ou 4 : lien
  • 1 Raspberry Pi Camera v2 (ou v1) : lien
  • 1 Relais type Mosfet : lien ou lien
  • 1 LED (1W) : lien
  • Jumper cables (femelle-femelle, male-femelle, male-male) : lien

Montage :

La complexitĂ© du montage rĂ©side dans le fait qu’il n’est pas possible d’alimenter directement la LED Ă  partir d’une broche GPIO. Le courant de sortie est trop faible : 20-30mA.
Il faut donc utiliser un relais (un transistor Mosfet), pilotĂ© depuis une broche GPIO, pour jouer le rĂŽle d’interrupteur. On pourra alors utiliser la broche +5V ou +3.3V, qui elles, permettent un courant bien supĂ©rieur.
Le choix de la LED s’est portĂ© sur une LED de 1W avec une tension VF comprise entre 3.2-3.6V. En utilisant la broche power 3.3V du Raspberry Pi, il n’y pas besoin de rĂ©sistance pour limiter le courant.

Apparté électronique :
Par sécurité, il serait conseillé de mettre une résistance devant la LED (15ohm suffisent). Mais sans résistance, le montage réalisé avec les composants présentés en prérequis fonctionne sans accroc sur de longues périodes.

Avec l’alimentation 3.3V on obtient un courant de 240mA environ, soit un flux lumineux idĂ©al pour Ă©clairer le Blob.

Pour le montage, il faut connecter la broche +3.3V du Raspberry Pi sur l’entrĂ©e + du Mosfet, ainsi que le GND sur le GND du Raspberry Pi. Puis enfin, connecter l’Out sur l’anode de la LED.

alt-text

Installation :

Nous partons du principe que Raspbian est installé sur le Raspberry Pi (voir ce tutoriel)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# crĂ©ation d’un nouveau user blob
sudo adduser blob
# ajout des droits superuser au user blob
sudo visudo → blob    ALL=(ALL:ALL) ALL
su blob
# suppression du user pi
sudo deluser -remove-home pi
# ajout du user blob au groupe gpio et video pour le contrÎle des pins GPIO et de la caméra
sudo usermod -aG gpio blob
sudo usermod -aG video blob
# MaJ du systĂšme
sudo apt update
sudo apt upgrade
# installation du serveur web
sudo apt install apache2
sudo apt install php php-mbstring
# attribution des droits sur le répertoire web
sudo chown -R blob:www-data /var/www/html
sudo chmod 770 /var/www/html/
# activation des pins GPIO et de la caméra
sudo raspi-config → enable GPIO and camera

Test :

On regarde si la Pi Camera fonctionne bien :

1
raspistill -o testshot.jpg

→ Il faut rĂ©gler la focale de la camĂ©ra pour avoir une bonne nettetĂ© Ă  faible distance (lien).

On contrĂŽle les pins GPIO

1
sudo ./ledcontrol.sh

→ Petit script Bash que j’ai Ă©crit pour vĂ©rifier rapidement que l’allumage et l’extinction de la LED fonctionne.

Usage

DĂ©marrer le timelapse :

1
sudo ./timelapse.sh &

Les sources sont sur mon dépot Github

Explication :

La fonction timelapse() permet de prendre les photos à intervalle régulier sur une période de temps.

La variable sample_period permet de dĂ©finir l’intervalle de temps entre 2 photos. Il est exprimĂ© en seconde.

La variable nb_picture permet de définir le nombre de photos qui seront prises.

DurĂ©e de l’expĂ©rience = sample_period x nb_pictures

Si l’on souhaite que l’expĂ©rience dure 24h (soit 86400 secondes) avec un intervalle de 10 minutes entre chaque prise (600 secondes) alors nb_pictures = 86400 / 600 = 144 photos

La fonction take_picture() prend les photos en utilisant l’utilitaire raspistill prĂ©sent de base sur la distribution.
Chaque photo est nommée suivant le pattern suivant : timelapse_YY-mm-dd_HH:MM:SS.jpg.
Cela permet de faire apparaĂźtre l’horodatage directement dans le nom de photo, ce qui plus commode Ă  utiliser et Ă  visualiser que de rechercher ces informations dans les propriĂ©tĂ©s du fichier.

Il y a deux fonctions d’encodage pour crĂ©er la vidĂ©o de timelapse Ă  partir des photos prises :

  • encoding_1() utilise mencoder (basĂ© sur ffmpeg) et produit un timelapse de moyenne rĂ©solution avec poids faible et un traitement rapide pour le processeur du Pi.
  • encoding_2() utilise directement ffmpeg et produit un timelapse avec une rĂ©solution HD (1080p). Le traitement de l’encodage est plus long (compter 5 minutes pour 144 photos Ă  15fps) pour poids d’environ 150Mo.

encoding_2() se veut lossless, lĂ  oĂč encoding_1() se veut rapide et lĂ©ger.

Les 2 fonctions peuvent s’utiliser en fonction des besoins, il suffit de changer le code en dĂ©commentant la ligne avec la fonction voulue et en commentant l’autre.

1
2
3
4
5
6
7
echo -e "Starting timelapse"
create_dir
timelapse
echo -e "Creating video..."
#encoding_1
encoding_2
echo -e "Done"

Les vidĂ©os produites sont Ă  15fps mais ce paramĂštre peut ĂȘtre modifiĂ© au niveau des fonctions encoding_1() et encoding_2().

A 15fps, 6 jours de capture produisent une vidĂ©o d’une durĂ©e d’environ 1 minute.

Les autres fonctions sont des fonctions utilitaires. L’intĂ©rĂȘt de les dĂ©crire ici n’est pas pertinent.

A noter que le script se lance avec les droits superuser (sudo). Ceci est lié aux fonctions manipulant les pins GPIO.
Il semble exister des possibilitĂ©s pour manipuler les pins GPIO en tant que user normal mais la mise en Ɠuvre est loin d’ĂȘtre simple et ne semble pas parfaitement fonctionnelle. (lien)

Comme timelapse.sh est lancé sur une période assez longue (24h à une semaine suivant les protocoles expérimentaux), il est important de ne pas lier le processus au terminal qui le lance.

Pour cela il faut utiliser l’exĂ©cutable nohup.

1
sudo nohup ./timelapse.sh & --> le & est important pour ne pas bloquer le terminal).

Cette commande a le dĂ©faut de ne pas faire apparaĂźtre le prompt de sudo demandant le mot de passe de l’utilisateur.
Afin de palier à cela, la mécanique suivante est employée :

1
2
3
sudo su
exit
sudo nohup ./timelapse.sh &

Le mot de passe de l’utilisateur ayant Ă©tĂ© demandĂ© pour la commande sudo su, il ne le sera normalement pas pour la commande sudo nohup ./timelapse.sh (comportement que l’on retrouve sur les distro type Debian/Ubuntu notamment).

Dernier point : un fichier de log timelapse.log s’alimente dans le rĂ©pertoire oĂč sont stockĂ©es les photos. Il permet de suivre l’évolution des prises de vue et dĂ©tecter si un souci est survenu (notamment l’arrĂȘt du script pour une raison X).

Aperçu :

alt-text
alt-text
alt-text

Vidéo produite :

Blob Timelapse


Hohenheim
RÉDIGÉ PAR
Hohenheim
Computer guy


Contenu