Une boîte noire pour enregistrer ses données de vol
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:
- Localisation: GPS
- Tangage, Roulis, Lacet: IMU
- Orientation: magnétomètre de l'IMU ci-dessus
- Pression atmosphérique: capteur barométrique
- Température et Humidité: capteur de température humidité
- Son: Carte audio et microphone
- Caméra: caméra
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.