You are on page 1of 30

TABLE DES MATIRES

Avant-propos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

IX

1 Communications srie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.1

Envoi des informations de dbogage de lArduino lordinateur . . . .

1.2

Envoi de texte mis en forme et de donnes numriques partir de


lArduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

1.3

Rception de donnes srie sur lArduino . . . . . . . . . . . . . . . . . . . . . . . . . . .

13

1.4

Envoi partir de lArduino de plusieurs champs texte dans un


message unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

Rception dans lArduino de plusieurs champs texte dans un message


unique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

1.6

Envoi de donnes binaires partir de lArduino . . . . . . . . . . . . . . . . . . . . .

27

1.7

Rception sur lordinateur de donnes binaires partir de lArduino

31

1.8

Envoi de donnes binaires partir de Processing vers lArduino . . . . . .

33

1.9

Envoi de la valeur de plusieurs broches de lArduino . . . . . . . . . . . . . . . . .

35

1.10

Comment dplacer le curseur de la souris sur un PC ou un Mac . . . . . .

39

1.11

Contrle de Google Earth avec lArduino . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

1.12

Journalisation des donnes de lArduino dans un fichier sur


lordinateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

1.13

Envoi de donnes sur deux priphriques srie en mme temps . . . . .

51

1.14

Rception de donnes srie partir de deux priphriques en mme


temps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

54

Paramtrage de Processing sur lordinateur pour envoyer et recevoir


des donnes srie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

59

2 Entres simples analogiques et numriques . . . . . . . . . . . . . . . . . . . .

61

Utilisation dun interrupteur sans rsistances externes . . . . . . . . . . . . . . .

64

Dunod Toute reproduction non autorise est un dlit.

1.5

1.15

2.1

La bote outils Arduino

2.2

Dterminer pendant combien de temps on appuie sur un interrupteur

66

2.3

Lecture de plus de six entres analogiques . . . . . . . . . . . . . . . . . . . . . . . . . .

71

2.4

Affichage des voltages jusqu 5 volts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

74

2.5

Ragir aux changements de voltage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76

2.6

Mesurer des voltages de plus de 5 volts (rducteurs de tension) . . . . .

78

3 Capteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

81

3.1

Dtection de mouvement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

3.2

Dtection de lumire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

85

3.3

Dtection du mouvement (intgration de dtecteurs


infrarouges passifs) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

87

3.4

Mesurer la distance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

89

3.5

Mesurer la distance avec prcision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

93

3.6

Dtecter un son . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

97

3.7

Lecture dtiquettes RFID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

100

3.8

Suivi de mouvement rotatif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

103

3.9

Suivi du mouvement de plusieurs encodeurs rotatifs . . . . . . . . . . . . . . . . .

106

3.10

Suivi du mouvement rotatif dans un sketch occup dautres tches

108

3.11

Dtecter une rotation laide dun gyroscope . . . . . . . . . . . . . . . . . . . . . . .

111

3.12

Dtection de la direction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

115

3.13

Rcupration de lentre dune manette de jeu (PlayStation) . . . . . . . .

120

4 Sortie visuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123


4.1

Ajustement de la couleur dune LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

127

4.2

Montage en srie de plusieurs LED pour produire des effets visuels . .

130

4.3

Contrle dune matrice de LED en utilisant les registres dcalage


MAX72xx . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

131

Augmentation du nombre de sorties analogiques avec les puces


dextension PWM (TLC5940) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

134

4.4

5 Sortie physique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

IV

5.1

Contrle dun ou deux servos avec un potentiomtre ou un capteur .

142

5.2

Contrle de servos laide de commandes excutes sur un ordinateur 143

5.3

Piloter un moteur sans balais (avec un rgulateur de vitesse) . . . . . . . .

145

Table des matires

5.4

Faire vibrer un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

146

5.5

Utilisation de capteurs pour contrler la direction et la vitesse de


moteurs balais (L293 H-Bridge) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

149

5.6

Pilotage dun moteur pas--pas bipolaire . . . . . . . . . . . . . . . . . . . . . . . . . . . .

155

5.7

Pilotage dun moteur pas--pas bipolaire (avec la carte EasyDriver) . .

157

6 Sortie audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161


6.1

Jouer des notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

163

6.2

Jouer une simple mlodie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

165

6.3

Gnration de plusieurs notes la fois . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

167

6.4

Gnration de notes et baisse de lintensit dune LED . . . . . . . . . . . . . .

169

6.5

Jouer un fichier WAV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

172

6.6

Contrle dun priphrique MIDI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

175

6.7

Ralisation dun synthtiseur audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

178

7 Contrle distant dappareils externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181


7.1

Ragir une tlcommande infrarouge . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

182

7.2

Dcodage des signaux dune tlcommande infrarouge . . . . . . . . . . . . .

185

7.3

Imitation de signaux de commande distance . . . . . . . . . . . . . . . . . . . . . . .

188

7.4

Contrle dun appareil photo numrique . . . . . . . . . . . . . . . . . . . . . . . . . . . .

191

Dunod Toute reproduction non autorise est un dlit.

8 Afficheurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
8.1

Mise en forme du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

196

8.2

Activation et dsactivation du curseur et de laffichage . . . . . . . . . . . . . .

198

8.3

Faire dfiler du texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

200

8.4

Affichage de symboles spciaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

203

8.5

Cration de caractres personnaliss . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

205

8.6

Affichage de symboles plus grands quun seul caractre . . . . . . . . . . . . .

207

8.7

Affichage de pixels plus petits quun seul caractre . . . . . . . . . . . . . . . . . .

210

8.8

Cration de bitmaps utiliser avec un afficheur graphique . . . . . . . . . .

212

9 Heure et dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215


9.1

Cration de temps dattente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

215

9.2

Utilisation de millis pour dterminer la dure . . . . . . . . . . . . . . . . . . . . . . .

216

9.3

Mesurer plus prcisment la dure dune impulsion . . . . . . . . . . . . . . . . .

220

La bote outils Arduino

9.4

Utilisation de lArduino en tant quhorloge . . . . . . . . . . . . . . . . . . . . . . . . . .

222

9.5

Cration dune alarme pour appeler priodiquement une fonction . .

230

10 Communication avec I2C et SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235


10.1

Contrle dune LED RGB avec un module BlinkM . . . . . . . . . . . . . . . . . . . .

239

10.2

Utilisation de lacclromtre du Nunchuck Wii . . . . . . . . . . . . . . . . . . . . .

243

10.3

Interfaage avec une horloge externe temps rel . . . . . . . . . . . . . . . . . . . .

248

10.4

Lecture dune temprature avec un thermomtre numrique . . . . . . . .

250

10.5

Intgration dun expandeur de port I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

255

10.6

Communication entre plusieurs cartes Arduino . . . . . . . . . . . . . . . . . . . . . .

257

11 Communication sans fil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261


11.1

Envoi de messages laide de modules sans fil bon march . . . . . . . . . .

261

11.2

Envoi dun message un XBee particulier . . . . . . . . . . . . . . . . . . . . . . . . . . .

266

11.3

Activation dun actionneur connect un XBee . . . . . . . . . . . . . . . . . . . . .

269

11.4

Envoi de messages laide dun metteur-rcepteur bon march . . . .

275

12 Ethernet et mise en rseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281


12.1

Requte de donnes partir dun serveur web utilisant XML . . . . . . . .

283

12.2

Envoi de messages Twitter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

286

