Changes between Version 3 and Version 4 of IOC_T05
- Timestamp:
- Mar 11, 2022, 7:57:22 AM (3 years ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
IOC_T05
v3 v4 1 = Programmation ESP32 / Arduino 1 [[PageOutline]] 2 {{{#!html 3 <h1><font size=+2> Programmation ESP32 / Arduino 4 }}} 5 2 6 3 7 = Objectif de la séance 4 8 5 Le but de la séance est d'écrire une application multitâches Arduino utilisant plusieurs périphériques. 6 L'application finale contiendra toutes les tâches. 7 8 Vous allez devoir installer l'IDE Arduino et installer les bibliothèques permettant d'utiliser l'ESP32. 9 10 Puis vous aller : 9 10 Le but de la séance est d'écrire une application multitâches Arduino utilisant plusieurs périphériques. 11 Vous allez écrire une application affichant par exemple la luminosité chaque seconde sur l'écran OLED, tout en faisant clignoter la LED avec un ON/OFF par le bouton poussoir et contrôler le buzzer en faisant dépendre sa fréquence de la lumière ou d'une action du bouton ou encore d'une valeur entrée au clavier du terminal. En conséquence, vous allez : 11 12 - Utiliser la LED présente sur le module. 12 13 - Utiliser le port série qui relie le module et le PC. … … 14 15 - Utiliser la photorésistance 15 16 - Utiliser le buzzer 16 - Ecrire une application affichant la luminosité chaque seconde sur l'écran OLED, tout en faisant clignoter la LED avec un ON/OFF par le bouton poussoir. 17 - Vous pouvez tester le composant ESP32 en exécutant quelques exemples de tutoriaux (décrivez ce que vous avez fait dans le CR) 18 19 Les documents utiles se trouvent : 20 - [https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/ Tutoriel pour l'installation des bibliothèque ESP32] 21 - [https://github.com/adafruit/Adafruit_SSD1306 Repository API Ecran OLED] 22 - [https://github.com/adafruit/Adafruit-GFX-Library Repository API Graphique] 23 - [http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ReferenceMaxi Langage Arduino] 24 25 Pour les machine du laboratoire, vous devez utiliser la version d'arduino qui se trouve dans `/opt/arduino-1.8.8/`. Je vous conseille d'ajouter le chemin `/opt/arduino-1.8.8` dans la variable PATH dans le `.bashrc`. 26 {{{#!bash 27 Dans le .bashrc : 28 export PATH=/opt/arduino-1.8.8:$PATH 29 }}} 30 Sinon, vous pouvez appeler arduino directement : 31 {{{#!bash 32 > /opt/arduino-1.8.8/arduino 33 }}} 34 35 = Installation ESP32 / Arduino sur votre ordinateur personnel 36 37 38 39 * Ouvrir un navigateur web et se rendre à l'adresse : `https://www.arduino.cc/en/Main/Software` 40 * Cliquer sur l'archive qui correspond à votre système. 41 * Cliquer sur `JUST DOWNLOAD` 42 * Cliquer sur `Télécharger` 43 44 == Installation sur Mac OS 45 46 * l'archive se décompresse et est enregistrée dans le répertoire `Downloads` (sur ma machine en tout cas). 47 * Déplacer l'application `Arduino` qui apparaît dans le répertoir `Downloads` dans le répertoire `Applications`. 48 49 == Installation sur Linux 50 51 à compléter... 52 53 == Installation sur Windows 54 55 * Cliquer sur la fenêtre popup `Ouvrir Microsoft Store` 56 * Cliquer sur `Installer` 57 * A la demande `Utiliser sur l'ensemble de vos appareils`, répondre `Non merci` 58 * Attendre le téléchargement (ça peut être long...) 59 * Cliquer sur `lancer` Quand le bouton apparaît 60 * Arduino se lance, et demande éventuellement une mise-à-jour, ne pas la faire 17 18 Vous pouvez écrire plusieurs sketchs, chacun gérant un seul périphérique, mais l'application finale contiendra toutes les tâches pour tous les périphériques (ceux que vous aurez traités). 19 20 Vous rendrez une archive avec : 21 1. un compte rendu au format markdown (ou en pdf) expliquant en détail votre sketch Arduino, l'idée est de vous approprier cette méthode de programmation, alors les explications que vous faites sont utiles pour vous. Vous devez aussi insérez un graphe représentant les tâches et leur communication (avec graphviz). 22 1. le sketch Arduino avec des commentaires, celui contenant toutes les tâches. 23 24 25 = Installation ESP32 / Arduino 26 27 28 Si vous êtes sur votre ordinateur personnel, vous allez devoir installer l'IDE Arduino et installer les bibliothèques permettant d'utiliser l'ESP32. 29 30 Pour Arduino, vous devez vous rendre à l'adresse `https://www.arduino.cc/en/Main/Software` 31 et suivre la procédure correspondant à votre OS (Linux, Windows ou MacOS). 61 32 62 33 == Installation des librairies ESP32 63 34 64 P rocédure à suivre pour ajouter les gestionnaires de cartes à base d'ESP32 :65 66 * Lancer `Arduino` (si ce n'est pas déjà fait à l'étape précédente)35 Par défaut, les modules ESP32 ne sont pas disponible dans l'IDE Arduino, il faut les ajouter, voici la procédure à suivre pour ajouter les gestionnaires de cartes à base d'ESP32 : 36 37 * Lancer `Arduino` 67 38 * Cliquer sur `Fichier > Préférences` 68 39 * Dans `URL de gestionnaire de cartes supplémentaires`, écrire :[[BR]] … … 75 46 * Cliquer sur `Fermer` 76 47 77 78 = Démarrage (rappel) 48 - Vous pouvez tester le composant ESP32 en exécutant quelques exemples de tutoriaux (décrivez succinctement ce que vous avez fait dans le CR) 49 50 Les documents utiles se trouvent : 51 - [https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/ Tutoriel pour l'installation des bibliothèque ESP32] 52 - [https://github.com/adafruit/Adafruit_SSD1306 Repository API Ecran OLED] 53 - [https://github.com/adafruit/Adafruit-GFX-Library Repository API Graphique] 54 - [http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ReferenceMaxi Langage Arduino] 55 56 Pour les machine du laboratoire, vous devez utiliser la version d'arduino qui se trouve dans `/opt/arduino-1.8.8/`. Je vous conseille d'ajouter le chemin `/opt/arduino-1.8.8` dans la variable PATH dans le `.bashrc`. 57 {{{#!bash 58 Dans le .bashrc : 59 export PATH=/opt/arduino-1.8.8:$PATH 60 }}} 61 Sinon, vous pouvez appeler arduino directement : 62 {{{#!bash 63 > /opt/arduino-1.8.8/arduino 64 }}} 65 66 67 68 = Démarrage 69 70 79 71 80 72 Pour s'assurer que le module Arduino et la chaîne de compilation sont fonctionnels, vous pouvez reprendre l'exemple `blink`` … … 90 82 - La led doit clignoter sur le module 91 83 84 85 92 86 = Exécution ''multi-tâches'' 87 88 93 89 94 90 == Tâches standards … … 99 95 - une fonction `loop_Tache()` qui code son comportement qui sera appelée dans la fonction `loop()`. 100 96 - une seconde fonction `setup_Tache()` qui initialise les ressources de la tâche (périphériques) et l'état interne. 101 - une structure contenant l'état interne et le contexte d'exécution représenté par une variable globale sous forme d'une structure . Cette structure est passée en argument de la tâche des fonctions `setup_Tache()` et `loop_Tache`.97 - une structure contenant l'état interne et le contexte d'exécution représenté par une variable globale sous forme d'une structure `Tache_t`. Cette structure est passée en argument de la tâche des fonctions `setup_Tache()` et `loop_Tache`. 102 98 103 99 Les fonctions `loop_Tache` et `setup_Tache` peuvent avoir des variables locales mais leur état n'est pas conservé entre deux exécutions. 104 Elles peuvent aussi avoir des variables static mais ces variables ont une valeur unique même si la tâche est à plusieurs exemplaires.100 Elles peuvent aussi avoir des variables static mais ces variables ont une valeur unique même si la tâche est en plusieurs exemplaires et que donc elle utilise la même fonction `loop_Tache`. Les variables static ne sont pas conseillées parce qu'elles ne peuvent être initialisées dans la fonction `setup_Tache` 105 101 106 102 La structure contexte ressemble à : 107 103 {{{#!c 108 struct Tache_st{104 typedef struct Tache_s { 109 105 unsigned int etat; 110 106 int config; 111 } ;112 struct Tache_st T1, T2; // deux contextes pour deux tâches. 113 }}} 114 115 116 C'est la fonction `setup_Tache()`qui va pouvoir initialiserle contexte avec des paramètres.117 {{{#!c 118 void setup_Tache( struct Tache_st *ctx, params...) {107 } Tache_t; 108 Tache_t T1, T2; // 2 contextes pour 2 instances de tâches ayant le même comportement 109 }}} 110 111 112 C'est la fonction `setup_Tache()`qui initialise le contexte avec des paramètres. 113 {{{#!c 114 void setup_Tache(Tache_t *ctx, params...) { 119 115 // Initialisation du contexte} 120 116 ctx->etat = etat_initial; // reçu dans les paramètres … … 124 120 125 121 La fonction `loop()` demande donc l'exécution des fonctions `loop_Tache()` à tour de rôle. 126 Les tâches n'ont pas le droit de conserver le processeur sinon cela crée un blocage du système.122 Les tâches n'ont pas le droit de conserver le processeur, sinon cela crée un blocage du système (une famine pour les autres tâches). 127 123 Cela signifie qu'il est interdit de faire des boucles d'attente d'un événement. 124 128 125 `connectors` sont des pointeurs vers des variables globales utilisées pour la communications inter-tâches. 129 126 La structure générale d'une tâche est la suivante : 130 127 131 128 {{{#!c 132 void loop_Tache( struct Tache_st *ctx, connectors....) {129 void loop_Tache(tache_t *ctx, connectors....) { 133 130 // test de la condition d'exécution, si absent on SORT 134 131 if (evement_attendu_absent) return; … … 142 139 Pour les tâches périodiques (elles sont fréquentes), nous pouvons écrire une fonction qui exploite un timer interne du processeur qui s'incrémente chaque microseconde. Cette fonction nommée `waitFor(int timer, unsigned long period)` prend deux paramètres `timer` et `period`. Le premier un numéro de timer (il en faudra autant que de tâches périodiques). Le second est une période en microsecondes. 143 140 144 `wairFor()` peut être appelée aussi souvent que nécessaire, elle rend la valeur 1 une seule fois par période (second paramètre).141 `wairFor()` peut être appelée aussi souvent que l'on veut, elle rend la valeur 1 une seule fois par période (second paramètre). 145 142 Si elle n'est pas appelée pendant longtemps alors elle rend le nombre de périodes qui se sont écoulées. 146 143 Autrement dit, si dans une tâche vous écrivez `waitFor(12,100)` parce c'est le timer n°12 et que la période est de `100us` et si vous n'exécutez pas la tâche pendant `500us` alors au premier appel après ce délai de 500us `waitFor(12,100)` rendra 5. … … 317 314 - Représenter le graphe de tâches final sur un dessin en utilisant le langage de [http://www.graphviz.org/ graphviz] (regarder [https://graphviz.gitlab.io/_pages/Gallery/directed/traffic_lights.html ce graphe bi-parti] dont le code est [https://graphviz.gitlab.io/_pages/Gallery/directed/traffic_lights.gv.txt là]). C'est un graphe biparti avec des ronds pour les tâches et des rectangles pour les boites à lettres. 318 315 319 **Compte rendu**320 321 Vous rendrez un seul sketch Arduino avec des commentaires, celui contenant toutes les tâches.322 Dans le le compte-rendu, en plus des questions, vous insérerez le graphe de votre application.323 316 324 317 {{{