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
setupetloop; - 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 (fonctionmillis).
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 ;
- 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 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 (cf. chap. C2‑III ), au début du programme, hors de toute fonction, de type int :
-
LED_PINpour désigner le numéro de broche du port numérique de la carte Arduino à laquelle est reliée la led ; -
BUTTON_PINpour 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 :
- Clignotement à signal carré permanent
- Clignotement à signal rectangulaire limité
- Code morse
- 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é.
- 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.
- Commande monostable
- Commande bistable
- Clignotement permanent par codage réactif (sans
delay) - Clignotement temporaire
- * Commande bistable par codage réactif
- 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
isLedBlinkingpar exemple. - Idem avec un mode clignotant de rapport cyclique α = 20 % (et non plus 50 %).
BLINK_HALF_PERIOD pour cette valeur). 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. 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).
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. | É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 |
! – cf. chap. C2‑IV ) du niveau de tension lu sur cette même broche.
// 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
}
millis (cf. chap. C2‑IX ) ? 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.