Ardu? No!Initiation ≫ Blink with delay

        Blink with delay
Clignotement avec delay()

N'importe quel programmeur averti d'Arduino connaît ce programme avec le titre anglais. Il s'agit de faire clignoter une led qui est sur la carte en utilisant la fonction delay() que nous connaissons bien. Jusqu'à présent nous n'avons pas utilisé de composant hard bien que la vocation essentielle des cartes Arduino est de gérer des boutons, des lumières et des moteurs. Mais cela nécessite souvent du matériel, et je m'en occuperai une fois les bases du C en place.

La carte Uno possède des broches (pins en anglais, à retenir) qui lui permettent de dialoguer avec le monde extérieur. Les broches ont, pour la plupart, plusieurs fonctions différentes, et c'est à nous d'utiliser une fonction plutôt qu'une autre sur une broche.

Numérique ou analogique?

Ces mots ont des sens complètement différents pour les Arduino (doit-on dire Arduini?) et pour le reste du monde.

Normalement une grandeur est analogique quand elle peut prendre une infinité de valeurs entre deux limites. C'est le cas de la plupart des grandeurs physiques qui nous entourent: température d'une pièce, de l'éclairement du soleil, distance entre deux objets, couleurs, niveau sonore... En informatique, on ne peut pas avoir une infinité de valeurs pour une grandeur, on va donc numériser les grandeurs physiques, ce qui va nous donner un nombre représentant la grandeur. Beaucoup d'appareils analogiques ont été remplacés par des appareils équivalent numériques ces dernières années:

analogiquenumérique
photo argentiquejpeg
cassette VHSDVD
cassette audiomp3, CD
 montre à aiguille  montre digitale 
lettre manuscritemail et pdf

Dans le domaine de l'informatique tout devient numérique.

Dans une Arduino, ces noms analogique et numérique ont un autre sens. On emploie le terme de numérique pour une information qui ne peut prendre que deux valeurs, l'une proche de la masse, l'autre proche de la tension d'alimentation. On emploie le terme d'analogique pour une information pouvant prendre un ensemble de valeurs. Ainsi sur une entrée numérique on peut mettre une tension analogique, mais le microcontrôleur ne peut voir que deux états haut ou bas. Sur une entrée analogique, on peut aussi mettre une tension analogique, mais le microcontrôleur verra une valeur chiffrée, par exemple entre 0 et 1023. On devrait plutôt parler d'entrée binaire/numérique plutôt que de numérique/analogique.

Broches d'une Uno

Sur une Uno, il y a 20 entrées/sorties numériques repérées 0 à 19. Si ces broches sont configurées en entrées, on peut voir par programme si le niveau de tension est haut ou bas. Si elles sont configurées en sorties, on peut les mettre à 5V ou à 0V.

Sur une Uno, il y a 6 entrées analogiques repérées A0 à A5. Si ces broches sont configurées en entrées, on peut voir par programme le niveau de tension représenté par un nombre de 0 à 1023.

Sur une Uno, il y a 6 sorties analogiques repérées par un ~. On ne peut pas choisir la tension instantanée qui vaut soit 0V soit 5V, mais on peut choisir la tension moyenne. En fait le micro va envoyer pendant un certain temps du 5V, et pendant un certain temps du 0V et on peut choisir la tension moyenne avec un nombre qui est généralement compris entre 0 et 255.

Comme il n'y a pas suffisamment de broches disponibles, avec une Uno, certaines ont deux fonctions. Toutes les entrées/sorties peuvent être numériques, et certaines peuvent aussi être soit des entrées analogiques soit des sorties analogiques. Les broches 14 à 19 s'appellent aussi A0 à A5. Pour ne pas surcharger la sérigraphie, les noms 14 à 19 ne sont pas marqués. Certains vont donc croire que les broches A0 à A5 ne sont que des entrées analogiques. Pour la programmation, A0 est équivalent à 14, A1 à 15...

Sur la Nano, deux broches repérées A6 et A7 ne sont que des entrées analogiques et ne peuvent pas être utilisée comme broche numérique.

Sur la Mega le nombre de broches est beaucoup plus important. Il y a 70 entrées sorties, dont 16 qui ont aussi la fonction d'entrées analogiques et 16 sont aussi des sorties numériques.

Enfin pour couronner le tout, n'importe quelle broche peut être utilisée comme sortie analogique par soft. Mais c'est plus compliqué à gérer et cela demande du temps machine et du code.

La led

Sur les cartes Uno, Nano ou Mega, se trouve une del (ou led) mis à la disposition de l'utilisateur. Il y en a d'autres qui informent de ce qui se passe lors des transferts de données (repérées RX et TX). Led est un terme barbare (car anglais) pour désigner une Light Emitting Diode, une diode électroluminescente (DEL en frenchie). Les mots led et del sont donc équivalents, mais led est plus utilisé, exactement comme les abréviations laser. J'emploierai donc led et laser, (et même parfois "laser led").

Une led est un composant électronique qui est avant tout une diode. La propriété la plus importante est que le courant ne passe que dans un seul sens, celui indiqué par le sens de la flèche de sa représentation schématique. Et si la diode est en plus une led, quand on fait passer un courant, elle s'allume. Cela va nous suffire pour aujourd'hui, car le composant est soudé sur la carte et nous n'avons pas les moyens de changer quoi que ce soit.

