Débuter avec Arduino

Partie 2 : premiers programmes

Arts, Maths, Sciences et Technologies | Deuxième cycle

schéma

DIFFICULTÉ MOYENNE | 6 À 8 HEURES


Si vous êtes rendus à la partie 2 c'est que vous maîtrisez les points suivant :
  1. Vous avez compris ce qu'est Arduino et à quoi ça sert.
  2. Vous avez compris ce qu'est un signal analogique et un signal numérique.
  3. Vous avez compris ce qu'est un signal entrant et un signal sortant.
  4. Une platine d'essai n'a presque plus de secrets pour vous !

Dans cette partie, vous allez apprendre à simuler des circuits simples sur Tinkercad, faire vos premiers programmes pour contrôler un effecteur (une DEL) et découvrir le fabuleux monde des "fonctions" et de la programmation en C/C++.
Au travail !


Simulations avec Tinkercad circuits.


Voici ce que Tinkercad dit de Tinkercad :

Tinkercad est une collection d’outils logiciels gratuits en ligne qui aident les gens du monde entier à penser, créer et fabriquer. Nous sommes l’introduction idéale pour Autodesk, le leader des logiciels de conception 3D, d’ingénierie et de divertissement.

Pour commencer, si ce n'est pas déjà fait, aller vous créer un compte sur Tinkercad ici !
Toutes les simulations que vous verrez dans ce tutoriel ont été faites sur Tinkercad. Avec un compte, vous pourrez cliquer sur les simulations pour accéder au site et les modifier. N'hésitez pas à expérimenter !

Simuler un circuit simple sur breadboard


Exercice

Allons jouer avec Tinkercad ! Je voudrais que vous fassiez un circuit comportant 2 DEL, une rouge et une bleue, chacune protégée par une résistance et alimentées par une pile de 9 volts. Utilisez la résistance par défaut que Tinkercad vous propose, nous calculerons sa valeur plus tard (dans la partie 5).
Je vous donne un indice : les DEL ont un sens à respecter, on dit qu'elles sont polarisées. L'anode est le côté négatif, la cathode le côté positif. Mais ça vous le saviez déjà !
Obtenez-vous quelque chose de semblable ?


Pour aller plus loin.
Êtes-vous capable d'ajouter un bouton poussoir ou un interrupteur ?
Êtes-vous capable de crééer votre propre circuit original ?

Bon, je sens que vous avez totalement compris le concept de breadboard ! Si ce n'est pas le cas, continuez à expérimenter, il vous faudra être à l'aise pour la suite.
Nous allons maintenant remplacer la pile de 9 volts par un Arduino et écrire un premier programme !

Simuler un programme simple avec Arduino


Encore un peu de pratique avant de faire une nouvelle pause thérorique !
La simulation ci-dessous permet également d'allumer une DEL. Cette fois-ci c'est Arduino qui contrôle son éclairage.
Cliquez sur "Start Simulation" pour voir le résultat, cliquez sur "Code" pour afficher le programme.
schéma
Figure : redirection vers le site web de Tinkercad


Remarque : pour modifier le code, cliquez sur le logo "Tinkercad" dans le coin supérieur gauche de la simulation. Vous serez automatiquement redirigé vers le site web de Tinkercad (voir figure). Si vous avez un compte, vous pourez modifier la simulation en cliquant sur "Tinker This".


Attardons-nous à comprendre le petit programme.


La structure d'un programme Arduino.


Voici le programme très simple qui permet d'allumer la DEL dans la simulation ci-dessus :

void setup(){
  pinMode (13, OUTPUT);
}

void loop(){
  digitalWrite (13, HIGH);
}

Constatez que le programme est scindé en deux parties :
  1. Void Setup ()
  2. Void Loop ()
Tous les programmes Arduino comportent au minimum ces deux parties : ces deux "void".

