Changes between Version 19 and Version 20 of IOC20_T01
- Timestamp:
- Jan 31, 2020, 6:37:09 AM (4 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
IOC20_T01
v19 v20 1 1 = 1. Préambule 2 2 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.).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.). 4 4 5 5 Vous 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 boutonpoussoir.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. 7 7 Ce que vous allez devoir faire, c'est : 8 8 … … 10 10 * Connexion à un système distant par ssh / scp. 11 11 * 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 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 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. 15 15 16 16 * 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.) … … 27 27 28 28 Le 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 c oté 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`).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 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`). 30 30 Pour 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. 31 31 … … 53 53 54 54 **Questions pour voir si vous avez compris**:: 55 1. Pourquoi passe zpar la redirection des ports ? (faites une réponse succincte)55 1. Pourquoi passer par la redirection des ports ? (faites une réponse succincte) 56 56 1. Pourquoi faut-il que vos fichiers soit dans un répertoire propre sur une !RaspberryPi ? 57 57 … … 171 171 1. Dans la fonction `gpio_fsel()`, que contient la variable reg ? 172 172 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()`. 175 175 1. Que fait la fonction `delay()` ? 176 176 1. Pourquoi doit-on utiliser `sudo` … … 182 182 183 183 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.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. 185 185 186 186 * 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()`). … … 195 195 Maintenant que vous maîtrisez le contrôle d'un GPIO en sortie, passons au mode "entrée". 196 196 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 204 Deux 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 201 207 {{{#!c 202 208 BP_ON = 0 // mis à 1 si le bouton a été appuyé, mis à 0 quand la tâche qui attend l'appui a vu l'appui … … 204 210 }}} 205 211 206 Pseudo-code pour ladétection du changement d'état du bouton212 Pseudo-code de la tâche de détection du changement d'état du bouton 207 213 {{{#!c 208 214 val_prec = 1 … … 214 220 si (val_nouv == 0) alors // appui détecté 215 221 BP_ON <- 1 216 sinon // rel achement détecté222 sinon // relâchement détecté 217 223 BP_OFF <- 1 218 224 fsi … … 222 228 }}} 223 229 224 Pseudo-code pour l'utilisation du changement d'état du bouton230 Pseudo-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é. 225 231 226 232 {{{#!c … … 231 237 si BP_OFF alors 232 238 BP_OFF <- 0 // Le relâchement est un événement ponctuel 233 comportement quand un rel achement est detecte239 comportement quand un relâchement est detecte 234 240 fsi 235 241 }}} 236 242 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 239 243 240 244 … … 243 247 244 248 245 Vous devez rendre un compte 249 Vous devez rendre un compte-rendu ioc20_X_nom1_nom2.zip avec 246 250 * 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). 248 252 * `helloword` avec `helloworld.c` et `Makefile`` 249 253 * `lab1`avec `Makefile`, `blink0.c`, `blink0_pt.c`, `blink01_pt.c`, `read_bp.c`, et `blink01_bp_pt.c`.