Objectifs pédagogiques
Les principaux objectifs de ce sujet de travaux pratiques sont :
- de découvrir l'emploi des sorties numériques modulées ;
- d'utiliser des types énumérés et d'employer les structures de contrôle appropriées pour en tester les valeurs (bifurcations multiples
switch) ; - d'expérimenter l'usage du moniteur série pour effectuer des entrées‑sorties numériques.
Les exercices sont aussi l'occasion de consolider la manipulation des données de types entiers et la pratique des entrées analogiques.
Pour traiter ce sujet de TP, il est recommandé d'avoir étudié tous les chapitres de la partie C3 de ce module de formation (à l'exception du chap. C3‑V). Des renvois aux principaux éléments de cours requis sont indiqués au fur et à mesure des questions.
Mise en situation
Spécifications matérielles générales
Tous les exercices sont à traiter dans l'environnement de simulation en ligne Tinkercad , en implémentant préalablement le montage électronique en figure ci‑contre, qui comprend :
- une carte Arduino Uno R3 ;
- une platine d'essai (breadboard) de taille moyenne, dont les rails « + » et « − » sont respectivement reliés aux broches 5V et GND de la carte Arduino ;
- deux led RGB W à brochage RCGB (Red-Cathode-Green-Blue dans l'ordre de gauche à droite) montées de telle sorte que pour chacune :
- la cathode commune est reliée au rail « − » de la platine ;
- les trois anodes R (red) G (green) B (blue) sont respectivement reliées à trois broches du port numérique de la carte, chacune via une résistance de limitation de courant de 220 Ω, avec :
- un potentiomètre (résistance variable) W à bouton tournant, de résistance totale 10 kΩ, alimenté en tension par les rails « + » et « − » de la platine, et dont le curseur (contact mobile) est relié directement à l'entrée analogique A0 de la carte.
- un interrupteur à glissière SPDT (single pole double throw) W tel que :
- son pôle commun est relié au rail « − » de la platine ;
- sa voie de droite est reliée à la broche 8 du port numérique de la carte et n'est pas associée à une résistance externe ; elle est donc à configurer dans les programmes comme une entrée en logique négative qui active un résistor de pull‑up interne (cf. chap. C2‑VIII ) ;
- sa voie de gauche n'est pas utilisée ; elle est reliée par défaut au rail « − » de la platine ;
- un bouton‑poussoir câblé de la même manière que l'interrupteur à glissière, donc fonctionnant aussi en logique négative mais sur la broche 2 du port numérique de la carte ; ses pôles sont reliés par un condensateur anti‑rebond de 10 nF (recommandé en pratique, mais facultatif en simulation, voire néfaste – à mettre hors circuit si les appuis sont mal détectés sur Tinkercad – cf. chap. C2‑VIII ).
Spécifications logicielles générales
Les exercices consistent à commander la couleur d'allumage de la led RGB variable (à gauche) qui joue le rôle de partie opérative du système. On souhaite lui faire balayer le spectre des couleurs par synthèse additive W des composantes primaires W rouge, vert et bleu.
La led fixe, quant à elle, fait partie de l'interface homme‑machine du système. Elle indique quelle couleur primaire est en cours de réglage.
On demande d'implémenter deux modes de fonctionnement.
- Le mode manuel est tel que :
- On sélectionne par appuis successifs sur le bouton‑poussoir une des trois composantes primaires de couleur rouge, vert et bleu, dans cet ordre et en boucle ; cette couleur doit « s'afficher » instantanément sur la led fixe.
- On règle le niveau d'intensité lumineuse de cette composante de 0 à 100 % avec le potentiomètre ; la couleur de la led variable change en temps‑réel par superposition des valeurs d'intensité déjà réglées pour les trois couleurs primaires (valeur 0 % par défaut).
- Le mode automatique met en œuvre une modulation de l'intensité lumineuse des trois composantes de la led variable pour lui faire suivre le cercle chromatique (en anglais, hue variation W) des couleurs alternées primaires et secondaires listées ci‑dessous : rouge – jaune – vert – cyan – bleu – magenta
- la transition rouge → jaune opère en incrémentation unitaire de la composante de couleur vert ;
- la transition jaune → vert opère en décrémentation unitaire de la composante de couleur rouge ;
- et ainsi de suite pour toutes les autres transitions.
- une durée de 0,01 s à chaque incrémentation ou décrémentation unitaire de la valeur de modulation (argument value) ;
- une pause de 1 s à chaque moment d'intensité maximale d'une couleur primaire ou secondaire du cycle, c'est‑à‑dire quand la valeur de modulation vient d'atteindre la valeur
0ou255.
Travail demandé
Il est recommandé de traiter les exercices dans l'ordre.
Préalablement, dans un nouveau circuit sous Tinkercad :
- effectuer le câblage de la partie matérielle conformément à la figure ci‑dessus ;
- vérifier le câblage par branchements directs temporaires, typiquement en reliant les anodes des led au potentiel de référence 5V de la carte.
Pour coder les programmes, il est vivement recommandé de ne pas travailler directement dans Tinkercad, mais d'utiliser un éditeur de code externe comme VS Code, à paramétrer pour obtenir une coloration syntaxique adaptée au langage C++ (cf. chap. C2‑X ).
On s'efforcera de respecter les règles de bonnes pratiques de codage, notamment pour le nommage des données, l'indentation et l'aération du code (cf. chap. C2‑X ).
- Au fur et à mesure, enregistrer chaque fichier source en le nommant conformément à la numérotation des exercices, c'est‑à‑dire par exemple :
Ct32_exNvX.ino
où N est le numéro de l'exercice et X la version du programme. - Tous ces fichiers doivent être regroupés dans un répertoire d'exercices nommé par exemple
TP_C3-2, lui‑même placé dans le répertoire principal de programmationPROG_C, lui‑même placé dans répertoire personnel d'étudiant.
Remarque. Comme on n'expérimente pas ici avec une véritable carte Arduino, il n'est pas indispensable de créer un répertoire de projet distinct pour chaque programme.
Enfin, pour tester le bon fonctionnement de chaque programme, procéder par copier‑coller dans la fenêtre d'édition de Tinkercad. En cas de modifications ponctuelles de mise au point, ne pas oublier d'effectuer un copier‑coller inverse dans l'éditeur de code et d'enregistrer les modifications.
Répondre aux questions supplémentaires sur feuille ou cahier.
Consignes de codage
Déclarer les constantes globales :
-
STEADY_LED_GREEN_PIN,STEADY_LED_BLUE_PINetSTEADY_LED_RED_PINpour désigner les numéros de broches auxquelles sont respectivement reliées les anodes de la led fixe ; -
VAR_LED_GREEN_PIN,VAR_LED_BLUE_PINetVAR_LED_RED_PINpour désigner les numéros de broches auxquelles sont respectivement reliées les anodes de la led variable ; -
BUTTON_PIN,SWITCH_PINetPOTENTIOMETER_PINpour désigner les numéros des broches auxquelles sont reliés respectivement le bouton‑poussoir, l'interrupteur à glissière et le potentiomètre.
Coder la fonction setup pour configurer et initialiser toutes les sorties utilisées du port numérique de la carte (selon les exercices).
- Mode manuel en synthèse additive (RGB)
- Avant la fonction
loop: - Déclarer un type énuméré
Colorconstitué des constantes nomméesRED,GREENetBLUE(cf. chap. C3‑IV ). Déclarer une variablesteadyLedColorde ce type pour mémoriser la couleur de la led fixe. - Déclarer respectivement, dans le type
uint8_t, les variables entières de sortieredValue,greenValueetblueValuepour mémoriser l'intensité lumineuse à écrire respectivement sur les trois broches reliées aux anodes de la led variable. - Dans la fonction
loop: - Au début, coder la détection des appuis sur le bouton‑poussoir (cf. chap. C2‑VIII ) et consécutivement, l'incrémentation unitaire cyclique de
steadyLedColor(cf. chap. C3‑IV ) pour déterminer la couleur en cours de réglage. - Au début, lire la valeur analogique de la position du curseur du potentiomètre (cf. chap. C3‑VII ) ; au regard de cette valeur, mettre à l'échelle la variable d'intensité de la composante de couleur primaire en cours de réglage de la led variable (cf. chap. C2‑IV ).
- Mode manuel en synthèse soustractive (CMY)
- la led fixe prend la couleur cyan ;
- la led variable prend la couleur blanche puis toutes les nuances de cyan lorsqu'on tourne le potentiomètre.
- remplacer les noms des constantes nommées du type énuméré
Colorpar les identificateurs des couleurs secondairesCYAN,MAGENTAetYELLOW; - créer trois nouvelles variables d'intensité de composantes secondaires (
cyanValue, etc.), qui joueront le rôle de variables d'état, sans supprimer les variables de sortie (redValue, etc.) des composantes primaires, puisque les led RGB sont toujours commandées par composantes primaires ; - mettre à l'échelle la valeur de ces variables d'intensité des composantes secondaires en fonction de la valeur lue sur le potentiomètre, comme cela est fait pour les composantes primaires dans l’exercice précédent ;
- calculer les valeurs des variables d'intensité des composantes primaires en fonction de celle des composantes secondaires, sachant les relations de complémentarité W qui existent respectivement entre elles :
- le rouge avec le cyan,
- le vert avec le magenta ;
- le bleu avec le jaune.
- Mode automatique
- Sur cahier, dresser le tableau complet des transitions du mode automatique en déterminant pour chacune :
- la composante variable et son sens de variation (
++ou--), - les valeurs respectives de deux autres composantes qui sont constantes.
- Dans le programme, déclarer un type énuméré nommé par exemple
ColorTransitionlistant les différentes transitionsTO_YELLOW,TO_GREEN, etc. ainsi qu'une variable de ce type nomméecolorTransitionpour mémoriser la transition en cours. - Dans la fonction
loop, traiter les transitions par bifurcation multiple (cf. chap. C2‑V ) sur la variablecolorTransition, avec pour chaque transition : - l'incrémentation ou de décrémentation de la composante variable jusqu'à la valeur cible (
0ou255) ; - une fois que la valeur cible est atteinte, le passage à la transition suivante par incrémentation cyclique de la variable
colorTransitionaprès la pause requise. - Système complet en synthèse additive
- Il est recommandé de déclarer un type énuméré classiquement nommé
Modeavec les deux constantesAUTOetMANU, ainsi qu'une variable de ce type nomméemodepour mémoriser le mode de fonctionnement courant du système. - On veillera à bien ré‑initialiser les variables d'état appropriées à chaque changement de mode, notamment
steadyLedColorpour l'entrée dans le mode manuel etcolorTransitionpour l'entrée dans le mode automatique. - Mode manuel RGB à commande en ligne
- un message invite l'utilisateur à saisir la valeur d'une composante (cf. chap. C3‑X ) ;
- on procède à la lecture de la valeur saisie (cf. chap. C3‑X ) :
- si elle est comprise entre
0et255, elle est mémorisée, sinon l'invite passe à la composante suivante ; - la couleur de la led variable est actualisée après chaque saisie.
switch (cf. chap. C2‑V ) sur la valeur de steadyLedColor. mode permet ainsi de gérer les changements de mode sans avoir à créer deux variables de niveau logique pour l'interrupteur à glissière. Par exemple, pour le passage au mode manuel, il suffit de coder : if (mode == AUTO && digitalRead(switchPin) == LOW) { //...