12.3

Envoi et rception dun simple message (UDP) . . . . . . . . . . . . . . . . . . . . . . .

289

12.4

Obtention de lheure partir dun serveur de temps Internet . . . . . . . .

295

13 Utilisation, modification et cration de bibliothques . . . . . . 301


13.1

Utilisation des bibliothques intgres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

301

13.2

Installation des bibliothques tierces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

303

13.3

Modification dune bibliothque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

304

13.4

Cration de votre propre bibliothque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

308

13.5

Cration dune bibliothque qui utilise dautres bibliothques . . . . . .

315

14 Codage avanc et gestion de la mmoire . . . . . . . . . . . . . . . . . . . . . . 321

VI

14.1

Comprendre le processus de gnration du code de lArduino . . . . . . .

323

14.2

Dterminer la quantit despace libre et la quantit consomme de


RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

325

Table des matires

14.3

Stockage et rcupration des valeurs numriques dans la mmoire du


programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

14.4

Stockage et rcupration des chanes de caractres dans la mmoire


du programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

331

14.5

Utilisation de #define et de const la place dentiers . . . . . . . . . . . . . . . .

333

14.6

Utilisation de la compilation conditionnelle . . . . . . . . . . . . . . . . . . . . . . . . .

334

15 Utilisation de la puce du contrleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337


15.1

Stockage des donnes dans la mmoire permanente de lEEPROM . . .

341

15.2

Utilisation des interruptions matrielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

344

15.3

Paramtrage de la dure du timer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

347

15.4

Paramtrage de la largeur dimpulsion dun timer et de sa dure . . . .

350

15.5

Cration dun gnrateur dimpulsions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

353

15.6

Modification de la frquence PWM dun timer . . . . . . . . . . . . . . . . . . . . . .

356

15.7

Comptage des impulsions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

358

15.8

Mesurer les impulsions plus prcisment . . . . . . . . . . . . . . . . . . . . . . . . . . . .

360

15.9

Mesurer rapidement les valeurs analogiques . . . . . . . . . . . . . . . . . . . . . . . .

363

15.10 Rduire la dcharge des piles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

364

15.11 Initialisation rapide des broches numriques . . . . . . . . . . . . . . . . . . . . . . . .

366

Dunod Toute reproduction non autorise est un dlit.

Annexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
A. Composants lectroniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

371

B. Utilisation des schmas de montage et des notices techniques . . . . . . . . . . .

374

C. Montage et connexion des circuits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

380

D. Astuces pour le dbogage des logiciels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

383

E. Astuces pour le dpannage des problmes matriels . . . . . . . . . . . . . . . . . . . .

386

F. Broches analogiques et numriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

388

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393

VII

AVANT-PROPOS

Cet ouvrage a t crit avec laide de Nick Weldin pour vous aider explorer toutes
les choses tonnantes que vous pouvez faire avec Arduino.
Arduino est une famille de microcontrleurs (petits ordinateurs) et un environnement
de cration logicielle qui facilite lcriture de programmes (que lon appelle sketchs)
pouvant interagir avec le monde physique. Les choses que vous pouvez raliser
avec Arduino peuvent sentir et ragir au toucher, au son, la position, la chaleur
et la lumire. Ce type de technologie, que lon dsigne souvent sous le nom
dinformatique physique, est utilis dans toutes sortes dappareils, de liPhone aux
systmes lectroniques automobiles. Arduino permet toute personne motive
(mme les gens sans exprience de la programmation ni de llectronique) dutiliser
cette technologie riche et complexe.

Dunod Toute reproduction non autorise est un dlit.

qui sadresse ce livre

Cet ouvrage sadresse aux lecteurs intresss par lutilisation de la technologie


informatique pour communiquer avec lenvironnement. Il est conu pour les gens
qui veulent trouver rapidement la solution aux problmes matriels et logiciels. Les
recettes fournissent linformation dont vous avez besoin pour accomplir une grande
varit de tches. Il comporte aussi des dtails qui vous aideront personnaliser les
solutions pour quelles rpondent vos besoins spcifiques. Il manque de lespace
dans un livre limit 400 pages pour traiter la formation thorique gnrale, si bien
que des liens vers des rfrences externes sont indiqus tout au long de louvrage
(ceux qui nont aucune exprience en programmation ni en lectronique peuvent se
reporter la section Ce qui na pas t trait pour obtenir des rfrences gnrales).
Si vous avez peu dexprience en programmation (vous avez peut-tre de grandes
ides sur la ralisation dun projet interactif, mais vous navez pas les comptences
pour le dvelopper), ce livre va vous aider apprendre ce que vous avez besoin de
savoir pour crire du code qui fonctionne, en utilisant des exemples qui couvrent
une centaine de tches courantes.
Si vous tes un programmeur expriment, mais que vous tes nophyte en Arduino,
le livre va vous aider devenir productif rapidement en vous montrant comment
implmenter les fonctionnalits spcifiques de lArduino pour votre projet.
Les lecteurs qui ont dj utilis un Arduino devraient trouver dans ces pages
un contenu qui favorise lapprentissage rapide de nouvelles techniques, qui sont
expliques laide dexemples pratiques. Cela vous permettra denvisager des projets

La bote outils Arduino

plus complexes en vous montrant comment rsoudre des problmes et utiliser des
fonctionnalits qui vous sont peut-tre nouvelles.
Les programmeurs C et C++ expriments trouveront des exemples dutilisation des
ressources bas niveau de lAVR (interruptions, timers, I2C, Ethernet, etc.) afin de
crer des applications qui se servent de lenvironnement Arduino.
Organisation de cet ouvrage

Ce livre contient des informations qui couvrent une large palette des fonctionnalits
de lArduino, des tches courantes1 aux technologies les plus avances. Chaque
technique est explique dans une recette qui montre comment implmenter une
fonctionnalit spcifique. Vous navez pas besoin de lire tout le contenu de louvrage
la suite. Quand une recette utilise une technique traite dans une autre recette, il y
a une rfrence au contenu de cette recette plutt que de rpter les dtails de cette
recette en de multiples endroits.
Le chapitre 1, Communications srie, dcrit la manire de connecter lArduino
pour quil communique avec votre ordinateur et dautres appareils. La liaison srie
est la mthode la plus courante pour les entres et les sorties de lArduino, et cette
fonctionnalit est utilise dans de nombreuses recettes de ce livre.
Le chapitre 2, Entres simples analogiques et numriques, introduit toute une
srie de techniques pour lire des signaux numriques et analogiques.
Le chapitre 3, Capteurs, fournit des recettes qui expliquent comment utiliser des
priphriques qui permettent lArduino de sentir le toucher, le son, la position, la
chaleur et la lumire.
Le chapitre 4, Sortie visuelle, traite du contrle de la lumire. Les recettes tudient
lallumage dune ou plusieurs LED, ainsi que le contrle de lclat et de la couleur.
Ce chapitre explique comment vous pouvez piloter des affichages LED, et crer
des motifs et des animations avec des matrices de LED. En outre, ce chapitre fournit
une introduction gnrale aux sorties numriques et analogiques.
Le chapitre 5, Sortie physique, explique comment vous pouvez faire dplacer
des objets en contrlant des moteurs (servomoteurs, moteurs en courant continu,
moteurs pas--pas) avec lArduino.
Le chapitre 6, Sortie audio, montre comment gnrer du son avec lArduino via un
priphrique de sortie comme un haut-parleur. Vous apprendrez jouer des notes
et des mlodies simples, et lire des fichiers WAV et MIDI.
Le chapitre 7, Contrle distant dappareils externes, dcrit des techniques qui
permettent de communiquer avec presque tout appareil utilisant une forme de

