Une boîte noire pour enregistrer ses données de vol

X-Plane 10 Flight Data Recorder

Pour me faciliter le prototypage, je vais repartir d'une solution identique au sous-marin (soit un couplage Raspberry Pi 2 / GrovePi), même si on pourrait beaucoup plus optimiser pour la consommation électrique. Mais cela me permettra d'aller plus vite au résultat normalement.

Les capteurs nécessaires pour ce projet sont les suivants:

Voici les différentes étapes réalisées à ce jour sur la configuration de la plate-forme pour mener à bien ce projet.

Installation et configuration de la plate-forme

Si vous avez besoin d'aide, vous pouvez consulter les pages suivantes pour la configuration de la Raspberry Pi et de la configuration de la plate-forme Grove Pi

WiFi

Une première étape pour connecter la plate-forme est de la configurer pour se connecter au réseau WiFi. Rien de très compliqué. Une très large documentation existe en ligne, y compris une note "officielle" sur le site de Raspberry. Mais il est beaucoup plus intéressant d'avoir la possibilité de non seulement se connecter à un réseau, mais de fournir un point d'accès pour que des clients se connectent à notre dispositif ("Access Point" ou AP). La configuration est un peu plus "complexe", avec quelques étapes nécessitant d'appliquer de nombreux patches et modifications de configurations.

Configuration d'un Point d'Accès

Ces informations sont issues du site consacré à la réalisation d'un "Access Point" pour les chipsets RTL81xxCU de Realtek. J'ai fait quelques modifications, en particulier pour la mise en place d'un serveur DHCP pour utiliser un outil plus simple.

Compilation des modules pour le dongle RTL8192cu

La première étape est la compilation d'une version modifiée du module correspondant à notre interface réseau sans-fil WiFi. Il faut tout d'abord installer les paquetages nécessaires pour disposer des sources des entêtes de fichiers du noyau pour pouvoir recompiler le bon module.

sudo apt-get install build-essential dkms git psmisc libnl-3-dev libnl-genl-3-dev pkg-config raspberrypi-kernel raspberrypi-kernel-headers firmware-realtek

Attention, si vous avez lancé l'outil rpi-update (celui-ci dit mettre à jour le firmware, mais il change la version de noyau pour le plus récent compilé), il est nécessaire de revenir à la version fournie sous forme de paquetage pour avoir les fichiers correspondant au noyau que l'on exécute. Pour revenir à la version noyau des paquetages, voici la commande à lancer:

sudo apt-get install --reinstall raspberrypi-kernel

Récupérons les sources adaptées du module et appliquons les différentes modifications nécessaires.

cd ~
git clone https://github.com/desflynn/realtek-8192cu-concurrent-softAP.git
ln -s realtek-8192cu-concurrent-softAP WifiAP

cd /usr/src/linux-headers-$(uname -r)/arch/
sudo ln -s arm armv7l

cd ~/WifiAP/rtl8192cu-fixes
make
sudo find /lib/modules -name \*8192\*.ko -exec rm {} \;
sudo make install
cd ..
sudo dkms add ./rtl8192cu-fixes
sudo dkms install 8192cu/1.10
sudo depmod -a
sudo cp ./rtl8192cu-fixes/blacklist-native-rtl8192.conf /etc/modprobe.d/

Configuration et installation du démon HostAPd

Passons maintenant à la mise en place du serveur "Acces Point" adapté à notre chipset en lui appliquant le patch nécessaire.

sudo apt-get -y purge hostapd
sudo apt-get install libssl-dev

git clone https://github.com/pritambaral/hostapd-rtl871xdrv.git
wget http://w1.fi/releases/hostapd-2.6.tar.gz
tar zxvf hostapd-2.6.tar.gz
cd hostapd-2.6
patch -p1 -i ../hostapd-rtl871xdrv/rtlxdrv.patch
cp ../hostapd-rtl871xdrv/driver_* src/drivers
cd hostapd
cp defconfig .config
echo CONFIG_DRIVER_RTW=y >> .config
echo CONFIG_LIBNL32=y >> .config
make
sudo make install

Reste maintenant à installer les fichiers de configuration proposés dans les sources du repository github, en ayant préalablement réalisé une sauvegarde des fichiers existants.

# Archivage des fichiers existants
sudo mv /etc/default/hostapd /etc/default/hostapd.bak
sudo mv /etc/hostapd/hostapd.conf /etc/hostapd/hostapd.conf.bak
sudo mv /etc/network/interfaces /etc/network/interfaces.bak
sudo mv /etc/dhcpcd.conf /etc/dhcpcd.conf.bak

