TP2 Raspberry
TP2 Raspberry
TP2 Raspberry
1 Introduction
Les ordinateurs embarqués sous le système d’exploitation Linux sont massivement présents dans les technologies
modernes (transports, multimédia, téléphonie mobile, appareils photos …).
L’ordinateur Raspberry PI constitue un support d’apprentissage performant, très bon marché et disposant d’une
forte communauté sur le net. Il possède des entrées/sorties puissantes permettant une connexion avec le monde
physique par l’intermédiaire de capteurs et d’actionneurs.
L’objectif de ce TP est de réaliser une rapide prise en main d’un système embarqué au travers d’un ordinateur
Raspberry PI et d’effectuer un tour d’horizon des pratiques de mise en œuvre et de développement.
Les connaissances acquises devront permettre la réalisation d’une application embarquée de supervision d’un
système matériel simplifié.
2 Evaluation
L’évaluation portera sur :
Un compte rendu détaillé explicitant les différentes opérations menées durant le TP.
Pensez à prendre des copies d’écran pour illustrer ces opérations.
la réalisation d’une application embarquée de supervision d’un système matériel simplifié.
Le cahier des charges sera détaillé plus loin dans se document.
Raspberry Pi peut être directement connecté à une IHM classique, souris/clavier/ecran HDMI ou vidéo
composite, cependant comme tout ordinateur Linux, Raspberry Pi peut intégrer ses propres outils de
développement et une IHM reposant sur SSH contrôlable depuis un autre ordinateur par Ethernet ou WIFI.
Le connecteur d’extension supporte les entrées/sorties parallèles ainsi que la plupart des bus de
communication. C’est un support particulièrement économique et puissant qui peut être facilement mis en
œuvre dans de petits systèmes nécessitant un accès au monde physique par des capteurs/actionneurs
disposants d’interfaces numériques.
Les broches peuvent avoir des fonctions différentes suivant qu’elles sont activées en tant que GPIO (Global
Purpose Input Output), périphérique de communication ou sorties PWM (Pulse Width Modulation).
http://www.element14.com/community/docs/DOC-73950/l/raspberry-pi-2-model-b-gpio-40-pin-block-pinout
3.3 Raspbian
Raspbian est un système d’exploitation libre basé sur la distribution GNU/Linux Debian, et optimisé pour le
plus petit ordinateur du monde, la Raspberry Pi.
Raspbian ne fournit pas simplement un système d’exploitation basique, il est aussi livré avec plus de 35 000
paquets, c’est-à-dire des logiciels pré-compilés livrés dans un format optimisé, pour une installation facile sur
votre Raspberry Pi via les gestionnaires de paquets.
La Raspberry Pi est une framboise merveilleuse, mais elle reste néanmoins dotée d’une puissance inférieure
à celle d’un ordinateur moderne. Par conséquent, il est préférable d’installer un système optimisé pour la
Raspberry.
Raspbian a été créé dans cette optique, et il est donc tout particulièrement adapté à la Raspberry.
Par ailleurs, en tant que distribution dérivée de Debian, il répond à la majeure partie de la très vaste
documentation de Debian.
https://www.raspbian.org/
Avant de brancher quoi que ce soit à votre Raspberry Pi, assurez-vous de disposer de l’ensemble des
éléments listés. Puis, suivez ces instructions :
Commencez par insérer votre carte microSD dans le logement prévu sur le Raspberry Pi.
Ensuite, connectez votre souris et votre clavier USB aux ports USB du Raspberry Pi.
Assurez-vous que votre moniteur est sous tension et que vous avez sélectionné l’entrée appropriée (p.
ex. HDMI 1, DVI, etc.).
Ensuite, reliez votre Raspberry Pi à votre moniteur à l’aide du câble HDMI.
Connectez votre Raspberry Pi au réseau à l’aide d’un câble Ethernet.
Lorsque vous avez branché tous les câbles et inséré la carte microSD requise, branchez l’alimentation
électrique micro USB. Cette action met sous tension et démarre votre Raspberry Pi.
4.2 Démarrage
Au premier démarrage, l’écran suivant apparait :
change pass : le mot de passe par défaut de l’utilisateur « pi » est « raspberry » (ne le changez pas)
Configurez la connexion filaire pour recevoir automatiquement les paramètres TCP/IP d’un DHCP.
Identifiez votre adresse IP.
Vérifiez dans le navigateur l’accès à internet.
Modifiez la configuration pour utiliser une adresse IP fixe (la même que celle que le DHCP vous a
fourni).
Vérifiez dans le navigateur l’accès à internet.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string prenom;
cout << "Test d'ecriture et de compilation d'un programme C++ sur Raspbery PI " << endl ;
cout << "- Ecriture sur cible " << endl ;
cout << "- Enregistrement local " << endl ;
cout << "- Compilation sur cible " << endl ;
cout << "Quel est ton prenom ? " ;
cin >> prenom;
cout << "Bonjour " << prenom << endl;
}
Depuis un hôte linux connecté au réseau, ouvrez une session SSH avec la Raspberry PI dans un
terminal. Explicitez les différentes étapes.
ssh <IP_Raspberry_PI>
La commande scp permet de copier un fichier ou un répertoire (-r) d’un client vers un serveur ou
d’un serveur vers un client. Depuis votre hôte linux, copiez le fichier hello1.cpp présent sur la
Raspberry PI dans votre dossier personnel.
scp <Fichier_local> <login@IP_client_distant:Chemin>
scp <login @IP_serveur_distant:Chemin/Fichier>
int main()
{
string prenom;
cout << "Test d'ecriture et de compilation d'un programme C++ sur Raspbery PI " << endl ;
cout << "- Ecriture sur hote distant linux " << endl ;
cout << "- Enregistrement sur hote distant puis transfert sur cible " << endl ;
cout << "- Compilation sur cible depuis hote distant " << endl ;
cout << "Quel est ton prenom ? " ;
cin >> prenom;
cout << "Bonjour " << prenom << endl;
}
Transférez le fichier sur la carte Raspberry PI dans le dossier personnel de l’utilisateur pi.
int main()
{
string prenom;
cout << "Test d'ecriture et de compilation d'un programme C++ sur Raspbery PI " << endl ;
cout << "- Ecriture sur hote distant Windows " << endl ;
cout << "- Enregistrement sur hote distant puis transfert sur cible " << endl ;
cout << "- Compilation sur cible depuis hote distant " << endl ;
cout << "Quel est ton prenom ? " ;
cin >> prenom;
cout << "Bonjour " << prenom << endl;
}
Transférez le fichier sur la carte Raspberry PI dans le dossier personnel de l’utilisateur pi.
Depuis l’hôte Windows, compilez et exécutez le programme sur la cible. Sauvegardez le rapport
de compilation.
g++ -ftime-report hello3.cpp –o hello3
Explicitez les différentes étapes.
5.4 Cross-compilation
Le processus de compilation mobilise les ressources du système (temps processeur et mémoire). Il nécessite
également un espace de stockage suffisant pour l’enregistrement des données temporaires de compilation.
Sur un système embarqué, ces caractéristiques matérielles sont naturellement limitées et il est souvent
préférable de procéder à la compilation des sources sur un système plus performant puis de transférer les
exécutables obtenus sur la cible.
Ce type de compilation s’appelle cross-compilation ou compilation croisé en français. Il s'agit de compiler sur
une machine (PC) pour une autre (Raspberry PI). Le cross-compilateur doit être construit sur mesure, pour
une cible donnée et sur un système hôte donné. Il faut donc le compiler en utilisant le compilateur de l’hôte,
des outils pour la cible (binutils) et des bibliothèques C adaptées (libC). Cette préparation peut être très
complexe. Il faut faire les bons choix et résoudre les problèmes de dépendances. Heureusement, il existe des
solutions « pré-faites » comme crosstool-NG. Il permet de fabriquer sur mesure les outils nécessaires pour
faire de la compilation croisée, en l'occurrence, les outils nécessaires pour compiler sur un PC x86-64 pour
une plate-forme ARM. Nous allons donc voir comment utiliser crosstool-NG pour faire de la compilation
croisée facile pour Raspberry Pi.
$ export VERSION=1.21.0
$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-${VERSION}.tar.bz2
$ tar xjf crosstool-ng-${VERSION}.tar.bz2
$ cd crosstool-ng-${VERSION}
$ ./configure --prefix=/opt/crosstool-ng
$ make
$ sudo make install
$ cd
$ export PATH= "${PATH} :/opt/crosstool-ng/bin"
$ mkdir my-dev
$ cd my-dev
$ ct-ng menuconfig
$ ct-ng build
Remarque : Ce processus peut être très long en fonction des ressources de votre machine. A titre
d’exemple, il m’a fallu attendre plus de 20 minutes sur une machine avec processeur i7 4 cores, 8 Go
de RAM et 8Go de mémoire virtuelle (Swap). Il aura fallu plus de 3h30 sur une machine virtuelle avec
processeur double cores, 2 Go de RAM et 2Go de mémoire virtuelle. Je recommande fortement de
passer en mode console (Ctrl + Alt + F1 à F6) pour cette opération.
A la fin du processus de fabrication, si tout c’est bien passer, un nouveau dossier x-tools a été créé. Il
contient le compilateur et les éléments nécessaires à la compilation croisée de programmes pour
linux sur une architecture ARM.
Pour pouvoir compiler de n’importe où dans le sytème de fichier, renseignez la variable PATH
avec le chemin d’accès au compilateur : /x-tools/arm-unknown-linux-gnueabihf/bin
int main()
{
string prenom;
cout << "Test d'ecriture et de crosscompilation d'un programme C++ pour Raspbery PI" << endl ;
cout << "- Ecriture sur hote distant Ubuntu " << endl ;
cout << "- Transfert par ssh / serveur monte dans FS Ubuntu " << endl ;
cout << "- Compilation sur hote " << endl ;
cout << "Quel est ton prenom ? " ;
cin >> prenom;
cout << "Bonjour " << prenom << endl;
}
Depuis l’hôte linux, compilez, transférez l’exécutable généré et exécutez le sur la cible.
Sauvegardez le rapport de compilation.
arm-unknown-linux-gnueabihf-g++ -ftime-report hello4.cpp -o hello4 -static-libstdc++
Explicitez les différentes étapes.
Nous pouvons utiliser ces GPIO de différentes façons, depuis l’espace utilisateur ou depuis le noyau. Le but ici est
de balayer les principaux aspects.
Pour chaque objet ajouté dans l'arbre des modèles de pilote (pilotes, périphériques, classes de
périphériques), un répertoire est créé dans sysfs.
Pour les périphériques et leurs pilotes, des attributs peuvent être créés. Ce sont de simples fichiers, la seule
contrainte est qu'ils ne peuvent contenir chacun qu'une seule valeur et/ou n'autoriser le renseignement que
d'une valeur. Ces fichiers sont placés dans le sous-répertoire du pilote correspondant au périphérique.
/ # cd /sys/class/gpio/
/sys/class/gpio # ls
export gpiochip0 unexport
6.2.2 Ecriture
La broche doit être configurée en sortie pour écrire :
6.3 Application
7 Installation de logiciel
7.1 Installation d’un serveur web
L'implantation d'un serveur web dans un système embarqué permet un accès simplifié à ce dernier à travers
une interface Web. On en trouve par exemple dans des équipements de domotique, matériels électro-
ménagers ou Hi-Fi, équipement réseaux, caméra IP et de nombreuses applications professionnelles.
Les serveurs web embarqués doivent prendre en compte de nombreuses problématiques liées à leurs
caractéristiques. En effet, la taille réduite, la consommation énergétique, l'architecture flexible ainsi que le
coût de ces serveurs sont autant de problématiques qu'il est nécessaire de soulever pour amener internet
vers les systèmes embarqués.
De nombreuses solutions sont disponibles, la plus utilisée lorsque les performances du système le permet est
Apache (environ 60% de part de marché).
https://fr.wikipedia.org/wiki/Serveur_web_embarqué
7.1.1 Installation
# apt-get install apache2 php5
7.1.2 Test
Dans un navigateur web, saisissez l’adresse IP de la carte Raspberry PI.
Explicitez les différentes étapes de l’installation est décrivez votre procédure de test pour
vérifier le fonctionnement du serveur pour l’affichage de pages html et php.
7.2.1 Installation
# apt-get install mysql-server php5-mysql
7.2.2 Test
Dans un terminal, saisissez la commande suivante :
mysql --user=root --password=votrepasswd
8 Mini-projet
Le but du mini projet est de réaliser une interface web de supervision distante d’un système matériel simplifié
utilisant les entrées/sorties TOR disponibles sur le Raspberry PI.
Les technologies de programmation sont librement choisies et explicitées dans votre compte-rendu.
Le fonctionnement de l’application fait l’objet d’une discussion avec le professeur.
9 Proposition de réalisation
La led change d’état à chaque front montant du switch (à la pression mais pas au relachement).
L’interface web permet de voir en temps réel l’état de la led et de changer son état. On conserve
l’historique des actions menées.
La led est connectée au GPIO21 et le switch au GPIO20
Interruption sur front montant sur le port GPIO20 (switch) :
#/sys/class/gpio/gpio20 # echo rising > edge
9.2 Technologies
La difficulté réside dans l’affichage temps réelle de l’interface web sans action à partir du client. La
technologie des Websockets est ici parfaitement adaptée.
void bySwitch()
{
// Ouvrir le fichier qui contient l'etat du switch
while (1)
{
// Attente passive sur le switch (pas de timeout, donc infinie...)
// Lire la valeur actuelle du switch
// Verrouiller l'acces au fichier qui contient l'etat de la LED
// Lire l’état de la LED
// Inverser l’état de la LED
// Deverrouiller l'acces au fichier qui contient l'etat de la LED
}
close(fd);
}// fin du thread bySwitch
void byApp()
{
while(1)
{
// Lire la commande sur le flux d’entrée
// Verrouiller l'acces au fichier qui contient l'etat de la LED
// Inverser l’état de la LED
// Deverrouiller l'acces au fichier qui contient l'etat de la LED
}
}// fin du thread byApp
int main()
{
thread th1 (bySwitch);
thread th2 (byApp);
th1.join();
th2.join();
}
<!DOCTYPE html>
<script>
var msg;
function log(msg)
{
// Afficher l’image de la LED correspondant à son état
// Ajouter une ligne de log
} ;
// Ouverture du websocket
var ws = new WebSocket('ws://192.168.1.31:8080/');
ws.onopen = function()
{
log('CONNECT');
};
ws.onclose = function()
{
log('DISCONNECT');
};
ws.onmessage = function(event)
{
msg = event.data;
log(msg);
};
function sendLED()
{
if(ws)
{
try { ws.send('TOGGLE'); }
catch (ex){alert("Erreur : "+ex);}
}
} ;
</script>
<HTML>
<HEAD>
<style>
/* Mes styles */
</style>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<TITLE>Supervision GPIO</TITLE>
</HEAD>
<BODY>
<center><h1>Controler la LED sur GPIO21 </h1>
<a href="#" onclick="sendLED()";><img id="LED" src ="leds/led-off.png"></a>
</center>
<h2>   Historique :</h2>
<div id='log'></div>
</BODY>
</HTML>
Ce script est à placer dans le dossier indiqué par l’option –staticdir lors de l’exécution du serveur. Le
client devra spécifier explicitement le port, ici : http://192.168.1.31:8080
Le script peut aussi être placé dans le dossier /var/www/html si apache ou lighttpd est installé.