1. NDE : Si vous dbutez avec Arduino nous vous conseillons la lecture des ouvrages suivants :
Pour dmarrer avec Arduino, M. Banzi, 2e dition, 120 pages, Dunod, 2013.
Arduino - Matrisez sa programmation et ses cartes dinterface, C. Tavernier, Dunod, 2011.
Arduino Applications avances, C. Tavernier, Dunod, 2012.

Dunod Toute reproduction non autorise est un dlit.

Avant-propos

tlcommande, notamment les tlviseurs, les quipements audio, les appareils


photo, les portes de garage et les jouets. Il est bas sur les techniques employes dans
les chapitres prcdents pour connecter lArduino aux priphriques et aux modules.
Le chapitre 8, Afficheurs, tude linterfaage avec les afficheurs LCD en mode texte
et en mode graphique. Ce chapitre montre comment connecter ces priphriques
pour afficher du texte, faire dfiler ou mettre en surbrillance des mots, et crer des
symboles et des caractres spciaux.
Le chapitre 9, Heure et dates, traite des fonctions intgres de gestion du temps
de lArduino et introduit de nombreuses autres techniques pour grer les dlais
dattente, la mesure du temps et les heures et les dates en pratique.
Le chapitre 10, Communication avec I2C et SPI, tudie les normes I2C (InterIntegrated Circuit) et SPI (Serial Peripheral Interface). Ces standards fournissent
des moyens simples pour le transfert dinformations numriques entre des capteurs
et lArduino. Ce chapitre montre comment utiliser I2C et SPI pour connecter des
priphriques courants. Il montre galement comment connecter plusieurs cartes
Arduino, laide de I2C pour des applications multicartes.
Le chapitre 11, Communication sans fil, tudie la communication sans fil avec un
XBee et dautres modules sans fil. Ce chapitre fournit toute une srie dexemples qui
vont du simple remplacement du port srie par un module sans fil jusquaux rseaux
mesh connectant plusieurs cartes plusieurs capteurs.
Le chapitre 12, Ethernet et mise en rseau, dcrit les nombreux moyens qui
permettent Arduino dutiliser Internet. Vous y trouverez des exemples montrant
comment employer les protocoles de communication les plus courants avec Arduino.
Les bibliothques logicielles de lArduino sont un moyen standard dajouter des
fonctionnalits lenvironnement Arduino. Le chapitre 13, Utilisation, modification et cration de bibliothques, explique comment employer et modifier les
bibliothques logicielles. Il fournit aussi des conseils sur la manire de crer vos
propres bibliothques.
Le chapitre 14, Codage avanc et gestion de la mmoire, tudie des techniques de
programmation avance ; les sujets abords dans ce chapitre sont plus techniques
que les autres recettes de ce livre car ils couvrent des choses qui sont habituellement
masques par lemballage convivial de lArduino. Les techniques de ce chapitre
peuvent tre utilises pour rendre vos sketchs plus efficaces (en amliorant les
performances et en rduisant la taille du code de vos sketchs).
Le chapitre 15, Utilisation de la puce du contrleur, montre comment accder aux
fonctions matrielles qui ne sont pas totalement prsentes dans la documentation
officielle du langage Arduino. Ce chapitre traite de lutilisation bas niveau des
registres dentre/sortie, des timers et des interruptions.
Les annexes :
A Composants lectroniques fournit une vue densemble des composants
utiliss dans cet ouvrage.

XI

La bote outils Arduino

B Utilisation des schmas de montage et des notices techniques explique


comment utiliser les schmas et les notices techniques.
C Montage et connexion des circuits fournit une brve introduction
lutilisation des platines dessai, la connexion et lutilisation des alimentations
externes et des piles, et lemploi de condensateurs de dcouplage.
D Astuces pour le dbogage des logiciels fournit des conseils sur le dpannage
des problmes de compilation et dexcution des sketchs.
E Astuces pour le dpannage des problmes matriels couvre les problmes
avec les circuits lectroniques.
F Broches analogiques et numriques fournit des tableaux qui listent les
fonctionnalits offertes par les broches des cartes standard Arduino.
Ce qui na pas t trait

Il ny a pas assez de place dans ce livre pour traiter la thorie et la pratique de


llectronique, bien que des conseils soient fournis pour monter les circuits employs
dans les recettes. Pour des informations dtailles, les lecteurs pourront se reporter
aux documents qui sont largement disponibles sur Internet ou aux ouvrages suivants :
Llectronique en pratique de Charles Platt (Eyrolles).
Getting Started in Electronics de Forrest M. Mims III (Master Publishing).
Physical Computing de Dan OSullivan et Tom Igoe (Cengage).
Practical Electronics for Inventors de Paul Scherz (McGraw-Hill).
Ce livre de recettes explique comment crire du code pour accomplir des tches
spcifiques, mais il ne sagit pas dune introduction la programmation. Si vous
voulez apprendre la programmation, il est souhaitable de se procurer lun des
ouvrages suivants :
Practical C Programming de Steve Oualline (OReilly).
A Book on C de Al Kelley et Ira Pohl (Addison-Wesley).
Mon livre prfr, bien quil ne soit pas vraiment un ouvrage pour dbutants, est
celui qui ma servi apprendre le C :
Le langage C de Brian W. Kernighan et Dennis M. Ritchie (version franaise
publie par Dunod).
Style du code

Le code utilis dans cet ouvrage a t adapt pour illustrer clairement le sujet trait
dans chaque recette. Cela a pour consquence que certains raccourcis courants de
codage ont t vits, particulirement dans les premiers chapitres. Les programmeurs
C expriments utilisent souvent des expressions riches, mais condenses qui ont
lavantage de lefficacit et linconvnient dtre peu lisibles pour les dbutants.
Par exemple, lincrmentation des variables dans les premiers chapitres se fait par
lemploi dexpressions explicites qui sont faciles comprendre pour les dbutants en
programmation :

XII

Avant-propos

result = result + 1; // incrmente le compteur

Nous nutilisons donc pas le code suivant dont se servent habituellement les
programmeurs expriments pour raliser la mme chose :
result++;

// incrmente l'aide de l'oprateur de post incrmentation

Vous tes libre demployer le style que vous prfrez. Les dbutants seront rassurs
en apprenant quil ny a aucune amlioration des performances ni rduction de la
taille du code en utilisant la version condense.
Certaines expressions sont cependant si courantes quelles sont utilises dans leur
forme condense. Par exemple, les expressions de boucle sont crites de la manire
suivante :
for(int i=0; i < 4; i++)

qui est quivalente lexpression suivante :


int i;
for(i=0; i < 4; i = i+1)

Une bonne pratique en programmation consiste sassurer que les valeurs que lon
utilise sont valides en les vrifiant avant leur emploi dans des calculs. Cependant, afin
de se concentrer sur le sujet trait dans les recettes, trs peu de code de traitement
derreur a t inclus dans les recettes.

Dunod Toute reproduction non autorise est un dlit.

Version de lArduino traite dans cet ouvrage

Tout le code a t test avec la version 1.0 dArduino.


Si vous avez des problmes pour faire fonctionner les exemples de code, consultez
lannexe D qui traite du dpannage des problmes logiciels. Le forum Arduino1 est
aussi un bon endroit pour poster une question si vous avez besoin dassistance :
http://www.arduino.cc
Conventions utilises dans cet ouvrage

