Objectifs pédagogiques

Les principaux objectifs de ce sujet de travaux pratiques sont de consolider la pratique de toutes les éléments de langage abordés dans le sujet précédent, à savoir :

  • les constantes et variables booléennes ;
  • les structures de contrôle élémentaires (if, for) ;
  • la détection d'un front montant du signal de tension sur le bouton‑poussoir et non pas seulement de son état (appuyé ou relâché).

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 le rail «  » est relié à la broche GND de la carte ;
  • une série de 8 led jaunes telles que :
    • les anodes sont respectivement reliées aux broches 2 à 9 du port numérique de la carte ; ces broches doivent donc être configurées dans les programmes comme des sorties (cf. chap. C2‑VIII ) ;
    • les cathodes sont reliées au rail «  » de la platine, chacune via un résistor 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 12 du port numérique de la carte et n'est pas associé à un résistor 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 ) ;
    • 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 faire clignoter les led en chenillard (en anglais, led chaser ) selon différents modes :

  • répétitif unidirectionnel ou bidirectionnel,
  • déclenché à chaque trajet par appui sur le bouton‑poussoir,
  • marche‑arrêt commandé par appuis sur le bouton‑poussoir,
  • pas‑à‑pas (c'est‑à‑dire led par led) à chaque appui sur le bouton‑poussoir…

Sauf pour le mode pas‑à‑pas, tous les chenillard seront programmés avec durée de poursuite – c'est‑à‑dire la durée d'allumage de la led courante – de 0,1 seconde.

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 :
    Ct22_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-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 ci‑dessous :

  • FIRST_LED_PIN et LAST_LED_PIN pour désigner les numéros de broches du port numérique auxquelles sont respectivement reliées la première (la plus à droite) et la dernière led (la plus à gauche) du chenillard ;
  • BUTTON_PIN pour désigner le numéro de broche du port numérique à laquelle est relié le bouton‑poussoir ;
  • CHASE_DURATION pour désigner la durée de poursuite de la led courante durant le chenillard (cf. spécifications logicielles générales supra ), à déclarer de type entier non signé.

Dans la fonction setup :

  • à l'aide d'une boucle for (cf. chap. C2‑V ) avec une variable d'itération ledPin allant de FIRST_LED_PIN à LAST_LED_PIN, configurer comme sorties et initialiser à l'état logique bas toutes les broches du port numérique auxquelles sont reliées des led.
  • configurer comme entrée la broche du port numérique à laquelle est relié le bouton‑poussoir (on rappelle que ce dernier est câblé pour fonctionner en logique négative en faisant appel à un résistor de pull‑up interne à la carte Arduino – cf. supra ).
  1. Chenillard répétitif unidirectionnel
  2. Le programme doit répondre aux spécifications suivantes de fonctionnement de la carte :
    • Initialement (fonction setup), toutes les led doivent clignoter simultanément  3 fois (période T = 1 s, rapport cyclique α = 50 %).
    • Remarque : pour cela, on utilisera l'algorithme classique du programme « blink » (cf. chap. C2‑IX ) avec des boucles for (cf. chap. C2‑V ).
    • Après, en boucle (fonction loop), les led doivent s'animer en chenillard répétitif unidirectionnel vers la gauche, c'est‑à‑dire qu'après avoir atteint la led la plus à gauche, le chenillard reprend automatiquement à la led la plus à droite.
    Attention ! Pour le chenillard uniquement (pas le clignotement), on demande de coder deux versions différentes v1v2 :
    • v1 – dans la fonction loop, utiliser une boucle for (cf. chap. C2‑V ) :
      • qui opère sur une variable ledPin allant de FIRST_LED_PIN à LAST_LED_PIN ;
      • qui met en œuvre la séquence élémentaire à la base du chenillard, laquelle consiste simplement à :
        1. allumer la led courante (cf. chap. C2‑IX ),
        2. attendre l'écoulement de la durée de poursuite CHASE_DURATION (cf. chap. C2‑IX ),
        3. éteindre de led courante, et passer à la led suivante…
    • v2 – procéder sans boucle for (ni while) dans la fonction loop, mais en exploitant la répétitivité de cette dernière. Pour cela, il faut déclarer préalablement (hors de la fonction loop) une variable d'itération ledPin qu'on peut alors explicitement incrémenter, tester et réinitialiser comme le fait implicitement une boucle for.
    Comparer ces deux versions en termes de lisibilité, d'efficacité, de réactivité…

    Pour tous les exercices suivants, aucun clignotement initial des led n'est demandé. Les instructions correspondantes codées à l'exercice 1 peuvent donc être supprimées de la fonction setup pour ne pas encombrer inutilement les programmes ni alourdir leur exécution.

  3. Chenillard répétitif bidirectionnel
  4. Coder un programme qui anime les led en chenillard répétitif bidirectionnel (vers la gauche puis vers la droite), avec deux versions différentes v1v2 :
    • v1 : avec deux boucles « symétriques » for dans la fonction loop ;
    • v2 : sans boucle for dans la fonction loop, mais en exploitant la répétitivité de cette dernière comme pour l'exercice précédent ;
      pour rationaliser le code, on pourra déclarer une variable de direction chaseDirection et deux constantes entières nommées LEFT et RIGHT, valant respectivement +1 et -1, formant les deux seules valeurs que l'on affectera à chaseDirection.
    Comparer ces deux versions en termes de lisibilité, d'efficacité, de réactivité…
  5. Chenillard intermittent bidirectionnel déclenché
  6. Coder un programme qui, sans clignotement initial, anime les led en chenillard bidirectionnel déclenché, chaque trajet de gauche à droite ou de droite à gauche débutant lorsque le bouton‑poussoir est appuyé. Pour cela :
    • Il faut détecter les appuis sur le bouton‑poussoir (cf. chap. C2‑VIII ), sachant que ce dernier opère en logique négative (cf. les spécifications matérielles supra ).
    • Il faut aussi mémoriser le fait que le chenillard doit rester « en mouvement » durant tout un trajet. On peut déclarer une variable booléenne nommée isChasing.
    Remarque. Le programme n'a pas besoin d'être réactif, autrement dit, on peut encore utiliser la fonction delay. En effet, tout trajet commencé doit être achevé, donc tant que ce trajet dure, il n'est pas nécessaire de surveiller l'état du bouton.
  7. * Chenillard répétitif bidirectionnel déclenché
  8. Coder un programme qui anime les led en chenillard répétitif bidirectionnel comme à l'exercice 2 (v2), mais avec un bouton‑poussoir marche‑arrêt. À l'arrêt, la led en cours doit rester allumée et donc, à l'instant initial, la led la plus à droite doit être allumée.
    • Cette fois, le programme doit être réactif car il faut pouvoir détecter à tout instant un éventuel appui sur le bouton‑poussoir. Il ne faut donc pas recourir à la fonction delay mais à la place, employer la fonction millis (cf. chap. C2‑IX ).
    • Et pour l'algorithme global de la boucle loop, on peut s'inspirer de celui de l'exercice nº 8 du TP C2‑1 , en remarquant qu'ici, un appui sur le bouton‑poussoir agit sur le mode de fonctionnement du chenillard, qui passe de arrêt à marche ou inversement.
  9. Chenillard répétitif bidirectionnel pas à pas
  10. Coder un programme qui anime les led en chenillard répétitif bidirectionnel, comme à l'exercice 2 (v2), mais en mode pas‑à‑pas, en déclenchant chaque passage à led suivante par un appui sur le bouton‑poussoir. Entre chaque pas, la led en cours doit rester allumée et donc, à l'instant initial, la led la plus à droite est allumée.
  11. Chenillard répétitif bidirectionnel à sens commandé
  12. Coder un programme qui anime les led en chenillard répétitif bidirectionnel, mais qui opère immédiatement un changement de direction par un appui sur le bouton‑poussoir (même si le trajet en cours n'est pas achevé). À l'instant initial, le chenillard doit donc être en marche.