Objectifs pédagogiques

Les principaux objectifs de ce sujet de travaux pratiques sont de mettre en œuvre :

  • les instructions de bases du langage C et du framework Arduino, notamment le rôle bien distinct des fonctions setup et loop ;
  • la manipulation des variables booléennes et des entrées‑sorties ;
  • la détection d'un front montant du signal de tension sur un bouton et non pas seulement de son état (appuyé/relâché) ;
  • des structures de contrôle (if, for, while), notamment pour factoriser les instructions répétitives ;
  • la gestion temps (fonction delay) et les techniques de codage pour obtenir des programmes réactifs (fonction millis).

Pour traiter ce sujet de TP, il est recommandé d'avoir étudié le cours jusqu'au chapitre C2‑IX inclus (à l'exception du chap. C2‑VII). Néanmoins, la plupart des exercices ne font appel qu'à un nombre ciblé de connaissances et 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 ;
  • une led rouge telle que :
    • son anode est reliée à la broche 2 du port numérique de la carte Arduino ; cette broche doit donc être configurée dans les programmes comme une sortie (cf. chap. C2‑VIII ) ;
    • sa cathode est reliée au rail «  » de la platine via une résistance de limitation de courant de 220 Ω ;
  • un bouton‑poussoir tel que :
    • son pôle gauche est relié au rail « + » de la platine ;
    • son pôle droit est relié à la broche 7 du port numérique de la carte Arduino ; cette broche doit donc être configurée dans les programmes comme une entrée ;
    • de plus, pour être référencé à un potentiel déterminé même quand le bouton n'est pas appuyé, ce pôle doit aussi être relié au rail «  » de la platine via un résistor de pull‑down de 2 kΩ ; le bouton fonctionnera donc en logique positive (cf. chap. C2‑VIII ) ;
    • enfin, ces pôles sont également reliés l'un à l'autre 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 à coder des programmes pour commander l'allumage de la led de différentes manières :

  • par clignotement périodique ou temporaire (blink)  avec différentes durées pour la durée d'allumage et d'extinction ;
  • par séquences de clignotements particulières pour émettre un message en code morse ;
  • par commande directe de l'état de la led par le bouton‑poussoir ;
  • par contrôle du mode de fonctionnement de la led par le bouton‑poussoir.

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 l'anode de la 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 Sublime Text, à paramétrer pour obtenir une coloration syntaxique adaptée au langage C++ (cf. chap. C1‑II ).

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 :
    Ct21_exN.ino
    où N est le numéro de l'exercice.
  • Tous ces fichiers doivent être regroupés dans un répertoire d'exercices nommé par exemple TP_C2-1, 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 (cf. chap. C2‑III ), au début du programme, hors de toute fonction, de type int :

  • LED_PIN pour désigner le numéro de broche du port numérique de la carte Arduino à laquelle est reliée la led ;
  • BUTTON_PIN pour désigner le numéro de broche du port numérique de la carte Arduino à laquelle est relié le bouton‑poussoir .

Dans la fonction setup :

  • configurer comme sortie et initialiser à l'état logique bas (LOW) la broche du port numérique reliée à la led (cf. chap. C2‑VIII ) ;
  • configurer comme entrée la broche du port numérique reliée au bouton‑poussoir (cf. chap. C2‑VIII ).
  1. Clignotement à signal carré permanent
  2. Coder un programme de clignotement de la led (cf. chap. C2‑IX ) avec :
    • une période T = 1 s W,
    • un rapport cyclique α = 50 % W (signal carré),
    c'est‑à‑dire une demi‑période de 500 ms (déclarer une constante de type entier non signé BLINK_HALF_PERIOD pour cette valeur).
    Vérifier le bon fonctionnement en contrôlant la durée d'exécution du programme affichée par l'environnement Tinkercad (cf. chap. C1‑III ).
  3. Clignotement à signal rectangulaire limité
  4. À l'aide d'une boucle for (cf. chap. C2‑V ) dans la fonction setup, faire clignoter 3 fois la led avec une période T = 1 s et un rapport cyclique α = 25 %, puis l’allumer définitivement.
    Remarque. Le signal de clignotement n'étant pas carré (α ≠ 50 %), il ne peut pas être caractérisé par une seule constante temporelle. À la place de BLINK_HALF_PERIOD, on peut déclarer deux constantes entières non signées nommées respectivement BLINK_LOW_DURATION (durée du temps bas) et BLINK_HIGH_DURATION (durée du temps haut).
  5. Code morse
  6. À l'aide de plusieurs boucles for consécutives dans la fonction loop, coder un programme qui fait clignoter la led pour répéter sans fin le message « SOS » en code Morse international W.
    On respectera en tenant compte des deux spécifications ci‑dessous :
    • Pour optimiser la visualisation en simulation, on impose dans le tableau ci‑dessous des durées en millisecondes des éléments du code supérieures à celles employées en télégraphie ; on définira ces valeurs comme des constantes nommées respectivement dans la colonne de droite, toutes à déclarer de type entier non signé.
    • Élément du code morse Durée Identificateur
      trait 750 ms DASH_DURATION
      point 250 ms DOT_DURATION
      séparateur de symboles 250 ms INTER_SYMBOLS_DURATION
      séparateur de lettres 750 ms INTER_LETTERS_DURATION
      séparateur de mots 3500 ms INTER_WORDS_DURATION
    • Pour des questions pédagogiques, on impose de coder un séparateur de lettres dans le sigle « SOS » qui, selon la norme, n'en comporte pas (cette exception normalisée est motivée par l'urgence que sous‑tend un message « SOS ») W.
  7. Commande monostable
  8. Coder un programme de commande monostable d'allumage de la led, c'est‑à‑dire pour qu'elle s'allume seulement tant qu’on appuie sur le bouton‑poussoir.
    Pour cela, on pourra effectuer une composition d'appels de fonction en écrivant sur la broche de la led la valeur logique du niveau de tension lu sur la broche du bouton (cf. chap. C2‑VIII ).
  9. Commande bistable
  10. Coder un programme de commande bistable d'allumage de la led, c'est‑à‑dire qui inverse son état (allumée/éteinte) à chaque appui sur le bouton‑poussoir.
    Ce programme nécessite d'exploiter les fronts montants (cf. chap. C2‑VIII ) du signal de tension sur la broche de la carte à laquelle le bouton est relié : on codera que si un front montant est détecté, on écrit sur la broche de la led la valeur contraire (opérateur ! – cf. chap. C2‑IV ) du niveau de tension lu sur cette même broche.
  11. Clignotement permanent par codage réactif (sans delay)
  12. Dans la fenêtre de code de Tinkercad, copier‑coller directement le code source ci‑dessous.
    // Module C - TP2-1 - exercice 6 - led-blink3
    
    const int LED_PIN = 2;
    
    
    void setup()
    {
      pinMode(LED_PIN, OUTPUT);
      digitalWrite(LED_PIN, LOW);
    }
    
    int previousMillis = millis();
    const unsigned BLINK_HALF_PERIOD = 500;
    
    
    void loop()
    {
      if (millis() - previousMillis >= BLINK_HALF_PERIOD){
        previousMillis += BLINK_HALF_PERIOD;
        digitalWrite(LED_PIN, !digitalRead(LED_PIN));
      }
      delay(10); // only for a quicker Tinkercad simulation
    }
    
    Lancer la simulation et observer le comportement. Quel est l’intérêt de recourir à la fonction millis (cf. chap. C2‑IX ) ?
    Que se passe‑t‑il au bout de 33 secondes ? Proposer une explication et une correction pour régler le problème constaté (cf. chap C2‑IX ).
  13. Clignotement temporaire
  14. En codant l'algorithme de clignotement seulement dans la fonction loop et en utilisant la fonction millis, faire clignoter durant 5 s la led avec une période T = 0,3 s et un rapport cyclique α = 50 %, puis l’éteindre définitivement. On négligera le temps d’exécution de la fonction setup.
  15. * Commande bistable par codage réactif
    1. Coder un programme de commande bi‑mode de la led, qui alterne à chaque appui sur le bouton‑poussoir les modes de fonctionnement fixe et clignotant avec, pour le mode clignotant, les spécifications temporelles T = 1 s et α = 50 %.
      • Ce programme doit être réactif comme celui de l'exercice 5 (cf. chap. C2‑IX ).
      • De plus, il nécessite de déclarer une variable booléenne pour mémoriser le mode de fonctionnement de la led ; on peut nommer cette variable isLedBlinking par exemple.
    2. Idem avec un mode clignotant de rapport cyclique α = 20 % (et non plus 50 %).