Changes between Initial Version and Version 1 of SujetTP1-2018


Ignore:
Timestamp:
Feb 8, 2018, 10:49:01 PM (7 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • SujetTP1-2018

    v1 v1  
     1{{{#!comment
     2Pour la définition de la bibliothèque, il faut s'inspirer du TP2...
     3}}}
     4= TP1 : Outils de développement et GPIO =
     5
     6La carte Raspberry Pi offre de nombreuses possibilités pour développer des applications embarquées. Notamment, elle dispose de ports d'entrées/sorties génériques (GPIO) qui permettent de s'interfacer avec un grand nombre de périphériques plus ou moins exotiques.
     7
     8Dans ce TP il vous est demandé de développer une application "user-land" qui fasse clignoter deux LEDs selon un motif que vous choisirez et également de récupérer les informations d'un bouton poussoir.
     9
     10À la fin de ce TP, vous devriez avoir acquis les compétences suivantes:
     11* Compilation croisée via un compilateur déporté
     12* Contrôle distant de système embarqué par liaison réseau (SSH)
     13* Manipulation d'un périphérique GPIO et de ses registres "memory mappés"
     14* Interface numérique/analogique via des ports GPIO
     15* Programmation d'automates de contrôle en C
     16
     17== 0. Plateforme de développement ==
     18
     19[[Image(htdocs:png/plateforme-peri-raspberry.png, width=700px, nolink)]]
     20
     21Pour exécuter votre programme sur une carte Raspberry Pi, vous devez vous connecter en SSH sur une carte Raspberry Pi en passant par le routeur peri. Le routeur a deux adresses: `132.227.102.36` du coté laboratoire et `192.168.1.1` de l'autre coté.  Le routeur crée un sous-réseau (`192.168.1.x`) où sont connectées les cartes. Les cartes sont numérotées de `20` à `26` plus des cartes étudiants (ici n°30), le routeur a été programmé de telle sorte que l'adresse internet de la carte n°`X` est comme adresse 192.168.1.`X` (par exemple la carte n°`20` a comme adresse sur ce réseau `192.168.1.20`).
     22Pour faire ça, le firmware du routeur a été remplacé par '''[[http://www.dd-wrt.com/site/index | dd-wrt]]''' qui permet ce type de mode.  Le routeur a été également été programmé pour que tous les paquets entrants sur le port `5000`+`X` de l'adresse `132.227.102.36` soient routés vers l'adresse `192.168.1.X`.
     23
     24Il n'y a qu'un seul compte utilisateur sur une carte Raspberry Pi. Le nom de login est `pi` et le mot de passe est `raspberry`.
     25
     26Ainsi, pour se connecter en ssh sur la carte n°`22` avec le login `pi`, il faut taper (remarquez que c'est un `p` minuscule):
     27{{{#!sh
     28$ ssh -p 5022 pi@132.227.102.36
     29pi@132.227.102.36's password: raspberry
     30}}}
     31
     32Comme, il n'y a qu'un compte par carte et que vous allez devoir vous les partager, vous devez créer un répertoire à la racine avec le nom de votre login sur le réseau enseignement accolé avec un tiret avec le nom de votre binôme si vous en avez un. Par exemple, deux personnes en binôme se nommant respectivement `almada` et `fomentin` vont créer un répertoire `almada-fomentin` (en minuscule). '''Je vous demande de respecter cette convention afin que je puisse vous identifier facilement.'''
     33
     34Il est recommandé de ne pas laisser de fichiers source sur la carte SD, car celle-ci peut être reformatée en cas de dysfonctionnement.
     35
     36Pour copier un fichier `file.x` depuis votre compte enseignement sur le carte n°`22` il faut taper (remarquez que c'est un `P` majuscule):
     37{{{#!sh
     38$ scp -P 5022 file.x pi@132.227.102.36:almada-fomentin
     39pi@132.227.102.36's password: raspberry
     40}}}
     41
     42{{{#!td
     43{{{#!td
     44**__Astuce__**[=#mdp][[BR]]
     45Taper le mot de passe à chaque fois que l'on se logue et à chaque copie peut être pénible à la longue.
     46Pour éviter cela, il faut donner à la !RaspberryPi la clé publique du protocole de chiffrement utilisé pour la connexion.
     47* Pour la première commande, vous devez taper 3 fois sur la touche entrée pour choisir les valeurs par défaut.
     48* Pour la deuxième commande, vous sélectionnez la bonne carte (en remplaçant x par le bon chiffre) et vous tapez le mot de passe `raspberry` (ce sera la dernière fois).
     49* La troisième est là pour vérifier
     50{{{#!sh
     51ssh-keygen -t rsa
     52ssh-copy-id -i .ssh/id_rsa.pub "-p 502x pi@132.227.102.36"
     53ssh -p 502x pi@132.227.102.36
     54}}}
     55}}}
     56}}}
     57[[BR]]
     58
     59= 1. Prise en mains des outils de développement: Hello World! =
     60
     61La première étape consiste à vous familiariser avec les outils de
     62développement. Pour cela, vous allez développer un petit programme
     63de type "Hello World!" qui affiche une phrase sur la sortie standard
     64grâce à un printf.
     65
     66Pour compiler votre programme, suivez les instructions suivantes.
     67
     68* Tout d'abord, configurez votre terminal pour utiliser le compilateur croisé (vous pourrez ajouter cette commande dans le fichier $HOME/.bashrc):
     69  {{{#!sh
     70  $ source /users/enseig/franck/peri/export_rpi_toolchain.sh
     71  }}}
     72
     73* Une fois le terminal configuré, vérifiez que le compilateur est accessible:
     74  {{{#!sh
     75  $ which bcm2708hardfp-gcc
     76  }}}
     77  Si cette commande ne retourne rien, la configuration n'a pas fonctionné. Appelez le chargé de TP pour vous aider.
     78
     79Votre suite d'outils (toolchain) contient tous les outils nécessaires pour la compilation, l'édition des liens et la manipulation de binaires pour la carte Raspberry Pi. Et tous ces outils sont préfixés par la même chaîne de caractères: `bcm2708hardfp-`. Il s'agit donc d'un compilateur pour un SoC BCM2708 avec l'option hardfp activée (calcul flottant matériel). Il s'agit bien du SoC de la carte Raspberry Pi.
     80
     81Maintenant, pour compiler un programme C vers un binaire qui puisse s'exécuter sur la carte Raspberry Pi, il vous faut écrire un Makefile pour plus de facilité. Pour cela, suivez la syntaxe de base des Makefile:
     82{{{#!make
     83cible: dépendances
     84    commande
     85}}}
     86Notez bien que l'indentation de la seconde ligne doit OBLIGATOIREMENT être une tabulation et non une suite d'espaces.
     87
     88Vous pourrez donc par exemple, écrire la règle de Makefile suivante:
     89{{{#!make
     90helloworld.x: helloworld.c
     91    bcm2708hardfp-gcc -o $@ $< -O2 -static
     92}}}
     93{{{#!protected
     94Un `Makefile` un peu plus complexe qui se charge de la copie et qui utilise la règle de compilation implicite:
     95{{{#!make
     96CC=bcm2708hardfp-gcc
     97CFLAGS=-O2 -static
     98CARD=5020
     99NAME=lacas
     100APP=helloworld
     101
     102all: $(APP)
     103    scp -P $(CARD) $^ pi@132.227.102.36:lacas
     104
     105clean:
     106    rm $(APP)
     107}}}
     108}}}
     109
     110L'option "-static" est importante ici, car la librairie C du compilateur croisé n'est pas tout à fait identique à la librairie C sur la carte Raspberry Pi. Ajouter "-static" à la ligne de compilation permet de créer un binaire qui
     111contient en plus les fonctions de la librairie C utilisée par votre programme. Ceci permettra à celui-ci de ne pas essayer d'utiliser des fonctions de la librairie C installée sur la carte qui, sinon, aurait été chargée dynamiquement.
     112
     113== 2. Contrôle de GPIO en sortie ==
     114
     115[[Image(htdocs:png/Raspberry-Pi-GPIO-Layout-Revision-2.png,500px,nolink)]]
     116
     117Dans cet exercice, on vous propose de manipuler une pin du GPIO en mode "sortie" pour contrôler le clignotement d'une LED à une fréquence donnée.
     118
     119* Avant de commencer à écrire du code, déterminez quelles sont les différentes étapes nécessaires depuis l'initialisation jusqu'à l'envoi des valeurs 0 ou 1 sur le GPIO.
     120* Récupérer le répertoire lab1, exécuter la commande suivante dans un terminal et dans le dossier que vous souhaitez pour contenir votre code pour ce premier TP.
     121{{{#!sh
     122cp -rp /users/enseig/franck/peri/lab1 .
     123}}}
     124* Éditez le fichier lab1.c et ajoutez le code que vous pensez nécessaire à la réalisation de cet exercice.\\
     125  ATTENTION: ne changez pas les valeurs de GPIO_LED0, car vous risqueriez d'endommager la carte Raspberry Pi.
     126* Ensuite, compilez-le grâce au Makefile qui vous est fourni.
     127  Qu'observez-vous ? Essayez de changer la fréquence de clignotement.
     128
     129== 3. Contrôle de plusieurs GPIO en mode "sortie" ==
     130
     131Refaites le même exercice que précédemment, mais cette fois-ci configurez plusieurs GPIO en sorties.
     132* En plus du GPIO 4 de l'exercice précédent, rajoutez la LED1 qui est connectée sur le GPIO 17.
     133* Avant d'exécuter votre programme, validez votre code avec le chargé de TP !
     134
     135== 4. Lecture de la valeur d'une entrée GPIO ==
     136
     137Maintenant que vous maîtrisez le contrôle d'un GPIO en sortie, passons au mode "entrée".
     138Écrivez un programme qui configure la GPIO 18 en entrée. Vous devez afficher la valeur de ce GPIO dans une boucle infinie.
     139
     140* Une fois réalisé, compilez votre programme comme précédemment à l'aide du Makefile fourni. Et validez votre code avec le chargé de TP !
     141* Ensuite, copiez votre programme sur la carte comme indiqué dans l'exercice précédent.
     142
     143On veut détecter l'appui sur le bouton poussoir. Pour cela, vous allez lire sa valeur périodiquement toutes les 20ms. L'appui ou le relâchement correspond est présent quand deux valeurs successives sont différentes. La structure du programme suggéré.
     144{{{#!c
     145faire toujours:
     146   attendre 20ms
     147   lire la valeur du BP
     148   si un appui est detecte alors BP_ON <- 1
     149   si un relachement est detecte alors BP_OFF <- 1
     150   si BP_ON :
     151      BP_ON <- 0                   // l'appui est un evenement ponctuel
     152      comportement du BP_ON
     153   si BP_OFF :
     154      BP_OFF <- 0                  // Le relachemet est un évènement ponctuel
     155      comportement du BP_OFF
     156   gestion de la LED0
     157   gestion de la LED1
     158}}}
     159
     160== 5. Réalisation d'une petite librairie ==
     161
     162Écrire les fonctions suivantes et fabriquer une fonction libgpio.a
     163* gpio_open : ouverture et mapping.
     164* gpio_setup : setup des broches
     165* gpio_read : lecture d'une broche
     166* gpio_write : écriture d'une broche
     167
     168== 6. Amusez-vous ! ==
     169
     170Maintenant que vous maîtrisez tous les aspects liés à la configuration et
     171à la programmation des GPIO sur Raspberry Pi, laisser aller votre imagination
     172et proposer d'autres programmes à exécuter sur la carte Raspberry Pi qui
     173vous est fournie.
     174
     175== 7. Compte rendu (CR) ==
     176
     177Vous écrirez un CR au format [[http://docutils.sourceforge.net/docs/user/rst/quickref.html|reStucturedText]], dans lequel vous mettrez les étapes de configurations de votre compte pour réaliser le TP, ainsi vous conserverez une trace.
     178Vous ajouterez vos codes commentés (succinctement mais proprement).
     179
     180Contraintes :
     181- Le fichier doit impérativement être nommé `peri_tp1_nom1_nom2.rst`
     182- Vous enverez le CR par mail à __**franck.wajsburt @ lip6.fr**__ et __**lionel.lacassagne @ lip6.fr**__ avec le sujet: `[PERI] CR TP1`