Vous êtes sur la page 1sur 11

3

lments du langage C
Le langage de programmation qui permet de programmer une carte Arduino se nomme
le langage C. Ce chapitre vous propose d'en dcouvrir ou d'en revoir les lments fonda-
mentaux. Ce que vous allez apprendre au cours de ce chapitre vous servira dans tous les
programmes que vous allez concevoir pour Arduino. Pour bien tirer proft d'Arduino,
il faut avoir compris ces lments fondamentaux.
Programmer
Il n'est pas rare de nos jours que les gens parlent plus d'une langue. D'ailleurs, plus vous
en apprenez, plus il devient simple d'en apprendre d'autres, parce que vous commencez
reprer des invariants de grammaire et de vocabulaire qui sont partags entre plusieurs
langues. Il en va de mme avec les langages de programmation. Autrement dit, si vous
avez dj pratiqu un autre langage, vous serez vite niveau en langage C.
La bonne nouvelle avec les langages de programmation informatique est que leur
vocabulaire est bien plus restreint que celui d'une langue humaine. De plus, c'est un
langage crit et non parl, ce qui vous permet de toujours pouvoir recourir au diction-
naire en cas de doute. La grammaire et la syntaxe d'un langage informatique sont trs
strictes. Une fois que vous avez assimil une poigne de concepts simples, la progression
devient quasiment naturelle.
ARDUI__Monk.indb 25 21/03/13 18:05
2013 Pearson France Arduino Simon Monk
26 Arduino : les bases de la programmation
Vous pouvez comparer un programme informatique (les programmes source Arduino
s'appellent des croquis ou sketch), comme une liste d'instructions que le processeur
doit excuter dans l'ordre dans lequel elles apparaissent. Prenons comme exemple les
trois lignes suivantes :
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
Chacune de ces trois lignes fait raliser une action. La premire ligne force le passage
l'tat haut (HIGH) de la broche 13 du circuit. C'est sur cette broche qu'est installe une
LED sur la carte Arduino. Cet ordre oblige donc faire allumer la LED. La deuxime
ligne se contente de suspendre l'excution pendant 500 millisecondes (une demi-
seconde). La troisime ligne est ensuite excute pour teindre la LED. L'excution de
ces trois lignes permet donc de faire clignoter une fois la LED.
Vous aurez remarqu la prsence de plusieurs signes de ponctuation et l'apparent oubli
d'espaces entre les mots (et de lettres accentues). Bien des dbutants en programmation
savent ce qu'ils veulent faire, mais ils ne savent comment le formuler par crit. Ne vous
inquitez pas, nous allons tout expliquer.
Voyons d'abord ce problme de ponctuation et d'absence d'espaces entre les mots. Ces
manires d'crire sont conformes la syntaxe du langage et la plupart des langages
de programmation vous demandent d'tre trs prcis ce niveau. Une des rgles de
syntaxe majeure est que les noms donns aux choses doivent tre constitus d'un seul
mot sans espaces. Autrement dit, digitalWrite() est le nom de quelque chose, plus
prcisment le nom d'une fonction prprogramme (nous reparlerons des fonctions
plus tard). Cette fonction va raliser une action de changement de l'tat d'une broche
de sortie sur la carte Arduino. Non seulement il faut viter les espaces dans les noms,
mais il faut tenir compte de la diffrence entre majuscules et minuscules, c'est--dire
la casse des lettres. Pour le programme, digitalWrite() n'est pas la mme chose que
DigitalWrite() ou Digitalwrite().
Notre fonction digitalWrite() a besoin que vous lui indiquiez quelle broche elle doit
modifer et s'il faut forcer l'tat lectrique de la broche l'tat haut (HIGH) ou bas (LOW).
Ces deux informations s'appellent des arguments, et ces arguments sont transmis la
fonction lorsqu'elle est appele. Les arguments d'une fonction doivent tre entours par
un couple de parenthses et spars les uns des autres par une virgule.
Par convention, la parenthse ouvrante suit immdiatement la dernire lettre du nom
de la fonction. Une autre convention qui facilite la lecture par les humains consiste
ajouter un espace aprs chaque virgule sparant deux arguments. Vous pouvez cependant
ajouter plus d'espaces entre les parenthses si cela vous aide la lecture.
Notez que lorsqu'une fonction n'a qu'un seul argument, il n'y a aucune virgule.
ARDUI__Monk.indb 26 21/03/13 18:05
2013 Pearson France Arduino Simon Monk
Chapitre 3 lments du langage C 27
Vous remarquez que chacune des trois lignes se termine par un signe point-virgule.
Vous pourriez trouver plus logique d'utiliser des points, puisque cela signife la fn d'une
commande, un peu comme en fn de phrase.
Nous allons dcouvrir maintenant ce qui se passe lorsque vous transfrez le programme
grce au bouton TLVERSER (Upload) de l'ordinateur de dveloppement vers la carte
Arduino, partir de l'atelier. Nous allons ensuite pouvoir faire quelques essais pratiques
de programmation.
Qu'est-ce qu'un langage de programmation?
Certains lecteurs seront peut-tre surpris de constater que nous avons attendu d'en tre
au Chapitre 3 pour dfnir exactement ce qu'est un langage de programmation, alors
que c'est le sujet de ce livre. Au point o nous en sommes, vous savez dj reconnatre
un croquis Arduino et avez certainement une ide gnrale de ce quoi servent ces
programmes. Nous devons maintenant aller voir plus prcisment comment le code
source du langage, c'est--dire un ensemble de mots dans un programme d'dition,
fnit par se transformer en quelque chose qui agit sur le monde rel, comme allumer
ou teindre une LED.
La Figure 3.1 montre les grandes tapes de cette chane de production qui va de la saisie
du code source dans l'atelier IDE Arduino jusqu' l'excution du programme sur la carte.
Figure 3.1
Du code source
la carte.

