LOCODUINO

Forum de discussion
Dépôt GIT Locoduino
Flux RSS

jeudi 25 mai 2017

48 visiteurs en ce moment

La programmation, qu’est ce que c’est

. Par : Dominique, Guillaume, Jean-Luc

Cet article est le premier d’une série visant à vous apprendre la programmation en général et la programmation sur un Arduino en particulier. Il n’y a pas de pré-requis particulier, sauf, peut-être, une certaine prédisposition à la compréhension générale de ce qu’est un programme.

Les ordinateurs nous entourent. Si vous lisez ceci c’est que vous êtes assis devant un ordinateur. Ils sont de plus en plus nombreux dans tous les appareils de la vie courante. Certains sont visibles comme ceux présents dans les smartphones ou les GPS. Visibles car ils interagissent avec l’utilisateur, vous. D’autres sont invisibles et s’occupent de tâches où il n’y a pas d’interaction avec l’utilisateur. Ils y en a plusieurs dizaines dans les voitures, par exemple, ils contrôlent le moteur, l’ABS, l’anti-patinage mais aussi les fonctions de l’habitacle comme les lève-vitres. Il y en a dans les réfrigérateurs, les fours, les cafetières, etc.

Et bien sûr il y en a dans les centrales DCC  , les décodeurs des locomotives et de façon générale tous les accessoires électroniques un peu récents que vous avez pu installer sur votre réseau.

Et ce n’est pas près de s’arrêter.

Comparés à l’ordinateur devant lequel vous êtes assis, ces systèmes sont un peu différents dans la mesure où ils ne sont pas forcément capables de remplir les fonctions d’un ordinateur classique. En effet, ils n’ont pas forcément un écran ou un clavier ni la capacité de faire des choses aussi complexes qu’un ordinateur de bureau. Mais ils sont capables de faire des choses dont sont incapables les ordinateurs classiques [1] : piloter des moteurs, des relais, des DEL  , etc. On parle donc plutôt de systèmes informatiques embarqués ou enfouis.

Comme les ordinateurs classiques, les systèmes embarqués se programment.

Qu’est ce qu’un programme

Un ordinateur est une machine qui exécute un programme, un peu comme un cuisinier exécute une recette de cuisine. Un programme est donc une succession d’instructions que l’ordinateur exécute, les unes après les autres, dans l’ordre [2].

Une recette de cuisine est rédigée en langage naturel, pour rédiger un programme, on emploie un langage informatique dédié qui est bien plus restreint que le langage naturel mais qui est aussi bien plus précis.

Comme un langage naturel, un langage informatique est formé de mots, de symboles de ponctuation et a une syntaxe pour construire des phrases. Il a aussi une sémantique, c’est à dire que les phrases ont une signification. Pour construire un programme, il faut enchaîner les phrases qui constituent la recette de ce que l’on veut faire. Il existe des milliers de langages informatiques et il en naît tous les jours. Pour programmer l’Arduino, nous allons étudier LE langage de l’Arduino [3]. Dans le monde Arduino, un programme s’appelle un Croquis, ou un Sketch en anglais, n’oubliez pas que l’Arduino a, à l’origine, été conçu pour des artistes.

Les mots pour le dire

En français, les phrases se terminent par un point. En Arduino les phrases se terminent par un point-virgule. Une des phrases que vous rencontrerez très fréquemment est la suivante :

  1. digitalWrite(4,HIGH);

Cette phrase signifie « mettre la sortie numérique 4 à l’état haut ». Comme en français une phrase isolée de son contexte peut vouloir dire autre chose que dans son contexte. La signification qui vient d’être donnée suppose que la broche 4 a été programmée en sortie, ce qui n’est pas forcément le cas. Si la broche 4 a été programmée en entrée, cette phrase a un sens différent. Il ne suffit donc pas que les instructions soient correctes pour que le programme le soit. Comme en français une succession de phrases correctes ne fait pas un discours qui a du sens. Nous y reviendrons. Cette phrase est formée de mots, de nombres et de signes de ponctuation. Un mot commence obligatoirement par une lettre et ne contient que des lettres, des chiffres et le caractère de soulignement : _. Les mots s’appellent également identifiants.

Puisque nous en parlons, la fonction permettant de programmer la direction d’une broche est la fonction pinMode. Si l’on veut que notre digitalWrite mette la sortie 4 à l’état haut, il faut préalablement avoir programmé la broche 4 en sortie. Comme ceci :

  1. pinMode(4,OUTPUT);

Nous allons arrêter d’utiliser phrase car en informatique le mot est instruction étant donné que toutes les phrases sont des ordres que l’ordinateur exécute [4] et non un discours philosophique.

