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 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 ci‑dessous :
-
FIRST_LED_PINetLAST_LED_PINpour 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_PINpour désigner le numéro de broche du port numérique à laquelle est relié le bouton‑poussoir ; -
CHASE_DURATIONpour 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érationledPinallant deFIRST_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 ).
- Chenillard répétitif unidirectionnel
- Initialement (fonction
setup), toutes les led doivent clignoter simultanément 3 fois (période T = 1 s, rapport cyclique α = 50 %). - 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. - v1 – dans la fonction
loop, utiliser une bouclefor(cf. chap. C2‑V ) : - qui opère sur une variable
ledPinallant deFIRST_LED_PINàLAST_LED_PIN; - qui met en œuvre la séquence élémentaire à la base du chenillard, laquelle consiste simplement à :
- v2 – procéder sans boucle
for(niwhile) dans la fonctionloop, mais en exploitant la répétitivité de cette dernière. Pour cela, il faut déclarer préalablement (hors de la fonctionloop) une variable d'itérationledPinqu'on peut alors explicitement incrémenter, tester et réinitialiser comme le fait implicitement une bouclefor. - Chenillard répétitif bidirectionnel
- v1 : avec deux boucles « symétriques »
fordans la fonctionloop; - v2 : sans boucle
fordans la fonctionloop, 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 directionchaseDirectionet deux constantes entières nomméesLEFTetRIGHT, valant respectivement+1et-1, formant les deux seules valeurs que l'on affectera àchaseDirection. - Chenillard intermittent bidirectionnel déclenché
- 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. - * Chenillard répétitif bidirectionnel déclenché
- 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
delaymais à la place, employer la fonctionmillis(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. - Chenillard répétitif bidirectionnel pas à pas
- Chenillard répétitif bidirectionnel à sens commandé
for (cf. chap. C2‑V ). 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.
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.