Mais c'est quoi un "void" ?
Petite définition théorique :
Void indique au programme d’exécuter une routine : la routine setup et la routine loop. Void est utilisé pour des routines, ou fonctions, qui ne renvoient aucunes valeurs, contrairement à une fonction mathématique qui renvoie un résultat.
Késaveudire tout ça ?
Grosso-modo, un "Void" est une partie de programme qu'Arduino va exécuter. Grâce aux "Void", Arduino saura de quelle manière exécuter ce fragment de programme (soit "Setup", soit "Loop"). Derrière les "Void" il y a des lignes de code que l'on ne voit pas (de la même manière que lorsque vous programmez avec Scratch ou Lego Mindstorm, derrière chaque icône il y a du code). C'est ce que l'on appelle des "routines" (ou des "fonctions", terme que j'utiliserai plus souvent), que l'on déclenche avec un mot (soit "Setup", soit "Loop") et que les concepteurs d'Arduino ont créé pour nous simplifier la tâche.
Donc, à chaque fois que l'on écrit "Void", Arduino se dit "Ah, je dois exécuter une fonction, laquelle ?". Ensuite on y accole le nom de la fonction : "Setup" ou "Loop" (Arduino se dit alors "Ah oui, fonction Loop, je connais, c'est partiiiiiii !").
Sauf qu'Arduino ne se dit rien en fait, il ne pense pas, c'est une machine ! L'humain a tendance à anthropomorphiser...

A quoi servent ces 2 fonctions "void Setup" et "Void Loop" ?
  • Void Setup () : c'est la partie d'initialisation du programme. Elle n'est exécutée qu'une seule fois.
    Si le programme était une recette de cuisine, nous y écririons "préparez les ustensiles, sortez les ingrédients, préchauffez le four, lavez-vous les mains".
    Le code caché derrière la fonction serait par exemple : "les ustensiles sont dans le deuxième tiroir de la cuisine, les ingrédients sont au frigo" : tout ce que vous n'avez pas besoin de spécifier mais que le programme doit connaître pour exécuter l'action. La routine quoi !
    Vous n'exécutez ces actions qu'au tout début et ne les referez plus (vous n'allez pas préchauffer votre four 3 fois !).
  • Void Loop () : c'est la partie du programme dans laquelle on indique toutes les actions que l'on veut qu'Arduino exécute, en boucle ("loop").
    Si le programme était une recette de cuisine, nous y écririons "cassez les oeufs, mélangez, cuire 20 minutes".
    On peut exécuter ces actions autant de fois que l'on veut tant que les ustensiles sont sortis et que le four est chaud (et tant qu'il reste des oeufs ! ou des piles si c'est un Arduino !)
Analysons notre programme.

Void Setup ()


void setup(){
  pinMode (13, OUTPUT);
}

C'est la partie "d'initialisation du programme".
On y indique, entre autre, quelles prises sont branchées et comment elles doivent se comporter.
Ici, nous voulons que la prise "13" puisse se comporter comme une "sortie" (OUTPUT).

En language Arduino nous écrivons :
pinMode (13, OUTPUT);

Remarque :
  • Notez que toutes les lignes se terminent par un point-virgule.
    C'est la façon de dire à Arduino : "j'ai fini cette instruction, passe à la suivante".
  • Notez également que toutes les instructions du "Void" sont comprises entre deux accolades ({}).

Void Loop ()


void loop(){
  digitalWrite (13, HIGH);
}

C'est la partie "visible" du programme. On y indique tout ce que l'on veut qu'Arduino fasse pour nous : lire un signal provenant d'un capteur, écrire un signal vers un effecteur, exécuter des calculs mathématiques, etc.
Ici nous voulons que la DEL branchée sur la prise 13 s'allume. Nous allons demander à Arduino de produire un signal électrique au niveau de la prise 13 de sorte à alimenter la DEL afin qu'elle s'allume.

En language Arduino nous écrivons :
(traduction : écris un signal numérique HAUT (5 volts) sur la prise 13.)
digitalWrite (13, HIGH);

Remarque :
  • Notez que le terme "HIGH" fait référence à un signal élevé, soit une tension de 5 volts.
  • A l'inverse, le terme "LOW" fait référence à un signal bas, soit une tension de 0 volt.

Exercices


À partir de la simulation simple précédemment vue, vous allez devoir modifier le code ET le circuit.
  1. Exercice 1 : Modifiez le code et le circuit de sorte à ce que la DEL soit branchée sur la prise 3 et éclaire.
  2. Exercice 2 : Modifiez le code de sorte à ce que la DEL n'éclaire pas.
  3. Exercice 3 : Modifiez le code de sorte à ce que la DEL clignote toutes les 1/2 seconde.
    Vous avez besoin d'un indice pour cet exercice !
    Lisez la suite !



Fonctions et arguments.


Il existe une fonction qui permet de dire à Arduino de mettre un programme en pause.
Il s'agit de la fonction delay();.
Entre ses parenthèses, cette fonction a besoin d'un argument, c'est à dire un paramètre.
Dans notre exemple de recette de cuisine, nous pourrions créer une fonction préchaufferFour();.
L'argument de notre fonction préchaufferFour(); serait la température de préchauffage. Je pourrais donc utiliser la même fonction pour toutes mes recettes et seuleument modifier l'argument.
Pour des CupCakes, j'utiliserai la fonction et l'argument préchaufferFour(350); afin de préchauffer le four à 350°, pour un poulet préchaufferFour(400); pour 400° et pour des lasagnes préchaufferFour(broil); pour les grattiner.
La fonction delay(); accepte comme argument un nombre entier, qui est le temps, en millisecondes, d'arrêt du programme.

Pour une pause d'une demi-seconde, nous écrirons :
delay (500);

Toutes les fonctions ont besoin de 0, 1, 2, parfois plus, arguments.
Par exemple, les fonctions "Void Setup" et "Void Loop" n'acceptent pas d'argument : les parenthèses restent vides et on écrit Void Setup() ou Void Loop().
Les fonctions "pinMode" et "digitalWrite" acceptent chacune 2 arguments :
  • pinMode : numéro de prise et mode de la prise (entrée ou sortie de signal).
    On écrit pinMode (# prise, mode prise).
  • digitalWrite : numéro de prise et état de la prise (haut ou bas, 5 ou 0 volt).
    On écrit digitalWrite (# prise, état prise).

Vous savez maintenant comment finir l'exercice 3 !
Comme je ne suis pas trop méchant, voici la correction. Mais comme je suis tout de même un peu méchant j'y ai glissé 4 erreurs. Oui oui c'est vrai, cliquez sur "Start Simulation", vous verrez, ça ne fonctionne pas ! A vous de corriger la correction !
Mais attention, vous devriez pouvoir faire cet exercice vous-même, sinon vous ne serez pas prêt pour la partie 3 !



Résumé de la partie 2.


Voici ce qu'il faut retenir de ce chapitre :
  • Tinkercad circuits permet de faire tout ce qu'on peut faire avec Arduino, sans avoir d'Arduino.
  • Un programme Arduino est divisé en deux parties : le Void Setup et le Void Loop.
  • Le Void Setup permet d'initialiser le programme et, entre autre, indiquer à Arduino quelles prises sont des entrées ou des sorties.
  • Le Void Loop contient le programme proprement dit et que l'on veut qu'Arduino exécute.
  • Les "Void" sont des fonctions. Les fonctions peuvent accepter des "arguments".
  • Le code compris dans un "Void" doit obligatoirement être contenu entre deux accolades "{}".
  • Chaque ligne d'instruction dans le programme doit se terminer par un point-virgule ";".
  • pinMode et digitalWrite sont également des fonctions. Chacune accepte 2 arguments. delay est une fonction qui n'accepte qu'un seul argument.
  • Une fonction est une façon "abrégée" de programmer. Dans une fonction il y a plein de code que l'on ne voit pas.
  • Vous êtes capable d'écrire le programme de clignotement de la DEL tout seul.

Le tableau suivant résume les fonctions apprises durant ce chapitre :

Syntaxe Emplacement Utilisation Argument(s)
pinMode (a, b) setup() Initialisation de la prise indiquée en argument a = nom ou # de prise
b = pin en lecture (INPUT) ou écriture (OUTPUT)
digitalWrite (a, b); loop() Allume ou éteint la pin indiquée en argument. a = nom ou # de prise
b = pin "allumée" (HIGH) ou "éteinte" (LOW)
delay (x); loop() Met le programme en pause pour une certaine durée x = temps en millisecondes

Prêt pour la suite ?
Passez à la partie suivante (exercices) pour pratiquer tout ce que vous venez de voir.
Dans la partie 3, nous allons utiliser des capteurs et lire/écrire des signaux analogiques, utiliser les prises PWM et découvrir le fabuleux monde des variables ! Wouaw !