Les fonctions

Revenons à digitalWrite. Cette instruction est l’appel d’une fonction, nous allons voir plus loin et en détail de quoi il s’agit. Pour l’heure, il faut juste retenir que le logiciel qui vient avec l’Arduino fournit un catalogue de fonctions qui facilite la programmation. 4 est le premier argument de la fonction, il s’agit du numéro de la broche concernée. HIGH est le second argument de la fonction et signifie état haut de la tension électrique. Ça peut être 5V sur un Arduino alimenté en 5V ou bien 3,3V si il est alimenté en 3,3V. Concrètement, quand un Arduino Uno exécute cette instruction, la tension sur la broche 4 est mise à 5V.

Notez bien les parenthèses qui délimitent le début et la fin des arguments de la fonction, la virgule qui les sépare, ainsi que le point-virgule qui termine l’instruction. Toute omission de ces symboles empêchera que le programme soit exploitable par l’Arduino.

Une fonction est un ensemble d’instructions, un bout de recette de cuisine qui a un nom. Pour continuer dans l’analogie avec la cuisine, si vous exécutez une recette de tarte, vous trouverez un appel à la fonction : confectionner une pâte sablée. Pour exécuter cette fonction, il faudra prendre sa recette et exécuter les instructions qui la compose puis revenir à l’exécution de la recette de la tarte. L’avantage des fonctions est la concision et la réutilisation du même bout de recette partout où on en a besoin. Toutes les recettes de tarte utilisent la sous-recette de la pâte sablée, il est inutile de recopier cette-sous recette dans toutes les recettes. Il suffit d’y écrire : « Confectionnez une pâte sablée ».

On peut, bien évidemment, faire ses propres fonctions, on dit les définir, et d’ailleurs c’est ce que l’on fait quand, dans l’IDE de l’Arduino, on crée un nouveau croquis [5]. l’IDE insère automatiquement deux fonctions qui l’on remplit ensuite. Il s’agit des fonctions setup et loop.

Comme ceci :

  1. void setup() {
  2.  
  3. }
  4.  
  5. void loop() {
  6.  
  7. }

Une fonction peut retourner ou non une valeur comme la sous-recette de la pâte sablée retourne… une pâte sablée alors que la sous recette « Préchauffer le four thermostat 7 » ne retourne rien. Ici void indique que ces fonctions ne retournent aucune valeur [6]. Rien n’apparaît entre les parenthèses car ces fonctions n’ont aucun argument. Les accolades, une ouvrante et une fermante, délimitent les instructions de la fonction. C’est à dire que toutes les instructions situées entre les accolades font partie de la fonction et seront exécutées l’une après l’autre quand la fonction sera appelée. Ce n’est pas vous qui appelez setup et loop. Ces fonctions sont appelées automatiquement mais par contre vous pouvez leur donner un contenu.

setup est appelé une fois seulement, on va donc y mettre les instructions qui mettent en place les choses, c’est un peu la section ingrédient d’une recette de cuisine. En informatique on parle d’initialisation.

loop est appelé de manière répétitive, on va donc y mettre les instructions qui doivent être exécutées répétitivement. Ici on s’éloigne de la recette de cuisine qui a un début et une fin. Par essence, un programme Arduino ne se termine jamais.

Un programme complet qui met la broche 4 en sortie puis la met à l’état haut de manière répétitive s’écrirait donc comme suit.

  1. void setup() {
  2. pinMode(4,OUTPUT);
  3. }
  4.  
  5. void loop() {
  6. digitalWrite(4,HIGH);
  7. }

Un premier programme

Un des premiers programmes que l’on réalise sur un micro-contrôleur est le clignotement d’une DEL  . C’est un classique car souvent il n’y a pas d’autre indice du déroulement du programme qu’une malheureuse DEL qui clignote dans un coin.

Nous avons vu plus haut la fonction digitalWrite(...) qui permet de mettre une sortie logique à l’état haut, HIGH, ou à l’état bas, LOW. Nous allons utiliser cette fonction pour faire clignoter notre DEL : il suffit alternativement de mettre la sortie logique sur laquelle est connectée la DEL à HIGH et à LOW. Il n’est pas utile de câbler une DEL sur l’Arduino car, sur l’entrée/sortie 13, une DEL est déjà présente.

Sur l’Arduino Uno, cette fameuse DEL elle est ici :

Le DEL de la broche 13
L’Arduino inclus une DEL connectée à la broche 13 qui peut servir à renseigner sur l’activité du programme qui s’y déroule.

Toutefois, si vous désirez le faire en connectant votre propre DEL et en employant une autre entrée/sortie que la 13, reportez vous à « Fonctionnement et pilotage d’une DEL ».

