Fonctions essentielles en Arduino
Fonctions essentielles en Arduino
Arduino
3. Notion de fonction
Une fonction est un « morceau » de programme :
• qui est désigné par un nom
• reçoit des paramètres (valeurs, données)
• exécute des instructions
• renvoie un résultat
Par exemple, une fonction qui multiplie 2 nombres :
• pourra s'appeler « multiplication »
• recevra les 2 nombres à multiplier
• réalisera la multiplication des 2 nombres
• renverra le résultat
Par convention, le nom d'une fonction commencera toujours par une minuscule.
5. La fonction la plus simple
L'utilisation la plus simple d'un « moulin à café » consiste :
• à ne rien mettre dedans = pas de grains
• à ne pas tourner la manivelle = ne pas moudre les grains = ne rien faire
• et le moulin à café ne vous donnera pas de café moulu = renverra rien !
De la même façon, la fonction la plus simple est une fonction :
• qui ne reçoit aucun paramètre : on laissera tout simplement les
parenthèses vides,
• qui n'exécute aucune instruction : l'espace entre les 2 accolades restera
vide,
• qui ne renvoie rien : le type correspondant s'appelle void
Cette fonction ne fait rien, ne renvoie rien, mais elle est correctement écrite et ne
provoquera aucune erreur de compilation.
L'important ici est de bien mémoriser cette structure de base qui sera souvent
réutilisée dans le langage Arduino :
• par les 2 fonctions de base obligatoires d'un programme Arduino comme
on va le voir juste après,
• par des fonctions plus complexes qui seront présentées en temps voulu,
• ou bien dans une forme un peu différente par certaines instructions du
langage Arduino, notamment les boucles et les conditions.
6. Les 2 fonctions de base obligatoires dans tout programme Arduino
Tout programme Arduino est structuré en 2 parties distinctes et obligatoires
qui sont en fait deux fonctions obligatoires de forme simple, à savoir :
//--- le programme minimum ---
• la fonction setup()
• la fonction loop() //--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
Un programme qui ne contient que ces 2 fonctions vides est LE programme // NB : les lignes précédées de // sont des commentaires
Arduino minimum : il ne fait rien, mais il compile sans provoquer d'erreur.
7. A vous de jouer : Ecrire et compiler le programme minimum
Cette manipulation peut se faire sur le PC sans posséder de carte Arduino. Seul le
logiciel Arduino doit être correctement installé sur votre système.
Pour compiler le programme minimum :
• Commencer par ouvrir le logiciel Arduino
• Se placer dans la fenêtre d'édition et saisir à la main le code minimum
correspondant aux 2 fonctions setup() et loop() vides.
• Une fois le code saisi, cliquer sur le bouton de compilation.
• La compilation doit se dérouler sans erreur et vous devez obtenir un
message attestant la fin de compilation.
• A noter : La console vous indique la taille qui sera utilisée dans la
mémoire Arduino par le programme ainsi compilé.
• Une fois fait, vous pouvez vous entraîner à ajouter des commentaires et à
recompiler.
• Amusez-vous également à provoquer volontairement des erreurs de
compilation en enlevant une accolade ou une parenthèse : un message
rouge apparaît dans la console !
Ce programme minimum doit vous servir de base pour toute écriture d'un
programme Arduino !
Le programme minimum est aussi disponible dans le logiciel Arduino dans :
File > Examples > Basics > BareMinimum
8. Signification des 2 boucles obligatoires setup() et loop()
La fonction setup() :
• n'est exécutée qu'une seule fois et en premier au début du programme,
• on y placera les instructions d'initialisation et de configuration du
programme.
La fonction loop() :
• est exécutée ensuite en boucle, se répétant indéfiniment tant que le
programme n'est pas interrompu.
• on y placera les instructions à exécuter de façon répétée en boucle.
Si une fonction utilise un ou plusieurs paramètres, ceux-ci seront mis entre les
parenthèses.
Règle 1
Toute ligne comportant une instruction devra se terminer par un point-virgule ;
Règle 2
Toute accolade ouverte { doit être associée à une accolade de fermeture }
Règle 3
Toute ligne commençant par un double // est un commentaire sur une ligne
Règle 4
On pourra écrire un commentaire sur plusieurs ligne en le débutant par /* et en
le terminant par */
Arduino
3. La notion de variable
Vous avez tous déjà rangé des objets dans des boites et collé une étiquette dessus :
alors vous allez facilement comprendre ce qu'est une variable !
Lorsque l'on écrit un programme en langage Arduino (ou dans n'importe quel
autre langage de programmation d'ailleurs), on va manipuler des nombres entiers,
des nombres à virgules, des chaines de caractères.
Pour pouvoir manipuler facilement toutes ces grandeurs, on va les mémoriser, les
stocker, ce qui revient à les «ranger chacun dans une boite » et on va « coller une
étiquette dessus ».
En programmation, une « boite mémoire » sur laquelle on colle une
« étiquette » pour y mettre quelque chose : çà s'appelle une variable !
La carte Arduino dispose d'un processeur qui sait très bien utiliser ces « boîtes »
mémoires : c'est même son principal travail !
La carte Arduino possède de nombreuses cases mémoires disponibles que vous
allez pouvoir utiliser à volonté :
• vous disposez de plus de 1000 « boîtes » (ou octets) dans lesquelles vous
allez pouvoir lire, écrire, effacer des valeurs ,
• cette « réserve » de boites, c'est la mémoire vive, ou RAM (active lorsque
Arduino est allumé et qui s'efface lorsque vous éteignez Arduino). C'est
elle que le programme Arduino utilise pour stocker les variables !
• pour info (usage avancé), la carte Arduino dispose également :
◦ d'une petite mémoire Eeprom dans laquelle on peut lire/écrire et qui
ne s'efface pas quand on éteint l'Arduino
◦ d'une très grosse mémoire FLASH qui est écrite une fois pour toute et qui
ne s'efface pas quand on éteint Arduino. On y met le programme mais on
peut aussi y mettre des données fixes (texte par exemple).
4. La notion de « type » de variables
Imaginons que vous vouliez ranger des objets de toutes sortes : vous allez vous
préparer un stock de boites de tailles diverses et ensuite vous allez ranger vos
objets de façon adaptée dans vos boites.
Par exemple :
• vous allez mettre un bijou dans une petite boite, vous mettrez des crayons
dans une boite moyenne, vous mettrez des livres dans une grosse boite,
etc...
• dans votre cuisine, vous mettrez un petit reste dans un petit tupperware,
des oeufs dans une boite à oeufs, du liquide dans une bouteille, etc...
En programmation, c'est exactement pareil :
• vous allez utilisez des « boites mémoires » différentes en fonction de la
« taille » ou de la nature de ce que vous allez mettre dedans.
•les types possibles vont être des valeurs numériques entières (1,2,3,..), des
nombres à virgules (3.14159), des caractères ('A', 'B', ..), des valeurs
binaires (0 ou 1, vrai ou faux), etc..
En programmation, la « taille » d'une « boite mémoire » (ou variable)
s 'appelle le « type ». Pour dire les choses autrement, le type d'une
variable, c'est sa catégorie, son genre .
Le type de variable le plus simple est celui d'une variable dite « binaire » qui ne
peut contenir que rien ou quelque chose, autrement dit 0 ou 1, vrai ou faux :
c'est le type boolean
Les types de variables que vous allez le plus utiliser sont les variables numériques
entières :
• le type int (pour integer = entier) pour une valeur entière comprise
entre -32536 et + 32535
• le type long pour une valeur entière comprise entre -2 147 483 648 et
+2 147 483 647
• usage avancé : on fera précéder le type int ou long du mot clé unsigned si on
souhaite n'utiliser que des valeurs positives. Ceci a pour effet de doubler la
valeur positive utilisable (de 0 à 65535 pour un int par exemple).
Une variable qui va contenir un nombre à virgule sera de type float
Une variable correspondant à un caractère sera de type char
A part, la classe String qui servira à stocker les chaines de caractères.
Les types vous sont présentés ici pour information : vous les utiliserez et les
découvrirez au fur et à mesure des besoins de vos programmes.
En pratique, au début, déclarez vos variables en type int : çà
couvrira tous les besoins courants !
7. A vous de jouer : Déclarations de variables et opérations de bases sur les variables
Exemples de déclarations de variables Exemples d'opérations de base sur les variables
Pour stocker une valeur pouvant prendre comme valeur « vrai ou faux », 1 ou Pour attribuer une valeur à une variable, on fera :
0, on pourra utiliser un boolean : maVariable=2500;
boolean maVariable=false;
Entre 2 valeurs numériques, on pourra réaliser des opérations
Pour stocker une valeur entière pouvant prendre comme valeur maximale mathématiques. Si a, b et c sont 3 variables du même type (int par exemple),
1000, on utilisera un int : on pourra faire :
int maVariable=0; a=a+b;
c=b-a;
Pour stocker une valeur entière pouvant prendre comme valeur maximale 1 c=3*(a-b);
000 000, on utilisera un long : b=a/c;
long maVariable=0;
Noter que la division renverra une valeur entière si on utilise 2 valeurs
Pour stocker une valeur décimale, on utilisera un float : entières.
float maVariable=0.0;
Usage avancé : une variable a une taille qui se mesure en « octets » (un ensemble 8
coquetiers...) Il est possible de connaître la taille d'une variable grâce à l'instruction
En pratique :déclarez vos variables en type int : çà couvrira tous sizeOf (usage avancé) selon :
les besoins courants ! initialisez vos variables lors de la
int taille = sizeof(maVariable); // récupère la taille en octets d'une variable
déclaration pour éviter les effets inattendus !
Usage avancé : La portée des variables et leur durée de vie est modifiable également par certains
mots-clés, appelé « qualificateurs », à mettre avant le type de la variable lors de la déclaration :
• static : permet de rendre une variable locale persistante entre 2 appels d'une fonction
utilisant une variable locale. Est inaccessible en dehors de la fonction qui l'utilise.
• volatile : rend persistante une variable globale quelque soit le moment où elle sera
appelée. Utile avec les interruptions.
9. Les « variables fixes » : les constantes !
Pour tous les types de variables, il existe une situation particulière : celle où le
contenu de la variable ne peut et ne doit pas changer au cours du programme.
Par exemple :
• si la variable représente le numéro d'une broche,
• si la variable représente le nombre PI, etc...
Dans cette situation particulière, on va pouvoir préciser que le contenu de la
variable ne changera pas au cours du programme en créant une constante ! (à
noter que ce n'est pas obligatoire, mais c'est mieux !)
Pour déclarer une constante, c'est simple : on ajoute le mot clé const devant type
de la variable qui devient ainsi une constante ! Exemple :
const int maBroche=13; // déclare une constante de type int valant 13
Une fois déclarée, la valeur d'une constante ne pourra plus être
modifiée !
Dans un programme qui va afficher des messages utilisant des variables dans le
Terminal série sur le PC, la structure sera la suivante :
// --- entete déclarative ---
int myInt=-123; // variable entière "petit format"
long myLong=456789; // variable entière "grand format" float
Entête déclarative myFloat=3.14159; // variable à virgule
A ce niveau, on va déclarer et initialiser les variables utilisées, par exemple : const int myConst=10; // constante entière
• une variable int void setup() { // fonction setup() : exécutée 1 seule fois en premier
• une variable long [Link](115200); // initialise la communication série
• une variable float
} // fin setup
• une constante int
void loop() { // fonction loop() : exécutée ensuite en boucle sans fin
Fonction setup()
[Link]("myInt = "), [Link](myInt); // affiche message [Link]("myLong = "),
A ce niveau, on va : [Link](myLong); // affiche message [Link]("myFloat = "), [Link](myFloat,4); //
• initialiser la communication série : affiche message [Link]("myConst = "), [Link](myConst); // affiche message
[Link](); // saut de ligne vide
• +/- afficher les messages de début de programme (1 seul affichage)
delay(1000); // pause de 1 seconde
Fonction loop()
} // fin loop
On ce niveau on va :
• afficher les messages utilisant les variables
• faire une pause de 1 seconde entre 2 passages.
Sorties numériques : contrôler 8 LEDs et réaliser des « jeux de lumière », simuler les feux de
circulation, apprendre la boucle for, la condition if, utiliser un digit.
Arduino
3. Faire clignoter 8 LEDs : le montage
Continuons, sur notre lancée avec un montage utilisant maintenant 8 LEDs
simultanément ! Pour faire clignoter 8 LEDs, on va connecter 8 LEDs chacune en
série avec une résistance sur 8 broche E/S de la carte Arduino configurées en
sortie.
Le principe sera le suivant :
• lorsque la broche sera au niveau HAUT, la LED sera allumée,
• lorsque la broche sera au niveau BAS, la LED sera éteinte.
Cette fois on va reprendre le même programme en utilisant cette fois un //--- entete déclarative
tableau de 8 constantes pour désigner les broches : // = déclarer ici variables et constantes globales
• un tableau de 8 constantes pour désigner les 8 broches
const int LED[8] = {2,3,4,5,6,7,8,9}; // Tableau de constantes
• et une variable pour fixer la vitesse de clignotement.
int vitesse=1000; // variable fixant la durée de la pause
Entête déclarative
On déclare :
• un tableau de 8 constantes appelé LED de type int pour désigner les //--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
broches 2,3,4,5,6,7,8 et 9.
pinMode(LED[0], OUTPUT); // met la broche en sortie
• une variable de type int pour fixer la vitesse, appelée vitesse pinMode(LED[1], OUTPUT); // met la broche en sortie
pinMode(LED[2], OUTPUT); // met la broche en sortie
Fonction setup() pinMode(LED[3], OUTPUT); // met la broche en sortie
pinMode(LED[4], OUTPUT); // met la broche en sortie
A ce niveau, on va : pinMode(LED[5], OUTPUT); // met la broche en sortie
• initialiser les broches utilisées en sortie (avec les constantes LED[0], pinMode(LED[6], OUTPUT); // met la broche en sortie
LED[1], LED[2], LED[3], LED[4],LED[5],LED[6],LED[7]) pinMode(LED[7], OUTPUT); // met la broche en sortie
//--- la fonction loop() : exécutée ensuite en boucle sans fin void loop() {
Explication avancée : En fait le contenu entre les parenthèses d'une boucle correspond à 3 L'opérateur d'incrémentation ++ équivaut à l'opération +1
instructions, d'où les points-virgule de séparation :
i++ équivaut à i=i+1
• la première instruction est la déclaration/initialisation d'une variable typiquement
• la seconde instruction est une condition : tant qu'elle est vraie, la boucle exécute L'opérateur de décrémentation - - équivaut à l'opération -1
la 3ème instructions i-- équivaut à i =i-1
• la troisième instruction correspond à l'opération à effectuer à chaque fois que la
condition est vraie. Noter que l'on peut utiliser toute sorte d'opération : i=i+10 par
exemple.
6. Faire clignoter 8 LEDs : 2ème version en utilisant une boucle FOR
Le plus simple pour comprendre l'intérêt d'une boucle est de l'utiliser dans un
exemple. Ici, on va reprendre tout simplement le programme précédent en
utilisant des boucles pour alléger le programme !
//--- entete déclarative
Entête déclarative // = déclarer ici variables et constantes globales
On déclare :
const int LED[8] = {2,3,4,5,6,7,8,9}; // Tableau de constantes
• un tableau de 8 constantes appelé LED de type int pour désigner les
broches 2,3,4,5,6,7,8 et 9. int vitesse=1000; // variable fixant la durée de la pause
• une variable de type int pour fixer la vitesse, appelée vitesse //--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
La forme if .. else...
• ! (NON logique) : VRAI si l'opérande est FAUX – cas particulier : !x est VRAI chaque fois que x=0 (« tordu » mais pratique !)
10. Un jeu de lumière à 8 LEDs en utilisant un tableau de variables et une boucle FOR
Allez, on continue... Ici, on va allumer une seule LED à la fois, on va faire
« défiler » et recommencer en boucle. On va donc se baser sur :
• un tableau de constantes pour désigner les broches, //--- entete déclarative
// = déclarer ici variables et constantes globales
• une boucle for de défilement pour parcourir les broches,
const int LED[8] = {2,3,4,5,6,7,8,9}; // Tableau de constantes
• une condition if pour choisir la LED à allumer
Prêt ? C'est parti ! int vitesse=50; // variable fixant la durée de la pause
Entête déclarative //--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
On déclare : //--- met les 8 broches en sortie ---
• un tableau de 8 constantes appelé LED de type int pour désigner les for (int i=0; i<8; i++) { // répète 8 fois le code pinMode(LED[i],
OUTPUT); // met la broche en sortie
broches 2,3,4,5,6,7,8 et 9. } // fin for
• une variable de type int pour fixer la vitesse, appelée vitesse
} // fin de la fonction setup()
Fonction setup()
A ce niveau, on va : //--- la fonction loop() : exécutée ensuite en boucle sans fin void loop() {
• initialiser les broches utilisées en sortie en utilisant une boucle, sous
for (int numLED=0; numLED<8; numLED++) { // défile les 8 LEDs
la forme LED[i] où i est la variable de comptage de la boucle.
Fonction loop() // allume la LED voulue
for (int i=0; i<8; i++) { // répète 8 fois le code
A ce niveau on va :
if (i==numLED) { // si la LED est la LED courante
• Dans une boucle principale, répéter 8 fois le code suivant : digitalWrite(LED[i],HIGH); // allume la LED
◦ Parcourir 1 à 1 les LEDs à l'aide d'une boucle for }
else { // sinon
◦ A l'aide d'une condition if : digitalWrite(LED[i],LOW); // éteint la LED
}
▪ Allumer la LED courante de la boucle principale = mettre les
broches au niveau HAUT (5V) } // fin for i
▪ sinon éteindre les autres LEDs delay(vitesse); // pause de n millisecondes
◦ Attendre le temps voulu (= la valeur de la variable vitesse en
millisecondes) } // fin for numLED
Fonction setup()
//--- la fonction loop() : exécutée ensuite en boucle sans fin void loop() {
A ce niveau, on va initialiser les broches utilisées en sortie en utilisant une
boucle, sous la forme LED[i] où i est la variable de comptage de la boucle. for (int numLED=0; numLED<8; numLED++) { // défile les 8 LEDs crescendo
allumeLED(numLED); // appelle la fonction pour allumer LED voulue delay(vitesse); //
Fonction loop() pause de n millisecondes
A ce niveau on va : } // fin for numLED
• Dans une première boucle principale, répéter 8 fois : for (int numLED=0; numLED<8; numLED++) { // défile les 8 LEDs decrescendo
allumeLED(7-numLED); // appelle la fonction pour allumer LED
◦ l'appel de la fonction chargée d'allumer la LED voulue voulue
◦ Attendre le temps voulu (= la valeur de la variable vitesse en delay(vitesse); // pause de n millisecondes
} // fin for numLED
millisecondes)
• Ensuite, on écrit le même code dans une 2ème boucle, mais cette fois } // fin de la fonction loop()
en parcourant les broches en sens inverse ! Pour ce faire, on peut : soit
//---- fonction qui allume la LED voulue
inverser la logique de la boucle, ou bien utiliser l'indice selon (7-i) (le void allumeLED (int numLEDIn) { // la fonction reçoit le numéro de le
plus simple) ! LED à allumer
• le code de la fonction loop se répète sans fin... // allume la LED voulue
Autre fonction : fonction allumeLED(broche) for (int i=0; i<8; i++) { // répètre 8 fois le code
if (i==numLEDIn) { // si la LED est la LED courante
Afin de ne pas répéter 2 fois le code pour allumer la LED voulue, on peut le digitalWrite(LED[i],HIGH); // allume la LED
mettre dans une fonction séparée qui va « renvoyer rien » , va recevoir le } // fin if
numéro de la LED et qui aura pour fonction (trop facile celle-là !...) : else { // sinon
digitalWrite(LED[i],LOW); // éteint la LED
• Parcourir 1 à 1 les LEDs à l'aide d'une boucle for } // fin else
} // fin for i
• A l'aide d'une condition if :
} // fin allumeLED
▪ Allumer la LED courante de la boucle principale = mettre les
broches au niveau HAUT (5V)
▪ sinon éteindre les autres LEDs
Il est déjà pas mal ce petit code ! Vous avez tout compris ? Bravo !
13. Jeux de lumière à LEDs : une solution plus visuelle pour coder des séquences variées !
A présent, pour ceux qui voudraient aller encore plus loin (si vous avez un peu //--- entete déclarative
de mal, vous êtes pas obligés...!), je propose ici une solution pour créer des // = déclarer ici variables et constantes globales
const int LED[8] = {2,3,4,5,6,7,8,9}; // Tableau de constantes int vitesse=100; //
« jeux de lumière » sous une forme plus visuelle. Cette solution passe par la variable fixant la durée de la pause
possibilité, en langage Arduino, d'exprimer les valeurs numériques au format
binaire, sous la forme 10010101. En faisant correspondre une LED à chaque //--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
valeur 1/0, on obtient une façon simple de « visualiser » l'état des 8 LEDs... //--- met les 8 broches en sortie ---
for (int i=0; i<8; i++) { // répètre 8 fois le code pinMode(LED[i],
Les séquences d'effets deviennent ainsi plus facile à coder. Allez, on se lance... OUTPUT); // met la broche en sortie
} // fin for
Entête déclarative } // fin de la fonction setup()
On déclare :
• un tableau de 8 constantes appelé LED de type int pour désigner les //--- la fonction loop() : exécutée ensuite en boucle sans fin void loop() {
broches 2,3,4,5,6,7,8 et 9.
for (int repet=0; repet<10; repet++ ) { // repete 10 fois la séquence allumeLED(B10101010);
• une variable de type int pour fixer la vitesse, appelée vitesse // appelle la fonction pour allumer LED à
partir valeur binaire
Fonction setup() // bien utiliser 8 chiffres - B devant pour indiquer format binaire allumeLED(B01010101);
A ce niveau, on va : // appelle la fonction pour allumer LED à
partir valeur binaire
• initialiser les broches utilisées en sortie en utilisant une boucle, sous } // fin for repet
la forme LED[i] où i est la variable de comptage de la boucle.
for (int repet=0; repet<10; repet++ ) { // repete 10 fois la séquence allumeLED(B00000000);
Fonction loop() // appelle la fonction pour allumer LED à
A ce niveau on va : partir valeur binaire
allumeLED(B10000001);
• appelle ensuite la fonction de gestion des LEDs en passant une valeur allumeLED(B11000011);
sous une forme binaire, en faisant B11111111 par exemple pour allumer allumeLED(B11100111);
allumeLED(B11111111);
toutes les LEDs. Il faut simplement bien utiliser 8 chiffres ! allumeLED(B11100111);
• répéter autant de fois que voulu pour créer des séquences allumeLED(B11000011);
allumeLED(B10000001);
• le code de la fonction loop se répète sans fin... } // fin for repet
• on défile les 8 broches et à chaque fois on met la LEDs dans l'état du for (int i=0; i<=7; i++) {
0/1 correspondant. On utilise pour cela une fonction du langage digitalWrite(LED[i],bitRead(valeur,7-i)); // met la broche LED[i]
dans l'état du bit de rang i de la variable
Arduino qui permet de lire la valeur d'un bit d'une variable, }
bitRead(valeur, bit). delay(vitesse); //pause
• puis faire une pause entre 2 appels de la fonction.
} // fin de la fonction allumeLED
Ce code est un petit peu plus « avancé » mais il rend la programmation
d'effets lumineux très simple !
14. Simuler les feux de circulation avec 6 LEDs : Le montage
Allez, on change un peu de sujet, histoire de varier les plaisirs... Cette fois, je vous
propose un petit montage didactique assez parlant : la simulation des feux de
circulation ! Une façon sympa de s'entraîner à utiliser les broches en sortie !
On va ici utiliser 6 LEDs : 2 groupes de 3 LEDs associant chacun 1 rouge, 1 jaune
et 1 verte. Chaque LED sera connectée en série avec une résistance.
• puis le second passe au vert, le premier restant au rouge //--- le feu 2 passe au rouge digitalWrite(ORANGE_2,LOW); //
éteint orange feu 2 digitalWrite(ROUGE_2,HIGH); // allume rouge
• puis le second passe à l'orange puis au rouge feu 2
• les 2 restent un peu au rouge puis...
delay (1000); // pause courte 1 seconde
• le premier feu est au vert et le 2ème est au rouge, etc...
//--- le feu 1 passe au vert digitalWrite(ROUGE_1,LOW); // éteint
Entête déclarative rouge feu 1 digitalWrite(VERT_1,HIGH); // allume vert feu 1
On déclare :
delay (5000); // pause longue 5 secondes
• 6 constantes de broches désignant les feux en utilisant des noms
significatifs //--- le feu 1 passe à l'orange digitalWrite(VERT_1,LOW); // éteint
vert feu 1 digitalWrite(ORANGE_1,HIGH); // allume orange feu 1
Fonction setup()
delay (2000); // pause 2 secondes
A ce niveau, on va initialiser les broches utilisées en sortie.
Fonction loop() //--- le feu 1 passe au rouge digitalWrite(ORANGE_1,LOW); //
éteint orange feu 1 digitalWrite(ROUGE_1,HIGH); // allume rouge
A ce niveau on va : feu 1
• combiner des pauses et des conditions de façon à réaliser la séquence delay (1000); // pause courte 1 seconde
voulue.
//--- le feu 2 passe au vert digitalWrite(ROUGE_2,LOW); // éteint
• Il y a plusieurs solutions. rouge feu 2 digitalWrite(VERT_2,HIGH); // allume vert feu 2
Comme vu précédemment, si on désire une intensité de 13mA dans la LED, on utilisera, d'après la loi
d'ohm, une résistance de R=U/I = 3,5V/0,013A= 270 Ohms.
Ce montage nécessite un peu de rigueur. Utiliser les broches que vous voulez pour les segments : le programme pourra être adapté en conséquence !
Notez bien sur un papier cependant quelle broche est utilisée pour chaque segment.
18. Afficher les segments d'un digit : le programme 1ère version
Donc, à présent, on va allumer puis éteindre successivement tous les segments
et le point du Digit. Nous allons reprendre une structure de programme que
nous avons déjà utilisée pour réaliser un jeu de lumière à 8 LEDs. //--- entete déclarative
// = déclarer ici variables et constantes globales
Entête déclarative const int LED[8] = {8,9,4,3,2,7,6,5}; // Tableau de constantes
// --- ordre des broches : a,b,c,d,e,f,g,pt
On déclare :
• un tableau de 8 constantes appelé LED de type int pour désigner les 7 int vitesse=200; // variable fixant la durée de la pause
broches de segments ainsi que la broche du point.
//--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
• une variable de type int pour fixer la vitesse, appelée vitesse
//--- met les 8 broches en sortie ---
Fonction setup() for (int i=0; i<8; i++) { // répètre 8 fois le code pinMode(LED[i],
OUTPUT); // met la broche en sortie
A ce niveau, on va : } // fin for
• initialiser les broches utilisées en sortie en utilisant une boucle, sous
la forme LED[i] où i est la variable de comptage de la boucle. } // fin de la fonction setup()
Fonction loop()
//--- la fonction loop() : exécutée ensuite en boucle sans fin void loop() {
A ce niveau on va :
//--- met les 8 broches en sortie ---
• à l'aide d'une boucle, allumer successivement la LED voulue puis for (int i=0; i<8; i++) { // répètre 8 fois le code
l'éteindre après une pause avant de passer à la LED suivante.
digitalWrite(LED[i], HIGH); // allume la LED
• le code de la fonction loop se répète sans fin... delay(vitesse); // pause digitalWrite(LED[i], LOW); // éteint
la LED
Remarquer tout l'intérêt d'utiliser un tableau de constantes pour désigner } // fin for
les broches : si votre montage est différent de celui proposé ici, vous n'avez
qu'à modifier la liste des broches au niveau de l'initialisation et tout le reste
du programme est inchangé ! } // fin de la fonction loop()
• un tableau de 8 constantes appelé LED de type int pour désigner les 7 //--- met les 8 broches en sortie ---
broches de segments ainsi que la broche du point. for (int i=0; i<8; i++) { // répètre 8 fois le code pinMode(LED[i],
OUTPUT); // met la broche en sortie
• une variable de type int pour fixer la vitesse, appelée vitesse } // fin for
Fonction setup() } // fin de la fonction setup()
A ce niveau, on va :
• initialiser les broches utilisées en sortie en utilisant une boucle, sous //--- la fonction loop() : exécutée ensuite en boucle sans fin void loop() {
la forme LED[i] où i est la variable de comptage de la boucle.
// --- ordre des broches : a,b,c,d,e,f,g,pt
Fonction loop() allumeLED(B10000000); // segt a allumeLED(B01000000);
// segt b allumeLED(B00100000); // segt c
A ce niveau on va :
allumeLED(B00010000); // segt d allumeLED(B00001000);
• à l'aide d'une boucle, allumer successivement la LED voulue. // segt e allumeLED(B00000100); // segt f
allumeLED(B00000010); // segt g allumeLED(B00000001);
• le code de la fonction loop se répète sans fin... // segt pt allumeLED(B00000000); // éteint tout
Autre fonction : fonction de gestion des LEDs } // fin de la fonction loop()
Nous allons ici encore une fois séparer le code de gestion des LEDs dans une
fonction séparée : //fonction qui reçoit une valeur de type int non signé et ne renvoie auc une valeur
void allumeLED(unsigned int valeur) { // fonction pour allumer/éteindre les LEDs voulue en
• cette fonction va recevoir la valeur binaire fonction valeur 8 bits reçue
• on défile les 8 broches et à chaque fois on met la LEDs dans l'état du for (int i=0; i<=7; i++) {
0/1 correspondant. On utilise pour cela une fonction du langage digitalWrite(LED[i],bitRead(valeur,7-i)); // met la broche LED[i]
Arduino qui permet de lire la valeur d'un bit d'une variable, dans l'état du bit de rang i de la variable
}
bitRead(valeur, bit). delay(vitesse); //pause
• puis faire une pause entre 2 appels de la fonction.
} // fin de la fonction allumeLED
Ainsi :
• pour afficher le 1, on allumera les segments b et c, les autres restant éteints,
• pour afficher le 2, on allumera les segments a,b,d,e et g, les autres restant éteints,
• et ainsi de suite...
Avant de lire la suite, prenez un crayon et écrivez vous-mêmes toutes les séquences.... !
Faut bien que vous bossiez un peu quand même...
21. Afficher des chiffres sur un digit : 1ère version
Vous êtes prêts ? Allez, on se lance pour afficher nos chiffres sur le digit :
//--- entete déclarative
Entête déclarative // = déclarer ici variables et constantes globales
const int LED[8] = {8,9,4,3,2,7,6,5}; // Tableau de constantes
On déclare : // --- ordre des broches : a,b,c,d,e,f,g,pt
• un tableau de 8 constantes appelé LED de type int pour désigner les 7
int vitesse=1000; // variable fixant la durée de la pause
broches de segments ainsi que la broche du point.
• une variable de type int pour fixer la vitesse, appelée vitesse //--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
Bravo, vous savez afficher des chiffres sur un digit ! } // fin de la fonction allumeLED
Vous ne regarderez plus votre radio-réveil tout à fait de la même façon !
22. Pour info : Afficher des chiffres sur un digit en utilisant une fonction dédiée
A présent, on va essayer d'améliorer un petit peu çà (ben oui... on allait tout de
même pas s'arrêter en si bon chemin... ) On va écrire une fonction de la forme //--- entete déclarative
digit(chiffre,point) pour afficher le chiffre voulu sur le digit +/- le point ! // = déclarer ici variables et constantes globales
const int LED[8] = {8,9,4,3,2,7,6,5}; // Tableau de constantes
Entête déclarative // --- ordre des broches : a,b,c,d,e,f,g,pt
On déclare :
int vitesse=1000; // variable fixant la durée de la pause
• un tableau de 8 constantes appelé LED de type int pour désigner les 7
broches de segments ainsi que la broche du point. //--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
• une variable de type int pour fixer la vitesse, appelée vitesse //---défile les 8 broches 0 à 7 ---
for (int i=0; i<8; i++) { // répètre 8 fois le code pinMode(LED[i],
Fonction setup() OUTPUT); // met la broche en sortie
} // fin for
A ce niveau, on va :
• initialiser les broches utilisées en sortie en utilisant une boucle, sous } // fin de la fonction setup()
la forme LED[i] où i est la variable de comptage de la boucle.
Fonction loop() //--- la fonction loop() : exécutée ensuite en boucle sans fin void loop() {
A ce niveau on va : //---défile les chiffres 0 à 9 ---
for (int chiffre=0; chiffre<=9; chiffre++) {
• à l'aide d'une boucle, on appelle successivement la fonction d'affichage
//digit(chiffre, true); // chiffre + point
des chiffres et du point avec les valeurs de 0 à 9 //digit(chiffre, false); // chiffre sans le point digit(chiffre, chiffre % 2 ); // chiffre
• le code de la fonction loop se répète sans fin... + le point allumé si
impair (reste=1)
Autre fonction 1: fonction de gestion des LEDs delay(vitesse); //pause
}
Nous allons ici séparer le code de gestion des LEDs dans une fonction séparée
qui va recevoir la valeur binaire : digit(-1, false); // éteint segments + point delay(vitesse);
//pause
• on défile les 8 broches et à chaque fois on met la LEDs dans l'état du
0/1 correspondant. On utilise pour cela une fonction du langage } // fin de la fonction loop()
Arduino qui permet de lire la valeur d'un bit d'une variable,
bitRead(valeur, bit). //fonction qui reçoit une valeur de type int non signé et ne renvoie auc une valeur
void allumeLED(unsigned int valeur) { // fonction pour allumer/éteindre les LEDs voulue en
• puis faire une pause entre 2 appels de la fonction. fonction valeur 8 bits reçue
Remarquer comment l'usage d'une fonction simplifie le code : for (int i=0; i<=7; i++) {
il suffit de passer la valeur et les segments voulus seront allumés. digitalWrite(LED[i],bitRead(valeur,7-i)); // met la broche LED[i]
dans l'état du bit de rang i de la variable
La plupart des instructions du langage Arduino sont des fonctions qui }
simplifient la programmation et exécutent un code sous-jacent parfois
complexe (dont vous n'avez pas à vous soucier d'ailleurs...). Tout ce qui
} // fin de la fonction allumeLED
compte pour vous, c'est qu'une fonction Arduino fasse ce qu'on attend elle
sans erreur.
« Bandes de petits veinards» je vous dis !
Ce code vous est présenté à titre informatif pour vous montrer comment } // fin fonction digit
écrire une fonction qui reçoit 2 paramètres. Ce n'est pas grave si vous
n'arrivez pas à l'écrire par vous-mêmes : c'est un programme déjà un peu
avancé. Mais c'est une bonne façon pour vous d'apprendre !
Arduino
3. Notion d'électronique numérique
L'électronique est une technique qui manipule les « électrons » sous forme de
tension ou d'intensité. On distingue 2 types d'électronique :
• L'électronique analogique qui utilise des variations continues de la
tension qui peut prendre toutes les valeurs intermédiaires (potentiomètre
= variation du minimum au maximum).
• L'électronique numérique qui utilise des variations « abruptes » de
la tension qui va prendre 2 niveaux (interrupteur = allumé ou éteint) :
l'un dit HAUT (5V), l'un dit BAS (0V).
Un microprocesseur, tel que celui de la carte Arduino, est un circuit numérique
qui va permettre de manipuler des niveaux HAUT/BAS.
Une broche numérique va être caractérisée par son état ou niveau de tension : elle
va pouvoir se trouver dans 2 états possibles seulement :
◦ soit au niveau HAUT (=5V), symbolisé par 1 ou HIGH
◦ soit au niveau BAS (=0V), symbolisé par 0 ou LOW
• noter qu'à un instant quelconque, la broche se trouve obligatoirement
dans l'un de ces 2 états.
Remarquer également que la plupart des broches numériques ont des fonctions
particulières potentielles qui seront présentées au fur et à mesure de leur
utilisation. A titre indicatif, les fonctions disponibles sont la génération d'impulsion, la
communication SPI, la communication I2C, les interruptions externes...
D'un point de vue électrique, retenir que :
• chaque broche numérique E/S peut supporter 40 mA d'instensité en
sortie ou en entrée
• L'ensemble des broches numériques E/S ne doit pas dépasser 200mA en
entrée ou en sortie !
Usage avancé : pour des projets nécessitant de nombreuses broches E/S (= mal conçu?),
la carte Arduino Mega dispose de plus d'une 50aine de broches E/S !
7. Truc technique : les broches E/S de la carte Arduino sur borniers à vis avec un screwshield.... !
Bon à savoir :
Il existe des shields (carte d'extension) de la carte Arduino qui permettent de dédoubler les broches de
la carte Arduino sur des borniers à vis : les « screwchields » !
Très pratique pour finaliser des montages en « dur ».
//--- la fonction loop() : exécutée ensuite en boucle sans fin void loop() {
La règle qui lui est associée et qui est tout aussi importante :
TOUTE « ALIMENTATION » ELECTRIQUE SE CARACTERISE PAR 2
CHOSES :
UNE TENSION FOURNIE mesurée en VOLTS UNE
INTENSITE MAXIMALE mesurée en AMPERES
Ainsi, avant de connecter un dispositif sur une alimentation, il va falloir Exemple de fiche technique d'un bloc secteur
systématiquement se poser 2 questions :
• la tension fournie par l'alimentation correspond-elle à la tension
d'alimentation du dispositif ?
• l'intensité de fonctionnement du dispositif est-elle bien inférieure à
l'intensité maximale possible ?
Il faudra toujours répondre OUI à ces 2 questions. Exemples :
• puis-je connecter un appareil fonctionnant en 12V et consommant 1A sur
une prise de courant de 220V / 10A ? => NON (danger!)
• puis-je connecter un moteur fonctionnant en 6V et consommant 2A sur
un bloc secteur 6V/500mA ? => NON
• puis-je connecter une lampe consommant 5V/20mA sur une broche
pouvant fournir 5V/40mA ? => OUI
11. Notion de tension alternative, continue, régulée..
La tension Vin d'une carte Arduino pourra être de type continu régulé ou non, la carte Arduino disposant d'un régulateur 5V intégré.
12. Truc technique... : une alimentation régulée de « labo » à pas cher !
BON à savoir :
une alimentation de PC de récupération, dite alimentation ATX, est une alimentation régulée peu coûteuse (<10€) et qui fournit du 5V régulé sous
plusieurs ampères, du 12V régulé sous plusieurs ampères, et aussi du 3.3V régulé, du -12V régulé, etc.. Pratique !
A comparer à un bloc secteur 220V AC / 6-12V DC qui ne fournira que 0.5 à 1A dans le meilleur des cas, pour le même prix...
Avec çà, vous êtes sur de pouvoir alimenter tous vos projets, y compris (et surtout) si vous utilisez des moteurs ou de nombreux servomoteurs !
Pour activer l'alimentation, au niveau du connecteur ATX, il suffit de mettre un strap entre la broche verte (16) et la masse (0V - noir)
13. Caractéristiques électriques globales de la carte Arduino
Voici quelques exemples, pour se faire une idée de ce que l'on peut connecter
directement sur une broche numérique d'une carte Arduino en sortie :
• une broche d'un autre CI numérique consommera dans les 1 mA, =>
connexion directe POSSIBLE !
• une LED en série avec sa résistance consommera dans les 10-20mA selon
la résistance utilisée, => connexion directe POSSIBLE !
• la broche de commande d'un servomoteur consommera dans les 5mA, =>
connexion directe POSSIBLE !
• un moteur CC consommera dans les 250mA => connexion directe
IMPOSSIBLE ! (Dans ce cas, on devra utiliser une interface de
puissance comme nous le verrons)
En pratique : TOUJOURS se demander « quelle intensité va être
utilisée ? »
15. Technique : Le schéma électrique interne de l'alimentation de la carte Arduino
Afin de comprendre ce que l'on fait, il est important d'avoir toujours à l'esprit les notions d'intensité et de tension de la carte Arduino. Comme on l'a dit, la carte
Arduino intègre une alimentation interne régulée de 5V rég / 500mA :
• soit en provenance du port USB
• soit à partir de l'alimentation Vin 7-12V / 500mA (ou +) (connecteur Jack)
Il est essentiel de distinguer :
• l'intensité maximale (200mA) que peut fournir le « coeur » de la carte Arduino et limité à 40mA par broche en sortie mais 200mA maximum
pour l'ensemble des broches réunies. Une LED en série avec une résistance utilisera par exemple 15mA fournis par le « coeur » Arduino.
• l'intensité maximale (500mA) que peut fournir l'alimentation +5V régulé/500mA. Cette alimentation de +5V/500mA de la carte Arduino
peut également être mise en parallèle avec une alimentation externe +5V régulée au besoin.
• l'intensité résiduelle disponible de 300mA supplémentaires maxi pour alimenter des dispositifs 5V directement à partir de
l'alimentation de la carte Arduino (mais pas à partir des broches !!)
16. Découvrir les composants et accessoires de base pour faire des montages avec la carte Arduino
La résistance
Ce composant sert à limiter l'intensité, c'est à dire le nombre d'électrons qui
circulent dans le circuit. Sens de connexion indifférent. Se mesure en Ohms. Les
bandes colorées indiquent la valeur de la résistance.
Jumper ou Straps
Câble souple ou semi-rigide permettant de réaliser des connexions entre 2
composants. Existent dans différentes tailles et couleurs. Existent en Mâle/Mâle,
Femelle/Femelle, Mâle/Femelle.
Pour les matheux ( on est pas du tout obligé de savoir faire ce calcul !) :
• aux bornes de la LED, la tension vaut 1,5V environ (fixe)
• la tension aux bornes de la résistance en série avec la LED, dans le cas
d'une alimentation en 5V, vaudra donc 5V-1,5V = 3.5V
• si on désire une intensité de 13mA dans la LED, on utilisera, d'après la loi
d'ohm, une résistance de R=U/I = 3,5V/0,013A= 270 Ohms.
19. Principe d'utilisation d'une plaque d'essai (ou « breadboard »)
Pour réaliser des montages électroniques sans soudure, on va utiliser ce que l'on appelle une « plaque d'essai » ou « breadboard » en anglais. Une fois que l'on
a compris comment utiliser cette plaque, on pourra réaliser facilement toutes sortes de montages associés ou non à la carte Arduino.
Courber légèrement la patte longue de façon à obtenir la même longueur pour les
2 pattes :
Couper les 2 pattes à la même longeur :
Ainsi, la LED sera très facile à utiliser sur une plaque d'essai :
Bon à savoir :
Tous les montages que vous réaliserez sur plaque d'essai (et donc transitoires) peuvent être facilement rendus définitifs au besoin grâce au « proto-shield » ou
shield de prototypage. Ce shield (ou carte d'extension) s'insèrera broche à broche sur la carte Arduino et dispose d'une zone de pastilles à souder équivalentes à
une plaque d'essai.
Un montage que vous avez envie de rendre définitif : soudez-le sur un protoshield (de 10 à 15€ selon modèle) !
Note : En utilisant des constantes pour désigner les broches, les programmes sont plus simples à modifier et la fonction des broches est plus
claire ! Vos codes sont également plus faciles à réutiliser dans un autre programme ou une fonction.
26. Faire clignoter 4 LEDs : le montage
Pour faire clignoter 4 LEDs, on va connecter 4 LEDs chacune en série avec une
résistance sur 4 broche E/S de la carte Arduino configurées en sortie. Le principe
sera le suivant :
• lorsque la broche sera au niveau HAUT, la LED sera allumée,
• lorsque la broche sera au niveau BAS, la LED sera éteinte.
• une variable de type int pour fixer la vitesse, appelée vitesse pinMode(LED1, OUTPUT); // met la broche en sortie
pinMode(LED2, OUTPUT); // met la broche en sortie
Fonction setup() pinMode(LED3, OUTPUT); // met la broche en sortie
A ce niveau, on va : pinMode(LED4, OUTPUT); // met la broche en sortie
• initialiser les broches utilisées en sortie (avec les constantes LED1, } // fin de la fonction setup()
LED2, LED3, LED4)
Fonction loop() //--- la fonction loop() : exécutée ensuite en boucle sans fin void loop() {
A ce niveau on va : digitalWrite(LED1,HIGH); // allume la LED
digitalWrite(LED2,HIGH); // allume la LED
• Allumer les LEDs = mettre les broches au niveau HAUT (5V) digitalWrite(LED3,HIGH); // allume la LED
• Attendre le temps voulu (= la valeur de la variable vitesse en digitalWrite(LED4,HIGH); // allume la LED
millisecondes)
delay(vitesse); // pause de n millisecondes
• Eteindre les LEDs = mettre les broches au niveau BAS (0V)
digitalWrite(LED1,LOW); // éteint la LED
• Attendre le temps voulu (= la valeur de la variable vitesse en
digitalWrite(LED2,LOW); // éteint la LED
millisecondes) digitalWrite(LED3,LOW); // éteint la LED
• le code de la fonction loop se répète sans fin... digitalWrite(LED4,LOW); // éteint la LED
Mais pour parcourir une liste de variables à l'aide d'une boucle, il faut au
préalable créer un tableau de variables. Le principe : toutes les variables ont le
même nom,
le nom du tableau, mais sont numérotées de 0 à n-1 dans le tableau.
Exemple
Indice d'un0tableau appelé LED désignant les broches 2 à 9 :
1 2 3 4 5 6 7
Variable LED[0] LED[1] LED[2] LED[3] LED[4] LED[5] LED[6] LED[7]
Valeur 2 3 4 5 6 7 8 9
• et une variable pour fixer la vitesse de clignotement. const int LED[4] = {2,3,4,5}; // Tableau de constantes
Entête déclarative int vitesse=1000; // variable fixant la durée de la pause
On déclare :
• un tableau de 4 constantes appelé LED de type int pour désigner les //--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
broches 2,3,4 et 5.
pinMode(LED[0], OUTPUT); // met la broche en sortie
• une variable de type int pour fixer la vitesse, appelée vitesse pinMode(LED[1], OUTPUT); // met la broche en sortie
Fonction setup() pinMode(LED[2], OUTPUT); // met la broche en sortie
A ce niveau, on va :
pinMode(LED[3], OUTPUT); // met la broche en sortie
• initialiser les broches utilisées en sortie (avec les constantes LED[0],
LED[1], LED[2], LED[3]) } // fin de la fonction setup()
Fonction loop()
//--- la fonction loop() : exécutée ensuite en boucle sans fin void loop() {
A ce niveau on va :
• Allumer les LEDs = mettre les broches au niveau HAUT (5V) digitalWrite(LED[0],HIGH); // allume la LED
digitalWrite(LED[1],HIGH); // allume la LED
• Attendre le temps voulu (= la valeur de la variable vitesse en digitalWrite(LED[2],HIGH); // allume la LED
millisecondes)
• Eteindre les LEDs = mettre ea broches au niveau BAS (0V) digitalWrite(LED[3],HIGH); // allume la LED
• Attendre le temps voulu (= la valeur de la variable vitesse en
delay(vitesse); // pause de n millisecondes
millisecondes) digitalWrite(LED[1],LOW); // éteint la LED
• le code de la fonction loop se répète sans fin... digitalWrite(LED[0],LOW); // éteint la LED
digitalWrite(LED[3],LOW); // éteint la LED
En utilisant un tableau de variables pour désigner un ensemble de broches : on digitalWrite(LED[2],LOW); // éteint la LED
simplifie et on allège d'une part le code et on permet de plus une adaptation
simplifiée du programme, seule la ligne d'initialisation du tableau des broches
utilisées étant à modifier si on change de broches !
Ateliers Arduino
3. Rappel : Une broche numérique ne peut avoir que 2 états : HAUT ou BAS, « y'a ou y'a pas » !
Une broche numérique, dans un circuit numérique est un point du circuit
matérialisé par une broche métallique dans le cas d'un circuit intégré ou d'une
carte électronique.
Une broche numérique va être caractérisée par son état ou niveau de tension :
elle va pouvoir se trouver dans 2 états possibles seulement :
• soit au niveau HAUT (=5V), symbolisé par 1 ou HIGH
• soit au niveau BAS (=0V), symbolisé par 0 ou LOW
• noter qu'à un instant quelconque, la broche se trouve obligatoirement
dans l'un de ces 2 états.
Bon à savoir :
Il existe des shields (carte d'extension) de la carte Arduino qui permettent de dédoubler les broches de
la carte Arduino sur des borniers à vis : les « screwchields » !
Très pratique pour finaliser des montages en « dur ».
Schéma théorique
Le schéma théorique du bouton poussoir est très simple : Pour utiliser facilement le bouton poussoir sur une plaque d'essai, il peut
être utile d'aplatir légèrement les pattes avec une pince de façon à ce qu'il
s'insère facilement sur la plaque d'essai.
9. Principe d'utilisation d'un bouton poussoir avec une carte Arduino : notion de « rappel au plus ».
Principe général La solution : une résistance de « rappel au plus »
Comme on l'a déjà dit, une broche numérique utilisée en entrée va permettre Vous comprenez que dans ces conditions, il sera impossible d'analyser l'état de
de « lire » l'état de la broche. la broche numérique en entrée !!
D'où l'idée, très simple, de connecter un bouton poussoir entre la broche en Pour contourner ce problème, on « attache » au +5V (ou au 0V) la broche
entrée et le 0V afin d'interagir avec la carte Arduino. numérique en entrée à l'aide d'une résistance assez élevée, de l'ordre de
Ainsi : 10KOhms (la valeur exacte n'a pas grande importance, seul l'ordre de
grandeur est à respecter...) : on appelle cela le « rappel au plus ».
• lorsque le bouton est appuyé, le contact est établi et la broche sera
connectée au 0V. Du coup, lorsque la broche ne sera pas connectée, elle sera parfaitement
maintenue à 5V et l'enregistrement de la broche non-connectée deviendra :
• lorsque le bouton est relâché, le contact n'est pas établi et la broche ne
sera pas connectée au 0V
Etat d'une broche numérique en entrée non connectée...
Si vous êtes attentif, vous allez vous poser cette question : « dans quel état sera
la broche numérique en entrée lorsqu'elle ne sera connectée à rien, c'est à dire
lorsque le bouton poussoir sera relâché ? »
En effet, lorsque le bouton poussoir est relâché, la broche numérique en entrée
restera non connectée et lorsque Arduino lira son état, quel sera-t-il ?? On
pourrait intuitivement penser que dans ce cas la broche sera à 1... En fait, dans
cette situation, la broche va se comporter comme une petite antenne... et va Truc : Utiliser les résistances de « rappel au plus » internes
osciller en permanence au gré des interférences électro-magnétiques Les concepteurs de microprocesseur savent que vous allez utiliser un bouton
ambiantes. Si on enregistrait l'état de la broche, on obtiendrait quelque chose poussoir sur une broche en entrée et pour résoudre ce problème, ils ont prévus
comme çà : en interne des résistances de rappel au plus (ou pull-up) internes. Arduino
dispose de telles résistances : elles pourront être activée par le programme.
10. Broche ES en entrée : utiliser un bouton poussoir : Le montage
Le montage à réaliser pour utiliser un bouton poussoir avec la carte Arduino
est simple si l'on utilise les résistances de rappel au plus internes comme on va
le faire ici.
Il suffit donc de connecter le bouton poussoir (BP) d'une part au 0V et d'autre
part à la broche numérique voulue de la carte Arduino selon :
• À l'aide d'une condition if() on teste si le bouton poussoir est bien }// fin de la fonction setup()
appuyé en lisant son état avec la fonction digitalRead()
• Si le bouton poussoir est bien appuyé : //---lafonctionloop():exécutéeensuiteenbouclesansfin void loop() {
◦ on envoie un message sur le port Série if(digitalRead(BP)==APPUI) { // si appui [Link]("Appui sur Bouton
◦ on réalise une courte pause anti-rebond Poussoir !"); // message delay(250); // pause anti-rebond
}// fin if
A RETENIR : ON ACTIVE LE « RAPPEL AU PLUS » interne d'une broche
configurée en entrée en écrivant la valeur HIGH sur la broche, bien
qu'elle soit configurée en entrée.
}// fin de la fonction loop()
13. Utiliser un bouton poussoir et une LED : le montage.
Le montage à réaliser pour utiliser un bouton poussoir et une LED avec la
carte Arduino consiste à combiner le montage d'un bouton poussoir et d'une
LED : vous savez faire !
14. Un BP et une LED : La LED reflète l'état du BP
Cette fois, nous allons écrire un programme de façon à ce que la LED soit à
tout moment dans l'état du bouton poussoir. Rien de très compliqué. // --- Déclaration des constantes ---
const int APPUI=0; // constante état du BP - appui sur niveau bas
Entete déclarative
const int BP=2; //declaration constante de broche const int LED=3;
On va déclarer à ce niveau : //declaration constante de broche
• 1 constante désignant la broche utilisée pour la LED, appelée ici LED // --- Déclaration des variables globales ---
• 1 constante désignant la broche utilisée pour le bouton poussoir,
int ETAT_BP=0; // variable état BP
appelée ici BP
• 1 constante int appelée APPUI et initialisée à 0. // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du
programme
• 1 variable int pour mémoriser l'état du BP
void setup() { // debut de la fonction setup()
Fonction setup()
• on configure la broche de la LED en sortie avec l'instruction // -------Broches en sortie ------- pinMode(LED, OUTPUT); //met
la broche en sortie
pinMode(broche, OUTPUT)
• on configure la broche du bouton poussoir en entrée avec l'instruction // -------Broches en entrée ------- pinMode(BP, INPUT); //met
la broche en entree
pinMode(broche, INPUT)
• ON ACTIVE LE « RAPPEL AU PLUS » interne de la broche en // -------Activation du rappel au + interne des broches en entrée si nécessaire -------
écrivant la valeur HIGH sur la broche, bien qu'elle ait été digitalWrite(BP, HIGH) ; // activation du pullup de la broche en entrée
configurée en entrée. }// fin de la fonction setup()
Fonction loop()
• À l'aide d'une condition if() on teste si le bouton poussoir est bien // la fonction loop() s'exécute sans fin en boucle
appuyé en lisant son état avec la fonction digitalRead()
void loop(){ // debut de la fonction loop()
• Si le bouton poussoir est bien appuyé :
// lire l'état du BP et mémoriser la valeur
◦ on allume la LED ETAT_BP=digitalRead(BP);
◦ sinon, on éteint la LED
// tester l'état du BP mémorisé et allumer la LED si appuyé if
◦ on réalise une courte pause anti-rebond (pas indispensable ici) (ETAT_BP==APPUI){ // si BP appuyé
}// fin if
}// fin de la fonction loop() - le programme recommence au début de la fonction loop sans
fin
15. Un BP et une LED : le BP en minuteur
Elaborons un petit peu ce programme de façon à ce qu'un appui sur le bouton
// --- Déclaration des constantes ---
poussoir allume la LED un certain temps puis l'éteigne à la façon d'une
const int APPUI=0; // constante état du BP - appui sur niveau bas
minuterie.
Entete déclarative const int BP=2; //declaration constante de broche const int LED=3;
//declaration constante de broche
On va déclarer à ce niveau :
// --- Déclaration des variables globales ---
• 1 constante désignant la broche utilisée pour la LED, appelée ici LED
int etatLED=0; // variable état BP
• 1 constante désignant la broche utilisée pour le bouton poussoir,
appelée ici BP // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du
• 1 constante int appelée APPUI et initialisée à 0. programme
• on configure la broche de la LED en sortie avec l'instruction // -------Broches en sortie ------- pinMode(LED, OUTPUT); //met
pinMode(broche, OUTPUT) la broche en sortie
• on configure la broche du bouton poussoir en entrée avec l'instruction // -------Broches en entrée ------- pinMode(BP, INPUT); //met
pinMode(broche, INPUT) la broche en entree
• ON ACTIVE LE « RAPPEL AU PLUS » interne de la broche en // -------Activation du rappel au + interne des broches en entrée si nécessaire -------
écrivant la valeur HIGH sur la broche, bien qu'elle ait été digitalWrite(BP, HIGH) ; // activation du pullup de la broche en entrée
configurée en entrée.
}// fin de la fonction setup()
Fonction loop()
• À l'aide d'une condition if() on teste si le bouton poussoir est bien // la fonction loop() s'exécute sans fin en boucle
appuyé en lisant son état avec la fonction digitalRead()
void loop(){ // debut de la fonction loop()
• Si le bouton poussoir est bien appuyé :
◦ on allume la LED avec l'instruction digitalWrite(broche, HIGH) if (digitalRead(BP)==APPUI) { // si le BP est appuyé
◦ puis on réalise une pause de durée voulue à l'aide de l'instruction digitalWrite(LED,HIGH); //allume la LED
delay(duree) delay (5000); // attend 5 secondes- le BP est inactif pendant ce temps digitalWrite
(LED,LOW); // éteint la LED
}// fin de la fonction loop() - le programme recommence au début de la fonction loop sans
fin
16. Un BP et une LED : l'appui sur le BP inverse la LED
A présent, nous allons écrire un programme de façon à ce qu'un appui sur
le bouton poussoir inverse l'état de la LED. // --- Déclaration des constantes ---
const int APPUI=0; // constante état du BP - appui sur niveau bas
Entete déclarative
const int BP=2; //declaration constante de broche const int LED=3;
On va déclarer à ce niveau : //declaration constante de broche
• 1 constante désignant la broche utilisée pour la LED, appelée ici LED // --- Déclaration des variables globales ---
• 1 constante désignant la broche utilisée pour le bouton poussoir,
int etatLED=0; // variable état BP
appelée ici BP
• 1 constante int appelée APPUI et initialisée à 0. // La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du
programme
• 1 variable int pour mémoriser l'état de la LED.
void setup() { // debut de la fonction setup()
Fonction setup()
• on configure la broche de la LED en sortie avec l'instruction // -------Broches en sortie ------- pinMode(LED, OUTPUT); //met
la broche en sortie
pinMode(broche, OUTPUT)
• on configure la broche du bouton poussoir en entrée avec l'instruction // -------Broches en entrée ------- pinMode(BP, INPUT); //met
la broche en entree
pinMode(broche, INPUT)
• ON ACTIVE LE « RAPPEL AU PLUS » interne de la broche en // -------Activation du rappel au + interne des broches en entrée si nécessaire -------
digitalWrite(BP, HIGH) ; // activation du pullup de la broche en entrée
écrivant la valeur HIGH sur la broche, bien qu'elle ait été
configurée en entrée. }// fin de la fonction setup()
Fonction loop()
• À l'aide d'une condition if() on teste si le bouton poussoir est bien // la fonction loop() s'exécute sans fin en boucle
appuyé en lisant son état avec la fonction digitalRead() void loop(){ // debut de la fonction loop()
• Si le bouton poussoir est bien appuyé, on inverse l'état de la LED par
un jeu de condition testant la variable d'état de la LED. if (digitalRead(BP)==APPUI) { // si appui sur le BP
//metlaLEDdansl'étatdelavariableetatLED
if (etatLED==1) { // si la variable vaut 1
digitalWrite(LED,HIGH); // la LED est allumée
}
else { // sinon, càd si la variable vaut 0
digitalWrite(LED,LOW); // la LED est éteinte
}
}// fin de la fonction loop() - le programme recommence au début de la fonction loop sans
fin
17. Utiliser 3 boutons poussoir : le montage
Une situation beaucoup plus utile en pratique : utiliser 3 boutons poussoir,
typiquement l'un +, l'autre – et le 3ème OK. Ceci permet de réaliser des
réglages de valeur notamment.
• À l'aide d'une condition if() on teste si chaque bouton poussoir est //-------Brochesenentréesnumériques-------
appuyé en lisant son état avec la fonction digitalRead() pinMode (bpMOINS,INPUT); // Broche BP MOINS configurée en entrée pinMode
(bpPLUS,INPUT); // Broche BP PLUS configurée en entrée pinMode (bpOK,INPUT); //
• Si le bouton poussoir PLUS est appuyé, on ajoute 1 à la variable Broche BP OK configurée en entrée
• Si le bouton poussoir MOINS est appuyé, on retranche 1 à la variable
• Si le bouton OK est appuyé, on affiche la variable sur le port Série //-------Activationsibesoindurappelau+
(pullup)desbrochesenentréesnumériques-------
digitalWrite (bpMOINS,HIGH); // Rappel au + activé sur la broche BP MOINS configurée
en entrée
Un des défauts de cette façon de faire est de devoir lire en permanence l 'état digitalWrite (bpPLUS,HIGH); // Rappel au + activé sur la broche BP PLUS
des boutons poussoir pour ne pas rater un appui : si on fait faire autre chose configurée en entrée
à Arduino, on risque de rater des appuis. Pour contourner ce problème, digitalWrite (bpOK,HIGH); // Rappel au + activé sur la broche BP OK
on utilisera une interruption (on verra çà plus tard...) configurée en entrée
if (digitalRead(bpPLUS)==APPUI) {
valeur=valeur+1;
if (valeur>maxi) valeur=maxi; // valeur maxi
[Link]("+1");
delay(250); // pause anti-rebond
if (digitalRead(bpMOINS)==APPUI) {
valeur=valeur-1;
if (valeur<mini) valeur=mini; // valeur mini
[Link]("-1");
delay(250); // pause anti-rebond
if (digitalRead(bpOK)==APPUI) {
[Link]("Valeur = ");
[Link](valeur); delay(250); // pause
anti-rebond
Entete déclarative const int bpDO=2; // Constante pour la broche 2 const int
bpRE=3; // Constante pour la broche 3 const int bpMI=4; //
On va déclarer à ce niveau : Constante pour la broche 3
• 3 constante désignant les 3 broches utilisées pour les bouton poussoir,
const int PIEZO=5; // constante pour la broche du piézo
appelée ici bpDO, bpRE, bpMI.
• 1 constante désignant la broche utilisée en sortie avec le buzzer
//---Déclarationdesvariablesglobales---
• 1 constante int appelée APPUI et initialisée à 0.
int DO=262; // variable de la fréquence note int RE=294;
• 3 constantes de notes // variable de la fréquence note int MI=330; // variable de
la fréquence note
Fonction setup()
• on configure la broches du bouton poussoir en sortie avec l'instruction
void setup() { // debut de la fonction setup()
pinMode (broche, OUTPUT)
• on configure les broches des boutons poussoir en entrée avec
l'instruction pinMode(broche, INPUT) //-------Initialisationfonctionnalitésutilisées-------
//-------Brochesenentréesnumériques-------
pinMode (bpDO,INPUT); // Broche BP MOINS configurée en entrée pinMode
(bpRE,INPUT); // Broche BP PLUS configurée en entrée pinMode (bpMI,INPUT);
// Broche BP OK configurée en entrée
//-------Activationsibesoindurappelau+
(pullup)desbrochesenentréesnumériques-------
digitalWrite (bpDO,HIGH); // Rappel au + activé sur la broche BP MOINS
configurée en entrée
digitalWrite (bpRE,HIGH); // Rappel au + activé sur la broche BP PLUS
configurée en entrée
digitalWrite (bpMI,HIGH); // Rappel au + activé sur la broche BP OK
configurée en entrée
}
else if (digitalRead(bpMI)==APPUI) { // sinon, si appui BP MI
tone(PIEZO,MI); // joue note MI
delay(50); // pause anti-rebond
}
else { // sinon
noTone(PIEZO); // sinon stoppe son
}
}// fin de la fonction loop() - le programme recommence au début de la fonction loop sans
fin
Entrées analogiques : faire des mesures et utiliser des capteurs analogiques, utiliser les
nombres à virgules avec la carte Arduino.
Ateliers Arduino
3. Rappel : Notion d'électronique numérique et analogique
L'électronique est une technique qui manipule les « électrons » sous forme de
tension ou d'intensité. On distingue 2 types d'électronique :
• L'électronique analogique qui utilise des variations continues de la
tension qui peut prendre toutes les valeurs intermédiaires (potentiomètre
= variation du minimum au maximum).
• L'électronique numérique qui utilise des variations « abruptes » de
la tension qui va prendre 2 niveaux (interrupteur = allumé ou éteint) :
l'un dit HAUT (5V), l'un dit BAS (0V).
Un microprocesseur, tel que celui de la carte Arduino, est un circuit numérique
qui va permettre de manipuler des niveaux HAUT/BAS.
Une broche numérique va être caractérisée par son état ou niveau de tension : elle
va pouvoir se trouver dans 2 états possibles seulement :
• soit au niveau HAUT (=5V), symbolisé par 1 ou HIGH
• soit au niveau BAS (=0V), symbolisé par 0 ou LOW
• noter qu'à un instant quelconque, la broche se trouve obligatoirement
dans l'un de ces 2 états.
Remarquer également que la plupart des broches numériques ont des fonctions
particulières potentielles qui seront présentées au fur et à mesure de leur
utilisation. A titre indicatif, les fonctions disponibles sont la génération d'impulsion, la
communication SPI, la communication I2C, les interruptions externes...
D'un point de vue électrique, retenir que :
• chaque broche numérique E/S peut supporter 40 mA d'instensité en
sortie ou en entrée
• L'ensemble des broches numériques E/S ne doit pas dépasser 200mA en
entrée ou en sortie !
Usage avancé : pour des projets nécessitant de nombreuses broches E/S (= mal conçu?),
la carte Arduino Mega dispose de plus d'une 50aine de broches E/S !
9. Pour info : les caractéristiques de la « règle à tension » numérique de l'Arduino
Voici quelques informations concernant la « règle à tension » numérique de la Correspondance entre la graduation et la tension mesurée
carte Arduino :
La « règle à tension » de l'Arduino, dispose de 1024 graduations numérotées
6 broches de mesure ! de 0 à 1023 :
• disponible sur 6 broches dites analogiques : on peut donc utiliser 6 • la graduation 0 correspond au 0V ou 0mV
capteurs en même temps... (et même plus si on utilise un/des • la graduation 1023 correspond au 5V ou 5000mV
« multiplexeur analogique » tel que le CI 4051)
• la graduation 204 correspond au 204x5000/1023 = 997mV soit 1V
Plusieurs centaines de mesures par seconde !
• la graduation nnn correspond à nnn x 5000 / 1023 mV
• une mesure se fait en 100µs environ ce qui permet de réaliser sans
aucune difficulté plusieurs centaines voir milliers de mesure par
seconde (on peut transformer sa carte Arduino en un petit
oscilloscope USB !)
Pleine échelle de mesure de 0 à 5V
• la mesure est réalisée par défaut pour une tension comprise entre 0V
et 5V. La broche ARef permet au besoin d'utiliser une autre tension de référence (2,5V
par exemple), mais en pratique, c'est très peu utilisé.
Le type long
L'autre type que vous connaissez est le type long : le type long permet de
stocker une valeur entière comprise entre -2 147 483 648 et +2 147 483
647 : le long est un quadruple octet (32 cases unitaires !) Par exemple :
float maVariable=0.0;
Le type float et les fonctions print() ou println()
Les fonctions print() et println() permettent de fixer le nombre de décimales
affichées :
[Link](1.23456, 0); // affiche "1"
[Link](1.23456, 2); // affiche "1.23"
usage avancé : on fera précéder le type int ou long du mot clé unsigned si on
[Link](1.23456, 4); // affiche "1.2346"
souhaite n'utiliser que des valeurs positives. Ceci a pour effet de doubler la
valeur positive utilisable (de 0 à 65535 pour un int par exemple).
14. Affichage d'une mesure analogique convertie en millivolts dans le Terminal Serie
A présent, on va calculer la valeur en millivolts correspondant à la valeur
brute // --- constantes des broches ---
const int RVar=0; //declaration constante de broche analogique
(entre 0 et 1023) correspondant à la tension entre 0 et 5V présente sur une
broche analogique. // --- Déclaration des variables globales ---
int mesureBrute=0;// Variable pour acquisition résultat brut de conversion analogique
Entete déclarative numérique
On va déclarer à ce niveau : float mesure; // variable à virgule pour calcul valeur en millivolts
• une constante de broche pour la voie analogique : ATTENTION, il //**************** FONCTION SETUP = Code d'initialisation *****
faut utiliser le numéro de la broche analogique (entre 0 et 5) void setup() { // debut de la fonction setup()
et pas le numéro de la broche numérique (entre 14 et 19..)
[Link](115200); // initialise connexion série à 115200 bauds
• on déclare une variable globale de type int pour stocker le résultat de // IMPORTANT : régler le terminal côté PC avec la même valeur de transmi ssion
la mesure.
• on déclare une variable de type float pour stocker la valeur à virgule } // fin de la fonction setup()
en millivolts.
//***** FONCTION LOOP = Boucle sans fin *****
Fonction setup() void loop(){ // debut de la fonction loop()
• on initialise la communication série avec l'instruction // acquisition conversion analogique-numerique (CAN) sur la voie analogi que
[Link](vitesse). On utilisera 115200 bauds. mesureBrute=analogRead(RVar);
Schéma fonctionnel
Truc : on peut utiliser un connecteur 3 broches sur fils pour le montage !
18. Réaliser un simple thermomètre numérique avec affichage dans le Terminal Série : le montage
Principe d'utilisation du capteur LM 35
Le principe général d'utilisation d'un capteur analogique est le même que celui
que nous avons vu pour la résistance variable utilisée avec une carte
Arduino : connexion des broches d'alimentation au 0V et au 5V et de la
broche variable sur une entrée analogique.
• une constante de broche pour la voie analogique : ATTENTION, il // debut de la fonction setup() [Link](115200); // initialise connexion série à 115200
faut utiliser le numéro de la broche analogique (entre 0 et 5)
bauds
et pas le numéro de la broche numérique (entre 14 et 19..) // IMPORTANT : régler le terminal côté PC avec la même valeur de transmissio
n
• on déclare une variable globale de type int pour stocker le résultat de
la mesure.
} // fin de la fonction setup()
• on déclare une variable de type float pour stocker la valeur à virgule
en millivolts puis en degrés. //***** FONCTION LOOP = Boucle sans fin *****
Fonction setup()
void loop(){ // debut de la fonction loop()
• on initialise la communication série avec l'instruction
[Link](vitesse). On utilisera 115200 bauds. // acquisition conversion analogique-numerique (CAN) sur la voie analogique
mesureBrute=analogRead(RVar);
Fonction loop()
// calcule de la valeur a virgule en millivolts
• on réalise une mesure à l'aide de la fonction // = convertit la valeur brute 0 - 1023 en valeur 0 - 5000 mV
analogRead(brocheAnalogique) et on stocke dans une variable.
mesure=map(mesureBrute,0,1023,0.0,5000.0);
• on convertit la valeur brute en la valeur de la tension correspondante à
l'aide de l'instruction map() qui réalise une règle de 3. //---- calcul équivalent ----
//mesure=mesureBrute;
• on convertit la valeur en degrés par une simple division par 10 //mesure=mesure*5000.0;
(tension de sortie = 0 +/- 10mv/°C). // mesure=mesure/1023.0;
• ensuite, on affiche le résultat dans le Terminal Série à l'aide de la // affiche valeur numerique entière puis à virgule au format décimal
fonction [Link]() [Link]("Mesure brute =");
[Link](mesureBrute); [Link](" soit
• On réalise ensuite une pause d'une demi-seconde entre 2 mesures ");
avec l'instruction delay(500). [Link](mesure,2); // affichage avec 2 virgules
[Link](" millivolts.");
[Link](" soit ");
Fonctionnement du programme [Link](mesure/10,1); // affichage avec 2 virgules
• Ouvrir le Terminal Série (Tools > Serial Monitor) et fixer le débit à la [Link](" degres Celcius");
même valeur que celle utilisée pour delay(500);
l'[Link](vitesse). Ici, 115200 bauds.
} // fin de la fonction loop() - le programme recommence au début de la fonction loop sans
fin
20. Exemple d'affichage de résultat sous forme graphique : un mini-oscillo USB de base !
Présentation de Processing Exemple
Processing est un interface graphique programmable, libre et gratuite, écrite Vous trouverez plusieurs pages proposant les codes Arduino et Processing
en Java (et donc multi-OS) qui permet de facilement réaliser des interfaces pour réaliser facilement un petit oscilloscope USB à l'aide d'une carte Arduino.
graphiques simples , de manipuler des images, de réaliser des graphiques de Voir :
façon interactive à l'aide d'un langage simplifié, comme le langage Arduino.
•
En effet, l'interface Processing est capable d'interagir facilement avec le
clavier, la souris, mais aussi la communication série USB, le réseau, etc... •
Pour installer et télécharger Processing : [Link]
Vous êtes déjà familiarisé avec Processing sans le savoir : le
logiciel Arduino est basé sur une interface Processing !
23.
24. Un détecteur d'obscurité simple : le programme.
On reprend la même base programme que ce que l'on a utilisé précédemment
et on va utiliser un seuil pour la détection de l'obscurité. // --- constantes des broches ---
Ateliers Arduino
2. Vue d'ensemble des différents types de moteurs
Introduction Servomoteurs
Un des intérêt majeur d'une carte Arduino est de pouvoir réaliser le contrôle
de motorisations variées selon ses besoins, en interaction avec des capteurs,
des boutons poussoirs, etc... On pourra de la sorte construire assez
simplement un robot motorisé et interactif intelligent !
Vue d'ensemble des différents types de moteurs
Il existe 3 grandes familles de motorisation utilisables avec Arduino, chacune
ayant ses avantages et ses inconvénients comme nous allons le voir :
• les servo-moteurs qui se subdivisent en :
◦ servomoteurs standards (maintien de position entre 0° et 180°)
standard à rotation continue
◦ servomoteurs à rotation continue (rotation continue )
Moteurs et moto-réducteurs à courant continu
• les moteurs à courant continu (dits CC) avec :
◦ les moteurs CC simple (rotation rapide)
◦ les moto-réducteurs (rotation plus lente avec engrenage de force)
• les moteurs dits « pas-à-pas » (rotation à vitesse lente ou moyenne
de précision – la trotteuse ) avec 2 technologies :
◦ les moteurs pas à pas unipolaires
◦ les moteurs pas à pas bipolaires moteur CC avec engrenages moto-réducteur
A quel coût ? Moteurs « pas à pas »
Pour la plupart de ces moteurs, on en trouve neufs à partir de moins de 10€
pièce pour des modèles standards... et chaque gamme propose une grande
variété avec des caractéristiques variées.
Mais le véritable « coût » d'un moteur n'est pas, à mon avis, le prix
du moteur individuel mais le prix de l'ensemble du matériel
« interface + moteur » nécessaire pour l'utiliser. En effet, dans la
plupart des cas, il faudra un circuit électronique d'interface entre le moteur et
la carte Arduino A titre indicatif, une interface moteur polyvalente coûtera
dans les 15-20€.
La bonne nouvelle : il existe un modèle de moteur utilisable en rotation
moteur pas à pas
continue dans les 2 sens et à vitesse variable sans interface à... 12€ pièce !
Suivez le guide !
3. Panorama global des caractéristiques des moteurs utilisables avec Arduino
Servomoteurs Moteurs Courant Continu Moteurs pas à pas
Standard Rotation continue Moteur CC Moto-réducteur Bipolaire Unipolaire
Description Boitier plastique avec Boitier plastique avec Moteur avec axe + 2 fils Moteur avec engrenages + Moteur avec axe + 4 fils Moteur avec axe + 4 fils
pignon + 3 fils pignon + 3 fils 2 fils
Type de mouvement Position angulaire 0-180° Rotation continue vitesse Rotation continue vitesse Rotation continue vitesse > Positionnement angulaire par « crans »
maxi moyenne maxi rapide maxi moyenne
> ou Rotation continue vitesse maxi moyenne
Brochage 3 broches : PWM servo (numérique) / V+ / 0V 2 broches : V+ et 0V, polarité indifférente, fixe le sens 4 broches : 2 par phase x 2 5 broches : 1 commune et
phases 1 par phase x 4 phases
Principe contrôle Largeur impulsion entre Largeur impulsion entre > La polarité fixe le sens de rotation Séquence de polarité V+ successive sur les 4 broches
1ms et 2ms fixe la position 1ms et 2ms fixe sens ET
> impulsion PWM fixe la vitesse
vitesse
Caract. Mécaniques 180° ou 360° 2000 tr/min ou + 200 tr/min voire moins 100 tr/min – Force faible en rotation lente
Force en rotation lente Force en rotation lente
Caract. électriques Tension = 5V voire 6V Tension entre 7 et 12V Tension entre 7 et 12V
I alim = 100mA ou + I alim de 200mA à 2000mA ou + I alim de 200mA à 2000mA ou + par phase
I contrôle = 5mA
Maintien position hors Blocage correct de la position courante en « roue libre » Blocage de la position en « roue libre »
tension courante
Codage Simple avec librairie Arduino Servo (1 broche par servo) Simple via interface soit avec 2 broches PWM, soit 1 Simple avec la librairie Arduino Stepper en mode 2 ou 4
broche sens et 1 PWM vitesse broches
Interface AUCUNE. Circuit de connexion vite utile. Jusqu'à 20 OBLIGATOIRE : 1 « pont en H » par moteur . Réalise OBLIGATOIRE : 2 « ponts en H » par moteur . Réalise
servos avec 1 carte Arduino ! adaptation tension, intensité + contrôle sens, vitesse adaptation tension, intensité
Alim ext 5-6V si + de 3 servomoteurs
Alimentation 5V carte Arduino ou 5V reg ext voire 6V ext Vin / 2A ou+ Alim externe obligatoire 1 à 4A voire + Alim externe obligatoire 1 à 4A voire +
Prix unitaire dès < 10€ dès < 12€ récup – neuf dès 5€ récup – neuf dès < 10€ récup - neuf dès 15€ récup – neuf dès 15€
Coût global unitaire dès <10€ / servo dès < 12€ /servo 5€/mot + interf 7,5€/mot = 10€/mot + interf 7,5€/mot 15€/mot + interf 12,5€/mot 15€/mot + interf 1€/mot
+/- alim si + de 3 +/- alim si + de 3 12,50€/mot (pas réducteur) = 17,50€/mot (25€ mini) = 27,5€/moteur (36€ min) = 16€/mot min
+ alim ext 1 à 4A + alim ext 1 à 4 A + alim ext 1 à 4A + alim ext 1 à 4A
Utilisation type Tourelles, bras, hexapode Robot initiation low cost Hélice Robot mobile 1Kg Découpe numérique, CNC, Robot mobile
Avantages 1 broche, pas interface 1 broche sens ET vitesse Force et blocage ! Silencieux, précis Silencieux, précis
Inconvénients +/- Vibration Peu courant ? Bruit, intensité intensité, bruit réduit Force faible et pas blocage Force faible et pas blocage
4. Servomoteurs : les servomoteurs standards : concrètement
Servomoteur vu de l'intérieur (en pratique, on n'a pas besoin de le démonter... juste pour comprendre) :
5. Servomoteurs : les servomoteurs standards : exemples d'utilisation
Voici quelques exemples d'utilisation de servomoteurs contrôlés avec Arduino et basés sur une mécanique de chez [Link]
Une carte Arduino associée à une simple alimentation adaptée peut permettre de contrôler jusqu'à 20 servomoteurs à la fois !
6. Servomoteurs : les servomoteurs à rotation continue : concrètement
Les servomoteurs à rotation continue « prêts à l'emploi » sont plutôt rares bien que très pratiques : une référence utile, le S04NF de DGServo.
L'utilisation type des servomoteurs à rotation continue = réalisation d'un robot mobile d'initiation.
On dispose ainsi d'une base ultra-simple et low-cost permettant de contrôler la marche avant / arrière et tourne droite / gauche.
8. Les moteurs et moto-réducteurs à courant continu ou CC : concrètement
Les moteurs CC seuls : pas chers (dès 3-4€), tailles variées, mais peu utilisables « tel que » sauf pour les rotation rapides simples (plusieurs milliers tr/min - hélices)
Les moto-réducteurs (moteurs + engrenages) sont beaucoup plus utiles : vitesse de rotation réduite (centaines tr/min) et force de rotation importante.
Une difficulté souvent rencontrée lors la mise en oeuvre d'un moteur : réaliser une fixation simple...
La gamme de moteur MFA, distribuée notamment par GoTronic, propose plusieurs modèles de moteurs et moto-réducteurs CC avec support intégré.
9. Les moteurs et moto-réducteurs CC : exemples d'utilisation
L'utilisation « type » des moteurs CC est la motorisation d'un robot mobile roulant
10. Les moteurs pas à pas : concrètement
Les 2 types de moteurs pas à pas : unipolaires (5 fils de commande) et bipolaire (4 fils de commande)
11. Les moteurs pas à pas : exemples d'utilisation
Imprimante 3D
voir le projet open source RepRap : [Link]
13. Rappel : Caractéristiques électriques d'une broche Numérique Arduino en sortie
Une broche numérique Arduino individuelle en sortie peut-être considérée
comme une « mini »-alimentation :
• fournissant une tension de 5V régulé au niveau HAUT et 0V au niveau
BAS.
• pouvant fournir au maximum 40mA pour une seule broche en sortie.
Voici quelques exemples, pour se faire une idée de ce que l'on peut connecter
directement sur une broche numérique d'une carte Arduino en sortie :
• une broche d'un autre CI numérique consommera dans les 1 mA, =>
connexion directe POSSIBLE !
• une LED en série avec sa résistance consommera dans les 10-20mA selon
la résistance utilisée, => connexion directe POSSIBLE !
• la broche de commande d'un servomoteur consommera dans les 5mA, =>
connexion directe POSSIBLE !
• un moteur CC consommera dans les 250mA => connexion directe
IMPOSSIBLE ! (Dans ce cas, on devra utiliser une interface de
puissance comme nous le verrons)
En pratique : TOUJOURS se demander « quelle intensité va être
utilisée ? »
14. Technique : l'alimentation de la carte Arduino
Lorsque l'on utilise un moteur, il est essentiel d'avoir toujours à l'esprit les notions d'intensité et de tension de la carte Arduino. Comme on l'a déjà vu, la carte
Arduino intègre une alimentation interne régulée de 5V rég / 500mA :
• soit en provenance du port USB
• soit à partir de l'alimentation Vin 7-12V / 500mA (ou +)
Il est essentiel de distinguer :
• l'intensité maximale (200mA) que peut fournir le « coeur » de la carte Arduino et limité à 40mA par broche en sortie mais 200mA maximum
pour l'ensemble des broches réunies. Une LED en série avec une résistance utilisera par exemple 15mA fournis par le « coeur » Arduino.
• l'intensité maximale (500mA) que peut fournir l'alimentation +5V régulé/500mA. Cette alimentation de +5V/500mA de la carte Arduino
peut également être mise en parallèle avec une alimentation externe +5V régulée au besoin.
• On dispose donc de 300mA supplémentaires maxi pour alimenter des dispositifs 5V directement à partir de l'alimentation de la carte
Arduino (mais pas à partir des broches !!)
15. Servomoteurs : les servomoteurs standards : schéma électrique type d'utilisation avec Arduino
On connecte :
• le + (fil rouge) et le – (fil noir) respectivement au +5V et au 0V de la carte Arduino
• le fil de commande (fil blanc) à une broche numérique en sortie de la carte Arduino.
16. Les moteurs et moto-réducteurs CC : schéma électrique type d'utilisation avec Arduino
Pour utiliser un moteur ou un moto-réducteur CC avec une carte Arduino, l'utilisation d'une carte d'interface est OBLIGATOIRE !
Bien noter le triple rôle de l'interface : adaptation en tension et en intensité ainsi que le contrôle du sens.
17. Les moteurs pas à pas bipolaires : schéma électrique type d'utilisation avec Arduino
On connecte :
• la phase 1 sur la sortie du 1er « pont en H »
• la phase 2 sur la sortie du 2ème « pont en H »
18. Présentation des circuits d'interface pour moteurs CC ou pas à pas
Les interfaces de moteurs Les cartes et shields d'interface pour moteurs CC
• Encore une fois, vous devez vous dire qu'un circuit comme çà, çà doit • En pratique, il est plus simple d'utiliser des petites cartes
coûter un max... Et bien pas tant que çà... Il existe des circuits intégrés électroniques toutes prêtes qui vont intégrer tous les composants
double « Pont en H » pour quelques euros : notamment le L293D ou externes nécessaires ainsi que les borniers à vis.
encore le L298. On peut utiliser avec Arduino :
•
• Ces circuits seuls ne sont pas très faciles à utiliser seuls (ils nécessitent ◦ des shields, enfichables broche à broche sur la carte Arduino
des composants externes) et ils sont donc intégrés dans des cartes
d'extension (ou shields) utilisables avec Arduino pour un coût de ◦ des cartes électroniques autonomes
l'ordre de 15-20€. Exemples de cartes d'interfaces à base de L293 x1
Deux exemples de CI double « pont en H » • Ces cartes permettent de contrôler 2 moteurs CC ou 1 moteur pas à
• La plupart des interfaces de contrôle de moteurs utilisées avec pas bipolaire.
Arduino sont basées autour de 2 circuits double « Pont en H » très
utilisés.
• Le L293 est un CI double « pont en H » de puissance modérée :
◦ en boitier DIL, de l'ordre de 3€
◦ permettant de contrôler 2 moteurs CC ou 1 moteur pas à pas
Exemples de cartes d'interface à base de L298 x1
bipolaire (on verra çà plus tard)
• Ces cartes permettent de contrôler 2 moteurs CC ou 1 moteur pas à
◦ capable de fournir 600mA par moteur (1,2A en pic) pas bipolaire.
◦ sous une tension de 5 à 36V
• Le L293 est un CI double « pont en H » de puissance élevée :
◦ en boitier MultiWatt ou SOC, de l'ordre de 6€
◦ permettant de contrôler 2 moteurs CC ou 1 moteur pas à pas
bipolaire Exemples de cartes d'interfaces à base de L293 x2
◦ capable de fournir 2000mA par moteur (3A en pic) • Ces cartes permettent de contrôler 4 moteurs CC ou 1 moteur pas à
pas bipolaire.
◦ sous une tension de 7 à 46V
• Il en existe pleins d'autres qui fonctionnent sur le même principe, Principe d'utilisation avec Arduino
mais ce sont les 2 plus importants à connaître en pratique. • Selon les modèles, ces interfaces disposeront : soit d'une broche de
direction + une broche de vitesse (PWM) par moteur, soit de deux
broches contrôlant chacune un sens et la vitesse (PWM) dans ce sens
par moteur
Apprendre à recevoir des chaînes de caractères en provenance du Terminal Série avec la
carte Arduino, à utiliser les chaînes de caractères avec l'objet String, à utiliser la boucle
conditionnelle while.
Ateliers Arduino
3. Rappel : Principe de communication de l'Arduino vers le PC
Comme vous le savez déjà, la carte Arduino est (re-)programmable à volonté via le Programmation par le port USB
port série USB du PC : c'est ce qui fait toute la simplicité de son utilisation.
Tout comme une fonction, une classe aura un nom : pour distinguer une classe
d'une fonction, le nom d'une classe commencera par une MAJUSCULE.
En pratique, lorsquel'onprogrammeenlangageArduino,onn'apasbesoinde
créerdeclasses (ouf !). Mais le langage Arduino ou ses librairies comporte
plusieurs classes et il faut donc comprendre ce concept :
• Ainsi, toutes les fonctions qui gèrent la communication avec le port série
USB sont rassemblées dans une classe appelée Serial : nous allons
utiliser cette classe ici.
• la classe LiquidCrystal pour la gestion d'un afficheur LCD
• la classe Servo pour la gestion d'un servomoteur
• etc...
En pratique, pour utiliser une fonction d'une classe du langage
Arduino, on utilisera le nom de la classe + un point + le nom de la
fonction.
Remarque technique : les instructions de base du langage Arduino, même si elles ne sont
pas précédées par un nom de classe, appartiennent toutes à une même classe (implicite) :
celle du coeur (ou core) du langage Arduino.
5. Rappel : la classe Serial
Ainsi, comme on vient de le dire :
On appelle « classe » un regroupement de fonctions.
La première classe du langage Arduino que nous avons déjà rencontré est celle qui
rassemble toutes les fonctions utilisées pour la communication série USB : cette
classe s'appelle Serial !
Les fonctions en « émission » (rappel) :
Les fonctions de la classe Serial sont au nombre d'une dizaine. Nous avion déjà
présenté les 3 fonctions qui permettent d'écrire un programme pour afficher des
messages vers le PC :
• begin() : fonction d'initialisation de la communication USB
• print() : fonction d'affichage d'un message sans saut de ligne
• println() : fonction d'affichage d'un message avec saut de ligne
Ces fonctions appartiennent à la classe Serial et nous les utiliserons donc sous la
forme : [Link]() ou [Link]() ou [Link]()
A présent, nous avons tous les éléments pour recevoir des messages en provenance
du PC depuis notre carte Arduino !
6. La fonction [Link]()
Description
Donne le nombre d'octets (caractères) disponibles pour lecture dans la file
d'attente (buffer) du port série. (available veut dire disponible en anglais)
Syntaxe
[Link]();
Paramètres
Aucun (laisser les parenthèses vides)
Valeur renvoyée
Renvoie nombre d'octet disponible pour lecture dans la file d'attente (buffer) du
port série, ou 0 si aucun caractère n'est disponible. Si une donnée est arrivée,
[Link]() sera supérieur à 0. La file d'attente du buffer peut recevoir
jusqu'à 128 octets.
Type : int
Exemple
if ([Link]() > 0) { // si des données entrantes sont présentes
// lit le 1er octet arrivé
incomingByte = [Link]();
// ici instructions à exécuter
}
7. La fonction [Link]()
Description
Lit les données entrantes sur le port Série.
Syntaxe
[Link]() ;
Paramètres
Aucun
Valeur renvoyée
Renvoi le premier octet de donnée entrant disponible dans le buffer du port série,
ou -1 si aucune donnée n'est disponible.
Type : int
Exemple
if ([Link]() > 0) { // si des données entrantes sont présentes
// lit le 1er octet arrivé
incomingByte = [Link]();
// ici instructions à exécuter
}
8. Rappel : « Hello world ! » : programme Arduino envoyant un message vers le PC via le port USB
Le principe d'utilisation de la communication USB dans un programme Arduino
consiste à :
• initialiser le débit (ou vitesse) de communication une fois pour toute au void setup() {
début du programme (dans la fonction setup() )
[Link](115200); // initialise la communication série
• utiliser les fonctions [Link]() lorsqu'on en a besoin :
◦ soit dans setup() pour afficher des messages une seule fois au début }
du programme,
◦soit dans loop() pour afficher des messages à intervalles réguliers ou void loop() {
en boucle.
Notre premier programme Série va : [Link]("Hello World !"); // affiche le message
• initialiser la communication à 115200 bauds avec [Link]()
delay(1000); // pause de 1 seconde
• afficher un message toutes les secondes
◦ affiche une chaîne : [Link](« mon message »); }
◦ pause d'une seconde : delay(1000); (ne pas oublier ! sinon
saturation du port USB... )
Attention : Une chaine de caractères s'écrit entre « »
Le type char
Le langage Arduino dispose d'un type particulier qui va nous servir par la suite
: le type char
Techniquement, une variable de type char va contenir également une valeur Deux syntaxes sont possibles
entière mais comprise entre -128 et + 127 : un char est donc un octet (8 cases char maVariable=65; // à partir du caractère ASCII – ici lettre A
unitaires). char maVariable='A'; // à partir du caractère lui-même entre ' '
Les types int, char et les fonctions print() ou println()
Soit le char myChar=65 et le int myInt=65 :
[Link](myChar); // affiche la lettre A (code ASCII = 65)
[Link](myInt); // affiche le nombre 65 (valeur numérique)
Convertir un int en char : la fonction char()
[Link](char(myInt)); // affiche la lettre A (code ASCII = 65)
11. Pour info : Le code ASCII (American Standard Code for Information Interchange)
Le code ASCII
Historiquement, pour représenter les caractères sur un système informatique,
on a utilisé un codage simplifié où à 1 nombre correspondait un caractère.
L'intérêt de cette façon de faire, c'est de permettre de coder les caractères sur 1
seul octet (au lieu de coder tous les pixels du caractère...) .
Un truc très utile : pour les caractères 0 à 9, on obtient la valeur numérique correspondante en faisant (code ASCII – 48 )
12. Recevoir un caractère sur le port Série et l'afficher dans le Terminal : le programme
A présent, on va donc écrire notre premier programme qui va recevoir un
//--- entete déclarative = variables et constantes globales int octetReception=0; //
caractère sur le port Série. Prêt ? C'est parti !
Entete déclarative variable de réception octet
char caractereReception=0; // variable de réception caractère
On va déclarer à ce niveau :
//--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
• on déclare une variable int pour stocker l'octet en réception (code
ASCII du caractère). [Link](115200); // initialise la vitesse de la connexion série
//-- utilise la meme vitesse dans le Terminal Série
• on déclare une variable char pour stocker le caractère correspondant.
Fonction setup() } // fin de la fonction setup()
• Si un octet est reçu, on affiche successivement : [Link]("Arduino a recu valeur :"); [Link](octetReception); // affiche la
valeur de l'octet [Link](" (code ASCII) correspondant au caractere ");
◦ sa valeur numérique (c'est à dire le code ASCII du caractère reçu) [Link](caractereReception); // affiche le caractere
◦ puis le caractère correspondant
} // fin if
Fonctionnement du programme
} // fin de la fonction loop()
• Ouvrir le Terminal Série (Tools > Serial Monitor) et fixer le débit à la
même valeur que celle utilisée pour l'instruction
[Link](vitesse). Ici, 115200 bauds.
• Régler également les paramètres de transmission de la chaine de
caractère à l'aide de la 2ème liste défilante. Mettre sur « No Line
Ending » pour aucun ajout après la chaine saisie.
13. Réglage et Utilisation du Terminal Série en « émission » vers Arduino
Lancement et réglage du Terminal Série en Réception
• Ouvrir le Terminal Série (Tools > Serial Monitor) et fixer le débit à la
même valeur que celle utilisée pour l'instruction
[Link](vitesse). Ici, 115200 bauds.
• Régler également les paramètres de transmission de la chaine de
caractère à l'aide de la 2ème liste défilante :
◦ sur « No Line Ending » afin qu'aucun caractère de fin de ligne ne
soit émis après la chaine de caractères,
◦ sur « New Line » si on souhaite qu'un saut de ligne soit émis après
la chaine de caractères (envoi le caractère ascii=10 après la
chaîne)
◦ sur « Carriage Return » si on souhaite qu'un retour de chariot soit
émis après la chaine de caractères (envoi le caractère ascii=13
après la chaîne)
◦ sur « Both NL & CR » pour les 2 simultanément.
Envoi d'une chaine sur le port Série
• Ensuite se positionner dans le champ de saisie et saisir 1 ou plusieurs
caractères dans le champ
• Clic sur envoi : la chaîne est émise sur le port Série +/- suivie des
options de fin de ligne.
Pas de panique !
Vous n'avez par besoin de retenir toutes les fonctions de la classe String par coeur : nous les utiliserons au fur et à mesure des besoins !
Retenez simplement que c'est un outil très puissant pour manipuler des chaînes de caractères !
16. Programme : Stocker dans une chaine les caractères reçus sur le port Série et l'afficher dans le Terminal
A ce stade, on va pouvoir stocker tous les caractères reçus sur le port série
dans une chaîne de caractères de taille variable : un objet String. //--- entete déclarative = variables et constantes globales
• on déclare une variable char pour stocker le caractère correspondant. [Link](115200); // initialise la vitesse de la connexion série
//-- utilise la meme vitesse dans le Terminal Série
• on déclare un objet String vide pour stocker la chaine de caractère
Fonction setup() } // fin de la fonction setup()
• ! (NON logique) : VRAI si l'opérande est FAUX – cas particulier : !x est VRAI chaque fois que x=0 (« tordu » mais pratique !)
19. Pour info : une variante : la boucle conditionnelle do... while
Juste pour votre information, car en pratique çà ne sert pas souvent, il existe
une variante de la boucle while() : la boucle do.. while() (« faire... tant que..
»).
Description
La boucle do / while ("faire tant que" en anglais) fonctionne de la même
façon que la boucle while, à la différence près que la condition est testée à
la fin de la boucle, et par conséquent la boucle do sera toujours
exécutée au moins une fois.
C'est subtil, mais çà peut parfois servir...
Syntaxe
Exemple
20. Programme : Recevoir une chaîne de caractères sur le port Série et l'afficher dans le Terminal
Si vous êtes attentif, vous avez du remarquer que le programme précédent
recevait les caractères 1 à la fois, à chaque passage dans loop(). Il serait plus //--- entete déclarative = variables et constantes globales
pratique de pouvoir recevoir une chaîne de caractère d'un seul coup, « tant
que des caractères sont disponibles »... et on va donc utiliser pour cela une int octetReception=0; // variable de réception octet
char caractereReception=0; // variable de réception caractère
boucle while ! (ben oui, je vous apprends des trucs qui vont servir ! ) String chaineReception=""; // déclare un objet String vide
Entete déclarative
//--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
On va déclarer à ce niveau :
[Link](115200); // initialise la vitesse de la connexion série
• on déclare une variable int pour stocker l'octet en réception (code //-- utilise la meme vitesse dans le Terminal Série
ASCII du caractère).
} // fin de la fonction setup()
• on déclare une variable char pour stocker le caractère correspondant.
• on déclare un objet String vide pour stocker la chaine de caractère
//--- la fonction loop() : exécutée en boucle sans fin void loop() {
Fonction setup()
while ([Link]()>0) { // si un caractère en réception
• on initialise la communication série avec l'instruction
[Link](vitesse). On utilisera 115200 bauds. octetReception=[Link](); // lit le 1er octet de la file
Fonction loop() d'attente
• A ce niveau, on va « écouter » le port Série en testant l'arrivée d'un caractereReception=char(octetReception); // récupere le caractere à partir du code Ascii
caractère à l'aide cette fois d'une boucle while pour tester la présence
chaineReception=chaineReception+caractereReception; // ajoute la caractère au String
d'un octet dans la file d'attente du port série avec la fonction
[Link]() delay(1); // laisse le temps au caractères d'arriver
• Tant qu'un octet est présent : on récupère le caractère correspondant à } // fin while - fin de réception de la chaine
l'aide de la fonction de conversion char(), puis on ajoute la caractère à
l'objet String. On réalise une petite pause entre 2 réceptions. //----- une fois la chaine reçue
if (chaineReception!="") { // la chaine n'est pas vide [Link]("Chaine
• Une fois toute la chaîne reçue,on l'affiche. recue : "); [Link](chaineReception);
Fonctionnement du programme chaineReception=""; // Vide la chaine
} // fin if
• Ouvrir le Terminal Série (Tools > Serial Monitor) et fixer le débit à la
même valeur que celle utilisée pour l'instruction
} // fin de la fonction loop()
[Link](vitesse). Ici, 115200 bauds.
• Régler également les paramètres de transmission de la chaine de
caractère à l'aide de la 2ème liste défilante. Mettre sur « No Line
Ending » pour aucun ajout après la chaine saisie.
21. Langage : l'instruction break
L'instruction break permet de sortir d'une boucle même si son déroulement
n'est pas terminé !
Description L'instruction break n'est pas utilisable avec une condition if else !
• L'instruction break est utilisée pour sortir d'une boucle do, for ou
while, en passant outre le déroulement normal de la boucle.
• Pour info, cette instruction est également utilisée pour sortir d'une
instruction switch (mais on n'a pas encore vu çà) .
Syntaxe
• Attention : l'instruction break ne nécessite pas de
parenthèses vides (c'est une exception... ah là là... « pourquoi y
z'aurait pas pu faire simple.... ! »...
• Mettre par contre, le point virgule comme d'hab' !
break;
Exemple
22. Programme : Recevoir une chaîne de caractères suivie d'un saut de ligne sur le port Série et l'afficher
Améliorons encore un peu les choses... Lorsque l'on va envoyer des chaînes de
caractères vers Arduino, c'est pour lui donner des instructions... Imaginons //--- entete déclarative = variables et constantes globales
que l'on en envoie plusieurs à la suite : le port série contiendra
« fairececifairecelapuiscecipuiscela »... Il faudrait que chaque instruction soit int octetReception=0; // variable de réception octet
bien séparée des autres : le truc va consister à intercaler un « saut de ligne » char caractereReception=0; // variable de réception caractère
String chaineReception=""; // déclare un objet String vide
(caractère ascii =10) entre chaque chaine donnant : « fairececi » puis
« fairecela » puis « puisceci » puis « puiscela »... allez action ! //--- la fonction setup() : exécutée au début et 1 seule fois void setup() {
Entete déclarative
[Link](115200); // initialise la vitesse de la connexion série
• on déclare une variable int pour stocker l'octet en réception (code //-- utilise la meme vitesse dans le Terminal Série
ASCII du caractère), une variable char pour stocker le caractère
} // fin de la fonction setup()
correspondant, un objet String vide pour stocker la chaine de
caractère
void loop() { //--- la fonction loop() : exécutée en boucle sans fin
Fonction setup()
• on initialise la communication série avec l'instruction while ([Link]()>0) { // si un caractère en réception
[Link](vitesse). On utilisera 115200 bauds.
octetReception=[Link](); // lit le 1er octet de la file d'attente
Fonction loop()
if (octetReception==10) { // si Octet reçu est le saut de ligne
• A ce niveau, on va « écouter » le port Série en testant l'arrivée d'un [Link] ("Saut de ligne recu : ");
caractère à l'aide d'une boucle while pour tester la présence d'un octet [Link] ("Chaine recue = "+chaineReception); // affiche la chaine recue
dans la file d'attente du port série avec la fonction [Link]() chaineReception=""; //RAZ le String de réception delay(100); //
pause
• Tant qu'un octet différent du saut de ligne est présent on ajoute la break; // sort de la boucle while
caractère à l'objet String. On réalise une petite pause entre 2 } // fin if
réceptions. else { // si le caractère reçu n'est pas un saut de ligne
• Si c'est un saut de ligne que l'on reçoit, on sort de la boucle while. caractereReception=char(octetReception); // récupere le caractere
à partir du code Ascii chaineReception=chaineReception+caractereReception; // ajoute la
• Une fois toute la chaîne reçue,on l'affiche. caractère au String
delay(1); // laisse le temps au caractères d'arriver
Fonctionnement du programme } // fin else
• Ouvrir le Terminal Série (Tools > Serial Monitor) et fixer le débit à la même valeur que
celle utilisée pour l'instruction [Link](vitesse). Ici, 115200 bauds. } // fin while - fin de réception de la chaine
De cette façon, les chaînes peuvent arriver rapidement ou lentement sur le port Série,
tant que le saut de ligne n'est pas reçu, elle n'est pas prise en compte.
Ceci donne de la « robustesse » à la communication série du PC vers Arduino.