# Remplacement par les fichiers modifiés
wget http://stephane.lavirotte.com/perso/xplane/configs.tgz
tar xzvf configs.tgz
cd configs
sudo mkdir /etc/hostapd
sudo cp ./hostapd /etc/default/hostapd
sudo cp ./hostapd.conf /etc/hostapd/hostapd.conf
sudo cp ./interfaces /etc/network/interfaces
sudo cp ./dhcpd.conf /etc/dhcpcd.conf

Installation et configuration d'un serveur DHCP léger (et cache DNS)

L'avant-dernière étape consiste à installer les utilitaires nécessaires, et en particulier le serveur DHCP qui répondra aux requêtes lors des demandes de connexions sur l'"Access Point".

sudo apt-get install dnsmasq

Enfin, pour finir, il reste à modifier les fichiers de configuration par rapport aux valeurs par défaut. Nous allons archiver le fichier existant:

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.bak

et le remplacer le contenu suivant (/etc/dnsmasq.conf):

interface=wlan1      # Use interface wlan1
listen-address=192.168.220.1   # Specify the address to listen on
bind-interfaces      # Bind to the interface
server=8.8.8.8       # Use Google DNS
domain-needed        # Don't forward short names
bogus-priv           # Drop the non-routed address spaces.
dhcp-range=192.168.220.50,192.168.220.150,12h # IP range and lease time

Pour le fichier /etc/hostapd/hostapd.conf, il faut modifier le nom que vous souhaitez donner à votre "Access Point" et bien sûr spécifier le mot de passe pour se connecter.

ssid=MyFlightRecorder
wpa_passphrase=FlightDataRec

Il ne restera alors plus maintenant qu'à réaliser un fichier pour lancer l'auto-start de hostapd en tant que service. En attendant, il est possible de démarrer manuellement le point d'accès à l'aide de la commande:

sudo /usr/local/bin/hostapd /etc/hostapd/hostapd.conf

Mise en place du routage du traffic vers l'interface eth0

Commençons par activer l'IP forwarding pour IPv4. Pour cela il faut retirer le commentaire à la ligne contenant ce paramètre dans le fichier /etc/sysctl.conf.

sudo nano /etc/sysctl.conf
# Enlever le commentaire à la ligne net.ipv4.ip_forward=1

Pour ne pas avoir à redémarrer et que ce changement de paramètre prenne tout de suite effet, on peut exécuter la commande suivante (sinon, il faudra attendre le prochain redémarrage de la plate-forme).

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

Il faut ensuite modifier le transférer le trafic de l'interface wlan1 vers eth0 et vice versa.

sudo apt-get install iptables
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan1 -o eth0 -j ACCEPT
sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

Pour que la configuration soit restaurée à chaque redémarrage de la plate-forme, il faut modifier le fichier /etc/rc.local.

sudo nano /etc/rc.local
# Avant exit 0 ajouter:
#  iptables-restore < /etc/iptables.ipv4.nat

GPS

La récupération des information du GPS est assez simple à réaliser. Il suffit de brancher celui-ci sur le port RPISER de la plate-forme GrovePi. La récupération des informations sera alors réalisée via l'interface série de la Raspberry (/dev/ttyAMA0 ou /dev/serial0).

Le seul problème est la configuration correct du port série pour non seulement en disposer, mais y avoir accès. Si vous ne voyez pas le fichier /dev/ttyAMA0 ou /dev/serial0, il est nécessaire d'ajouter le pilote pour le port série. Une manière simple de réaliser ceci est de lancer la commande raspi-config . Puis dans "Advanced Options / Serial", demander l'activation du port série pour la connexion. Ceci va permettre l'ajout des règles pour le chargement du pilote du port série, mais aussi l'ajout d'une option pour le lancement du noyau qu'il va falloir supprimer. En effet, cette configuration permet d'autoriser la connexion sur la Raspberry Pi via le port série. Mais ce port ne peut être utilisé que par un seul client. Le symptôme de ce problème est de bien voir le port /dev/ttyAMA0 mais de ne pas avoir les droit de lecture sur celui-ci (seulement le droit d'écriture).

Il est alors nécessaire de modifier le fichier /boot/cmdline.txt et de retirer le paramètre suivant: console=serial0,115200. Un redémarrage de la plate-forme est alors nécessaire.

Un programme simple de test est disponible dans le dossier de GrovePi/Software/Python sous le nom GroveGPS.py pour avoir accès aux informations du GPS.