Si vous n’avez pas encore installé l’IDE Arduino, l’application qui tourne sur votre PC ou votre Mac et qui permet de programmer l’Arduino, c’est peut-être le moment de le faire. Allez consulter « Installation de l’IDE Arduino ».

Lancez l’IDE Arduino puis choisissez Fichier > Nouveau. Si vous utilisez l’IDE 1.0.x, une fenêtre vide s’ouvre. Si vous utilisez l’IDE 1.5.x le squelette du croquis, avec une fonction setup() et une fonction loop() vides, est déjà présent. Dans le premier cas, faites le travail à la place de l’IDE en copiant-collant le squelette présenté précédemment.

Pour faire clignoter notre DEL, l’entrée/sortie 13 doit être programmée en sortie grâce à la fonction pinMode(...). Comme cette fonction est appelée une fois pour toute, elle trouve sa place dans setup().

  1. void setup() {
  2. pinMode(13, OUTPUT);
  3. }

Ensuite, comme cela a été dit, nous devons appeler digitalWrite(13, ...) une fois avec HIGH et une fois avec LOW. Comme ceci doit être fait alternativement et périodiquement, ces instructions trouvent leur place dans loop(). loop() étant exécuté en boucle (comme son nom l’indique) par le programme, cela règle le « périodiquement ». Il reste l’« alternativement » :

  1. void loop() {
  2. digitalWrite(13, HIGH);
  3. digitalWrite(13, LOW);
  4. }

Une fois ce programme chargé sur l’Arduino, force est de constater que ça ne fonctionne pas. La DEL est bien allumée, peut-être pas aussi fort que pour le premier programme, mais elle ne clignote pas. Que se passe-t-il ?

Combien de temps ça prend tout ça ?

Voilà une bonne question ! Si vous avez un Arduino Uno, son horloge, en quelques sortes son rythme de fonctionnement, est de 16MHz. C’est à dire que l’Arduino exécute 16 millions d’instructions à la seconde. Bien que digitalWrite nécessite plusieurs instructions, le rythme d’allumage et d’extinction de la DEL est de plusieurs milliers de fois par seconde. La DEL clignote bien mais on ne le voit pas !

Ce qu’il faudrait c’est laisser passer du temps entre le moment où le programme allume la DEL, digitalWrite(13, HIGH); et le moment où le programme l’éteint, digitalWrite(13, LOW);. Et puis, pour faire bonne mesure, il faut aussi laisser passer du temps entre le moment où le programme éteint la DEL et le moment où il l’allume car une fois à la fin de loop(), on recommence au début de loop() et après extinction la DEL serait tout de suite allumée à nouveau.

Bien évidemment cette fonction existe, il s’agit de delay(...). Elle accepte un unique argument qui est la durée d’attente en millisecondes.

Par exemple, si on veut que la DEL clignote à un rythme d’une fois par seconde, il faut l’allumer, attendre une demi-seconde, l’éteindre, attendre encore une demi-seconde. Comme ceci :

  1. void loop() {
  2. digitalWrite(13, HIGH);
  3. delay(500);
  4. digitalWrite(13, LOW);
  5. delay(500);
  6. }

On peut constater après avoir chargé le programme sur l’Arduino qu’il donne bien le résultat escompté.

Un avant dernier mot : les commentaires

Les commentaires sont du texte libre que l’on ajoute au programme et qui ne sont pas des instructions. Ils sont tout bonnement ignorés par le langage de l’Arduino et ne prennent aucune place dans la mémoire du micro-contrôleur. Deux moyens sont disponible pour commenter : le // qui ouvre un commentaire jusqu’à la fin de la ligne et le /* qui ouvre un commentaire jusqu’à ce que */ soit rencontré. Nous conseillons d’utiliser les commentaires sans retenue. Pendant l’apprentissage cela permet d’aider à se rappeler ce que font les instructions et ensuite cela permet de comprendre un programme que l’on a écrit il y a longtemps. Commentons donc notre programme de clignotement de DEL.

  1. /*
  2.  * Programme de clignotement de DEL.
  3.  *
  4.  * La broche 13 est utilisée pour faire clignoter la DEL qui y est connectée
  5.  */
  6. void setup() { // setup n'est exécuté qu'une fois au début du programme
  7. // La broche 13 est mise en sortie afin d'y établir une tension pour la DEL
  8. pinMode(13, OUTPUT);
  9. }
  10.  
  11. void loop() { // loop est exécuté de manière répétitive
  12. digitalWrite(13, HIGH); // Allume la DEL
  13. delay(500); // Attend une demi-seconde
  14. digitalWrite(13, LOW); // Eteint la DEL
  15. delay(500); // Attend une demi-seconde
  16. }

