Changes between Version 19 and Version 20 of IOC20_T01


Ignore:
Timestamp:
Jan 31, 2020, 6:37:09 AM (4 years ago)
Author:
franck
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • IOC20_T01

    v19 v20  
    11= 1. Préambule
    22
    3 Au long de ce module, vous allez utiliser 4 nano-ordinateurs (!RaspberryPi 1B, !RaspberryPi 3B, Arduino nano et ESP32 TTGO-Lora32-Oled), quelques périphériques (led, bouton, photorésistance, accéléromètre, etc.) et mettre en oeuvre plusieurs "briques technologiques" intervenant dans les systèmes d'objets communicants (http, mqtt, sql, i2c, arduino, etc.).
     3Au long de ce module, vous allez utiliser 4 nano-ordinateurs (!RaspberryPi 1B, !RaspberryPi 3B, Arduino nano et ESP32 TTGO-Lora32-Oled), quelques périphériques (LED, bouton, photorésistance, accéléromètre, etc.) et mettre en oeuvre plusieurs "briques technologiques" intervenant dans les systèmes d'objets communicants (HTTP, MQTT, sql, i2c, Arduino, etc.).
    44
    55Vous allez travailler en binôme. Le choix de votre binôme se fait à la première séance et est **définitif**.
    6 Dans ce TP, vous allez écrire une application pour !RaspberryPi 1B afin de contrôler deux LEDs et un  bouton un bouton poussoir. Cette application aura trois threads POSIX, 1 par led et 1 pour le bouton poussoir.
     6Dans ce TP, vous allez écrire une application pour !RaspberryPi 1B afin de contrôler deux LEDs et un  bouton un bouton poussoir. Cette application aura trois threads POSIX, 1 par LED et 1 pour le bouton-poussoir.
    77Ce que vous allez devoir faire, c'est :
    88
     
    1010* Connexion à un système distant par ssh / scp.
    1111* Manipulation directe des GPIO d'une !RaspberryPi en mode utilisateur.
    12 * Ecriture d'application multi-threadées simples.
    13 
    14 Vous écrirez un **compte-rendu au format markdown** (CR), dans lequel vous répondrez aux quelques questions du TME, vous mettrez les étapes de réalisation du TP, ainsi vous conserverez une trace et vous ajouterez tout ou partie de vos codes commentés (succinctement mais proprement). Les compte-rendus de TP doivent être suffisamment explicites pour que vous puissiez les réutiliser plus tard. Par exemple, vous allez devoir lire des documents externes et vous devrez référencer ces documents (mettre les liens) pour les retrouver. En fonction de vos connaissances de départ, vous pourrez être plus ou moins explicite sur tel ou tel point.
     12* Écriture d'application multi-threadées simple.
     13
     14Vous écrirez un **compte-rendu au format markdown** (CR), dans lequel vous répondrez aux quelques questions du TME, vous mettrez les étapes de réalisation du TP, ainsi vous conserverez une trace et vous ajouterez tout ou partie de vos codes commentés (succinctement, mais proprement). Les comptes-rendus de TP doivent être suffisamment explicites pour que vous puissiez les réutiliser plus tard. Par exemple, vous allez devoir lire des documents externes et vous devrez référencer ces documents (mettre les liens) pour les retrouver. En fonction de vos connaissances de départ, vous pourrez être plus ou moins explicite sur tel ou tel point.
    1515
    1616* Le  document doit impérativement être nommé `ioc20_X_nom1_nom2.md` (où X est le numéro du TP: 1 pour le TP1, 2 pour le TP2, etc.)
     
    2727
    2828Le schéma ci-dessous représente la plateforme des cartes !RaspberryPi 1.
    29 Pour exécuter votre programme sur une carte !RaspberryPi, vous devez vous connecter en `ssh` sur une des cartes !RaspberryPi en passant par le routeur peri. Le routeur peri a deux adresses: `132.227.71.43` du coté laboratoire et `192.168.1.1` de l'autre coté.  Le serveur de nom (DNS) du laboratoire a attribué le nom `peri` à l'adresse `132.227.71.43`. Le routeur peri crée un sous-réseau (`192.168.1.x`) où sont connectées les cartes !RaspberryPi. Les cartes sont numérotées de `20` à `26`. Le routeur a été configuré pour reconnaître les adresses MAC des cartes et leur attribuer une adresse IP fixe. La carte n°`X` (`X` allant de 20 à 26) reçoit l'adresse IP 192.168.1.`X` (par exemple la carte n°`20` a comme adresse IP sur ce réseau `192.168.1.20`).
     29Pour exécuter votre programme sur une carte !RaspberryPi, vous devez vous connecter en `ssh` sur une des cartes !RaspberryPi en passant par le routeur peri. Le routeur peri a deux adresses: `132.227.71.43` du côté laboratoire et `192.168.1.1` de l'autre coté.  Le serveur de nom (DNS) du laboratoire a attribué le nom `peri` à l'adresse `132.227.71.43`. Le routeur peri crée un sous-réseau (`192.168.1.x`) où sont connectées les cartes !RaspberryPi. Les cartes sont numérotées de `20` à `26`. Le routeur a été configuré pour reconnaître les adresses MAC des cartes et leur attribuer une adresse IP fixe. La carte n°`X` (`X` allant de 20 à 26) reçoit l'adresse IP 192.168.1.`X` (par exemple la carte n°`20` a comme adresse IP sur ce réseau `192.168.1.20`).
    3030Pour faire ça, le firmware du routeur a été remplacé par '''[[http://www.dd-wrt.com/site/index | dd-wrt]]''' qui permet ce type de configuration.  Le routeur a été également été configuré pour que tous les paquets entrants sur le port `62200`+`X` de l'adresse `peri` soient routés vers la carte !RaspberryPi d'adresse IP `192.168.1.X` port 22. Le port 22 est celui sur lequel écoute le serveur ssh.
    3131
     
    5353
    5454 **Questions pour voir si vous avez compris**::
    55  1. Pourquoi passez par la redirection des ports ? (faites une réponse succincte)
     55 1. Pourquoi passer par la redirection des ports ? (faites une réponse succincte)
    5656 1. Pourquoi faut-il que vos fichiers soit dans un répertoire propre sur une !RaspberryPi ?
    5757
     
    171171 1. Dans la fonction `gpio_fsel()`, que contient la variable reg ?
    172172 1. Dans la fonction `gpio_write()`, pourquoi écrire à deux adresses différentes en fonction de la valeur val ?
    173  1. Dans la fonction `gpio_mmap()`, à quoi correspondent les flags de open ?
    174  1. Dans la fonction `gpio_mmap()`, commentez les arguments de mmap.
     173 1. Dans la fonction `gpio_mmap()`, à quoi correspondent les flags de `open()` ?
     174 1. Dans la fonction `gpio_mmap()`, commentez les arguments de `mmap()`.
    175175 1. Que fait la fonction `delay()` ?
    176176 1. Pourquoi doit-on utiliser `sudo`
     
    182182
    183183
    184 Vous allez maintenant faire clignoter deux leds à des fréquences différentes et paramétrables sur la ligne de commande. Pour tous les exercices ci-après, vous devez changer votre Makefile en ajoutant les programmes à compiler.
     184Vous allez maintenant faire clignoter deux LEDs à des fréquences différentes et paramétrables sur la ligne de commande. Pour tous les exercices ci-après, vous devez changer votre Makefile en ajoutant les programmes à compiler.
    185185
    186186* Commencez par faire une copie du fichier `Blink0.c` en `blink0_pt.c`. Vous allez créer un thread Posix dans `blink0_pt.c` pour faire clignoter une led, c'est donc le même comportement que blink0 avec un pthread pour la partie `// Blink led ...` (à la fin de `main()`).
     
    195195Maintenant que vous maîtrisez le contrôle d'un GPIO en sortie, passons au mode "entrée".
    196196
    197 * Écrivez un programme `read_bp.c` qui configure la GPIO 18 en entrée (là où est connecté le bouton poussoir) et qui affiche la valeur de ce GPIO dans une boucle infinie.
    198 * On veut maintenant détecter l'appui sur le bouton poussoir. Pour cela reprenez le programme `blink01_pt.c` et faite une copie en `blink01_bp_pt.c`. Dans un pthread, vous allez lire la valeur du bouton périodiquement toutes les 20ms. L'appui ou le relâchement est présent quand deux valeurs lues successivement sont différentes. Quand le bouton n'est pas enfoncé, la valeur de la pin est à 1. Commencer par tester que vous savez détecter l'appui sans gérer les LEDs.
    199 
    200 Deux variables globales:
     197* Écrivez un programme `read_bp.c` qui configure la GPIO 18 en entrée (là où est connecté le bouton-poussoir) et qui affiche la valeur de ce GPIO dans une boucle infinie.
     198* On veut maintenant détecter l'appui sur le bouton-poussoir. Pour cela, reprenez le programme `blink01_pt.c` et faites une copie en `blink01_bp_pt.c`. Dans un pthread, vous allez lire la valeur du bouton périodiquement toutes les 20ms. L'appui ou le relâchement est présent quand deux valeurs lues successivement sont différentes. Quand le bouton n'est pas enfoncé, la valeur de la pin est à 1.
     199* Commencer par tester que vous savez détecter l'appui sans gérer les LEDs.
     200* Ensuite, modifier le programme pour faire fonctionner la led0 en télérupteur (un appui changer l'état de la LED) alors que la led1 continue de clignoter périodiquement.
     201
     202**Principe d'utilisation du changement d'état du bouton**
     203
     204Deux variables globales pour le passage de l'information entre la tâche (le thread) qui gère le bouton et détecte les événements d'appui et la tâche qui attend ces événements.
     205`BP_ON` et `BP_OFF` sont un peu des ''lignes d'interruption'' qui sont levées (mise à 1) par la tâche qui gère le bouton et baissées (acquittées, mise à 0) par la (ou les tâches) qui attendent après qu'elles aient vu le passage à 1.
     206
    201207{{{#!c
    202208BP_ON = 0   // mis à 1 si le bouton a été appuyé, mis à 0 quand la tâche qui attend l'appui a vu l'appui
     
    204210}}}
    205211
    206 Pseudo-code pour la détection du changement d'état du bouton
     212Pseudo-code de la tâche de détection du changement d'état du bouton
    207213{{{#!c
    208214val_prec = 1
     
    214220      si (val_nouv == 0) alors       // appui détecté
    215221         BP_ON <- 1
    216       sinon                          // relachement détecté
     222      sinon                          // relâchement détecté
    217223         BP_OFF <- 1
    218224      fsi
     
    222228}}}
    223229
    224 Pseudo-code pour l'utilisation du changement d'état du bouton
     230Pseudo-code d'une tâche qui attendrait à la fois l'appui et le relâchement du bouton. Notez que dans le cas du télérupteur, seul un des deux changements d'état est utilisé.
    225231
    226232{{{#!c
     
    231237si BP_OFF alors
    232238   BP_OFF <- 0                  // Le relâchement est un événement ponctuel
    233    comportement quand un relachement est detecte
     239   comportement quand un relâchement est detecte
    234240fsi
    235241}}}
    236242
    237 * Ensuite, modifier le programme pour faire fonctionner la led0 en télérupteur (un appui changer l'état de la led) alors que la led1 continue de clignoter périodiquement.
    238 
    239243
    240244
     
    243247
    244248
    245 Vous devez rendre un compte rendu ioc20_X_nom1_nom2.zip avec
     249Vous devez rendre un compte-rendu ioc20_X_nom1_nom2.zip avec
    246250* ioc20_X_nom1_nom2.md contenant la description des expériences et les réponses aux questions
    247 * 2 répertoires avec vos sources ''correctement'' commenté (juste le nécessaire).
     251* 2 répertoires avec vos sources ''correctement'' commentées (juste le nécessaire).
    248252  * `helloword` avec `helloworld.c` et `Makefile``
    249253  * `lab1`avec `Makefile`, `blink0.c`, `blink0_pt.c`, `blink01_pt.c`, `read_bp.c`, et `blink01_bp_pt.c`.