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 :
      • pour la led de gauche, dite variable, les broches 9 10 11, à commander en MLI (cf. chap. C3‑VII ) ;
      • pour la led de droite, dite fixe, les broches 3 4 5, à commander en TOR (tout‑ou‑rien) comme des sorties booléennes usuelles (cf. chap. C2‑VIII ).
  • 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 throwW 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.

  1. 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).
    À l'état initial, si le potentiomètre est à 0, la led variable doit être éteinte (elle apparaît transparente dans Tinkercad).
  2. 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 :
  3. rouge – jaune – vert – cyan – bleu – magenta
    sachant que :
    • 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.
    Autrement dit, à chaque transition, la modulation opère sur une seule composante de couleur à la fois, par pilotage de la broche correspondante en MLI (cf. chap. C3‑VII ). Pour obtenir une bonne visibilité des changements chromatiques de la led variable, on adoptera :
    • 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 0 ou 255.
    Quant à la led fixe, elle doit rester éteinte.

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 programmation PROG_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_PIN et STEADY_LED_RED_PIN pour 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_PIN et VAR_LED_RED_PIN pour désigner les numéros de broches auxquelles sont respectivement reliées les anodes de la led variable ;
  • BUTTON_PIN, SWITCH_PIN et POTENTIOMETER_PIN pour 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).

  1. Mode manuel en synthèse additive (RGB)
  2. Sans employer l'interrupteur à glissière, implémenter le programme d'animation du mode manuel en synthèse additive des couleurs, en suivant les étapes ci‑dessous.
    1. Avant la fonction loop :
      • Déclarer un type énuméré Color constitué des constantes nommées RED, GREEN et BLUE (cf. chap. C3‑IV ). Déclarer une variable steadyLedColor de ce type pour mémoriser la couleur de la led fixe.
      • Déclarer respectivement, dans le type uint8_t, les variables entières de sortie redValue, greenValue et blueValue pour mémoriser l'intensité lumineuse à écrire respectivement sur les trois broches reliées aux anodes de la led variable.
    2. 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.
      • À la fin, coder les instructions d'écriture des sorties TOR (cf. chap. C2‑VIII ) pour afficher la couleur de la led fixe. On pourra opportunément employer une bifurcation multiple switch (cf. chap. C2‑V ) sur la valeur de steadyLedColor.
      • 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 ).
      • À la fin, coder les instructions d'écriture des sorties PWM (cf. chap. C3‑VII ) pour afficher la couleur de la led variable.
  3. Mode manuel en synthèse soustractive (CMY)
  4. Recoder le mode manuel de l'exercice précédent en affichant sur la led fixe non pas les composantes primaires mais les composantes secondaires pour opérer sur la led variable une synthèse soustractive W. Ainsi, à l'instant initial :
    • 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.
    Pour coder ce mode manuel soustractif, on peut :
    1. remplacer les noms des constantes nommées du type énuméré Color par les identificateurs des couleurs secondaires CYAN, MAGENTA et YELLOW ;
    2. 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 ;
    3. 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 ;
    4. 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.
  5. Mode automatique
  6. Toujours sans employer l'interrupteur à glissière, implémenter le programme d'animation du mode automatique (cf. supra ) : 
    rouge – jaune – vert – cyan – bleu – magenta
    en gardant les variables de sortie des exercices précédents et en suivant les étapes ci‑dessous.
    1. 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.
    2. Dans le programme, déclarer un type énuméré nommé par exemple ColorTransition listant les différentes transitions TO_YELLOW, TO_GREEN, etc. ainsi qu'une variable de ce type nommée colorTransition pour mémoriser la transition en cours.
    3. Dans la fonction loop, traiter les transitions par bifurcation multiple (cf. chap. C2‑V ) sur la variable colorTransition, avec pour chaque transition :
      • l'incrémentation ou de décrémentation de la composante variable jusqu'à la valeur cible (0 ou 255) ;
      • une fois que la valeur cible est atteinte, le passage à la transition suivante par incrémentation cyclique de la variable colorTransition après la pause requise.
  7. Système complet en synthèse additive
  8. Réemployer le code source des deux exercices précédents pour implémenter le programme d'animation complet avec les deux modes de fonctionnement – manuel en synthèse additive et automatique – sélectionnés par l'interrupteur à glissière.
    • Il est recommandé de déclarer un type énuméré classiquement nommé Mode avec les deux constantes AUTO et MANU, ainsi qu'une variable de ce type nommée mode pour mémoriser le mode de fonctionnement courant du système.
    • La variable 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) { //...
    • On veillera à bien ré‑initialiser les variables d'état appropriées à chaque changement de mode, notamment steadyLedColor pour l'entrée dans le mode manuel et colorTransition pour l'entrée dans le mode automatique.
  9. Mode manuel RGB à commande en ligne
  10. Reprendre le programme du mode manuel en synthèse additive (exercice 1) en obtenant la valeur des variables des composantes primaires par le moniteur série (dans ce programme, ni le bouton‑poussoir, ni l'interrupteur, ni la led fixe ne seront utilisés).
    En procédant dans l'ordre des composantes primaires rouge ‑ vert ‑ bleu :
    • 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 0 et 255, 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.