Télécharger

C’est plus clair comme ça !

Un dernier mot : les mise en page des programme

Quand nous étions à l’école élémentaire, en première année, au CP, la maîtresse (ou le maître) nous a appris à tenir notre cahier. Il fallait réserver une marge, écrire la date à un emplacement précis, passer à la ligne de manière appropriée. Quand nous écrivons c’est pour être lu et pour être facilement lu, il faut respecter certaines règles de mise en page.

C’est également le cas pour un programme. Le placement des instructions et des séparateurs comme { et } est important pour lire et comprendre facilement un programme. Dans les programmes présentés ci-dessus, l’ouverture d’une accolade est accompagnée d’un passage à la ligne et d’une indentation qui met en évidence le fait que les instructions qui suivent sont dans un bloc délimité par une paire d’accolades. La fermeture de l’accolade est également accompagnée d’une indentation inverse.

L’indentation consiste à ajouter un ou plusieurs espaces au début de la ligne pour la décaler de la précédente.

Il est tout à fait légal d’écrire notre clignotement de DEL comme ceci et l’IDE Arduino ne vous fera pas la moindre remarque :

  1. void loop()
  2. {digitalWrite(13,HIGH);delay(500);
  3. digitalWrite(13,LOW);
  4. delay(500);}

Mais la lecture ne sera pas facile. Si le programme ne fait pas ce que vous voulez, la recherche de l’erreur sera plus difficile. Si vous devez montrer votre programme à autrui, pour demander conseil sur ce qui ne va pas par exemple, il est presque sûr que la première remarque que vous aurez concernera une indentation incorrecte.

Il est indispensable d’indenter correctement son programme

La suite de la série d’articles avec « Types, constantes et variables ».

[1Du moins sans leur adjoindre du matériel supplémentaire.

[2L’ordre strict ! Contrairement aux recettes de cuisine où souvent on découvre à l’étape 4 qu’il fallait faire quelques chose en même temps que ce que l’on a fait à l’étape 2.

[3Le langage de l’Arduino est dérivé du langage C++ qui est lui même dérivé du langage C. Comme il ne s’agit pas de faire un cours de linguistique informatique, nous n’allons pas épiloguer là dessus. Il faut juste retenir que savoir programmer en Arduino vous donnera quelques compétences en C++.

[4Du moins pour les langages dits impératif dont le langage Arduino fait partie.

[5Dans l’IDE 1.5.6 à l’heure de la rédaction de cet article

[6l’un des sens de void en Anglais est complètement vide.

2 Messages

Réagissez à « La programmation, qu’est ce que c’est »

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

Rubrique « Programmation »

Comment gérer le temps dans un programme ?

La programmation, qu’est ce que c’est

Types, constantes et variables

Installation de l’IDE Arduino

Répéter des instructions : les boucles

Les interruptions (1)

Instructions conditionnelles : le if … else

Instructions conditionnelles : le switch … case

Comment gérer l’aléatoire ?

Calculer avec l’Arduino (1)

Calculer avec l’Arduino (2)

Les structures

Systèmes de numération

Les fonctions

Trois façons de déclarer des constantes

Transcription d’un programme simple en programmation objet

Les chaînes de caractères

Trucs, astuces et choses à ne pas faire !

Le monde des objets (1)

Le monde des objets (2)

Le monde des objets (3)

Le monde des objets (4)

Les pointeurs (1)

Les pointeurs (2)

Les Timers (I)

Les Timers (II)

Les Timers (III)

Les Timers (IV)

Les Timers (V)

Bien utiliser l’IDE d’Arduino (1)

Bien utiliser l’IDE d’Arduino (2)

Les derniers articles

Bien utiliser l’IDE d’Arduino (2)


Thierry

Bien utiliser l’IDE d’Arduino (1)


Christian Bézanger, Dominique, Jean-Luc, Thierry

Les Timers (V)


Christian Bézanger

Trucs, astuces et choses à ne pas faire !


Dominique

Le monde des objets (4)


Thierry

Les pointeurs (2)


Thierry

Les chaînes de caractères


Thierry

Transcription d’un programme simple en programmation objet


Dominique, Guillaume, Jean-Luc

Les pointeurs (1)


Thierry

Comment gérer l’aléatoire ?


Dominique, Guillaume, Jean-Luc

Les articles les plus lus

Les interruptions (1)

Les Timers (I)

Comment gérer le temps dans un programme ?

Les Timers (II)

Répéter des instructions : les boucles

Calculer avec l’Arduino (1)

Les Timers (IV)

Les chaînes de caractères

Installation de l’IDE Arduino

Les Timers (III)