cd ~/GrovePi/Software/Python
python GroveGPS.py

Centrale inertielle

Pour la centrale inertielle, il est possible de consulter la configuration pour l'accès aux données via les pages que j'ai déjà réalisé pour le robot sous-marin: configuration pour l'accès aux données de la centrale via l'utilisation de la librairie RTIMILib2 et calibration des données de la centrale inertielle.

Pour tester celle-ci, vous pouvez utiliser le programme de DemoGL. Mais celui-ci nécessite un environnement graphique et un Windows manager pour être plus à l'aise. Si vous avez installé la version Raspbian Light comme moi, vous ne disposez pas de l'environnement graphique. Pour l'ajouter, il suffit d'ajouter les paquetages suivants (et leurs dépendances bien entendu). Cela fera grossir votre installation de 32Mo environ.

sudo apt-get install xinit fluxbox

Pression atmosphérique et température

L'utilisation de la centrale inertielle IMU 10DOF permet d'avoir accès à un capteur barométrique intégré à la plate-forme. Ce capteur est du type BMP180 qui est géré dans la librairie fournie par GrovePi en Python.

cd ~/GrovePi/Software/Python/grove_barometer_sensors/barometric_sensor_bmp180
python grove_i2c_barometic_sensor_example.py

Ce capteur fournit non seulement la pression, mais aussi une information de température et d'altitude.

Temperature: 26.80 C
Pressure:    1018.33 hPa
Altitude:    -26.90 m

Humidité et température

Ne disposant actuellement pas du capteur Grove cité ci-dessus, je poursuis le prototypage à l'aide d'un capteur Phidget qui combine humidité et température 1125_0. Ce capteur est un double capteur analogique nécessitant deux câbles spéciaux permettant de connecter ces capteurs utilisant 3 pins avec la connectique Grove. La lecture de la donnée est réalisée à l'aide du script grove_analog_read.py en indiquant le port auquel chacun des capteurs est connecté.

Pour convertir la valeur numérique du capteur en valeur de température et d'humidité, il est nécessaire d'utiliser les formules données sur la fiche de description du produit.

La dernière étape est donc de réaliser le petit script Python qui récupère les valeurs, les converti et les affichent.

cd ~/GrovePi/Software/Python/
python phidget_1125.py

Audio et enregistrement

La plate-forme Raspberry ne dispose pas d'entrée son. Il est donc nécessaire d'ajouter une carte audio USB pour la capture du son. Les commandes suivantes permettent de visualiser que la carte son est bien reconnue et configurée. Pour de plus amples informations, une très bonne page en anglais décrit la configuration d'une carte audio sous Linux.

lsusb
arecord -l
amixer --card 1 contents
alsamixer
sudo alsactl store 1

Pour enregistrer un son de test, voici la commande à exécuter:

arecord -D plughw:1,0 -f cd -t raw sound.pcm

Pour éviter de remplir la carte SD de fichiers son trop volumineux, nous allons directement les enregistrer compressés grâce à la librairie et à l'utilitaire lame.

sudo apt-get install lame
arecord -D plughw:1,0 -f cd -t raw | lame -x -r -s 44.1 -V0 -h -b 160 --vbr-new - sound.mp3

Vidéo et enregistrement

Pour l'enregistrement, rien de très compliqué après avoir activé celle-ci avec l'outil raspi-config. Reste alors à lancer la commande suivante pour réaliser un enregistrement. Le temps spécifié avec le paramètre -t correspondant à une journée exprimé en secondes. Ceci évitera que l'enregistrement ne se coupe inopportunément.

video_length=86400000
video_file=video
raspivid -t ${video_length} -n -w 1280 -h 720 -fps 25 -o ${video_file}.h264

Programme et configuration système

Maintenant que tous les tests unitaires ont été réalisés et que l'on peut accédé à l'ensemble des données que nous souhaitions, l'étape suivante est de réaliser un petit programme qui regroupera toutes ces données dans le bon format et réalisera la sauvegarde des données. Pour conserver le travail déjà réaliser à la fois sur la lecture des capteurs et le traitement des données, nous réaliserons ce programme en Python.

Boîtier pour le projet

Il reste enfin à réaliser un petit boîtier pour permettre une utilisation du système. Évidemment, ce boîtier ne sera pas aux normes pour résister à un crash aéronautique, et ce n'est pas là le but. Mais, nous allons essayer de faire quelque chose de propre et qui permette une utilisation pratique.