Compilateur
Ordinateur hte
Carte Arduino
Chargeur
(bootloader)
Mmoire Flash
du programme
CPU
Ports
LED
Lorsque vous utilisez le bouton de tlversement de votre atelier Arduino, vous
dclenchez une srie d'vnements dont les deux dernires tapes correspondent
l'installation du programme excutable sur la carte Arduino et son dmarrage. Notez
qu'il ne s'agit pas de simplement transfrer les instructions de code source que vous
avez saisies vers la carte Arduino.
La premire tape de cette chane se nomme la compilation. Elle consiste analyser les
instructions de code source que vous avez crites pour les convertir en squences de code
ARDUI__Monk.indb 27 21/03/13 18:05
2013 Pearson France Arduino Simon Monk
28 Arduino : les bases de la programmation
machine, c'est--dire le langage binaire que peut comprendre le processeur de la carte
Arduino. Si vous utilisez le bouton triangulaire de vrifcation dans l'atelier Arduino,
vous demandez de faire une compilation du programme C sans faire suivre cette action
du transfert du code rsultant vers la carte. La compilation du code permet en effet de
vrifer que la totalit du contenu est conforme aux rgles de syntaxe du langage C.
Si vous saisissez les deux mots Ciao Bella alors que la zone d'dition de l'atelier est vide,
puis utilisez le bouton VRIFIER, vous obtiendrez les rsultats de la Figure 3.2. Observez
notamment le bandeau infrieur de la fentre.
Figure 3.2
La preuve qu'Arduino
ne comprend pas
l'italien.

