Matériel requis : Carte Arduino UNO et un câble USB 2.0 du type A/B
Dans le dernier article, nous avons commencer à appréhender notre espace de travail, l’IDE Arduino, et téléverser notre premier sketch, à savoir faire clignoter la LED 13 de notre UNO.
Bon je vous l’accorde, faire clignoter cette LED ça n’a rien d’impressionnant surtout que le sketch et existant mais c’est un bon début pour comprendre comment fonctionne l’électronique et la programmation ainsi que s’assurer que la carte est fonctionnelle. Et puis il faut bien commencer par quelque chose pour commencer la programmation.
Nous allons maintenant voir ensemble les subtilités de la programmation Arduino. Tout d’abord, vous devez savoir que le langage Arduino est très inspiré du C/C++. Le C et le C++ sont des bons langages de programmation parfait pour comprendre l’algorithme et facile à apprendre. C’est parfait c’est justement le but d’Arduino : apprendre et concevoir simplement.
Il est maintenant temps d’apprendre à programmer.
Comprendre le sketch Blink
Reprenons le sketch précédent « Blink » :
Le sketch est relativement simple à comprendre.
Dans la fonction setup(), nous utilisons une autre fonction propre à Arduino appelée pinMode() qui permet de définir quelle est la broche (pin) utilisée dans le sketch.
Ici on notifie la pin 13 de l’Arduino, à savoir sa LED. Nous ne spécifions pas directement le chiffre 13 mais une constante propre à Arduino appelé LED_BUILTIN. En utilisant cette constante, il ne sera pas nécessaire de changer le numéro de la broche si on veut utiliser une autre carte Arduino où la LED serait branchée (pour certaine carte c’est la broche 6 et non la 13).
La constante OUTPUT permet de dire que la broche sera utilisée en sortie. Il est possible d’utiliser la broche en entrée en utilisant la constante INPUT.
Pour résumer, on indique à notre sketch de nous préparer la broche 13 de notre carte UNO en sortie.
Dans la fonction loop(), nous commençons avec la fonction digitalWrite() qui permet d’écrire sur une broche de type digitale. ça tombe bien la LED sur la pin 13 est une broche digitale. En réalité, on ne va pas vraiment écrire via cette broche, on va juste lui donner 2 instructions HIGH ou LOW qu’on peut caractériser de niveau logique (haut ou bas). Le HIGH permet de débloquer une tension élevée sur la UNO c’est 5v (sur une carte en 3,3v c’est du 3,3v) et le LOW active la masse donc du 0v.
En clair, il faut comprendre que c’est comme un interrupteur qui ouvre ou ferme un circuit. Ici on ferme le circuit donc on allume la LED.
La fonction delay() permet de mettre en pause le sketch. La valeur à entrer est en millisecondes (1000 millisecondes = 1 seconde). Cette pause de 1 seconde nous permettra de faire cet effet de clignotement de la LED. Dans ce genre de sketch, delay() est intéressant mais il faut savoir qu’elle comporte un défaut : votre script est arrêté et ne peut plus effectuer de traitement pendant cette pause. Nous verrons dans les prochains articles qu’il existe un meilleur moyen pour faire des pauses tout en ne bloquant pas le reste du sketch.
Au bout d’une seconde, on indique à notre broche qu’on veut une tension basse (0v) pour éteindre la LED. Nous terminons par un nouveau delay() de 1 seconde et une fois au bout de la fonction loop(), ces instructions vont de nouveau s’exécuter continuellement tant que la carte sera alimentée.
Avouez que ce n’est pas compliqué à comprendre.
Et si on faisait le SOS à Arduino ?
Maintenant modifions ce sketch par exemple reproduire le célèbre SOS avec la LED 13 de notre UNO.
Le SOS se fait de cette manière : 3 lumières courtes, 3 lumières longues et 3 lumières courtes. Si vous découvrez la programmation pour la première fois, vous serez tenter de faire cela :
Ce code est fonctionnel mais terriblement long et difficilement lisible d’autant qu’en utilisant les outils à disposition il y a possibilité de faire mieux et plus simple.
Créons notre première fonction
Si vous observez le code du SOS, vous remarquerez que beaucoup de partie de code se répète et le but en programmation c’est d’en faire beaucoup sans pour autant écrire beaucoup de codes. Ce qui n’est pas le cas dans notre exemple précédent. Nous allons donc créer une fonction pour y remédier. Une fonction permet entre outre de créer une partie de fonctionnalité répondant un besoin. Ici, nous voulons faire un certain nombre de clignotement plus ou moins vite. Nous allons l’appeler « clignotement_pour_sos » et une fonction se déclare comme les fonctions loop() ou setup(), à savoir avec le mot-clé « void ». Pour information, « void » veut dire vide et ça signifie que notre fonction va juste exécuter notre code sans renvoyer un résultat. Nous verrons plus tard quels sont les mots-clés à utiliser pour des fonctions qui doivent renvoyer un résultat.
Notez que le nom d’une fonction ne doit pas comporter d’espace, ni de caractères spéciaux. Pour que ma fonction soit lisible, j’ai ajouté des underscores entre mes mots au lieu de les coller. Et n’hésitez pas des noms de fonctions plus long pour qu’il soit bien lisible et compréhensible. Bon pas trop long quand même.
Ici notre fonction va juste faire clignoter notre LED. Voici la déclaration :
Notre fonction a entre parenthèse 3 paramètres :
- nombre_clignotement
- delai_apres_digitalwrite_high
- delai_apres_digitalwrite_low
Ces 3 paramètres sont des entiers que l’on spécifie avec le mot-clé « int » (« int » pour intéger). Comme pour les fonctions, cette notation se met avant le nom de la variable. « int » est un type de variable. Il en existe plein d’autres comme « string » pour chaîne de caractères par exemple (vous pouvez consulter les autres types de variable sur http://playground.arduino.cc/French/Reference en recherchant « Types des données »).
Nos paramètres peuvent donc prendre comme valeur que des entiers. Si vous mettez une valeur autre que des entiers, vous obtiendrez une erreur lors de la compilation.
La première ligne de notre fonction commence par un « while ». Cette instruction est ce qu’on appelle une boucle. Suivant une condition (ici « nombre_clignotement > 0 ») la boucle répétera les instructions qu’elle contient. C’est comme ça pour toutes les boucles (vous pouvez consulter les autres types de variable sur http://playground.arduino.cc/French/Reference en recherchant « Structures de contrôle »).
Un « while » veut dire tant que. Tant que la condition est vrai, on exécute indéfiniment les instructions que contient la boucle.
En parlant des instructions :
- la 1ère ligne allume la LED
- la 2ème ligne appelle delay() avec la paramètre « delai_apres_digitalwrite_high » qui contiendra la valeur de la pause
- la 3ème ligne éteins la LED
- la 4ème ligne appelle delay() avec la paramètre « delai_apres_digitalwrite_low » qui contiendra la valeur de la pause
- la 5ème ligne décrémente notre paramètre « nombre_clignotement ». La syntaxe que j’ai utilisé une syntaxe raccourci. On aurait pu écrire l’instruction de cette façon : « nombre_clignotement = nombre_clignotement – 1; »
Utilisation de notre fonction
Admettons que l’on veut faire les 3 lumières courtes de notre SOS avec un délai de 500 millisecondes, nous appellerons notre fonction de la façon suivante :
Notre boucle « while va donc s’exécuter 3 fois avec des délais de 500 millisecondes. Et voici ce qui va se passer :
Notre boucle va s’exécuter 3 fois en répétant chacune de nos instructions. La valeur de « nombre_clignotement » va diminuer à mesure que l’on va exécuter la boucle. Elle s’arrêtera lorsque sa valeur atteindra la valeur 0.
Et maintenant voici le sketch final en utilisant notre fonction pour réaliser notre SOS :
C’est beaucoup plus agréable et lisible vous ne trouvez pas ? C’est ça la magie et la beauté de la programme : écrire peu pour en faire beaucoup. C’est dans cet esprit qu’il faut résonner. Bien entendu, si vous débutez cela peut paraître compliqué à faire et c’est normal rassurez-vous. Le but d’avoir le sketch le plus optimisé possible.
D’ailleurs il est encore possible de l’optimiser le code comme il y a également d’autres façons de faire . Quoi qu’il en soit retenez bien ça : il y a plusieurs façon d’arriver au résultat attendu mais sachez qu’il y a aura toujours une solution qui sortira du lot.
Voici ce que cela donne sur une carte Arduino UNO :
Nous verrons dans le prochain article comment utiliser les entrées/sorties analogiques de la carte ainsi que de nouvelles fonctions dans notre programmation.
merci beacoup