Je ne vais pas chercher à savoir sur quelle broche se trouve la led utilisateur, on peut donner le numéro de la broche, mais on peut aussi utiliser le nom LED_BUILTIN (led dans la construction). Je ne vais aujourd'hui pas chercher à savoir comment elle est branchée, nous avons juste besoin se savoir que si je mets la broche LED_BUILTIN à l'état haut elle s'allume et si je la mets à l'état bas, elle s'éteint.

Notez que la dernière phrase est normalement sans ambiguïté pour un français moyen, mais qu'un informaticien y trouvera à redire. Il ne faudrait pas dire "si je mets la broche à l'état haut elle s'allume" mais "si la broche est à l'état haut, elle est allumée". Mais le langage courant n'est pas toujours rigoureux et cela nous pose des problèmes pour traduire de l'humain en C. La femme d'un informaticien lui avait dit "va au marché et achète un kg de farine, et si il y a des œufs, tu en achète 12". L'informaticien a vu qu'il y avait des œufs à vendre et à donc ramené 12 kg de farine.

La broche LED_BUILTIN

La broche repérée est une entrée/sortie. On trouvera dans la littérature E/S, I/O (Input/Output), PIO (port I/O, un ensemble de 8 broches est un port) GPIO (global PIO), TOR (tout ou rien pour indiquer que l'on met toute la tension ou aucune)... La broche peut aussi servir à autre chose.

On ne peut pas relier deux sorties ensembles, sauf cas particulier. Si l'une voulait imposer une tension haute (5 volts) et l'autre une tension basse (0 volts), il y aurait un conflit. Et comme le concepteur du circuit ne peut pas savoir si la broche LED_BUILTIN sera reliée à une autre sortie ou pas, pour éviter les problèmes, il a choisi qu'à la mise sous tension toutes les broches E/S seraient configurées en entrées. Pour allumer et éteindre la led, il nous faudra donc mettre la broche en sortie d'une part (première nouvelle instruction), et envoyer la tension désirée (deuxième nouvelle instruction). Ces deux instructions sont spécifiques à nos cartes, elles n'existent pas pour le C d'un ordinateur qui n'a pas de leds. C'est bien du C, mais elles appartiennent à une bibliothèque de fonctions spécifiques à l'Arduino.

Pour choisir le mode entrée ou sortie, c'est la fonction pinMode() qu'il faut appeler. Il faut lui donner deux paramètres le premier étant le nom de la broche, le deuxième le mode que l'on veut (entrée ou sortie). Le mode est en réalité un nombre, mais pour des raison de commodité et de compatibilité possible avec des versions futures, on utilise systématiquement les mots INPUT, OUTPUT ou INPUT_PULLUP. Comme on veut mettre la broche en sortie, nous mettrons:

pinMode(LED_BUILTIN, OUTPUT);

INPUT_PULLUP est assez barbare, nous verrons son utilisation quand nous aborderons les boutons câblés sur les entrées.

Revenons à nos moutons, où faut-il mettre cette instruction? Une fois que la broche sera en sortie, elle y restera (sauf si on donnait un ordre contraire). On n'a donc besoin de l'exécuter qu'une fois pour la configuration. Sa place se trouve donc dans le setup(). On n'aura d'ailleurs rien d'autre à mettre dans le setup(), on n'a pas besoin de la liaison série, et c'est plus facile d'utiliser la boucle loop() pour répéter infiniment les ordres d'allumer et d'éteindre la led.

Allumer ou éteindre la led

Pour allumer le led, il faut envoyer du 5V sur la broche. Le mot correct pour le 5V est HIGH, et c'est LOW pour l'éteindre (0V). La ligne complète pour allumer la led est:

digitalWrite(LED_BUILTIN, HIGH);

La fonction digitalWrite écrit donc dans la broche LED_BUILTIN la valeur HIGH. Le mot digital est la pour nous rappeler qu'il s'agit d'une entrée tout ou rien, nous verrons ultérieurement analogWrite qui contrairement à son nom n'envoie pas une tension analogique comprise entre 0 et 5V, mais un signal un peu particulier.

Pour éteindre la led, il suffit de remplacer HIGH par LOW.

Le programme

Ecrivez donc un programme qui fait flasher la led de la broche LED_BUILTIN, avec une période de 1s (100ms allumée, 900ms éteinte). L'initialisation de la sortie est faite dans le setup(), et dans loop() on trouvera les ordres: allumer la led, attendre, éteindre la led, attendre. Solution?void setup() { pinMode(LED_BUILTIN, OUTPUT); } void loop() { digitalWrite(LED_BUILTIN, HIGH); delay(100); digitalWrite(LED_BUILTIN, LOW); delay(900); }

Constantes

Jusqu'à présent, on avait utilisé des nom écrits en minuscules sans le caractère _ sauf pour Serial qui commençait par une majuscule parce que c'est un objet (on définira ce mot plus tard). Les noms de fonctions et de variables sont par convention en minuscules (sauf la première lettre des mots intermédiaires). Mais dans ce programme, on a mis pleins de mots en majuscules seulement: LED_BUILTIN, INPUT, HIGH, LOW. C'est qu'en fait ces nombres sont des constantes. Ils ne peuvent pas changer de valeur. Et la convention est de les écrire en majuscules. Le caractère _ est apparu pour séparer deux mots, pour les variables on mettait une majuscule, mais là on ne peut pas (ou alors mettre une minuscule?). On pourrait remplacer ces constantes par leurs valeurs numériques, mais le programme devient moins lisible. Les noms sont plus parlants (pas forcément pour vous, surtout au début, mais tout le monde les utilisent).