L'atelier Arduino a essay de compiler les deux mots "Ciao Bella". Malgr ses origines
italiennes, il n'a rien compris ce que vous avez tent de lui dire. Ce texte n'est en
effet pas du langage C. Voil pourquoi vous voyez apparatre dans le bas de l'cran un
message un peu obscur : "'Ciao' does not name a type." Cela signife que ce que vous
avez crit ne convient pas du tout.
ARDUI__Monk.indb 28 21/03/13 18:05
2013 Pearson France Arduino Simon Monk
Chapitre 3 lments du langage C 29
Prenons un autre exemple. Voyons si nous pouvons compiler un croquis totalement
vide (voir Figure 3.3).
Figure 3.3
Un programme sans
setup() ni loop().
Cette fois-ci, le compilateur vous informe dans le bandeau infrieur que votre croquis
ne contient aucune fonction nomme setup() ou loop(). Si vous vous souvenez de
l'exemple Blink du Chapitre 2, vous savez qu'il fallait insrer un minimum de code
standard (boilerplate) avant de pouvoir ajouter vos instructions spcifques dans le
programme. Dans la programmation pour Arduino, le code gnrique prend la forme de
deux fonctions qui doivent toujours tre prsentes dans un croquis et porter exactement
les noms setup() et loop().
Nous dcrirons en dtail les fonctions dans le chapitre suivant du livre. Pour l'instant,
contentez-vous d'accepter le fait qu'il est ncessaire de toujours insrer ce code minimal
pour que le compilateur accepte de compiler votre croquis (voir Figure 3.4).
ARDUI__Monk.indb 29 21/03/13 18:05
2013 Pearson France Arduino Simon Monk
30 Arduino : les bases de la programmation
Figure 3.4
Exemple de croquis
pouvant tre compil,
bien qu'il soit vide.
L'atelier Arduino reconnat vos efforts de rdaction et accepte la compilation. Il vous
le confrme par le message "COMPILATION TERMINE." suivi d'un rapport sur la taille du
croquis : 466 octets, par exemple. Le message vous indique galement que la taille
maximale du programme est de 32 256 octets, ce qui vous laisse de la marge pour faire
grossir votre croquis.
Examinons de plus prs ces six lignes de code initiales qui doivent tre prsentes dans
tous vos croquis. Nous y trouvons de nouveaux lments, et notamment le mot void
ainsi que des paires d'accolades. Voyons d'abord quoi sert le mot void.
La premire ligne, void setup(), signife que vous dfnissez une fonction portant le
nom setup(). Dans Arduino, certaines fonctions sont prprogrammes, et c'est le cas
de digitalWrite() et de delay(), mais vous pouvez dfnir vos propres fonctions. Les
deux fonctions setup() et loop() sont particulires : leur nom est immuable, mais c'est
vous de dfnir leur contenu dans chacun de vos croquis.
Sachez que vous n'allez pas appeler ces deux fonctions spciales setup() et loop()
comme vous le feriez pour digitalWrite(). Vous devez dfnir les deux fonctions, mais
ARDUI__Monk.indb 30 21/03/13 18:05
2013 Pearson France Arduino Simon Monk
Chapitre 3 lments du langage C 31
c'est le systme Arduino qui va les appeler. Ce n'est pas un concept facile comprendre,
mais vous pouvez le comparer une dfnition de termes dans un document juridique.
Souvent, les documents juridiques contiennent une section de dfnition des termes
dans laquelle vous pourriez trouver quelque chose dans le style suivant :
Dfinitions :
Auteur : Par auteur est dsign la ou les personnes qui sont responsables
de la cration du livre.
Une fois qu'un terme est ainsi dfni, les avocats peuvent citer le mot "auteur" comme un
raccourci de l'expression "la ou les personnes responsables de la cration d'un livre", ce
qui permet de rendre les documents plus courts et plus lisibles. Une fonction quivaut
un peu une telle dfnition. Vous dfnissez la fonction que vous allez ensuite utiliser
ailleurs dans votre croquis ou que le systme va appeler.
Revenons au mot void (vide) qui est utilis en prfxe des deux fonctions. Il signife
qu'elles ne renvoient aucune valeur, alors que c'est le cas de nombreuses autres fonctions.
Pour dire qu'il n'y aura pas de valeur renvoye, nous utilisons ce mot rserv void.
Imaginez une fonction qui s'appelle sinus() pour calculer le sinus d'une valeur. Cette
fonction devrait par dfnition renvoyer une valeur (le rsultat de son calcul). Cette valeur
serait le sinus de l'angle qui aura t transmis en argument dans l'appel la fonction.
De mme que l'on utilise des mots pour dfnir un terme dans un document juridique,
nous utilisons le langage C pour dfnir des fonctions qui sont ensuite appeles d'autres
endroits du programme en langage C.
Le mot-cl void est suivi d'un espace, puis du nom de la fonction, puis d'un couple de
parenthses dlimitant la liste des paramtres. Dans les deux cas de notre exemple, il
n'y a aucun paramtre, mais les parenthses doivent cependant tre prsentes.
INFO
N.d.T. : Vous rencontrerez les deux termes "paramtre" et "argument". Un paramtre est la
variable thorique dfnie dans la dfnition de la fonction. Un argument est une valeur relle
transmise la place du paramtre lors d'un appel la fonction.
Vous remarquez en revanche qu'il n'y a pas de signe point-virgule aprs la parenthse
fermante. En effet, il ne s'agit ici que de la premire ligne du bloc de dfnition d'une
fonction. Ce n'est pas un appel la fonction. C'est entre les accolades que viendront se
placer les instructions excuter lorsque la fonction sera appele.
Toutes les actions que va raliser la fonction doivent tre places entre ces accolades.
Les accolades et les instructions constituent le corps de la fonction ou son bloc de code.
Nous reviendrons sur ce concept plus tard.
ARDUI__Monk.indb 31 21/03/13 18:05
2013 Pearson France Arduino Simon Monk
32 Arduino : les bases de la programmation
Vous remarquez que bien qu'il faille dfnir les deux fonctions setup() et loop(), il n'est
pas obligatoire d'insrer des instructions dans leur corps. Cela dit, si les deux fonctions
sont vides, votre croquis n'a aucun effet.
Le retour de Blink !
La raison pour laquelle tout programme Arduino rend obligatoire la prsence des deux
fonctions nommes setup() et loop() est que cela permet de sparer les actions qui ne
doivent tre ralises qu'une fois au dmarrage du croquis de celles qui doivent pouvoir
se drouler plusieurs fois.
La fonction nomme setup() n'est excute qu'une fois au dbut du dmarrage du
croquis. Nous allons ajouter quelques instructions dans son corps pour faire clignoter
la LED de la carte. Ajoutez les deux lignes d'instruction suivantes dans le corps de la
fonction setup() du croquis prcdent, puis demandez le transfert du programme vers
la carte par tlversement :
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
}
void loop()
{
}
Les deux instructions ajoutes dans setup() correspondent deux appels de fonctions
prdfnies qui sont pinMode() et digitalWrite(). Nous connaissons dj digitalWrite()
mais pas pinMode(). Cette fonction permet de confgurer une broche pour qu'elle soit
une broche d'entre ou de sortie. Pour allumer la LED, nous avons donc deux tapes
parcourir. D'abord, nous dfnissons la broche 13 comme devant tre utilise comme
sortie, puis nous forons cette sortie l'tat haut (HIGH).
Si vous lancez l'excution de ce croquis, vous verrez la LED s'allumer sur la carte et
rester allume. Ce n'est pas trs intressant. Essayons de la faire clignoter en provoquant
un allumage suivi d'une extinction dans la boucle loop() et non dans la fonction de
dmarrage setup().
Vous pouvez laisser l'appel pinMode() dans la fonction setup() parce qu'il n'est nces-
saire qu'une fois. Cela fonctionnerait toujours si nous dplacions l'appel dans la boucle,
mais il serait inutile de rpter cette action de prparation. Prenez la bonne habitude
de ne faire les choses qu'une fois si cela sufft.
Modifez le croquis pour qu'il ressemble celui-ci :
void setup()
{
pinMode(13, OUTPUT);
ARDUI__Monk.indb 32 21/03/13 18:05
2013 Pearson France Arduino Simon Monk
Chapitre 3 lments du langage C 33
}
void loop()
{
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
}
Essayez le croquis. Le rsultat va peut-tre vous tonner. La LED semble rester allume
en permanence. Comment est-ce possible ?
Droulons mentalement la logique du croquis ligne par ligne :
1. Nous excutons setup() pour forcer la broche 13 tre une sortie.
2. Nous entrons dans loop() et forons la broche 13 au niveau haut (LED allume).
3. Nous provoquons une pause d'une demi-seconde.
4. Nous forons la broche 13 l'tat bas (LED teinte).
5. Nous revenons en dbut de boucle, c'est--dire l'tape 2, et nous redonnons la
broche 13 l'tat haut (LED allume).
Le problme se situe entre les tapes 4 et 5. La LED est effectivement teinte, mais elle
est rallume immdiatement aprs. L'intervalle entre les deux actions est si rduit que
la LED semble rester allume en permanence.
Le microcontrleur qui quipe la carte Arduino peut raliser 16 millions d'instructions
machine par seconde. Cela ne revient pas 16 millions d'instructions en langage C, mais
cela reste trs rapide. Voil pourquoi notre LED s'teint bien, mais seulement pendant
quelques millionimes de seconde.
Pour rsoudre ce problme, il nous sufft d'ajouter une autre pause aprs avoir teint la
LED. Voici comment modifer votre code source :
// sketch_03_01
void setup()
{
pinMode(13, OUTPUT);
}
void loop()
{
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500);
}
Si vous faites un nouvel essai, vous devriez voir votre LED clignoter joyeusement une
fois par seconde.
ARDUI__Monk.indb 33 21/03/13 18:05
2013 Pearson France Arduino Simon Monk
34 Arduino : les bases de la programmation
Vous aurez remarqu un commentaire en dbut de listing qui indique "// sketch_03_01".
Pour vous viter de devoir tout ressaisir, nous mettons disposition sur le site compagnon
du livre tous les croquis comportant un tel commentaire en en-tte. Vous pouvez les
tlcharger en version anglaise l'adresse http://www.arduinobook.com. (N.d.T. :
Certains sont fournis en version franaise sur le site www.pearson.fr.)
Variables
Dans notre exemple, nous nous servons de la broche 13 et nous y faisons rfrence en
trois endroits diffrents du programme. Pour travailler avec une autre broche, il faudrait
donc modifer le numro de broche trois endroits. De mme, pour modifer la vitesse
de clignotement (utilise comme argument de la fonction delay()), il faudrait modifer
la valeur 500 deux endroits diffrents.
Une variable est une sorte de symbole pour un nom ou pour une valeur numrique. Elle
permet bien plus de choses, mais servons-nous en dj en tant que symbole d'une valeur.
Lorsque vous dfnissez une variable en langage C, vous devez d'abord indiquer le type
de donnes que la variable va contenir. Ici, nous avons besoin de variables correspondant
des valeurs numriques entires qui s'appellent en C des valeurs de type int (integer).
Pour dfnir une variable que nous choisissons de nommer brocheLED et possdant la
valeur 13, nous cririons la dclaration suivante :
int brocheLED 13;
La variable brocheLED est un nom et les rgles donnes plus haut pour les noms des
fonctions s'appliquent. Vous ne pouvez donc pas utiliser d'espaces dans le nom, ni
de lettres accentues. Par convention, les programmeurs font dbuter leurs noms
de variables par une lettre minuscule et commencent chaque nouveau mot par une
majuscule en collant les mots les uns aux autres. Cette criture est souvent dsigne
sous le terme d'criture en creux et bosses, ou CamelCase.
Ajoutons donc nos dclarations de variables dans le croquis Blink :
// sketch_03_02
int brocheLED = 13;
int dureePause = 500;
void setup()
{
pinMode(brocheLED, OUTPUT);
}
void loop()
{
digitalWrite(brocheLED, HIGH);
delay(dureePause);
digitalWrite(brocheLED, LOW);
delay(dureePause);
}
ARDUI__Monk.indb 34 21/03/13 18:05
2013 Pearson France Arduino Simon Monk
Chapitre 3 lments du langage C 35
Vous remarquez que nous avons dclar une seconde variable nomme dureePause.
tous les endroits dans le croquis o nous utilisions la valeur 13, nous indiquons
dornavant le nom brocheLED. De mme, l o nous utilisions la valeur 500 (une valeur
littrale) nous indiquons dornavant le nom de la variable dureePause.
Dornavant, pour faire clignoter la LED plus rapidement, il sufft de changer un endroit
la valeur affecte la variable dureePause. Essayez par exemple de rduire cette valeur
100 et relancez le croquis sur la carte Arduino.
Nous avons dit que vous pouviez faire bien d'autres choses avec des variables. Voyons
comment modifer le croquis de sorte que le clignotement commence frquence leve,
puis ralentisse de plus en plus, comme si la carte Arduino commenait se lasser. Pour
y parvenir, il nous sufft d'ajouter une petite valeur la valeur actuelle de dureePause
chaque tour de la boucle.
Modifez donc le croquis en ajoutant une ligne tout la fn du corps de la fonction
loop(), comme prsent dans l'extrait suivant. Transfrez le programme modif sur
la carte Arduino. Appuyez sur le bouton poussoir RESET de la carte et observez l'effet
de ralentissement du clignotement.
// sketch_03_03
int brocheLED = 13;
int dureePause = 100;
void setup()
{
pinMode(brocheLED, OUTPUT);
}
void loop()
{
digitalWrite(brocheLED, HIGH);
delay(dureePause);
digitalWrite(brocheLED, LOW);
delay(dureePause);
dureePause = dureePause + 100;
}
Voici que votre carte Arduino fait de l'arithmtique. chaque appel la fonction loop(),
nous provoquons un clignotement de la LED puis nous ajoutons 100 la valeur de la
variable dureePause. Nous reviendrons un peu plus loin sur les oprations arithm-
tiques. Voyons d'abord comment mieux observer ce que fait la carte Arduino qu'avec
un simple clignotement de LED.
ARDUI__Monk.indb 35 21/03/13 18:05
2013 Pearson France Arduino Simon Monk