Changes between Version 3 and Version 4 of IOC_T05


Ignore:
Timestamp:
Mar 11, 2022, 7:57:22 AM (3 years ago)
Author:
franck
Comment:

--

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
    26
    37= Objectif de la séance
    48
    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
     10Le but de la séance est d'écrire une application multitâches Arduino utilisant plusieurs périphériques.
     11Vous 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 :
    1112- Utiliser la LED présente sur le module.
    1213- Utiliser le port série qui relie le module et le PC.
     
    1415- Utiliser la photorésistance
    1516- 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
     18Vous 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
     20Vous rendrez une archive avec :
     211. 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).
     221. le sketch Arduino avec des commentaires, celui contenant toutes les tâches.
     23
     24
     25= Installation ESP32 / Arduino
     26
     27
     28Si vous êtes sur votre ordinateur personnel, vous allez devoir installer l'IDE Arduino et installer les bibliothèques permettant d'utiliser l'ESP32.
     29
     30Pour Arduino, vous devez vous rendre à l'adresse `https://www.arduino.cc/en/Main/Software`
     31et suivre la procédure correspondant à votre OS (Linux, Windows ou MacOS).
    6132
    6233== Installation des librairies ESP32
    6334
    64 Procé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)
     35Par 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`
    6738* Cliquer sur `Fichier > Préférences`
    6839* Dans `URL de gestionnaire de cartes supplémentaires`, écrire :[[BR]]
     
    7546* Cliquer sur `Fermer`
    7647
    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
     50Les 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
     56Pour 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
     58Dans le .bashrc :
     59export PATH=/opt/arduino-1.8.8:$PATH
     60}}}
     61Sinon, vous pouvez appeler arduino directement :
     62{{{#!bash
     63> /opt/arduino-1.8.8/arduino
     64}}}
     65
     66
     67
     68= Démarrage
     69
     70
    7971
    8072Pour s'assurer que le module Arduino et la chaîne de compilation sont fonctionnels, vous pouvez reprendre l'exemple `blink``
     
    9082- La led doit clignoter sur le module
    9183
     84
     85
    9286= Exécution ''multi-tâches''
     87
     88
    9389
    9490== Tâches standards
     
    9995- une fonction `loop_Tache()` qui code son comportement qui sera appelée dans la fonction `loop()`.
    10096- 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`.
    10298
    10399Les 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.
     100Elles 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`
    105101
    106102La structure contexte ressemble à :
    107103{{{#!c
    108 struct Tache_st {
     104typedef struct Tache_s {
    109105  unsigned int etat; 
    110106  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 initialiser le contexte avec des paramètres.
    117 {{{#!c
    118 void setup_Tache(struct Tache_st *ctx, params...) {
     107} Tache_t;
     108Tache_t T1, T2;  // 2 contextes pour 2 instances de tâches ayant le même comportement
     109}}}
     110
     111
     112C'est la fonction `setup_Tache()`qui initialise le contexte avec des paramètres.
     113{{{#!c
     114void setup_Tache(Tache_t *ctx, params...) {
    119115   // Initialisation du contexte}
    120116   ctx->etat = etat_initial;  //  reçu dans les paramètres
     
    124120
    125121La 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.
     122Les 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).
    127123Cela signifie qu'il est interdit de faire des boucles d'attente d'un événement.
     124
    128125`connectors` sont des pointeurs vers des variables globales utilisées pour la communications inter-tâches.
    129126La structure générale d'une tâche est la suivante :
    130127
    131128{{{#!c
    132 void loop_Tache(struct Tache_st *ctx, connectors....) {   
     129void loop_Tache(tache_t *ctx, connectors....) {   
    133130   // test de la condition d'exécution, si absent on SORT
    134131   if (evement_attendu_absent) return;
     
    142139Pour 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.
    143140
    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).
    145142Si elle n'est pas appelée pendant longtemps alors elle rend le nombre de périodes qui se sont écoulées.
    146143Autrement 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.
     
    317314- 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.
    318315
    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.
    323316
    324317{{{