Les conventions typographiques suivantes sont utilises dans ce livre :


Italique Indique les noms de chemins, les noms de fichiers, les noms des
programmes, les adresses Internet (noms de domaine et URL), ainsi que les
nouveaux lments quand ils sont dfinis.
Espacement fixe Indique les lignes de commande et les options qui doivent
tre saisies telles quelles, les noms et les mots-cls des programmes (y compris les
noms des mthodes, les noms des variables et les noms des classes) et les balises
HTML.
1. En franais ladresse suivante : http://arduino.cc/fr/.

XIII

La bote outils Arduino

Police en gras Indique les lignes de code sur lesquelles lattention est attire.
Espacement fixe italique Indique le texte qui doit tre remplac par des
valeurs fournies par lutilisateur.
Note
Cet encart indique un conseil, une suggestion ou une note.

Avertissement
Cet encart indique un avertissement ou une mise en garde.

propos de ldition franaise

Cet ouvrage est la traduction partielle du best-seller sur Arduino aux tats-Unis. Il
sagit du Arduino Cookbook (2e dition) paru chez OReilly (http://shop.oreilly.com/
product/0636920022244.do).
Louvrage original compte plus de 700 pages et plus de 200 recettes . Nous en
avons slectionn 105 parmi les plus originales et les plus performantes en partant
du principe quil existait dj plusieurs ouvrages pour dbutants en franais, et que
les amateurs dArduino avaient maintenant besoin douvrages plus avancs pour
progresser.
Le choix des 105 recettes de ce livre en franais sest fait avec laide prcieuse
de M. Christian Tavernier, auteur notamment chez Dunod (www.dunod.com) de
deux ouvrages sur Arduino daccs plus facile (http://www.dunod.com/search?search=
tavernier+arduino).
Les complments en ligne

Ils sont disponibles ladresse suivante :


http://www.dunod.com/contenus-complementaires/9782100701537
Vous pouvez tlcharger tout le code de louvrage. Vous remarquerez toutefois que
les commentaires sont en franais dans louvrage papier pour plus de clart dans les
explications, mais que le code tlcharger est le code original, non traduit, tel quil
a t rdig par Michael Margolis.
Un accs aux pages consacres au livre original sur le site (en anglais) de OReilly
vous permettra de prendre connaissance de commentaires et dventuelles mises
jour au cours du temps.
Une table de correspondances entre les recettes du livre en anglais et celles choisies
pour cette version franaise vous permettra de vous reprer dans le code des recettes.
Vous trouverez galement dans ces complments lensemble des hyperliens actifs
de manire vous viter de les ressaisir dans votre navigateur.

XIV

1 COMMUNICATIONS SRIE

1.0 Introduction
Les communications srie offrent une faon simple et souple de faire communiquer
lArduino avec un ordinateur ou dautres priphriques. Ce chapitre explique
comment envoyer et recevoir des informations grce cette fonctionnalit.
En connectant le port srie de lArduino votre ordinateur, vous pouvez charger
des sketchs. Ce processus envoie des donnes depuis votre ordinateur vers lArduino
et lArduino envoie son tour des messages dtat lordinateur pour confirmer le
bon droulement du transfert. Les recettes de ce chapitre montrent comment on
peut utiliser cette liaison pour envoyer et recevoir des informations entre lArduino
et votre ordinateur ou tout autre priphrique srie.
Avertissement
Les communications srie sont aussi un outil pratique pour le dbogage. Vous pouvez envoyer des
messages de dbogage partir de lArduino vers lordinateur et les afficher sur lcran de lordinateur
ou sur un affichage LCD externe.

Dunod Toute reproduction non autorise est un dlit.

LEnvironnement de dveloppement intgr (EDI) Arduino fournit un Moniteur


srie (illustr la figure 1.1) pour afficher les donnes srie envoyes partir de
lArduino.

Figure 1.1 cran du Moniteur srie de lArduino.

Vous pouvez aussi envoyer des donnes partir du Moniteur srie vers lArduino
en saisissant du texte dans la zone situe gauche du bouton Envoyer. La valeur

1 Communications srie

en bauds (la vitesse laquelle les donnes sont transmises est exprime en bits par
seconde) est slectionne dans la liste droulante situe en bas droite. Vous pouvez
utiliser la liste intitule Pas de fin de ligne pour gnrer automatiquement un
retour de chariot ou une combinaison de retour de chariot et de nouvelle ligne la
fin de chaque message envoy grce au bouton Envoyer, en choisissant lune des
options de la liste droulante.
Un sketch Arduino peut utiliser le port srie pour accder de manire indirecte (en
gnral via un programme proxy crit dans un langage tel que Processing) toutes
les ressources (mmoire, cran clavier, souris, connectivit rseau, etc.) que possde
votre ordinateur. Ce dernier peut aussi utiliser la liaison srie pour communiquer
avec des capteurs ou dautres priphriques connects lArduino.
La mise en uvre des communications srie implique du matriel et du logiciel. Le
matriel fournit la signalisation lectrique entre lArduino et le priphrique avec
lequel il communique. Le logiciel utilise le matriel pour envoyer des octets ou des
bits que le matriel connect interprte. Les bibliothques srie Arduino masquent
la plus grande partie de la complexit du matriel, mais cela aide de comprendre
les bases, particulirement si vous avez besoin de dtecter les erreurs dans un projet
mettant en uvre des communications srie.
Matriel srie

Le matriel srie envoie et reoit des donnes sous la forme dimpulsions lectriques
qui reprsentent les bits squentiels. Les zros et les uns qui transportent les
informations qui composent un octet peuvent tre reprsents de diffrentes manires.
Le modle utilis par Arduino est 0 volt pour reprsenter une valeur de bit gale 0,
et 5 volts (ou 3,3 volts) pour reprsenter une valeur de bit gale 1.
Note
Lutilisation de 0 volt (pour 0) et 5 volts (pour 1) est trs courante. On parle alors de niveau TTL car
ctait la manire dont les signaux taient reprsents dans lune des premires implmentations de la
logique numrique, appele Transistor-Transistor Logic (TTL).

Les cartes comme le Uno, le Duemilanove, le Diecimila, le Nano et le Mega


ont un circuit pour convertir le port srie matriel de la puce Arduino en une
connexion USB pour la liaison au port srie matriel. Dautres cartes, comme le
Mini, le Pro, le Pro Mini, le Boarduino, le Sanguino, et la Modern Device Bare
Bones Board ne prennent pas en charge lUSB et ncessitent un adaptateur pour
se connecter un ordinateur et convertir les signaux TTL en USB. Consultez
http://www.arduino.cc/en/Main/Hardware pour de plus amples informations sur ces
cartes.
Voici une liste dadaptateurs populaires :
Adaptateur Mini USB (http://arduino.cc/en/Main/MiniUSB)

1.0 Introduction

Dunod Toute reproduction non autorise est un dlit.

Adaptateur USB Serial Light (http://arduino.cc/en/Main/USBSerial)


Adaptateur FTDI USB TTL (http://www.ftdichip.com/Products/FT232R.htm)
Carte Modern Device USB BUB (http://shop.moderndevice.com/products/usb-bub)
Seeedstudio UartSBee (http://www.seeedstudio.com/depot/uartsbee-v31-p-688.
html)
Certains priphriques srie utilisent le standard RS-232 pour la connexion srie. Ils
ont en gnral un connecteur neuf broches, et un adaptateur est ncessaire pour
les utiliser avec lArduino. La norme RS-232 est un protocole de communication
ancien qui utilise des niveaux de voltage incompatibles avec les broches numriques
de lArduino.
On peut acheter des cartes Arduino compatibles avec les niveaux des signaux RS-232,
comme le Freeduino Serial v2.0 (http://www.nkcelectronics.com/freeduino-serial-v20board-kit-arduino-diecimila-compatib20.html).
Les adaptateurs RS-232 suivants connectent les signaux RS-232 aux broches 5V (ou
3,3V) de lArduino :
Adaptateur RS-232 vers TTL 3V5,5V (http://www.nkcelectronics.com/rs232-tottl-converter-board-33v232335.html)
Kits dadaptateurs P4 RS232 vers TTL Serial (http://shop.moderndevice.com/
products/p4)
RS232 Shifter SMD (http://www.sparkfun.com/commerce/product_info.php?
products_id=449)
Un Arduino standard a un seul port srie matriel, mais la communication srie
est aussi possible en utilisant des bibliothques logicielles pour muler des ports
supplmentaires (canaux de communication) afin de fournir la connectivit
plusieurs priphriques. La communication srie logicielle ncessite beaucoup de
ressources de la part du contrleur Arduino pour envoyer et recevoir des donnes, si
bien quelle nest pas aussi rapide et efficace que la communication srie matrielle.
LArduino Mega possde quatre ports matriels srie qui peuvent communiquer avec
quatre priphriques srie diffrents. Un seul a un adaptateur USB intgr (vous
pouvez cbler un adaptateur USB-TTL sur les autres ports srie). Le tableau 1.1 liste
les noms des ports et les broches utilises par les ports srie du Mega.
Tableau 1.1 Ports srie de lArduino Mega
Nom du port
Serial
Serial1
Serial2
Serial3

Broche de transmission
1 (aussi USB)
18
16
14

Broche de rception
0 (aussi USB)
19
17
15

1 Communications srie

Communication srie logicielle

On utilise en gnral la bibliothque srie Arduino intgre pour communiquer avec


les ports srie matriels. Les bibliothques srie simplifient lutilisation des ports
srie en masquant la complexit du matriel.
Il arrive parfois que lon ait besoin de plus de ports srie que le nombre de
ports matriels disponibles. Si tel est le cas, vous pouvez utiliser une bibliothque
supplmentaire qui mule par programme le matriel srie. Les recettes 1.13 et 1.14
montrent comment utiliser une bibliothque srie logicielle pour communiquer avec
plusieurs priphriques.

Protocole de message srie

Les bibliothques srie matrielles ou logicielles grent lenvoi et la rception des


informations. Ces informations sont souvent composes de groupes de variables qui
ont besoin dtre envoyes ensemble. Pour que ces informations soient interprtes
correctement, le destinataire doit reconnatre le dbut et la fin de chaque message.
Une communication srie intelligible, ou toute forme de communication impliquant
des machines, ne peut saccomplir que si lmetteur et le destinataire saccordent
sur la manire dont les informations sont organises dans le message. Lorganisation
formelle dun message et ltendue des rponses appropries aux demandes sappelle
un protocole de communication.
Les messages peuvent contenir un ou plusieurs caractres spciaux qui identifient le
dbut du message que lon appelle en-tte. Un ou plusieurs caractres peuvent
aussi tre utiliss pour identifier la fin du message que lon appelle terminateur.
Les recettes de ce chapitre illustrent des exemples de messages dans lesquels les
valeurs qui composent le corps du message peuvent tre envoyes soit au format
texte, soit au format binaire.
Lenvoi et la rception de messages au format texte impliquent lenvoi de commandes
et de valeurs numriques sous la forme de lettres et de mots lisibles par un tre humain.
Les nombres sont envoys sous la forme de chanes de chiffres qui reprsentent la
valeur. Par exemple, si la valeur est 1234, les caractres 1, 2, 3 puis 4 sont envoys
sous la forme de caractres individuels.
Les messages binaires se composent des octets que lordinateur utilise pour reprsenter
les valeurs. Les donnes binaires sont en gnral plus efficaces (car elles ncessitent
moins doctets envoyer), mais les donnes ne sont pas aussi lisibles que du texte,
ce qui les rend plus difficiles dboguer. Par exemple, Arduino reprsente la valeur
1234 par les octets 4 et 210 (4 * 256 + 210 = 1234). Si le priphrique auquel vous
tes connect nenvoie ou ne reoit que des donnes binaires, cest le format que
vous aurez utiliser, mais si vous avez le choix, les messages au format texte sont
plus simples implmenter et dboguer.

1.0 Introduction

Il y a de nombreuses manires daborder les problmes logiciels et certaines recettes


de ce chapitre illustrent deux ou trois faons diffrentes darriver au mme rsultat.
Les diffrences (par exemple, lenvoi de donnes au format texte plutt que binaire)
permettent doffrir un quilibre entre la simplicit et lefficacit. Quand vous avez le
choix, prfrez la solution que vous trouvez la plus facile comprendre et adapter
ce sera probablement la premire solution traite. Les solutions alternatives peuvent
tre un peu plus efficaces ou plus appropries pour un protocole spcifique, mais la
bonne mthode est celle que vous trouvez la plus simple pour votre projet.
Environnement de dveloppement Processing
Certains exemples de ce chapitre utilisent le langage Processing pour envoyer et recevoir des messages
srie sur un ordinateur communiquant avec un Arduino.
Processing est un outil gratuit open source qui emploie un environnement de dveloppement similaire
Arduino, mais au lieu dexcuter vos sketchs sur un microcontrleur, vos sketchs Processing
sexcutent sur votre ordinateur. Vous en apprendrez plus sur Processing et tlchargerez tout ce
dont vous avez besoin en visitant le site http://processing.org.
Processing est bas sur le langage Java, mais les exemples de code Processing de cet ouvrage devraient
tre faciles traduire dans dautres environnements qui prennent en charge les communications srie.
Processing est livr avec des exemples de sketchs qui illustrent la communication entre Arduino et
Processing. SimpleRead est un exemple Processing qui inclut du code Arduino. Dans Processing,
slectionnez FileExamplesLibrariesSerialSimpleRead pour voir un exemple qui lit des
donnes partir du port srie et modifie la couleur dun rectangle quand on appuie sur un interrupteur
connect un Arduino puis quon le relche.

Dunod Toute reproduction non autorise est un dlit.

Nouveauts de lArduino 1.0

Arduino 1.0 a introduit un certain nombre damliorations et de modifications des


fonctions Serial :
Serial.flush attend prsent que toutes les donnes sortantes soient envoyes
au lieu dannuler les donnes reues. Vous pouvez utiliser linstruction suivante
pour annuler toutes les donnes du buffer de rception : while(Serial.read()
>= 0) ; // vide le buffer de rception

Serial.write et Serial.print ne sont pas bloquantes. Le code prcdent


attendait que tous les caractres soient envoys avant de rendre la main. partir
de la version 1.0, les caractres envoys avec Serial.write sont transmis en
arrire-plan ( partir dun gestionnaire dinterruption), ce qui permet au code du
sketch de retourner immdiatement au traitement. Cest en gnral une bonne
chose (cela rend le sketch plus ractif), mais on souhaite parfois attendre que tous
les caractres soient envoys. On peut raliser cela en appelant Serial.flush()
immdiatement aprs Serial.write().
Les fonctions daffichage Serial retournent le nombre de caractres affichs. Cela
est utile quand le texte de la sortie a besoin dtre align ou pour les applications
qui envoient des donnes incluant le nombre total de caractres envoys.

1 Communications srie

Il y a une fonctionnalit danalyse intgre pour les flux comme Serial afin
dextraire facilement les nombres et trouver du texte. Reportez-vous la discussion
de la recette 1.5 pour en apprendre plus sur lutilisation de cette fonctionnalit.
La bibliothque SoftwareSerial qui est livre avec Arduino a t beaucoup
amliore (voir les recettes 1.13 et 1.14).
Une fonction Serial.peek a t ajoute pour permettre de lire le caractre
suivant du buffer de rception. la diffrence de Serial.read, le caractre nest
pas supprim du buffer avec Serial.peek.
Complments

Un tutoriel sur le protocole RS-232 est disponible http://www.arduino.cc/en/


Tutorial/ArduinoSoftwareRS232. On trouve aussi de nombreuses informations et
des liens sur le site web Serial Port Central, http://www.lvr.com/serport.htm.
Il existe de plus des livres sur le langage Processing :
Getting Started with Processing : A Quick, Hands-on Introduction de Casey Reas
et Ben Fry (Make).
Processing: A Programming Handbook for Visual Designers and Artists de Casey
Reas et Ben Fry (MIT Press).
Visualizing Data de Ben Fry (OReilly).
Processing : Creative Coding and Computational Art de Ira Greenberg (Apress).
Making Things Talk de Tom Igoe (Make). Cet ouvrage qui couvre Processing et
Arduino fournit de nombreux exemples de code de communication.

Envoi des informations de dbogage de lArduino


1.1 1.1
lordinateur
Problme

On veut envoyer du texte et des donnes pour les afficher sur lordinateur en utilisant
lEDI Arduino ou le programme de terminal srie de votre choix.
Solution

Ce sketch affiche des nombres squentiels sur le Moniteur srie :


/*
* Sketch SerialOutput
* Affiche des nombres sur le port srie
*/
void setup()
{
Serial.begin(9600); // envoie et reoit 9600 bauds

1.1 Envoi des informations de dbogage de lArduino lordinateur

}
int number = 0;
void loop()
{
Serial.print("Le nombre est ");
Serial.println(number);
// affiche le nombre
delay(500); // on attend une demi-seconde entre les nombres
number++; // on passe au nombre suivant
}

Connectez lArduino votre ordinateur et chargez ce sketch. Cliquez sur licne du


Moniteur srie dans lEDI et vous devriez voir apparatre la sortie suivante :
Le nombre est 0
Le nombre est 1
Le nombre est 2

Discussion

Dunod Toute reproduction non autorise est un dlit.

Pour afficher du texte et des nombres partir dun sketch sur un ordinateur par
le biais dune liaison srie, placez linstruction Serial.begin(9600) dans setup(),
puis utilisez les commandes Serial.print() pour afficher le texte et les valeurs que
vous voulez voir apparatre.
Le Moniteur srie peut afficher des donnes srie envoyes partir de lArduino.
Pour dmarrer le Moniteur srie, cliquez sur licne du Moniteur srie dans la barre
doutils qui est illustre la figure 1.2. Une nouvelle fentre souvre et affiche la
sortie de lArduino.

Figure 1.2 cran du Moniteur srie Arduino.

1 Communications srie

Votre sketch doit appeler la fonction Serial.begin() avant de pouvoir utiliser


lentre ou la sortie srie. La fonction na quun seul paramtre : la vitesse de
communication souhaite. Vous devez utiliser la mme vitesse pour lenvoi et la
rception, sinon vous verrez apparatre nimporte quoi lcran (voire rien du tout).
Cet exemple, ainsi que la plupart des autres exemples de ce livre, utilise une vitesse
de 9 600 bauds (le baud est la mesure du nombre de bits transmis en une seconde).
La vitesse de 9 600 bauds correspond approximativement 1 000 caractres par
seconde. Vous pouvez utiliser des vitesses plus lentes ou plus rapides (allant de 300
115 200 bauds), mais il faut vous assurer que lenvoi et la rception utilisent la
mme vitesse. Le Moniteur srie dfinit la vitesse laide dune liste droulante
(en bas droite de la fentre du Moniteur srie ; voir la figure 1.2). Si votre sortie
ressemble ceci :
3??f<x3 ??f<

vous devez vrifier que la vitesse slectionne dans le Moniteur srie correspond la
vitesse dfinie par Serial.begin() dans le sketch.
Note
Si les vitesses denvoi et de rception sont dfinies correctement et que vous obtenez toujours
des caractres sotriques, vrifiez que vous avez slectionn la bonne carte dans lEDI (menu
OutilsType de carte). Toutes les cartes nont pas la mme vitesse et si vous avez slectionn la
mauvaise, choisissez la bonne et rechargez le sketch dans la carte.

Vous pouvez afficher du texte avec la fonction Serial.print(). Les chanes (texte
encadr par des guillemets) seront affiches telles quelles (mais sans les guillemets).
Par exemple, le code suivant :
Serial.print("Le nombre est ");

affiche :
Le nombre est

Les valeurs (nombres) que lon affiche dpendent du type de variable (voir la recette 1.
2). Par exemple, laffichage dun entier va faire apparatre sa valeur numrique ; si la
variable number est gale 1, le code suivant :
Serial.println(number);

va afficher :
1

Dunod Toute reproduction non autorise est un dlit.

1.1 Envoi des informations de dbogage de lArduino lordinateur

Dans le sketch de cette recette, le nombre affich est 0 au dpart de la boucle, puis
il est incrment chaque tour de boucle. Le ln la fin de println provoque
laffichage de linstruction suivante sur une nouvelle ligne.
Cela devrait vous donner des ides pour afficher du texte et la valeur dcimale des
entiers. Reportez-vous la recette 1.2 pour de plus amples informations sur les
options de mise en forme de laffichage.
Il peut tre souhaitable denvisager lutilisation dun autre programme de terminal
qui possde plus de fonctionnalits que le Moniteur srie, notamment laffichage des
donnes au format texte ou binaire (ou les deux la fois), laffichage des caractres de
contrle, ou la journalisation dans un fichier. Il existe de nombreux programmes de
terminal tiers, dont les suivants qui sont recommands par les utilisateurs dArduino :
CoolTerm (http://freeware.the-meiers.org/ ) Programme de terminal freeware
convivial pour Windows, Mac et Linux.
CuteCom (http://cutecom.sourceforge.net/ ) Programme de terminal open source
pour Linux.
Bray Terminal (https://sites.google.com/site/terminalbpp/ ) Excutable gratuit
pour PC.
GNU screen (http://www.gnu.org/software/screen/ ) Programme de gestion
dcran virtuel open source qui prend en charge les communications srie ; livr
avec Linux et Mac OS X.
moserial (http://live.gnome.org/moserial) Autre programme de terminal open
source pour Linux.
PuTTY (http://www.chiark.greenend.org.uk/sgtatham/putty/ ) Programme
open source SSH pour Windows et Linux qui prend en charge les communications srie.
RealTerm (http://realterm.sourceforge.net/ ) Programme de terminal open source
pour PC.
ZTerm (http://homepage.mac.com/dalverson/zterm/ ) Shareware pour Mac.
De plus, un article du wiki Arduino explique comment configurer Linux pour quil
communique avec un Arduino laide de TTY (http://www.arduino.cc/playground/
Interfacing/LinuxTTY ).
Vous pouvez utiliser un cran LCD comme priphrique de sortie srie, mais les
fonctionnalits seront limites. Vrifiez la documentation pour voir comment votre
cran gre les retours de chariot car certains crans ne gnrent pas automatiquement
une nouvelle ligne aprs une instruction println.

Complments

La bibliothque Arduino LiquidCrystal pour laffichage du texte sur des crans


LCD utilise des fonctionnalits proches de la bibliothque Serial, si bien que vous

1 Communications srie

pouvez utiliser la plupart des recettes de ce chapitre avec cette bibliothque (voir le
chapitre 8).

1.2 de texte mis en forme et de donnes


1.2 Envoi
numriques partir de lArduino
Problme

On veut envoyer des donnes srie partir de lArduino pour les afficher sous la
forme de texte, de valeurs dcimales, hexadcimales ou binaires.
Solution

On peut afficher des donnes sur le port srie dans plusieurs formats diffrents ; le
sketch suivant illustre toutes les options de mise en forme :
/*
* SerialFormatting
* Affiche des valeurs dans diffrents formats sur le port srie
*/
char chrValue = 65; // valeurs de dpart afficher
byte byteValue = 65;
int intValue = 65;
float floatValue = 65.0;
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println("chrValue: ");
Serial.println(chrValue);
Serial.write(chrValue);
Serial.println();
Serial.println(chrValue,DEC);
Serial.println("byteValue: ");
Serial.println(byteValue);
Serial.write(byteValue);
Serial.println();
Serial.println(byteValue,DEC);
Serial.println("intValue: ");
Serial.println(intValue);
Serial.println(intValue,DEC);
Serial.println(intValue,HEX);
Serial.println(intValue,OCT);
Serial.println(intValue,BIN);
Serial.println("floatValue: ");
Serial.println(floatValue);
delay(1000); // on attend une seconde avant
chrValue++; // l'affichage de la valeur suivante

10

1.2 Envoi de texte mis en forme et de donnes numriques partir de lArduino

byteValue++;
intValue++;
floatValue +=1;
}

Voici un aperu de la sortie (condense en quelques lignes) :


chrValue:
byteValue:
intValue:
floatValue:
chrValue:
byteValue:
intValue:
floatValue:

A A
65 A
65 65
65.00
B B
66 B
66 66
66.00

65
65
41 101 1000001
66
66
42 102 1000010

Dunod Toute reproduction non autorise est un dlit.

Discussion

Laffichage dune chane de caractres est simple : Serial.print("hello world");


envoie la chane hello world sur un priphrique lautre bout du port srie. Si
vous voulez sauter la ligne aprs laffichage de la sortie, utilisez Serial.println()
la place de Serial.print().
Laffichage de valeurs numriques peut tre un peu plus compliqu. La manire
dont les valeurs byte et integer sont affiches dpend du type de variable et dun
paramtre de mise en forme optionnel. Le langage est trs laxiste sur la faon dont
on peut faire rfrence une mme valeur ayant des types de donnes diffrents.
Cette souplesse peut cependant tre droutante car mme si les valeurs numriques
sont similaires, le compilateur les considre comme ayant des types diffrents avec
un comportement diffrent. Par exemple, laffichage dune donne de type char,
byte et int ayant la mme valeur ne produira pas ncessairement le mme rsultat.
Voici quelques exemples particuliers de variables qui ont toutes des valeurs
identiques :
char asciiValue = 'A'; // En ASCII, la lettre A a la valeur 65
char chrValue = 65; // caractre sign sur 8 bits, vaut aussi 'A'
byte byteValue = 65; // caractre non sign sur 8 bits, vaut aussi 'A'
int intValue = 65; // integer sign sur 16 bits initialis la valeur 65
float floatValue = 65.0; // float avec une valeur de 65

Le tableau 1.2 illustre ce que lon voit quand on affiche des variables avec les routines
Arduino.
Note
Lexpression Serial.print(val,BYTE); nest plus prise en charge en Arduino 1.0.
Si votre code a besoin que des variables byte se comportent comme des variables char (cest--dire quil
les affiche comme des caractres ASCII), vous devez le modifier en utilisant Serial.write(val);.

11

1 Communications srie
Tableau 1.2 Formats daffichage avec Serial.print
Type
de
donnes

print
(val)

print
(val,DEC)

write
(val)

print
(val,HEX)

print
(val,OCT)

print
(val,BIN)

char

65

41

101

1000001

byte

65

65

41

101

1000001

int

65

65

41

101

1000001

long

Le format dune valeur long est identique celui dune valeur int
65.00
Affichage non pris en charge pour les valeurs en virgule flottante
65.00
Les valeurs double se comportent comme les valeurs float

float
double

Le sketch de cette recette utilise une ligne spare de code source pour chaque
instruction print, ce qui peut rendre les instructions print complexes volumineuses.
Par exemple, pour afficher la ligne suivante :
A 5 secondes : vitesse = 17, distance = 120

on code en gnral de la manire suivante :


Serial.print("A ")
Serial.print(t)
Serial.print(" secondes : vitesse = ")
Serial.print(v)
Serial.print(", distance = ")
Serial.println(d)

Cela fait beaucoup de lignes de code pour une seule ligne daffichage et vous pouvez
combiner le tout de la manire suivante :
Serial.print("A "); Serial.print(t); Serial.print(" secondes, vitesse = ");
Serial.print(v); Serial.print(", distance = ");Serial.println(d);

Vous pouvez aussi employer la fonctionnalit insertion de style du compilateur utilis


par Arduino pour mettre en forme vos instructions print. Vous pouvez tirer parti
de certaines fonctionnalits avances de C++ (syntaxe dinsertion de streaming et
modles) dont vous pouvez vous servir si vous dclarez un modle de streaming
dans votre sketch. Pour raliser cela, le plus simple est dinclure la bibliothque
Streaming dveloppe par Mikal Hart. Vous pourrez en apprendre plus sur cette
bibliothque et tlcharger son code sur le site web de Mikal (http://arduiniana.org/
libraries/streaming/ ).
Si vous utilisez la bibliothque Streaming, la ligne de code suivante procure le mme
rsultat que les lignes prcdentes :
Serial << "A " << t << " secondes, vitesse = " << v << ", distance = " << d <<
endl;

12

1.3 Rception de donnes srie sur lArduino

Complments

Site officiel Arduino :


http://arduino.cc/en/Reference/HomePage : commandes srie.
http://www.arduino.cc/playground/Main/StreamingOutput : affichage en streaming (insertion de style).

1.3 Rception
de donnes srie sur lArduino
1.3
Problme

On veut recevoir des donnes sur lArduino depuis un ordinateur ou un autre


priphrique srie, par exemple pour que lArduino ragisse des commandes ou
des donnes envoyes depuis un ordinateur.
Solution

Dunod Toute reproduction non autorise est un dlit.

Il est facile de recevoir des valeurs de 8 bits (char et byte), car les fonctions Serial
utilisent des valeurs de 8 bits. Ce sketch reoit un chiffre (de 0 9) et fait clignoter
la LED de la broche 13 un rythme proportionnel la valeur reue :
/*
* Sketch SerialReceive
* Fait clignoter la LED un rythme proportionnel la valeur reue
*/
const int ledPin = 13; // broche laquelle la LED est connecte
int
blinkRate=0;
// rythme de clignotement stock dans cette variable
void setup()
{
Serial.begin(9600); // Initialise le port srie pour envoyer et recevoir
9600 bauds
pinMode(ledPin, OUTPUT); // Dfinit cette broche en sortie
}
void loop()
{
if ( Serial.available()) // Vrifie si au moins un caractre est disponible
{
char ch = Serial.read();
if( isDigit(ch) ) // est-ce un chiffre compris entre 0 et 9 ?
{
blinkRate = (ch - '0');
// valeur ASCII convertie en chiffre
blinkRate = blinkRate * 100; // rythme = 100ms * valeur du chiffre
}
}
blink();
}
// On fait clignoter la LED au rythme dtermin par blinkRate
void blink()
{
digitalWrite(ledPin,HIGH);

13

1 Communications srie

delay(blinkRate); // l'attente dpend de la valeur de blinkRate


digitalWrite(ledPin,LOW);
delay(blinkRate);
}

Chargez le sketch et envoyez des messages laide du Moniteur srie. Ouvrez le


Moniteur srie en cliquant sur licne du Moniteur (voir la recette 1.1) et saisissez
un chiffre dans la zone de texte au sommet de la fentre Moniteur srie. En cliquant
sur le bouton Envoyer, vous envoyez lArduino le caractre saisi dans la zone de
texte. Si vous avez bien saisi un chiffre, vous devriez voir le rythme de clignotement
changer.
Discussion

La conversion des caractres ASCII reus peut se rvler problmatique si vous ntes
pas familier avec la manire dont le code ASCII reprsente les caractres. Lexemple
suivant convertit le caractre ch en sa valeur numrique :
blinkRate = (ch - '0');

// valeur ASCII convertie en valeur numrique

Les caractres ASCII de 0 9 ont une valeur qui va 48 57. La conversion de


1 en sa valeur numrique est ralise en soustrayant 0 car 1 a une valeur
ASCII de 49, si bien que 48 (la valeur ASCII de 0 ) doit tre soustrait pour
obtenir le nombre un. Par exemple, si ch reprsente le caractre 1, sa valeur ASCII
est 49. Lexpression 49- '0' est identique 49-48. Cela est gal 1, qui est la valeur
numrique du caractre 1.
En dautres termes, lexpression (ch - '0') est identique (ch - 48) et convertit
la valeur ASCII de la variable ch en une valeur numrique.
La rception de nombres plusieurs chiffres implique laccumulation des caractres
jusqu ce quun caractre qui ne soit pas un chiffre valide soit dtect. Le code
suivant utilise les mmes fonctions setup() et blink() que dans lexemple prcdent,
mais il accumule les chiffres tant quun caractre de nouvelle ligne na pas t reu.
Il utilise la valeur accumule pour dfinir le rythme de clignotement.
Note
Le caractre de nouvelle ligne (valeur 10 en ASCII) peut tre ajout automatiquement chaque fois
que lon clique sur le bouton Envoyer. Le Moniteur srie a une liste droulante en bas de la fentre
Moniteur srie (voir la figure 1.1) ; il suffit de changer loption Pas de fin de ligne en Nouvelle
ligne .

Modifiez le code de la manire suivante :


int value;
void loop()
{
if( Serial.available())

14

1.3 Rception de donnes srie sur lArduino

{
char ch = Serial.read();
if( isDigit(ch) )// est-ce un chiffre compris entre 0 et 9 ?
{
value = (value * 10) + (ch - '0'); // oui, on accumule la valeur
}
else if (ch == 10) // est-ce un caractre de nouvelle ligne ?
{
blinkRate = value; // dfinit blinkrate avec la valeur accumule
Serial.println(blinkRate);
value = 0; // rinitialise la valeur 0 pour tre prt pour la
squence suivante de chiffres
}
}
blink();
}

Saisissez une valeur, par exemple 123, dans la zone de texte du Moniteur srie et
cliquez sur Envoyer ; le rythme de clignotement sera dfini 123 millisecondes.
Chaque chiffre est converti partir de sa valeur ASCII en valeur numrique. Comme
les nombres sont en base 10, chaque chiffre successif est multipli par 10. Par
exemple, la valeur du nombre 234 est 2 * 100 + 3 * 10 + 4. Voici le code pour
accomplir cela :
if( isDigit(ch) ) // est-ce un chiffre compris entre 0 et 9 ?
{
value = (value * 10) + (ch - '0'); // oui, on accumule la valeur
}

Dunod Toute reproduction non autorise est un dlit.

Si vous voulez grer des nombres ngatifs, votre code doit reconnatre le signe moins
('-') en en-tte. Dans cet exemple, chaque valeur numrique doit tre spare par
un caractre qui nest pas un chiffre ou un signe moins :
int value = 0;
int sign = 1;
void loop()
{
if( Serial.available())
{
char ch = Serial.read();
if( isDigit(ch) ) // est-ce un chiffre compris entre 0 et 9 ?
value = (value * 10) + (ch - '0'); // oui, on accumule la valeur
else if( ch == '-')
sign = -1;
else // cela suppose que tout caractre n'tant pas un chiffre ou un signe
moins termine la valeur
{
value = value * sign ; // dfinit la valeur avec la valeur accumule
Serial.println(value);
value = 0; // rinitialise la valeur 0 pour tre prt pour la
squence suivante de chiffres
sign = 1;

15

1 Communications srie

}
}
}

Une autre approche pour convertir les chanes de caractres reprsentant des nombres
consiste utiliser la fonction de conversion du langage C appele atoi (pour les
variables int) ou atol (pour les variables long). Ces fonctions au nom obscur
convertissent une chane en entiers ou en entiers longs. Pour les utiliser, vous devez
recevoir et stocker la totalit de la chane dans un tableau de caractres avant de
pouvoir appeler la fonction de conversion.
Ce fragment de code termine la saisie des chiffres quand le caractre saisi nest pas
un chiffre (ou si le buffer est plein) :
const int MaxChars = 5; // une chane int contient jusqu' 5 chiffres et
// est termine par un 0 pour indiquer la fin de la
chane
char strValue[MaxChars+1]; // doit tre suffisamment grand pour les chiffres
et la valeur nulle de terminaison
int index = 0;
// l'indice du tableau stockant les chiffres reus
void loop()
{
if( Serial.available())
{
char ch = Serial.read();
if( index < MaxChars && isDigit(ch) ){
strValue[index++] = ch; // ajoute le caractre ASCII la chane;
}
else
{
// ici quand le buffer est plein ou si un caractre n'est pas un chiffre
strValue[index] = 0;
// on termine la chane par un 0
blinkRate = atoi(strValue); // on utilise atoi pour convertir la chane
en un int
index = 0;
}
}
blink();
}

strValue est une chane de chiffres cre partir des caractres reus sur le port srie.
atoi (abrviation de ASCII vers integer) est une fonction qui convertit une chane
de caractres en un entier (atol convertit en un entier long).
Arduino 1.0 a ajout la fonction serialEvent que vous pouvez utiliser pour grer les
caractres srie entrants. Si vous avez du code au sein dune fonction serialEvent

dans votre sketch, celui-ci sera appel une fois chaque passage dans la fonction
loop. Le sketch suivant accomplit la mme tche que le premier sketch de cette
recette, mais il utilise serialEvent pour grer les caractres entrants :

16

You might also like