You are on page 1of 454

Arduino:Premierspasen

informatiqueembarque

Auteurs:
SimonLandrault(Eskimon)
HippolyteWeisslinger(olyte)

Leblogd'Eskimon

ditiondu19juin2014

Prface
Contenudecetebook
Ce livre numrique vous propose de dcouvrir l'environnement de dveloppement
Arduino. Arduino est une plateforme de dveloppement lectronique et informatique
embarqu. Elle doit son succs auprs des hobbyistes et amateurs d'lectronique
grceunfaiblecot,ungaindetempspourdesphasesdeprototypageetunetrs
grande communaut active autour de cette plateforme. Afin de faire profiter au plus
grandnombredelapuissancedecettepetiteplateforme,cetutorielavulejourpour
proposeruneressourcequisoitaccessibleauxnophytestoutenrestantrigoureuseet
explorantdenombreuxaspects.Aprsunelonguecriture,noussommesfiersdevous
prsenter cet ebook regroupant l'ensemble du tutoriel que vous pourrez dornavant
emmenerpartoutavecvous,sansavoirbesoind'uneconnexioninternet!Celivreest
l'exacte copie de sa version en ligne. Les schmas sont les mmes et les codes
sourcesaussi.Seulespeuventdiffrerquelquescorrectionsdefautesoud'imprcisions
etventuellementdenouvellesannexesquineseraientalorspascrites.Pourcela,la
datedepublicationestvisibleenpremiredecouverture.Afindevousteniraucourant
des modifications, rendezvous sur la page de prsentation du livre qui tiendra un
compterendudesmodificationsdudocument.

proposdesauteursetdelardaction
Cetouvrageatralispardeuxauteurs:Eskimonetolyte.Ilssesontrencontrssur
feuleSiteduZro.olyte,l'initiateurduprojetavaitbesoind'uncoupdemainpourcrire
etaalorsproposEskimondelerejoindrepourtravaillerdeuxsurletutoriel.
Plus de deux ans plus tard, aprs de nombreuses pages crites, montages bricols,
schmas dessins et vidos ralises, le tutoriel touche enfin sa fin. 7 parties
regroupant une trentaine de chapitres permettent alors de dcouvrir de manire trs
largeetdtailleleframeworkArduino.
Depuis dbut 2014, le tutoriel est disponible dans une version jour sur le blog
d'Eskimon. En effet, le site du zro ayant volu et ne permettant plus de continuer
l'criture,desmesuresontdutreprisespourpouvoircontinuerfairevivreetvoluer
l'critureaufildenosides.
Le tutoriel est en licence Creative Common CCBYNCSA.
Cela signifie
quevouspouvezrecopierlecontenudututosivousnecomptezpasfaired'utilisation
commerciale(clauseNC)decedernieretquevousn'oubliezpasdedired'oilvientet
parquiilatcrit(clauseBY)).Vousdevezaussileredistribuersouscettemme
licence(clauseSA).

Remerciements
Denombreusespairesdemainsetd'yeuxsesontpenchessurcedocument.Parmis
elles, on retrouve des validateurs pour le ct technique de la rdaction et des
relecteurspourtoutelapartieorthographique.
Jetienssincrementremerciertoutescespersonnesquisesontrelayesetonteula
patiencederelire,d'approuver,decorrigeroudereformulercertainesphrasesetvoyant
1

leursrtinessouffrirsurnosfautesd'crituresnocturnesettroprapides.
MercidoncAstalaseven,cshark,elyppire933,mewtow,Nathalya,PG06,Sandhose,
zeqLetsrementd'autrespersonnesquisereconnaitront(excusezmapauvremmoire
et mon tourderie). Merci aussi vous, lecteurs, pour tous les encouragements,
propositionsetcorrectionsquevousavezpuapporteraufildesannes.L'critured'un
tutorielestuntravaildelonguehaleineetn'auraitsutreterminesivousn'aviezpas
tlpournoussupporter.
Jevoussouhaitemaintenantunebonnelectureetj'esprequevousl'apprcierez.
bientt!

Sommaire
001.PartieIDcouvertedel'Arduino

1. Prsentation
2. Quelquesbaseslmentaires
3. Lelogiciel
4. Lematriel
5. LelangageArduino(1/2)
6. LelangageArduino(2/2)

010.PartieIIGestiondesentres/sorties

1. Notrepremierprogramme!
2. Introduireletemps
3. [TP]Feuxdesignalisationroutire
4. Unsimplebouton
5. Afficheurs7segments
6. [TP]Parking

011.PartieIIILacommunicationavecArduino

1. Gnralits
2. Envoyer/Recevoirdesdonnes
3. [TP]Baignadeinterdite
4. Votreordinateuretsaliaisonsrie

100.PartieIVLesgrandeursanalogiques

1. Lesentresanalogiquesdel'Arduino
2. [TP]VumtreLED
3. Etlessorties"analogiques",enfin...presque!
4. [Exercice]Uneanimation"YouTube"

101.PartieVLescapteursetl'environnementautourd'Arduino

1. Gnralitssurlescapteurs
2. Diffrentstypesdemesure
3. Descapteursplusvolus

110.PartieVILemouvementgrceauxmoteurs

1. Moteurcourantcontinu
2. ServoMoteur
3. Moteurpaspas

111.PartieVIIL'affichage,uneautremanired'interagir

1. LescransLCD
2. Votrepremiertexte!
3. [TP]Supervision

[Arduino1]DcouvertedelArduino
Dans cette premire partie, nous ferons nos premiers pas avec Arduino. Nous allons
avant tout voir de quoi il sagit exactement, essayer de comprendre comment cela
fonctionne, puis installerons le matriel et le logiciel pour ensuite enchainer sur
lapprentissagedulangagedeprogrammationncessaireaubonfonctionnementdela
carte Arduino. Soyez donc attentif afin de bien comprendre tout ce que je vais vous
expliquer.Sanslesbases,vousnirezpasbienloin

[Arduino101]PrsentationdArduino
Comment faire de llectronique en utilisant un langage de programmation ? La
rponse, cest le projet Arduino qui lapporte. Vous allez le voir, celuici a t conu
pour tre accessible tous par sa simplicit. Mais il peut galement tre dusage
professionnel,tantlespossibilitsdapplicationssontnombreuses.

Questcequecest?
Une quipe de dveloppeurs compose de Massimo Banzi, David Cuartielles, Tom
Igoe, Gianluca Martino, David Mellis et Nicholas Zambetti a imagin un projet
rpondantaudouxnomdeArduinoetmettantenuvreunepetitecartelectronique
programmable et un logiciel multiplateforme, qui puisse tre accessible tout un
chacundanslebutdecrerfacilementdessystmeslectroniques.tantdonnquily
a des dbutants parmi nous, commenons par voir un peu le vocabulaire commun
propreaudomainedellectroniqueetdelinformatique.

Unecartelectronique
Unecartelectroniqueestunsupportplan,flexibleourigide,gnralementcompos
depoxyoudefibredeverre.Ellepossdedespisteslectriquesdisposessurune,
deux ou plusieurs couches (en surface et/ou en interne) qui permettent la mise en
relationlectriquedescomposantslectroniques.Chaquepisterelietelcomposant
tel autre, de faon crer un systme lectronique qui fonctionne et qui ralise les
oprationsdemandes.

Exemplesdecarteslectroniques
videmment,touslescomposantsdunecartelectroniquenesontpasforcmentrelis
entre eux. Le cblage des composants suit un plan spcifique chaque carte
lectronique,quisenommeleschmalectronique.

ExempledeschmalectroniquecarteArduinoUno
Enfin, avant de passer la ralisation dun carte lectronique, il est ncessaire de
transformerleschmalectroniqueenunschmadecblage,appeltypon.

ExempledetyponcarteArduino
Unefoisquelonaunecartelectronique,onfaitquoiavec?
6

Ehbienunefoisquelacartelectroniqueestfaite,nousnavonsplusqulatesteret
lutiliser ! Dans notre cas, avec Arduino, nous naurons pas fabriquer la carte et
encoremoinslaconcevoir.Elleexiste,elleestdjprtelemploietnousnavons
plusqulutiliser.Etpourcela,vousallezdevoirapprendrecommentlutiliser,ceque
jevaisvousmontrerdanscetutoriel.

Programmable?
Jaiparldecartelectroniqueprogrammableaudbutdecechapitre.Maissavez
vouscequecestexactement?Non?pasvraiment?Alorsvoyonsensembledequoiil
sagit.LacarteArduinoestunecartelectroniquequinesaitrienfairesansquonlui
disequoifaire. Pourquoi ? Eh bien cest du au fait quelle est programmable. Cela
signifiequelleabesoindunprogrammepourfonctionner.

Unprogramme
Un programme est une liste dinstructions qui est excute par un systme. Par
exemplevotrenavigateurinternet,aveclequelvouslisezprobablementcecours,estun
programme.Onpeutanalogiquementfairerfrenceunelistedecourse:

Chaquelmentdecettelisteestuneinstructionquivousdit:Vachercherlelaitou
Vachercherlepain,etc.Dansunprogrammelefonctionnementestsimilaire:
Attendrequelutilisateurrentreunsiteinternetconsulter
Recherchersurinternetlapagedemande
Afficherlersultat
Telpourraittrelefonctionnementdevotrenavigateurinternet.Ilvaattendrequevous
luidemandiezquelquechosepourallerlechercheretensuitevouslemontrer.Ehbien,
toutaussisimplementquecesdeuxcas,unecartelectroniqueprogrammablesuitune
listedinstructionspoureffectuerlesoprationsdemandesparleprogramme.
Etonlestrouveocesprogrammes?Commentonfaitpourlemettredanslacarte
?o_O
Desprogrammes,onpeutentrouverdepartout.MaisrestonsconcentrsurArduino.Le
programme que nous allons mettre dans la carte Arduino, cest nous qui allons le
raliser.Oui,vousavezbienlu.NousallonsprogrammercettecarteArduino.Biensr,
7

ceneserapasaussisimplequunelistedecourse,maisrassurezvouscependantcar
nousallonsrussirquandmme!Jevousmontreraicommentyparvenir,puisqueavant
tout cest un des objectifs de ce tutoriel. Voici un exemple de programme :

Vous le voyez comme moi, il sagit de plusieurs lignes de texte, chacune tant une
instruction.Celangageressembleunvritablebaragouinetnesemblevouloirpriori
riendiredutoutEtpourtant,cestcequenoussauronsfairedansquelquestemps!
Car nous apprendrons le langage informatique utilis pour programmer la carte
Arduino. Je ne mattarde pas sur les dtails, nous aurons amplement le temps de
revenirsurlesujetplustard.Pourrpondreladeuximequestion,nousallonsavoir
besoindunlogiciel

Etunlogiciel?
Bon,jenevaispasvousfaireledtaildecequestunlogiciel,voussavezsansaucun
doute de quoi il sagit. Ce nest autre quun programme informatique excut sur un
ordinateur.Oui,pourprogrammerlacarteArduino,nousallonsutiliserunprogramme!
Enfait,ilvasagirduncompilateur.Alorsquestcequecestexactement?

Uncompilateur
Eninformatique,cetermedsigneunlogicielquiestcapabledetraduireunlangage
informatique, ou plutt un programme utilisant un langage informatique, vers un
langageplusappropriafinquelamachinequivalelirepuisselecomprendre.Cest
un peu comme si le patron anglais dune firme Chinoise donnait des instructions en
anglais l'un de ses ouvriers chinois. Louvrier ne pourrait comprendre ce quil doit
faire.Pourcela,ilabesoinquelontraduisecequeluiditsonpatron.Cestlerledu
8

traducteur.Lecompilateurvadonctraduirelesinstructionsduprogrammeprcdent,
critesenlangagetexte,versunlangageditmachine.Celangageutiliseuniquement
des0etdes1.Nousverronsplustardpourquoi.Celapourraittreimagdelafaon
suivante:

Donc, pour traduire le langage texte vers le langage machine (avec des 0 et des 1),
nousauronsbesoindecefameuxcompilateur.Etpasnimportelequel,ilfautceluiqui
soitcapabledetraduirelelangagetexteArduinoverslelangagemachineArduino.Et
oui,sinonriennevafonctionner.SivousmettezuntraducteurFranaisversAllemand
entrenotrepatronanglaisetsonouvrierchinois,anefonctionnerapasmieuxquesils
discutaientdirectement.Vouscomprenez?
Et pourquoi on doit utiliser un traducteur, on peut pas simplement apprendre le
langagemachinedirectement?
Commentdirenon!Nonparcequelelangagemachineestquasimentimpossible
utilisertelquel.Parexemple,commeilestcomposde0etde1,sijevousmontrea:
0001011100111010101000111, vous serez incapable, tout comme moi, de dire ce
quecelasignifie!Etmmesijevousdisquelasuite01000001correspondlalettre
A, je vous donne bien du courage pour coder rien quune phrase ! Bref, oubliez
cetteide.Cestquandmmeplusfaciledutiliserdesmotsanglais(carouinousallons
tre oblig de faire un peu danglais pour programmer, mais rien de bien compliqu
rassurezvous)quedessuitesde0etde1.Vousnecroyezpas?

Envoyerleprogrammedanslacarte
L,jenevaispasvousdiregrandchosecarcestlenvironnementdedveloppement
quivagrertouta.Nousnauronsquapprendrecommentutilisercedernieretilse
dbrouilleratoutseulpourenvoyerleprogrammedanslacarte.Nah!Nousnaurons
doncqucrerleprogrammesansnoussoucierdureste.

PourquoichoisirArduino?
Quevatonfaireavec?
AvecArduino,nousallonscommencerparapprendreprogrammerpuisutiliserdes
composants lectroniques. Au final, nous saurons crer des systmes lectroniques
plusoumoinscomplexes.Maiscenestpastout

Dabord,Arduinocest
9

unecartelectroniqueprogrammableetunlogicielgratuit:

Maisaussi
Unprixdrisoiretantdonnltenduedesapplicationspossibles.Oncomptera
20 euros pour la carte que lon va utiliser dans le cours. Le logiciel est fournit
gratuitement!
Unecompatibilitsoustouteslesplateformes,savoir:Windows,LinuxetMas
OS.
Une communaut ultra dveloppe ! Des milliers de forums dentreaide, de
prsentationsdeprojets,depropositionsdeprogrammesetdebibliothques,
Un site en anglais arduino.cc et un autre en franais arduino.cc/fr o vous
trouvereztoutdelarfrenceArduino,lematriel,desexemplesdutilisations,de
laidepourdbuter,desexplicationssurlelogicieletlematriel,etc.
Unelibertquasiabsolue.Elleconstitueenellemmedeuxchoses:
Le logiciel : gratuit et open source, dvelopp en Java, dont la simplicit
dutilisationrelvedusavoircliquersurlasouris
Lematriel:carteslectroniquesdontlesschmassontenlibrecirculation
surinternet
Cettelibertaunecondition:lenomArduinonedoittreemployquepourles
cartesofficielles.Ensomme,vousnepouvezpasfabriquervotreproprecarte
surlemodleArduinoetluiassignerlenomArduino.

Etenfin,lesapplicationspossibles
VoiciunelistenonexhaustivedesapplicationspossibleralisesgrceArduino:
contrlerdesappareilsdomestiques
donneruneintelligenceunrobot
raliserdesjeuxdelumires
permettre un ordinateur de communiquer avec une carte lectronique et
diffrentscapteurs
tlcommanderunappareilmobile(modlisme)
etc...
Il y a tellement dautres infinits dutilisations, vous pouvez simplement chercher sur
votremoteurderechercheprfrousurYoutubelemotArduinopourdcouvrirles
milliersdeprojetsralissavec!

Arduinodanscetutoriel
Jevaisquandmmerappelerlesprincipauxobjectifsdececours.Nousallonsavant
tout dcouvrir Arduino dans son ensemble et apprendre lutiliser. Dans un premier
temps, il sagira de vous prsenter ce quest Arduino, comment cela fonctionne
10

globalement, pour ensuite entrer un peu plus dans le dtail. Nous allons alors
apprendreutiliserlelangageArduinopourpouvoircrerdesprogrammestrssimple
pourdbuter.Nousenchaineronsensuiteaveclesdiffrentesfonctionnalitsdelacarte
etferonsdepetitsTPquivouspermettrontdassimilerchaquenotionaborde.Dslors
que vous serez plutt laise avec toutes les bases, nous nous rapprocherons de
lutilisation de composants lectroniques plus ou moins complexes et finirons par un
plusgrosTPalliantlaprogrammationetllectronique.Dequoivousmettredeleau
labouche!

Arduinolcole?
Pdagogiquement,Arduinoaaussipasmaldatout.Eneffet,sescrateursontdabord
pensceprojetpourquilsoitfaciledaccs.Ilpermetainsiunetrsbonneapprochede
nombreuxdomainesetainsidapprendrepleindechosesassezsimplement.

Desexemples
Voiciquelquesexemplesdutilisationpossible:
Simulerlefonctionnementdesporteslogiques
Permettrelutilisationdediffrentscapteurs
Mettreenuvreetfaciliterlacomprhensiondunrseauinformatique
Se servir dArduino pour crer des maquettes animes montrant le
fonctionnement des collisions entres les plaques de la croute terrestre, par
exemple
Donner un exemple concret dutilisation des matrices avec un clavier
alphanumrique16touchesouplus
trelabasepourdeslvesayantunTPEfairepourleBAC

Deplus,normmentderessourcesettutoriels(maissouventenanglais)setrouvent
surinternet,cequioffreunautonomieparticulirelapprenant.

Desoutilsexistant!
Enfin, pour terminer de vous convaincre dutiliser Arduino pour dcouvrir le monde
merveilleux de lembarqu, il existe diffrents outils qui puissent tre utilis avec
Arduino.Jevaisenciterdeuxquimesembletrelesprincipaux:Ardublockestunoutil
quisegreffeaulogicielArduinoetquipermetdeprogrammeravecdesblocs.Chaque
bloc est une instruction. On peut aisment faire des programmes avec cet outil et
mmes des plutt complexes. Cela permet par exemple de se concentrer sur ce que
londoitfaireavecArduinoetnonseconcentrersurArduinopourensuitecequelon
doit comprendre avec. Citons entre autre la simulation de porte logique : plutt crer
des programmes rapidement sans connaitre le langage pour comprendre plus
facilementcommentfonctionneuneportelogique.Etcenestquunexemple.Carcela
permetaussidepermettredejeunesenfantsdecommencerprogrammersansde
tropgrandescomplications.

11

ExempledeprogrammesralissavecArdublock
ProcessingestuneautreplateformeenlienavecArduino.Lilnyapasdematriel,
uniquementunlogiciel.Ilpermetentreautredecrerdesinterfacesgraphiquesavecun
langagedeprogrammationtrssimilaireceluidArduino.Parcontre,celademande
un niveau un peu plus lev pour pouvoir lutiliser, mme si cela reste simple dans
lensemble.

VoilunexempledecequejavaisralisavecProcessingpourfairecommuniquer
monordinateuravecmacarteArduino
Jespre avoir t assez convaincant afin que vous franchissiez le pas et ayez du
plaisirapprendre!

LescartesArduino
Lematrielquejaichoisidutilisertoutaulongdececoursnapasunprixexcessifet,
jelaidit,tourneauxalentoursde25TTC.Ilexisteplusieursmagasinsenligneseten
boutiquesquivendentdescartesArduino.Jevaisvousendonnerquelquesuns,mais
avant,ilvafalloirdiffrenciercertaineschoses.

Lesfabricants
Le projet Arduino est libre et les schmas des cartes circulent librement sur internet.
Dolamiseengardequejevaisfaire:ilsepeutquunillustreinconnufabriquelui
mmesescartesArduino.Celanariendemalensoi,silveutlescommercialiser,il
peut.Maissilestmalhonnte,ilpeutvousvendreunproduitdfectueux.Biensr,tout
lemondenechercherapasvousarnaquer.Maislaprudenceestderigueur.Faites
doncattentionovousachetezvoscartes.

Lestypesdecartes
Ilyatroistypesdecartes:
Lesdites officielles qui sont fabriques en Italie par le
fabricantofficiel:SmartProjects
Lesdits compatibles qui ne sont pas fabriqus par SmartProjects, mais qui
sonttotalementcompatiblesaveclesArduinoofficielles.
Lesautresfabriquespardiverseentrepriseetcommercialisessousunnom
diffrent(Freeduino,Seeduino,Femtoduino,).
12

Lesdiffrentescartes
Des cartes Arduino il en existe beaucoup ! Voyons celles qui nous intressent La
carteUnoetDuemilanoveNouschoisironsdutiliserlacarteportantlenomdeUno
ouDuemilanove.Cesdeuxversionssontpresqueidentiques.

CarteArduinoDuemilavoveetUnoaveclaquellenousallonstravailler
La carte Mega La carte Arduino Mega est une autre carte qui offre toutes les
fonctionnalitsdelacarteprcdente,maisavecdesfonctionnalitssupplmentaires.
On retrouve notamment un nombre dentres et de sorties plus important ainsi que
plusieursliaisonssries.Biensr,leprixestpluslev:>40!

CarteArduinoMega
Les autres cartes Il existe encore beaucoup dautres cartes, je vous laisse vous
dbrouiller pour trouver celle qui conviendra vos projets. Cela dit, je vous conseil
dansunpremiertempsdutiliserlacarteArduinoUnoouDuemilanovedunepartcar
ellevousseralargementsuffisantepourdbuteretdautrepartcarcestaveccelleci
quenousprsentonslecours.

Oacheter?
IlexistesurlenetunemultitudedemagasinsquiproposentdescartesArduino.Pour
consulter la liste de ces magasins, rien de plus simple, il suffit de vous rendre sur le
forumddi:

LesmeilleursboutiquesdlectroniqueCliquezici
JaivudescartesofficiellesditionSMD/CMS.Calairbienaussi,cestquoila
13

diffrence?Jepeuxmenservir?
Ilnyapasdediffrence!enfinpresqueSMDsignifieSurfaceMountDevice,en
franais on appelle a des CMS pour Composants Monts en Surface. Ces
composants sont souds directement sur le cuivre de la carte, il ne la traverse pas
comme les autres. Pour les cartes Arduino, on retrouve le composant principal en
ditionSMDdanscescartes.Lacarteestdonclamme,aucunediffrencepourletuto.
Lescomposantssontlesmmes,seulelallurephysiqueestdiffrente.Parexemple,
cidessuslaMegaestenSMDetlaUnoestclassique.

Listedachat
Tout au long du cours, nous allons utiliser du matriel en supplment de la carte.
Rassurezvous le prix est bien moindre. Je vous donne cette liste, cela vous vitera
dacheterenplusieursfois.Vousallezdevoirmecroiresurparolesurleurintrt.Nous
dcouvrirons comment chaque composant fonctionne et comment les utiliser tout au
longdututoriel.
Attention, cette liste ne contient que les composants en quantits minimales
strictes.LibrevousdeprendreplusdeLEDetdersistancesparexemple(aucas
o vous en perdriez ou dtruisiez). Pour ce qui est des prix, jai regard sur
diffrents sites grands publics (donc pas Farnell par exemple), ils peuvent donc
paratrepluslevquelanormaledanslamesureocessitesamortissentmoins
surdesventesdesclientsfidlesquiprennenttoutengrandequantit
Avant que joublie, quatres lments napparaitront pas dans la liste et sont
indispensables:
UneArduinoUnoouDuemilanove

UncbleUSBAmle/Bmle

UneBreadBoard(plaquedessai)

Unlotdefilspourbrancherletout!

14

ListeGlobale
Voici donc la liste du matriel ncessaire pour suivre le cours. Libre vous de tout
acheterounon.

Listeincomplte,letutorielnestpastermin!Maiselle
suffitpoursuivreleschapitresenligne.
Dsignation

Quantit Photo

LEDrouge

LEDverte

LEDjaune(ou
orange)

Description
Cecomposantestunesortedelampeunpeu
spcial.Nousnousenservironsprincipalement
pourfairedelasignalisation.

Rsistance
(entre220et
10
470Ohm)
Rsistance
(entre2.2et4.7 2
kOhm)
Rsistance(10
2
kOhm)

Larsistanceestuncomposantdebasequi
sopposeaupassageducourant.Onsensertpour
limiterdescourantsmaximumsmaisaussipour
dautreschoses.

Bouton
Poussoir

Unboutonpoussoirsertfairepasserlecourant
lorsquonappuiedessusouaucontrairegarderle
circuitteintlorsquilestrelch.

Letransistorsertpleindechose.Ilpeuttre
utilispourfairedelamplification(decourantou
detension)maisaussicommeuninterrupteur
commandlectriquement.

Unafficheur7segmentsestunensembledeLEDs
(cf.cidessus)disposesgomtriquementpour
afficherdeschiffres.

Transistor
(2N2222ou
BC547)
Afficheur7
segments
(anode
commune)

15

DcodeurBCD
1
(MC14543)

LedcodeurBCD(BinaireCodDcimal)permet
piloterdesafficheurs7segmentsenlimitantle
nombredefilsdedonnes(4aulieude7).

Condensateur
(10nF)

Lecondensateurestuncomposantdebase.Ilsert
pleindechose.Onpeutselereprsentercomme
unpetitrservoirlectricit.

Condensateur
1000F

Celuiciestunplusgrosrservoirqueleprcdent

Potentiomtre
linaire(10
kOhm)

Lepotentiomtreestunersistancequelonpeut
fairevariermanuellement.

LEDRVB

UneLEDRVB(RougeVertBleu)estuneLED
permettantdemlangerlescouleursdebasespour
encrerdautres.

cranLCD
1
alphanumrique

LcranLCDalphanumriquepermetdafficherdes
caractrestelsqueleschiffresetleslettres.Ilva
apporterdelinteractivitvosprojetslesplusfous
!

Lesrevendeurs
Je vous ai dj donn le lien, vous pourrez trouver ces composants chez les
revendeurslistsdanscesujetduforum:

LesmeilleursboutiquesdlectroniqueCliquezici

Leskits
Enfin, il existe des kits tout prts chez certains revendeurs. Nous nen conseillerons
aucunpourplusieursraisons.Toutdabord,pournepasfairetropdepublicitetrester
conformeaveclachartedusite.Ensuite,carilestdifficiledetrouverunkitcomplet.Ils
onttousdesavantagesetdesinconvnientsmaisaucun(aumomentdelapublication
de ces lignes) ne propose absolument tous les composants que nous allons utiliser.
Nous ne voulons donc pas que vous reveniez vous plaindre sur les forums car nous
vousaurionsfaitdpenservotreargentinutilement!
Celatantdit,mercidenepasnousspammerdeMPpourquelondonnenotre
avissurteloutelkit!Usezdesforumspourcela,ilyatoujoursquelquunquisera
l pour vous aider. Et puis nous navons pas les moyens de tous les acheter et
testerleurqualit!

[Arduino102]Quelquesbaseslmentaires
En attendant que vous achetiez votre matriel, je vais vous prsenter les bases de
16

llectroniqueetdelaprogrammation.Celavousdemanderatoutdemmeunebonne
concentrationpouressayerdecomprendredesconceptspasvidentsensoit.
Lapremirepartiedecechapitrenefaitquereprendrequelqueslmentsducours
surllectronique,quevouspouvezconsulterpourdeplusamplesexplications.

Lecourant,latensionetlamasse
Pourfairedellectronique,ilestindispensabledeconnatresurleboutdesdoigtsce
quesontlesgrandeursphysiques.Alors,avantdecommencervoirlesquellesonva
manipuler,voyonsunpeucequestunegrandeurphysique.Unegrandeurphysique
estquelquechosequisemesure.Plusprcismentilsagitdunlmentmesurable,
grce un appareil ou dispositif de mesure, rgit par les lois de la physique. Par
exemple, la pression atmosphrique est une grandeur physique, ou bien la vitesse
laquelle circule une voiture en est aussi une. En lectronique cependant, nous ne
mesurons pas ces grandeursl, nous avons nos propres grandeurs, qui sont : le
courantetlatension.

Lasourcednergie
Lnergie que lon va manipuler (courant et tension) provient dun gnrateur. Par
exemple, on peut citer : la pile lectrique, la batterie lectrique, le secteur lectrique.
Cette nergie qui est fournie par le gnrateur est restitue un ou plusieurs
rcepteurs. Le rcepteur, daprs son nom, reoit de lnergie. On dit quil la
consomme.Onpeutciterpourexemples:unchauffagedappoint,unschecheveux,
uneperceuse.

Lecourantlectrique
Chargeslectriques
Leschargeslectriquessontdesgrandeursphysiquesmesurables.Ellesconstituentla
matireenellemme.Dansunatome,quiestlmentprimairedelamatire,ilyatrois
chargeslectriquesdiffrentes:leschargespositives,ngativesetneutresappeles
respectivement protons, lectrons et neutrons. Bien, maintenant nous pouvons
dfinirlecourantquiestundplacementordonndechargeslectriques.

Conductibilitdesmatriaux
Lanotiondeconductibilitestimportanteconnatre,carellepermetdecomprendre
pas mal de phnomnes. On peut dfinir la conductibilit comme tant la capacit
dun matriau se laisser traverser par un courant lectrique. De ces matriaux, on
peutdistinguerquatregrandesfamilles:
les isolants : leurs proprits empchent le passage dun courant lectrique
(plastique,bois,verre)
lessemiconducteurs:cesontdesisolants,maisquilaissentpasserlecourant
dslorsquelonmodifielgrementleurstructureinterne(diode,transistor,LED)
17

les conducteurs : pour eux, le courant peut passer librement travers tout en
opposant une faible rsistance selon le matriau utilis (or, cuivre, mtal en
gnral)
lessupraconducteurs:cesontdestypesbienparticuliersqui,unetemprature
extrmement basse, nopposent quasiment aucune rsistance au passage dun
courantlectrique

Sensducourant
Le courant lectrique se dplace selon un sens de circulation. Un gnrateur
lectrique,parexempleunepile,produituncourant.Etbiencecourantvacirculerdu
plepositifversleplengatifdelapile,sietseulementsicesdeuxplessontrelis
entre eux par un fil mtallique ou un autre conducteur. Ceci, cest le sens
conventionnel du courant. On note le courant par une flche qui indique le sens
conventionneldecirculationducourant:

Indicationdusensducourant

Intensitducourant
Lintensit du courant est la vitesse laquelle circule ce courant. Tandis que le
courant est un dplacement ordonn de charges lectriques. Voil un point ne
pasconfondre.
On mesure la vitesse du courant, appele intensit, en Ampres (not A) avec un
Ampremtre. En gnral, en lectronique de faible puissance, on utilise
principalementlemilliAmpre(mA)etlemicroAmpre(A),maisjamaisbienaudel.
Cesttoutcequilfautsavoirsurlecourant,pourlinstant.

Tension
Autantlecourantsedplace,oudumoinsestundplacementdechargeslectriques,
autantlatensionestquelquechosedestatique.Pourbiendfinircequestlatension,
sachezquonlacomparelapressiondunfluide.Parexemple,lorsquevousarrosez
votre jardin (ou une plante, comme vous prfrez) avec un tuyau darrosage et bien
danscetuyau,ilyaunecertainepressionexerceparleaufournieparlerobinet.Cette
pressionpermetledplacementdeleaudansletuyau,donccreruncourant.Maissi
lapressionnestpasassezforte,lecourantneseraluinonpluspasassezfort.Pour
preuve,vousnavezquapincerletuyaupourconstaterquelecourantnecirculeplus.
Onappellecephnomnedepression:latension.Jenendispaspluscarseserait
18

vousembrouiller.

Notationetunit
LatensionestmesureenVolts(noteV)parunVoltmtre.Onutiliseprincipalement
leVolt,maisaussisonsousmultiplequiestlemilliVolt(mV).Onreprsentelatension,
dunepileparexemple,grceuneflcheorientetoujoursdanslesensducourant
auxbornesdungnrateurettoujoursopposeaucourant,auxbornesdunrcepteur:

Flchagedelatension

Ladiffrencedepotentiel
Surleschmaprcdent,onaaupointMunetensionde0VetaupointP,unetension
de5V.PrenonsnotreVoltmtreetmesuronslatensionauxbornesdugnrateur.La
borne COM du Voltmtre doit tre relie au point M et la borne + au point P. Le
potentielaupointP,soustraitparlepotentielaupointMvaut:UP UM = 5 0 = 5V
.Onditqueladiffrencedepotentielentrecesdeuxpointsestde5V.Cettemesure
senotedonc: UPM .SioninverselesensdebranchementduVoltmtre,laborne+
est relie au point M et la borne COM au point P. La mesure que lon prend est la
diffrence de tension (= potentiel) entre le point M et le point P :
UM UP = 0 5 = 5V Cettedmonstrationunpeusurprenantevientdufaitquela
masseestarbitraire.

Lamasse
Justement,parlonsen!Lamasseest,enlectronique,unpointderfrence.

Notionderfrentiel
Quandonprendunemesure,engnral,onlaprendentredeuxpointsbiendfinis.Par
exemple, si vous vous mesurez, vous prenez la mesure de la plante de vos pieds
jusquausommetdevotrette.Sivousprenezlaplantedevospiedspourrfrence
(cestdirelechiffrezroinscritsurlemtre),vouslirez1m70(parexemple).Sivous
inversez, non pas la tte, mais le mtre et que le chiffre zro de celuici se retrouve
doncausommetdevotrette,vousserezobligdelirelamesure1m70.Etbien,ce
chiffre zro est la rfrence qui vous permet de vous mesurer. En lectronique, cette
rfrenceexiste,onlappellelamasse.

Questcequecest?
Lamasse,etbiencestunrfrentiel.Enlectroniqueonvoitlamassedunmontage
19

commetantlezroVolt(0V).Cestlepointquipermetdemesurerunebonnepartie
destensionsprsentesdansunmontage.

Reprsentationetnotation
Ellesereprsenteparcesymbole,surunschmalectronique:

Symboledelamasse
Vous ne le verrez pas souvent dans les schmas de ce cours, pour la simple raison
quelleestprsentesurlacartequelonvautilisersousunautrenom:GND.GNDest
undiminutifdutermeanglaisGroundquiveutdireterre/sol.Donc,pournousettous
les montages que lon ralisera, ce sera le point de rfrence pour la mesure des
tensionsprsentessurnoscircuitsetlezroVoltdetousnoscircuits.

Unerfrencearbitraire
Pour votre culture, sachez que la masse est quelque chose darbitraire. Je lai bien
montrdanslexempleaudbutdeceparagraphe.Onpeutchangerlemplacementde
cetterfrenceet,parexemple,trsbiendirequele5Vestlamasse.Cequiaurapour
consquencedemodifierlanciennemasseen5V.

Larsistanceetsaloi!
En lectronique il existe plein de composants qui ont chacun une ou plusieurs
fonctions.Nousallonsvoirquelssontcescomposantsdanslecours,maispastoutde
suite.Car,maintenant,onvaaborderlarsistancequiestLEcomposantdebaseen
lectronique.

Prsentation
Cestlecomposantleplusutilisenlectronique.Saprincipalefonctionestderduire
lintensitducourant(maispasuniquement).Cecomposantseprsentesouslaforme
dunpetitboitierfaitdediversmatriauxetreprpardesanneauxdecouleurindiquant
lavaleurdecettedernire.Photodersistance:

Photodersistance

Symbole
Lesymboledelarsistanceressembletrangementlaformedesonboitier:
20

Symboledelarsistance

Loidohm
Le courant traversant une rsistance est rgi par une formule assez simple, qui se
nommelaloidohm:

I=

U
R

I:intensitquitraverselarsistanceenAmpres,noteA
U:tensionauxbornesdelarsistanceenVolts,noteV
R:valeurdelarsistanceenOhms,note
Engnral,onretientmieuxlaformulesouscetteforme:U = R I

Unit
Lunitdelarsistanceestlohm.Onlenoteaveclesymbolegrecomgamajuscule:
.

Lecodecouleur
Larsistancepossdeunesuitedanneauxdecouleursdiffrentessursonboitier.Ces
couleurs servent expliciter la valeur de la rsistance sans avoir besoin dcrire en
chiffre dessus (car vous avez dj essay dcrire sur un cylindre ?) Le premier
anneaureprsentelechiffredescentaines,lesecondceluidesdizainesetletroisime
celui des units. Enfin, aprs un petit espace vient celui du coefficient multiplicateur.
Avecsesquatresanneauxetunpeudentrainementvouspouvezalorsdevinlavaleur
de la rsistance en un clin doeil . Ce tableau vous permettra de lire ce code qui
correspondlavaleurdelarsistance:
Couleur Chiffre Coefficientmultiplicateur Puissance Tolrance
Noir
0
1

100
1
Brun
1
10
1%
10
2
Rouge 2
100
2%
10
Orange 3
1000

103
Jaune 4
10000

104
Vert
5
100000
0.5%
105
6
Bleu
6
1000000
0.25%
10
7
Violet 7
10000000
0.10%
10
8
Gris
8
100000000
0.05%
10
9
Blanc 9
1000000000

10

Or
0.1
0.1
5%
101
Argent 0.01
0.01
10%
102
(absent)

20%
21

Lemicrocontrleur
Nous avons dj un peu abord le sujet dans la prsentation du cours. Je vous ai
expliqubrivementcommentfonctionnaitunprogrammeetsurtoutcequectait!
Bon,dsprsentjevaisrentrerunpetitpeuplusdansledtailenvousintroduisant
desnotionsbasessurlematrieltroitementlilaprogrammation.Nousallonsen
effet aborder le microcontrleur dans un niveau de complexit suprieur ce que je
vousavaisintroduittoutlheure.Ho,riendebieninsurmontable,soyezsanscraintes.

Laprogrammationenlectronique
Aujourdhui,llectroniqueestdeplusenpluscomposedecomposantsnumriques
programmables.Leurutilisationpermetdesimplifierlesschmaslectroniquesetpar
consquentrduirelecotdefabricationdunproduit.Ilenrsultedessystmesplus
complexesetperformantspourunespacerduit.

Commentprogrammerdellectronique?
Pour faire de llectronique programme, il faut un ordinateur et un composant
programmable. Il existe tout plein de varits diffrentes de composants
programmables,noter:lesmicrocontrleurs,lescircuitslogiquesprogrammables,
Nous,nousallonsprogrammerdesmicrocontrleurs.Maiscepropos,vousaijedit
questcequectaitquunmicrocontrleur?
Questcequecest?
Jelaiditlinstant,lemicrocontrleurestuncomposantlectroniqueprogrammable.
Onleprogrammeparlebiaisdunordinateurgrceunlangageinformatique,souvent
propreautypedemicrocontrleurutilis.Jenentreraispasdanslutilisationpousse
decesdernierscarleniveauestrudementlevetlacomprhensiondifficile.Voiciune
photodunmicrocontrleur:

22

Photodemicrocontrleur
CestdonclemicrocontrleurquivatrelecerveaudelacarteArduino,pourenrevenir
nosmoutons.Cestluiquenousallonsprogrammer.Onauraletempsdenrediscuter.
Pour linstant je veux uniquement vous prsenter les lments principaux qui le
composent.

Compositiondeslmentsinternesdunmicrocontrleur
Un microcontrleur est constitu par un ensemble dlments qui ont chacun une
fonctionbiendtermine.Ilestenfaitconstitudesmmeslmentsquesurlacarte
mre dun ordinateur. Si lon veut, cest un ordinateur (sans cran, sans disque dur,
sans lecteur de disque) dans un espace trs restreint. Je vais vous prsenter les
diffrentslmentsquicomposentunmicrocontrleurtypiqueetuniquementceuxqui
vont nous tre utiles. La mmoire La mmoire du microcontrleur sert plusieurs
choses.Onpeutaismentciterlestockageduprogrammeetdedonnesautresquele
programme.Ilenpossde5types:
LammoireFlash:Cestcellequicontiendraleprogrammeexcuter(celuique
vous allez crer!). Cette mmoire est effaable et rinscriptible (cest la mme
quuneclUSBparexemple)
RAM : cest la mmoire dite vive, elle va contenir les variables de votre
programme.Elleestditevolatilecarelleseffacesioncoupelalimentationdu
microcontrleur(commesurunordinateur).
EEPROM : Cest le disque dur du microcontrleur. Vous pourrez y enregistrer
des infos qui ont besoin de survivre dans le temps, mme si la carte doit tre
arrteetcoupedesonalimentation.Cettemmoireneseffacepaslorsquelon
teintlemicrocontrleuroulorsquonlereprogramme.
Lesregistres:cestuntypeparticulierdemmoireutilisparleprocesseur.Nous
nenparleronspastoutdesuite.
Lammoirecache:cestunemmoirequifaitlaliaisonentrelesregistresetla
RAM.Nousnenparleronsgalementpastoutdesuite.
23

Pour plus de dtails sur les mmoires utilisables dans vos programmes, une
annexeenfindetutorielsoccupedecela
Le processeur Cest le composant principal du microcontrleur. Cest lui qui va
excuterleprogrammequenousluidonneronstraiter.OnlenommesouventleCPU.
Diverseschoses Nous verrons plus en dtail lintrieur dun microcontrleur, mais
pas tout de suite, cest bien trop compliqu. Je ne voudrais pas perdre la moiti des
visiteursenuninstant!

Fonctionnement
Avant tout, pour que le microcontrleur fonctionne, il lui faut une alimentation ! Cette
alimentation se fait en gnrale par du +5V. Dautres ont besoin dune tension plus
faible, du +3,3V (cest le cas de la Arduino Due par exemple). En plus dune
alimentation,ilabesoindunsignaldhorloge.Cestenfaitunesuccessionde0etde1
ou plutt une succession de tension 0V et 5V. Elle permet en outre de cadencer le
fonctionnementdumicrocontrleurunrythmergulier.Grceelle,ilpeutintroduire
lanotiondetempsenprogrammation.Nousleverronsplusloin.Bon,pourlemoment,
vousnavezpasbesoindensavoirplus.Passonsautrechose.

Lesbasesdecomptage(2,10et16)
Lesbasesdudecomptage
Onvaapprendrecompter?o_O
Non,jevaissimplementvousexpliquercequesontlesbasesdecomptage.Cesten
faitunsystmedenumrationquipermetdecompterenutilisantdescaractresde
numrations,onappelleadeschiffres.

Cassimple,labase10
La base 10, vous la connaissez bien, cest celle que lon utilise tous les jours pour
compter. Elle regroupe un ensemble de 10 chiffres : 0,1,2,3,4,5,6,7,8,9. Avec ces
chiffres, on peut crer une infinit de nombres (ex : 42, 89, 12872, 14.56, 9.3, etc).
Cependant,voyonsceladunautreil
Lunitserareprsentparunchiffremultiplipar10lapuissance0.
Ladizaineserareprsentparunchiffremultiplipar10lapuissance1.
Lacentaineserareprsentparunchiffremultiplipar10lapuissance2.
[...]
Lemillionserareprsentparunchiffremultiplipar10lapuissance6.
etc
Engnralisant,onpeutdoncdirequunnombre(composdechiffres)estlasomme
deschiffresmultiplispar10unecertainepuissance.Parexemple,sionveutcrire
1024, on peut lcrire : 1 1000 + 0 100 + 2 10 + 4 1 = 1024
ce qui est
3
2
1
0
quivalentcrire:1 10 + 0 10 + 2 10 + 4 10 = 1024
Etbiencest
24

a,compterenbase10!Vousallezmieuxcomprendreaveclapartiesuivante.

Casinformatique,labase2etlabase16
En informatique, on utilise beaucoup les bases 2 et 16. Elles sont composes des
chiffressuivants:
pourlabase2:leschiffres0et1.
pourlabase16 : on retrouve les chiffres de la base 10, plus quelques lettres :
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
Onappellelabase2,labasebinaire.Ellereprsentedestatslogiques0ou1.Dans
un signal numrique, ces tats correspondent des niveaux de tension. En
lectroniquenumrique,trssouventilsagiradunetensionde0Vpouruntatlogique
0dunetensionde5Vpouruntatlogique1.OnparleaussideniveauHAUTouBAS
(in english : HIGH or LOW). Elle existe cause de la conception physique des
ordinateurs. En effet, ces derniers utilisent des millions de transistors, utiliss pour
traiter des donnes binaires, donc deux tats distincts uniquement (0 ou 1). Pour
compter en base 2, ce nest pas trs difficile si vous avez saisi ce quest une base.
Dans le cas de la base 10, chaque chiffre tait multipli par 10 une certaine
puissanceenpartantdelapuissance0.Etbienenbase2,pluttquedutiliser10,on
utilise 2. Par exemple, pour obtenir 11 en base 2 on crira : 1011 En effet, cela
quivaut

faire
:
1 23 + 0 22 + 1 21 + 1 20

soit
:

18+04+12+11

Unchiffreenbase2sappelleunbit.Unregroupementde8bitssappelleunoctet.
Cevocabulaireesttrsimportantdoncretenezle!
La base 16, ou basehexadcimale est utilise en programmation, notamment pour
reprsenterdesoctetsfacilement.Reprenonsnosbits.Sionenutilisequatre,onpeut
reprsenter des nombres de 0 (0000) 15 (1111). a tombe bien, cest justement la
portedunnombrehexadcimale!Eneffet,commeditplushautilvade0(0000ou0)
F(1111ou15),cequireprsente16chiffresenhexadcimal.Grcecela,onpeut
reprsentersimplementdesoctets,enutilisantjustedeuxchiffreshexadcimaux.

Lesnotations
Ici,riendetrscompliqu,jevaissimplementvousmontrercommentonpeutnoterun
nombreendisantquellebaseilappartient.
Basebinaire:(10100010)2
Basedcimale:(162)10
Basehexadcimale:(A2)16
Aprsent,voyonslesdiffrentesmthodespourpasserdunebaselautregrceaux
conversions.

Conversions
Souvent, on a besoin de convertir les nombres dans des bases diffrentes. On
25

retrouvera deux mthodes, bonnes savoir lune comme lautre. La premire vous
apprendrafairelesconversionslamain,vouspermettantdebiencomprendreles
choses.Laseconde,celledelacalculatrice,vouspermettradefairedesconversions
sansvousfatiguer.

DcimaleBinaire
Pourconvertirunnombredcimal(enbase10)versunnombrebinaire(enbase2,vous
suivezcestbien!),ilsuffitdesavoirdiviserpar2!aira?Prenezvotrenombre,
puis divisez le par 2. Divisez ensuite le quotient obtenu par 2 puis ainsi de suite
jusquavoirunquotientnul.Ilvoussuffitalorsdelirelesrestesdebasenhautpour
obtenirvotrenombrebinaireParexemplelenombre42scrira101010enbinaire.
Voilunschmadedmonstrationdecettemthode:

Ongardelesrestes(enrouge)etonlilersultatdebasenhaut.

BinaireHexadcimal
La conversion de binaire lhexadcimal est la plus simple raliser. Tout dabord,
commencezregrouperlesbitsparblocsdequatreencommenantparladroite.Siil
nyapasassezdebitsgauchepourfairelederniergroupedequatre,onrajoutedes
26

zros. Prenons le nombre 42, qui scrit en binaire, on la vu, 101010, on obtiendra
deuxgroupesde4bitsquiseront00101010.Ensuite,ilsuffitdecalculerblocparbloc
pourobtenirunchiffrehexadcimalenprenantencomptelavaleurdechaquebit.Le
premier bit, de poids faible (tout droite), vaudra par exemple A (
1 8 + 0 4 + 1 2 + 0 1 = 10
: A en hexadcimal). Ensuite, lautre bloc
vaudra simplement 2 (0 8 + 0 4 + 1 2 + 0 1 = 2
). Donc 42 en base
dcimalevaut2Aenbasehexadcimale,cequiscritaussi (42 ) 10 = (2A) 16 Pour
passerdehexadcimalbinaire,ilsuffitdefairelefonctionnementinverseensaidant
delabasedcimaledetempsentemps.Ladmarchesuivreestlasuivante:
Jespareleschiffresunparun(onobtient2etA)
Jeconvertisleursvaleursendcimal(cequinousfait2et10)
Jemetcesvaleursenbinaire(etonadonc00101010)

DcimalHexadcimal
Ce cas est plus dlicat traiter, car il ncessite de bien connatre la table de
multiplication par 16. Comme vous avez bien suivi les explications prcdentes,
vous comprenez comment faire ici Mais comme je suis nul en math, je vous
conseilleraisdefaireunpassageparlabasebinairepourfairelesconversions!

Mthoderapide
Pourcela,jevaisdansDmarrer/Touslesprogrammes/Accessoires/Calculatrice.
Quiaditquejtaisfainant?:colere2:

Vousvoyezenhautquilyadesoptionscocherpourafficherlenombreentrdansla
basequelonveut.Prsentement,jesuisenbase10(dcimaleboutonDc).Sije
cliquesurHex:

27

Jevoisquemonnombre42atconvertien:2A.Etmaintenant,sijecliquesurBin:

Notre nombre a t converti en : 00101010 Oui, cest vrai a. Pour quoi on a pas
commencparexpliquera?Quisait.

[Arduino103]Lelogiciel
AfindevouslaisserunlgertempsdepluspourvousprocurervotrecarteArduino,je
vaisvousmontrerbrivementcommentseprsentelelogicielArduino.

Installation
IlnyapasbesoindinstallerlelogicielArduinosurvotreordinateurpuisquecedernier
est une version portable. Regardons ensemble les tapes pour prparer votre
ordinateurlutilisationdelacarteArduino.

Tlchargement
Pour tlcharger le logiciel, il faut se rendre sur la page de tlchargement du site
arduino.cc.Vousavezdeuxcatgories:
Download:Danscettecatgorie,vouspouveztlchargerladernireversiondu
logiciel.LesplateformesWindows,LinuxetMacsontsupportesparlelogiciel.
Cestdonciciquevousalleztlchargerlelogiciel.
PreviousIDEVersions:Danscettecatgoriel,vousaveztouteslesversionsdu
logiciel, sous les plateformes prcdemment cites, depuis le dbut de sa
cration.

SousWindows
PourmoiceserasousWindows.JecliquesurlelienWindowsetlefichierapparait:

TlchargementdulogicielArduino
Une fois que le tlchargement est termin, vous navez plus qu dcompresser le
28

fichieravecunutilitairededcompression(7zip,WinRar,).Alintrieurdudossier
setrouventquelquesfichiersetlexcutabledulogiciel:

ExcutabledulogicielArduino

Macos
CliquezsurlelienMacOS.Unfichier.dmgapparait.Enregistrezle.

TlchargementsousMacos
Doublecliquezsurlefichier.dmg:

Contenudutlchargement
On y trouve lapplication Arduino (.app), mais aussi le driver installer (.mpkg).
Procdez linstallation du driver puis installez lapplication en la glissant dans le
raccourcidudossierApplicationsquiestnormalementprsentsurvotreordinateur.

SousLinux
Rien de plus simple, en allant dans la logithque, recherchez le logiciel Arduino.
Sinonvouspouvezaussipasserparlalignedecommande:
1 $sudoaptgetinstallarduino

Plusieursdpendancesserontinstallesenmmetemps.
Jerajouteunlienquivousmneraverslapageofficielle.

Interfacedulogiciel
Lancementdulogiciel
Lanonslelogicielendoublecliquantsurlicneaveclesymboleinfinieenvert.Cest
lexcutabledulogiciel.Aprsunlgertempsderflexion,uneimagesaffiche:

29

Cettefois,aprsquelquessecondes,lelogicielsouvre.Unefentreseprsentenous
:

30

Cequisauteauxyeuxenpremier,cestlaclartdeprsentationdulogiciel.Onvoittout
desuitesoninterfaceintuitive.Voyonscommentsecomposecetteinterface.

Prsentationdulogiciel
Jaidcoup,grcemonamipaint.net,limageprcdenteenplusieursparties:

31

Correspondance
Lecadrenumro1:cesontlesoptionsdeconfigurationdulogiciel
Le cadre numro 2 : il contient les boutons qui vont nous servir lorsque lon va
programmernoscartes
Lecadrenumro3:ceblocvacontenirleprogrammequenousallonscrer
Lecadrenumro4:celuiciestimportant,carilvanousaidercorrigerlesfautes
dansnotreprogramme.Cestledbogueur.

Approcheetutilisationdulogiciel
Attaquonsnous plus srieusement lutilisation du logiciel. La barre des menus est
entoureenrougeetnumroteparlechiffre1.

LemenuFile
32

Cestprincipalementcemenuquelonvautiliserleplus.Ildisposeduncertainnombre
de choses qui vont nous tre trs utiles. Il a t traduit en francais progressivement,
nousallonsdoncvoirlesquelquesoptionsquisortentdelordinaire:

Carnetdecroquis:CEmenuregroupelesfichiersquevousavezpufairejusqu
maintenant(etsilssontenregistrdansledossierpardfautdulogiciel)
Exemples(exemples):ceciestimportant,touteunelistesedroulepourafficher
les noms dexemples de programmes existants avec , vous pourrez vous
aider/inspirer pour crer vos propres programmes ou tester de nouveaux
composants
Tlverser : Permet denvoyer le programme sur la carte Arduino. Nous y
reviendrons .
Tlverseravecunprogrammateur : Idem que si dessus, mais avec lutilisation
dunprogrammateur(vousnennaurezquetrsrarementbesoin).
Prfrences:Vouspourrezrglericiquelquesparamtresdulogiciel
Lerestedesmenusnestpasintressantpourlinstant,onyreviendraplustard,avant
33

decommencerprogrammer.

Lesboutons
Voyonsprsentquoiserventlesboutons,encadrsenrougeetnumrotsparle
chiffre2.

Bouton1:Ceboutonpermetdevrifierleprogramme,ilactionneunmodulequi
chercheleserreursdansvotreprogramme
Bouton2:Charge(tlverse)leprogrammedanslacarteArduino
Bouton3:Creunnouveaufichier
Bouton4:Ouvreunfichier
Bouton5:Enregistrelefichier
Bouton6:Ouvrelemoniteursrie(onverraplustardcequecest )
Enfin, on va pouvoir soccuper du matriel que vous devriez tous possder en ce
momentmme:lacarteArduino!

[Arduino104]Lematriel

Prsentationdelacarte
PourcommencernotredcouvertedelacarteArduino,jevaisvousprsenterlacarte
en ellemme. Nous allons voir comment sen servir et avec quoi. Jai reprsent en
rougesurcettephotolespointsimportantsdelacarte.

34

PrsentationdelacarteArduino

Constitutiondelacarte
Voyonsquelssontcespointsimportantsetquoiilsservent.

Lemicrocontrleur
Voillecerveaudenotrecarte(en1).Cestluiquivarecevoirleprogrammequevous
aurezcretquivalestockerdanssammoirepuislexcuter.Grceceprogramme,
il va savoir faire des choses, qui peuvent tre : faire clignoter une LED, afficher des
caractressuruncran,envoyerdesdonnesunordinateur,

Alimentation
Pourfonctionner,lacarteabesoindunealimentation.Lemicrocontrleurfonctionnant
sous 5V, la carte peut tre alimente en 5V par le port USB (en 2) ou bien par une
alimentation externe (en 3) qui est comprise entre 7V et 12V. Cette tension doit tre
continue et peut par exemple tre fournie par une pile 9V. Un rgulateur se charge
ensuite de rduire la tension 5V pour le bon fonctionnement de la carte. Pas de
danger de tout griller donc! Veuillez seulement respecter lintervalle de 7V 15V
(mme si le rgulateur peut supporter plus, pas la peine de le retrancher dans ses
limites)

Visualisation
Lestroispointsblancsentoursenrouge(4)sontenfaitdesLEDdontlatailleestde
35

lordredumillimtre.CesLEDserventdeuxchoses:
Celletoutenhautducadre:elleestconnecteunebrochedumicrocontrleur
etvaservirpourtesterlematriel.Nota:QuandonbranchelacarteauPC,elle
clignotequelquessecondes.
Les deux LED du bas du cadre : servent visualiser lactivit sur la voie srie
(une pour lmission et lautre pour la rception). Le tlchargement du
programme dans le microcontrleur se faisant par cette voie, on peut les voir
clignoterlorsduchargement.

Laconnectique
La carte Arduino ne possdant pas de composants qui peuvent tre utiliss pour un
programme, mis a par la LED connecte la broche 13 du microcontrleur, il est
ncessairedelesrajouter.Maispourcefaire,ilfautlesconnecterlacarte.Cestl
quintervientlaconnectiquedelacarte(en5aet5b).Parexemple,onveutconnecter
une LED sur une sortie du microcontrleur. Il suffit juste le la connecter, avec une
rsistance en srie, la carte, sur les fiches de connections de la carte. Cette
connectique est importante et a un brochage quil faudra respecter. Nous le verrons
quand nous apprendrons faire notre premier programme. Cest avec cette
connectique que la carte est extensible, car lon peut y brancher tous types de
montagesetmodules!Parexemple,lacarteArduinoUnopeuttretendueavecdes
shields, comme le Shield Ethernet qui permet de connecter cette dernire
internet.

UnecarteArduinotendueavecunEthernetShield

Installation
Afindutiliserlacarte,ilfautlinstaller.Normalement,lesdriverssontdjinstallssous
GNU/Linux. Sous mac, il suffit de double cliquer sur le fichier .mkpg inclus dans le
tlchargementdelapplicationArduinoetlinstallationdesdriverssexcutedefaon
automatique.

SousWindows
LorsquevousconnectezlacartevotreordinateursurleportUSB,unpetitmessageen
basdelcranapparat.Thoriquement,lacartequevousutilisezdoitsinstallertoute
seule.Cependant,sivoustessousWin7commemoi,ilsepeutquecanemarchepas
du premier coup. Dans ce cas, laisser la carte branche puis ensuite allez dans le
panneaudeconfiguration.Unefoisl,cliquezsursystmepuisdanslepanneaude
gauche slectionnez gestionnaire de priphriques. Une fois ce menu ouvert, vous
36

devriezvoiruncomposantavecunpanneauattentionjaune.Faitesunclicdroitsurle
composant et cliquez sur Mettre jour les pilotes. Dans le nouveau menu,
slectionnezloptionRechercherlepilotemoimme.Enfin,ilnevousresteplusqu
aller slectionner le bon dossier contenant le driver. Il se trouve dans le dossier
dArduino que vous avez du dcompresser un peu plus tt et se nomme drivers
(attention, ne descendez pas jusquau dossier FTDI). Par exemple, pour moi le
cheminsera:
[lecheminjusqu'audossier]\arduino0022\arduino0022\drivers
Il semblerait quil y est des problmes en utilisant la version francaise dArduino
(lesdriverssontabsentsdudossier).Sicestlecas,ilvousfaudratlchargerla
versionoriginale(anglaise)pourpouvoirinstallerlesdrivers.
AprslinstallationetunesuitedeclignotementsurlesmicroLEDdelacarte,celleci
devraittrefonctionnelleunepetiteLEDvertetmoignedelabonnealimentationdela
carte:

Carteconnecteetalimente

Testersonmatriel
Avantdecommencerprogrammerlattebaisse,ilfaut,avanttouteschoses,testerle
bonfonctionnementdelacarte.Carceseraitidiotdeprogrammerlacarteetchercher
leserreursdansleprogrammealorsqueleproblmevientdelacarte! Nousallons
testernotrematrielenchargeantunprogrammequifonctionnedanslacarte.
Mais,onnenapasencorefaitdeprogrammes?o_O
Toutjuste!MaislelogicielArduinocontientdesexemplesdeprogrammes.Etbience
sontcesexemplesquenousallonsutiliserpourtesterlacarte.

1retape:ouvrirunprogramme
NousallonschoisirunexempletoutsimplequiconsistefaireclignoteruneLED.Son
nomestBlinketvousletrouverezdanslacatgorieBasics:

37

Une fois que vous avez cliqu sur Blink, une nouvelle fentre va apparatre. Elle va
contenir le programme Blink. Vous pouvez fermer lancienne fentre qui va ne nous
servirplusrien.

38

2etape
AvantdenvoyerleprogrammeBlinkverslacarte,ilfautdireaulogicielquelestlenom
delacarteetsurquelportelleestbranche.Choisirlacartequelonvaprogrammer.
Cenestpastrscompliqu,lenomdevotrecarteestindiqusurelle.Pournous,il
sagit de la carte Uno. Allez dans le menu Tools (outils en franais) puis dans
Board(carteenfranais).VrifiezquecestbienlenomArduinUnoquiestcoch.
Sicenestpaslecas,cochezle.

39

Choisissezleportdeconnexiondelacarte.AllezdanslemenuTools,puisSerial
port.L,vouschoisissezleportCOMX,Xtantlenumroduportquiestaffich.Ne
choisissezpasCOM1carilnestquasimentjamaisconnectlacarte.Dansmoncas,
ilsagitdeCOM5:

40

Pourtrouverleportdeconnexiondelacarte,vouspouvezallerdanslegestionnaire
depriphriquequisetrouvedanslepanneaudeconfiguration.Regardezlaligne
Ports(COMetLPT)etl,vousdevriezavoirArduinoUno(COMX).Aller,uneimage
pourleplaisir:

41

Derniretape
Trsbien.Maintenant,ilvafalloirenvoyerleprogrammedanslacarte.Pourcefaire,il
suffitdecliquersurleboutonTlverser,enjauneorangsurlaphoto:

42

Vous verrez tout dabord le message Compilation du croquis en cours pour vous
informerqueleprogrammeestentraindtrecompilenlangagemachineavantdtre
envoy.Ensuitevousaurezceci:

43

En bas dans limage, vous voyez le texte : Tlversement, cela signifie que le
logicielestentraindenvoyerleprogrammedanslacarte.Unefoisquilafini,ilaffiche
unautremessage:

44

Le message afficher : Tlversementtermin signale que le programme bien t


chargdanslacarte.Sivotrematrielfonctionne,vousdevriezavoiruneLEDsurla
cartequiclignote:
Sivousnobtenezpascemessagemaispluttuntrucenrouge,pasdinquitude,
lematrielnestpasforcmentdfectueux!
Eneffet,plusieurserreurssontpossibles:
lIDErecompileavantdenvoyerlecode,vrifierlaprsencederreur
Lavoiesrieestpeuttremalchoisi,vrifierlesbranchementsetlechoixdela
voiesrie
lIDE est cod en JAVA, il peuttre capricieux et bugger de temps en temps
(surtoutaveclavoiesrie):ressayezlenvoi!

45

LEDsurlacartequiclignote

Fonctionnementglobal
Nousavonsvuprcdemmentcequtaitunecartelectroniqueprogrammable.Nous
avons galement vu de quels lments se basait une carte lectronique pour
fonctionner(schmalectronique,schmadecblage).Jeviensdevousprsenterla
carte, de quoi elle est principalement constitue. Enfin, je vous ai montr comment
lutiliser de manire faire clignoter une petite lumire. Dornavant, nous allons voir
comment elle fonctionne de faon globale et rpondre quelques questions qui
pourraient vous trotter dans la tte : Comment la carte sait quil y a une LED de
connecte?,Etcommentsaitellequecestsurtellebroche?,Etleprogramme,o
estcequilsetrouveetsousquelleforme?,Commentlacartefaitpourcomprendrece
quelledoitfaire?,Denombreusesquestions,effectivement!

Partonsduprogramme
Lecontenu
Le contenu du programme, donc le programme en luimme, est ce qui va dfinir
chaque action que va excuter la carte Arduino. Mais ce nest pas tout ! Dans le
programmeilyaplusieurszones,quenousverronsplusendtailtoutaulongdela
lecturedececours,quiontchacuneunrleparticulier.
Lapremirezonesertprincipalement(jenevaispasmtendre)direlacarte
degarderenmmoirequelquesinformationsquipeuventtre:lemplacement
dun lment connect la carte, par exemple une LED en broche 13, ou bien
une valeur quelconque qui sera utile dans le programme :

La zone secondaire est lendroit o lon va initialiser certains paramtres du


46

programme. Par exemple, on pourra dire la carte quelle devra communiquer


aveclordinateurousimplementluidirecequelledevrafairedeleLEDquiest
connectesursabroche13.Onpeutencorefairedautreschoses,maisnousle
verrons
plus
tard.

Ladernirezoneestlazoneprincipaleosedrouleraleprogramme.Toutce
quivatrecritdanscettezoneseraexcutparlacarte,sesontlesactionsque
lacartefera.Parexemple,cesticiquonpourraluidiredefaireclignoterlaLED
sursabroche13.Onpourragalementluidemanderdefaireuneoprationtelle
que
2+2
ou
bien
dautres
choses
encore
!

En conclusion, tout (vraiment tout !) ce que va faire la carte est inscrit dans le
programme.Sansprogramme,lacartenesertrien!Cestgrceauprogrammequela
carte Arduino va savoir quune LED est connecte sur sa broche 13 et ce quelle va
devoirfaireavec,allumeretteindrelaLEDalternativementpourlafaireclignoter.

Etlenvoi
Le programme est envoy dans la carte lorsque vous cliquez sur le bouton
. Le
logicielArduinovaalorsvrifiersileprogrammenecontientpasderreuretensuitele
compiler(letraduire)pourlenvoyerdanslacarte:

Audpart,leprogrammeestsousformedetexte,puisilesttransformenunlangage
composuniquementde0etde1(cequiestabsolumentillisibleensoi! ).
47

Lenvoiduprogrammeestgrparvotreordinateur:leprogrammepasse,sousforme
de0etde1,danslecbleUSBquirelievotreordinateurvotrecarteetarrivedansla
carte.Lerestesepassedanslacarteellemme

Rceptionduprogramme
LeprogrammerentredoncdanslacarteenpassantenpremierparleconnecteurUSB
de celleci. Il va alors subir une petite transformation qui permet dadapter le signal
lectrique correspondant au programme (oui car le programme transite dans le cble
USB sous forme de signal lectrique) vers un signal plus appropri pour le
microcontrleur.OnpasseainsidunsignalcodpourlanormeUSBunsignalcod
pour une simple voie srie (que lon tudiera plus tard dailleurs). Puis ce nouveau
signalestalorsinterceptparlemicrocontrleur.

Toutlerestesepassealors

Alintrieurdumicrocontrleur
Lemplacementduprogramme
Le microcontrleur reoit le programme sous forme de signal
lectriquesursesbrochesTxetRx,dailleursdisponiblesurles
broches de la carte (cf. image). Une fois quil est reu, il est
intgralementstockdansunemmoiredetypeFlashquelon
appelleralammoiredeprogramme.Ensuite,lorsquelacarte
dmarre normalement (quaucun programme nest en train
dtre charg), le cerveau va alors grer les donnes et les
rpartirdanslesdiffrentesmmoires:
Lammoireprogrammeestcellequivaservirsavoiro
lonenestdansleprogramme,quelleinstructiononest
rendu. Cest dire, en quelque sorte, pointer sur des
morceaux des zones 2 et 3 que lon a vu dans le prcdent exemple de
programme.
Lammoirededonnes,aussiappelRAM(commedansvotreordinateur)va
48

stockerlesvariablestellesquelenumrodelabrochesurlaquelleestconnecte
uneLED,oubienunesimplevaleurcommeunchiffre,unnombre,descaractres,
etc.
Voici un petit synoptique qui vous montre un peu lintrieur du microcontrleur (cest
trs
simplifi
!)
:

Dmarragedumicrocontrleur
Lorsque le microcontrleur dmarre, il va commencer par lanc un bout de code
particulier:lebootloader.Cestcedernierquivasurveillersiunnouveauprogramme
arrivesurlavoieUSBetsilfautdoncchangerlancienenmmoireparlenouveau.Si
riennarrive,ildonnelamainvotreprogramme,celuiquevousavezcr.Cedernier
va alors dfiler, instruction par instruction. Chaque fois quune nouvelle variable sera
ncessaire, elle sera mise en RAM pour quon ai une mmoire de cette dernire (et
supprimerlorsquellenestplusncessaire).Sinon,lesinstructionsvontsesuivreune
parune,danslordrequevouslesavezcrites.

[Arduino105]LelangageArduino(1/2)
AprsentquevousavezunevisionglobalesurlefonctionnementdelacarteArduino,
nousallonspouvoirapprendreprogrammeravantdenouslancerdanslaralisation
deprogrammestrssimplepourdbuter!Pourpouvoirprogrammernotrecarte,ilnous
fauttroischoses:
Unordinateur
UnecarteArduino
EtconnaitrelelangageArduino
49

Cestcedernierpointquilnousfautacqurir.Lebutmmedecechapitreestdevous
apprendreprogrammeraveclelangageArduino.Cependant,cenestquunsupport
de cours que vous pourrez parcourir lorsque vous devrez programmer tout seul votre
carte. En effet, cest en manipulant que lon apprend, ce qui implique que votre
apprentissage en programmation sera plus consquent dans les prochains chapitres
quedanscecoursmme.
Le langage Arduino est trs proche du C et du C++. Pour ceux dont la
connaissancedeceslangagesestfonde,nevoussentezpasobligdelireles
deux chapitre sur le langage Arduino. Bien quil y ait des points quelques peu
important.

Lasyntaxedulangage
Lasyntaxedunlangagedeprogrammationestlensembledesrglesdcritureslies
celangage.Onvadoncvoirdanscesouschapitrelesrglesquirgissentlcriture
dulangageArduino.

Lecodeminimal
AvecArduino,nousdevonsutiliseruncodeminimallorsqueloncreunprogramme.
Ce code permet de diviser le programme que nous allons crer en deux grosses
parties.
1
2
3
4
5
6
7
8
9
10
11

//fonctiond'initialisationdelacarte
voidsetup()
{
//contenudel'initialisation
}

//fonctionprincipale,elleserpte(sexcute)l'infini
voidloop()
{
//contenudevotreprogramme
}

Vousavezdoncdevantvouslecodeminimalquilfautinsrerdansvotreprogramme.
Maisquepeutilbiensignifierpourquelquunquinajamaisprogramm?

Lafonction
Dans ce code se trouvent deux fonctions. Les fonctions sont en fait des portions de
code.
1
2
3
4
5
6

//fonctiond'initialisationdelacarte
voidsetup()
{
//contenudel'initialisation
//oncritlecodel'intrieur
}

50

Cette fonction setup() est appele une seule fois lorsque le programme commence.
Cestpourquoicestdanscettefonctionquelonvacrirelecodequinabesoindtre
excut une seule fois. On appelle cette fonction : fonction dinitialisation. On y
retrouveralamiseenplacedesdiffrentessortiesetquelquesautresrglages.Cestun
peu le checkup de dmarrage. Imaginez un pilote davion dans sa cabine qui fait
linventaire :patte2ensortie,tathaut?OKtimer315millisecondes?OK
Unefoisquelonainitialisleprogrammeilfautensuitecrersoncur,autrement
ditleprogrammeenluimme.
1
2
3
4
5

//fonctionprincipale,elleserpte(sexcute)l'infini
voidloop()
{
//contenudevotreprogramme
}

Cestdoncdanscettefonctionloop()olonvacrirelecontenuduprogramme.Ilfaut
savoirquecettefonctionestappeleenpermanence,cestdirequelleestexcute
unefois,puislorsquesonexcutionesttermine,onlarexcuteetencoreetencore.
Onparledeboucleinfinie.
A titre informatif, on nest pas oblig dcrire quelque chose dans ces deux
fonctions. En revanche, il est obligatoire de les crire, mme si elles ne
contiennentaucuncode!

Lesinstructions
Danscesfonctions,oncritquoi?
Cestjustementlobjetdeceparagraphe.Dansvotrelistepourledinerdecesoir,vous
crivez les tches importantes qui vous attendent. Ce sont des instructions. Les
instructionssontdeslignesdecodequidisentauprogramme:faitceci,faitcela,
Cesttoutbtemaistrspuissantcarcestcequivaorchestrernotreprogramme.

Lespointsvirgules
Les points virgules terminent les instructions. Si par exemple je dis dans mon
programme : appelle la fonction couperDuSaucissonje dois mettre un point virgule
aprslappeldecettefonction.
Lespointsvirgules()sontsynonymesderreurscarilarrivetrssouventdeles
oublier la fin des instructions. Par consquent le code ne marche pas et la
recherche de lerreur peut nous prendre un temps consquent ! Donc faites bien
attention.

Lesaccolades
Les accolades sont les conteneurs du code du programme. Elles sont propres aux
fonctions,auxconditionsetauxboucles.Lesinstructionsduprogrammesontcrites
lintrieurdecesaccolades.Parfoisellesnesontpasobligatoiresdanslesconditions
(nous allons voir plus bas ce que cest), mais je recommande de les mettre tout le
temps!Celarendrapluslisiblevotreprogramme.
51

Lescommentaires
Pourfinir,onvavoircequestuncommentaire.Jenaidjmisdanslesexemplesde
codes. Ce sont des lignes de codes qui seront ignores par le programme. Elles ne
serventenrienlorsdelexcutionduprogramme.
Maisalorscestinutile?o_O
Noncarcelavanouspermettrenousetauxprogrammeursquilironsvotrecode(sily
en a) de savoir ce que signifie la ligne de code que vous avez crite. Cest trs
importantdemettredescommentairesetcelapermetaussidereprendreunprogramme
laissdansloubliplusfacilement!Siparexemplevousconnaissezmaluneinstruction
que vous avez crite dans votre programme, vous mettez une ligne de commentaire
pour vous rappeler la prochaine fois que vous lirez votre programme ce que la ligne
signifie.Ligneuniquedecommentaire:
1 //cetteligneestuncommentairesurUNESEULEligne

Ligneouparagraphesurplusieurslignes:
1 /*cetteligneestuncommentaire,surPLUSIEURSlignes
2 quiseraignorparleprogramme,maispasparceluiquilitlecode*/

Lesaccents
Ilestformellementinterditdemettredesaccentsenprogrammation.Saufdansles
commentaires.

Lesvariables
Nouslavonsvu,dansunmicrocontrleur,ilyaplusieurstypesdemmoire.Nousnous
occuperons seulement de la mmoire vive (RAM) et de la mmoire morte
(EEPROM). Je vais vous poser un problme. Imaginons que vous avez connect un
bouton poussoir sur une broche de votre carte Arduino. Comment allezvous stocker
ltatdubouton(appuyouteint)?

Unevariable,questcequecest?
Unevariableestunnombre.Cenombreeststockdansunespacedelammoire
vive(RAM)dumicrocontrleur.Lamanirequipermetdelesstockerestsemblable
celleutilisepourrangerdeschaussures:dansuncasiernumrot.
Chaussuresrangesdansdes
casesnumrotes
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
52

41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
Unevariableestunnombre,cesttout?o_O
Cenombrealaparticularitdechangerdevaleur.Etrangenestcepas?Etbienpas
tant que a, car une variable est en fait le conteneur du nombre en question. Et ce
conteneur va tre stock dans une case de la mmoire. Si on matrialise cette
explicationparunschma,celadonnerait:
nombre=>variable=>mmoire
lesymbole=>signifiant:estcontenudans

Lenomdunevariable
Lenomdevariableacceptequasimenttouslescaractressauf:
.(lepoint)
,(lavirgule)
,,,(lesaccents)
Bonjevaispastouslesdonner,ilnacceptequelalphabetalphanumrique([az],[A
Z],[09])et_(underscore)

Dfinirunevariable
Siondonneunnombrenotreprogramme,ilnesaitpassicestunevariableoupas.Il
faut le lui indiquer. Pour cela, on donne un type aux variables. Oui, car il existe
plusieurstypesdevariables!Parexemplelavariablexvaut4:
1 x=4

Etbiencecodenefonctionneraitpascarilnesuffitpas!Eneffet,ilexisteunemultitude
denombres:lesnombresentiers,lesnombresdcimaux,Cestpourcelaquilfaut
assignerunevariableuntype.Voillestypesdevariableslesplusrpandus:
Type
int
long
char
float

Quelnombreil
Valeursmaximalesdu
stocke?
nombrestock
entier
32768+32767
2147483648+2147483
entier
647
entier
128+127
dcimale
3.4x10 38 +3.4x10 38

double dcimale

3.4x10 38 +3.4x10 38

Nombresur
Nombre
Xbits
doctets
16bits
2octets
32bits

4octets

8bits
32bits

1octets
4octets

32bits

4octets

Par exemple, si notre variable x ne prend que des valeurs entires, on utilisera les
typesint,long,ouchar.Simaintenantlavariablexnedpassepaslavaleur64ou
87,alorsonutiliseraletypechar.
53

1 charx=0

Sienrevanchex=260,alorsonutiliseraletypesuprieur(quiaccepteuneplus
grandequantitdenombre)char,autrementditintoulong.
Maistespasmalin,pourviterlesdpassementsdevaleurontmettoutdansdes
doubleoulong!
Oui,maisNON.Unmicrocontrleur,cenestpasunordinateur2GHzmulticore,4Gode
RAM!IcionparledunsystmequifonctionneavecunCPU16MHz(soit0,016GHz)
et2KodeSRAMpourlammoirevive.Doncdeuxraisonsfontquilfautchoisirses
variablesdemanirejudicieuse:
LaRAMnestpasextensible,quandilyenaplus,yenaplus!
Le processeur est de type 8 bits (sur Arduino UNO), donc il est optimis pour
faire des traitements sur des variables de taille 8 bits, un traitement sur une
variable32bitsprendradonc(beaucoup)plusdetemps!
Siprsentnotrevariablexneprendjamaisunevaleurngative(20,78,),alors
onutiliserauntypenonsign.Cestdire,dansnotrecas,unchardontlavaleurnest
plusde128+127,maisde0255.Voiciletableaudestypesnonsigns,onrepre
cestypesparlemotunsigned(delanglais:nonsign)quilesprcde:
Type

Quelnombreil
stocke?

Valeursmaximalesdu
nombrestock

unsigned
entiernonngatif 0255
char
unsigned
entiernonngatif 065535
int
unsigned
entiernonngatif 04294967295
long

Nombresur
Xbits

Nombre
doctets

8bits

1octets

16bits

2octets

32bits

4octets

UnedesparticularitsdulangageArduinoestquilaccepteunnombreplusimportant
detypesdevariables.Jevousleslistedanscetableau:
Quelnombreil
Valeursmaximalesdu
stocke?
nombrestock
byte
entiernonngatif 0255
word
entiernonngatif 065535
boolean entiernonngatif 01
Type

Nombresur
Nombre
Xbits
doctets
8bits
1octets
16bits
2octets
1bits
1octets

Pourvotreinformation,vouspouvezretrouvercestableauxsurcettepage.

Lesvariablesboolennes
Lesvariablesboolennessontdesvariablesquinepeuventprendrequedeuxvaleurs
:ouVRAIouFAUX.Ellessontutilisesnotammentdanslesbouclesetlesconditions.
Nousverronspourquoi.Unevariableboolennepeuttredfiniedeplusieursmanires
54

:
1
2
3
4

//variableestfaussecarellevautFALSE,dutermeanglais"faux"
booleanvariable=FALSE
//variableestvraiecarellevautTRUE,dutermeanglais"vrai"
booleanvariable=TRUE

Quand une variable vaut 0, on peut considrer cette variable comme une variable
boolenne,elleestdoncfausse.Enrevanche,lorsquellevaut1ounimportequelle
valeursdiffrentedezro,onpeutaussilaconsidrercommeunevariableboolenne,
elleestdoncvraie.Voilunexemple:
1
2
3
4
5
6

//variableestfaussecarellevaut0
intvariable=0
//variableestvraiecarellevaut1
intvariable=1
//variableestvraiecarsavaleurestdiffrentede0
intvariable=42

Le langage Arduino accepte aussi une troisime forme dcriture (qui lui sert pour
utiliserlesbrochesdesortiesdumicrocontrleur):
1
2
3
4

//variableestl'tatlogiquebas(=traductionde"low"),donc0
intvariable=LOW
//variableestl'tatlogiquehaut(=traductionde"high"),donc1
intvariable=HIGH

Nousnousservironsdecettetroisimecriturepourallumeretteindredeslumires

Lesoprationssimples
On va voir prsent les oprations qui sont possibles avec le langage Arduino
(addition,multiplication,).Jevousvoistoutdesuitedire:Maispourquoionfaita,
onlafaitenprimaire! Etbienparcequecestquelquechosedessentiel,caron
pourra ensuite faire des oprations avec des variables. Vous verrez, vous changerez
davisaprsavoirlulasuite!

Laddition
Vous savez ce que cest, pas besoin dexplications. Voyons comment on fait cette
oprationaveclelangageArduino.Prenonslammevariablequetoutlheure:
1
2
3
4
5
6

//dfinitiondelavariablex
intx=0

//onchangelavaleurdexparuneoprationsimple
x=12+3
//xvautmaintenant12+3=15

Faisonsmaintenantuneadditiondevariables:
1
2
3
4

//dfinitiondelavariablexetassignationlavaleur38
intx=38
inty=10
intz=0

55

5 //faisonsuneaddition
6 //onadoncz=38+10=48
7 z=x+y

Lasoustraction
Onpeutreprendrelesexemplesprcdents,enfaisantunesoustraction:
1
2
3
4
5
6

/dfinitiondelavariablex
intx=0

//onchangelavaleurdexparuneoprationsimple
x=123
//xvautmaintenant123=9

Soustractiondevariables:
1
2
3
4
5

intx=38//dfinitiondelavariablexetassignationlavaleur38
inty=10
intz=0

z=xy//onadoncz=3810=28

Lamultiplication
1
2
3
4
5
6
7
8
9
10
11

intx=0
inty=10
intz=0

x=12*3//xvautmaintenant12*3=36

z=x*y//onadoncz=36*10=360

//onpeutaussimultiplier(outouteautreopration)unnombreetunevariable:

z=z*(1/10)//soitz=360*0.1=36

Ladivision
1
2
3
4
5
6
7

floatx=0
floaty=15
floatz=0

x=12/2//xvautmaintenant12/2=6

z=y/x//onadoncz=15/6=2.5

Attention cependant, si vous essayer de stocker le rsultat dune division dans une
variable de type char, int ou long, le rsultat sera stock sous la forme dun entier
arrondiaunombreinfrieur.Parexempledanslecodeprcdentsionmetzdansun
intonaura:
1
2
3
4
5

floatx=0
floaty=15
intz=0

x=12/2//xvautmaintenant12/2=6

56

6
7 z=y/x//onadoncz=15/6=2!

Lemodulo
Aprscettebrveexplicationsurlesoprationsdebase,passonsquelquechosede
plussrieux.Lemoduloestuneoprationdebase,certesmoinsconnuequelesautres.
Cetteoprationpermetdobtenirlerestedunedivision.
1 18%6//lerestedel'oprationest0,carilya3*6dans18donc1818=0
2 18%5//lerestedel'oprationest3,carilya3*5dans18donc1815=3

Lemoduloestutilisgrceausymbole%.Cesttoutcequilfautretenir.Autreexemple
:
1
2
3
4
5

intx=24
inty=6
intz=0

z=x%y//onadoncz=24%6=0(car6*4=24)

Lemodulonepeuttrefaitquesurdesnombresentiers

Quelquesoprationsbienpratiques
Voyonsunpeudautresoprationsquifacilitentparfoislcritureducode.

Lincrmentation
Derrirecenombarbaresecacheunesimpleoprationdaddition.
1 var=0
2 var++//c'estcettelignedecodequinousintresse

var++revientcrire:var=var+1Enfait,onajoutelechiffre1lavaleurdevar.
Etsionrptelecodeuncertainnombredefois,parexemple30,etbienonauravar=
30.

Ladcrmentation
Cestlinversedelincrmentation.Autrementdit,onenlvelechiffre1lavaleurde
var.
1 var=30
2 var//dcrmentationdevar

Lesoprationscomposes
Parfois il devient assez lassant de rcrire les mmes chose et lon sait que les
programmeurs sont des gros fainants ! Il existe des raccourcis lorsque lon veut
effectueruneoprationsurunemmevariable:
1 intx,y

57

2
3
4
5
6

x+=y//correspondx=x+y
x=y//correspondx=xy
x*=y//correspondx=x*y
x/=y//correspondx=x/y

Avecunexemple,celadonnerait:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

intvar=10

//opration1
var=var+6
var+=6//var=16

//opration2
var=var6
var=6//var=4

//opration3
var=var*6
var*=6//var=60

//opration4
var=var/5
var/=5//var=2

Loprationdebascule(ouinversiondtat)
Unjour,pourleprojetduBAC,jedevais(oupluttjevoulais)amlioreruncodequi
servaitprogrammerunmoduledunecentraledegestiondomestique.Monbuttait
dafficherunchoixlutilisateursuruncran.Pourcefaire,ilfallaitquejeraliseune
basculeprogramme(cestcommeaquejelanommemaintenant).Etaprsmaintes
recherchesettests,jairussitrouver!Etilsavrequecetteopration,silonpeut
lappeler ainsi, est trs utile dans certains cas. Nous lutiliserons notamment lorsque
lonvoudrafaireclignoterunelumire.Sansplusattendre,voilcetteastuce:
1
2
3
4

//ondfinitunevariablexquinepeutprendrequelavaleur0ou1(vraieoufausse)
booleanx=0

x=1x//c'estlatoutel'astuceduprogramme!

Analysonscetteinstruction.Achaqueexcutionduprogramme(oui,jaiomisdevous
ledire,ilserptejusqulinfini),lavariablexvachangerdevaleur:
1ertemps:x=1xsoitx=10doncx=1
2etemps:x=1xorxvautmaintenant1doncx=11soitx=0
3etemps:xvaut0doncx=10soitx=1
Cecodeserptedoncetchaquerptition,lavariablexchangedevaleuretpasse
de01,de10,de01,etc.Ilagitbiencommeunebasculequichangelavaleur
dune variable boolenne. En mode console cela donnerait quelque chose du genre
(nessayezpascelanemarcherapas,cestunexemple):
1 x=0
2 x=1

58

3
4
5
6

x=0
x=1
x=0
...

Mais il existe dautres moyens darriver au mme rsultat. Par exemple, en utilisant
loprateur ! qui signifie not (non). Ainsi, avec le code suivant on aura le mme
fonctionnement:
1 x=!x

Puisquchaquepassagexdevientpasxdoncsixvaut1soncontrairesera0etsil
vaut0,ildeviendra1.

Lesconditions
Questcequunecondition
Cestunchoixquelonfaitentreplusieurspropositions.Eninformatique,lesconditions
servent tester des variables. Par exemple : Vous faites une recherche sur un site
spcialispouracheterunenouvellevoiture.Vousimposezleprixdelavoiturequidoit
treinfrieur5000(cestunpetitbudget ).Leprogrammequivagreravafaire
appeluntestconditionnel.Ilvaliminertouslesrsultatsdelarecherchedontle
prixestsuprieur5000.

Quelquessymboles
Pour tester des variables, il faut connatre quelques symboles. Je vous ai fait un joli
tableaupourquevousvousrepriezbien:
Symbole
==
<
>
<=
>=
!=

Aquoiilsert
Cesymbole,composdedeuxgales,permetdetester
lgalitentredeuxvariables
Celuicitestelinfrioritdunevariableparrapportune
autre
Lcestlasuprioritdunevariableparrapportune
autre
testelinfrioritoulgalitdunevariableparrapport
uneautre
testelasuprioritoulgalitdunevariableparrapport
uneautre
testeladiffrenceentredeuxvariables

Signification
estgale
estinfrieur
estsuprieur

estinfrieurou
gale
estsuprieurou
gal
estdiffrent
de

Etsionsoccupaitdesconditions?Oubiensinononvatranquillementallerboireun
boncaf?Commentdcortiquercettephrase?Mmm Ha!Jesais!Cettephraseimpliqueunchoix:le
premierchoixestdesoccuperdesconditions.Silinterlocuteurditoui,alorsilsoccupe
des conditions. Mais sil dit non, alors il va boire un bon caf. Il a donc lobligation
deffectueruneactionsurlesdeuxproposes.Eninformatique,onparledecondition.
59

silaconditionestvraie,onfaituneaction.Enrevanchesilaconditionestfausse,on
excuteuneautreaction.

Ifelse
La premire condition que nous verrons est la condition ifelse. Voyons un peu le
fonctionnement.

if
Onveuttesterlavaleurdunevariable.Prenonslemmeexemplequetoutlheure.Je
veuxtestersilavoitureestinfrieure5000.
1 intprix_voiture=4800//variable:prixdelavoituredfinit4800

Dabord on dfinit la variable prix_voiture. Sa valeur est de 4800. Ensuite, on doit


testercettevaleur.Pourtesterunecondition,onemploieletermeif(delanglaissi).
Cetermedoittresuivideparenthsesdanslesquellessetrouverontlesvariables
tester.Doncentrecesparenthses,nousdevonstesterlavariableprix_voitureafinde
savoirsielleestinfrieure5000.
1
2
3
4

if(prix_voiture<5000)
{
//laconditionestvraie,doncj'achtelavoiture
}

Onpeutlirecettelignedecodecommececi:silavariableprix_voitureestinfrieure
5000,onexcutelecodequisetrouveentrelesaccolades.
Les instructions qui sont entre les accolades ne seront excutes que si la
conditiontesteestvraie!
Leschmasuivrepourtesteruneconditionestdonclesuivant:
1
2
3
4

if(/*contenudelaconditiontester*/)
{
//instructionsexcutersilaconditionestvraie
}

else
On a pour linstant test que si la condition est vraie. Maintenant, nous allons voir
commentfairepourquedautresinstructionssoientexcutessilaconditionestfausse.
Le terme else de langlais sinon implique notre deuxime choix si la condition est
fausse.Par exemple, si le prix de la voiture est infrieur 5000, alors je lachte.
Sinon,jenelachtepas.Pourtraduirecettephraseenlignedecode,cestplussimple
quavecunif,ilnyapasdeparenthsesremplir:
1
2
3
4
5

intprix_voiture=5500

if(prix_voiture<5000)
{
//laconditionestvraie,doncj'achtelavoiture

60

6
7
8
9
10

}
else
{
//laconditionestfausse,doncjen'achtepaslavoiture
}

Leelseestgnralementutilispourlesconditionsditesdedfaut.Cestluiqui
le pouvoir sur toutes les conditions, cestdire que si aucune condition nest
vraie,onexcutelesinstructionsquilcontient.
Leelsenestpasobligatoire,onpeuttrsbienmettreplusieursiflasuite.
Leschmadeprinciperetenirestlesuivant:
1
2
3
4

else//sitouteslesconditionsprcdentessontfausses...
{
//...onexcutelesinstructionsentrecesaccolades
}

elseif
A ce que je vois, on a pas trop le choix : soit la condition est vraie, soit elle est
fausse.Ilnyapasdautrespossibilits?o_O
Biensurquelonpeuttesterdautresconditions!Pourcela,onemploieletermeelseif
qui signifie sinon si Par exemple, SI le prix de la voiture est infrieur 5000 je
lachteSINONSIelleestgale5500maisquellealoptionGPSenplus,alorsje
lachteSINONjenelachtepas.Lesinonsisemploiecommeleif:
1
2
3
4
5
6
7
8
9
10
11
12
13
14

intprix_voiture=5500

if(prix_voiture<5000)
{
//laconditionestvraie,doncj'achtelavoiture
}
elseif(prix_voiture==5500)
{
//laconditionestvraie,doncj'achtelavoiture
}
else
{
//laconditionestfausse,doncjen'achtepaslavoiture
}

Aretenirdonc,silapremireconditionestfausse,ontesteladeuxime,siladeuxime
estfausse,ontestelatroisime,etc.Schmadeprincipeduelse,idemauif:
1
2
3
4

elseif(/*testdelacondition*/)//sielleestvraie...
{
//...onexcutelesinstructionsentrecesaccolades
}

Leelseifnepeutpastreutilisetouteseule,ilfautobligatoirementquilyaitun
ifavant!
61

Lesoprateurslogiques
Et si je vous posais un autre problme ? Comment faire pour savoir si la voiture est
infrieure5000ETsielleestgrise?
Cestvraia,sijeveuxquelavoituresoitgriseenplusdtreinfrieure5000,
commentjefais?
Ilexistedesoprateursquivontnouspermettredetestercettecondition!Voyonsquels
sontsesoprateurspuistestonsles!
Oprateur Signification
&&
ET
||
OU
!
NON

ET
Reprenonscequenousavonstestdansleelseif:SIlavoiturevaut5500ETquelle
aloptionGPSenplus,ALORSjelachte.Onvautiliserunifetunoprateurlogique
quiseraleET:
1
2
3
4
5
6
7
8
9

intprix_voiture=5500
intoption_GPS=TRUE

/*l'oprateur&&lielesdeuxconditionsquidoiventtre
vraiesensemblepourquelaconditionsoitremplie*/
if(prix_voiture==5500&&option_GPS)
{
//j'achtelavoituresilaconditionprcdenteestvraie
}

OU
Onpeutreprendrelaconditionprcdenteetlapremireenlesassemblantpourrendre
lecodebeaucoupmoinslong.
Etoui,lesprogrammeurssontdesflemmards!
Rappelonsquellessontcesconditions:
1
2
3
4
5
6
7
8
9
10
11
12
13

intprix_voiture=5500
intoption_GPS=TRUE

if(prix_voiture<5000)
{
//laconditionestvraie,doncj'achtelavoiture
}
elseif(prix_voiture==5500&&option_GPS)
{
//laconditionestvraie,doncj'achtelavoiture
}
else
{

62

14 //laconditionestfausse,doncjen'achtepaslavoiture
15 }

Vousvoyezbienquelinstructiondansleifetleelseifestlamme.Avecunoprateur
logique,quiestleOU,onpeutrassemblercesconditions:
1
2
3
4
5
6
7
8
9
10
11

intprix_voiture=5500
intoption_GPS=TRUE

if((prix_voiture<5000)||(prix_voiture==5500&&option_GPS))
{
//laconditionestvraie,doncj'achtelavoiture
}
else
{
//laconditionestfausse,doncjen'achtepaslavoiture
}

Lisonslaconditiontestedansleif:SIleprixdelavoitureestinfrieur5000OUSI
le prix de la voiture est gal 5500 ET la voiture loption GPS en plus, ALORS
jachtelavoiture.
Attention aux parenthses qui sont bien placer dans les conditions, ici elles
ntaientpasncessaires,maisellesaidentmieuxlirelecode.

NON
Moijaimeraistestersilaconditionestfaussejachtelavoiture.Commentfaire?
ToitasunsouciIlexisteundernieroprateurlogiquequiseprnommeNON.Ilpermet
eneffetdetestersilaconditionestfausse:
1
2
3
4
5
6

intprix_voiture=5500

if(!(prix_voiture<5000))
{
//laconditionestvraie,doncj'achtelavoiture
}

Selit:SIleprixdelavoitureNESTPASinfrieur5000,alorsjachtelavoiture.
On sen sert avec le caractre ! (point dexclamation), gnralement pour tester des
variablesboolennes.Onverradanslesbouclesqueapeutgrandementsimplifierle
code.

Switch
Il existe un dernier test conditionnel que nous navons pas encore abord, cest le
switch.Voilunexemple:
1
2
3
4
5
6

intoptions_voiture=0

if(options_voiture==0)
{
//iln'yapasd'optionsdanslavoiture
}

63

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

if(options_voiture==1)
{
//lavoitureal'optionGPS
}
if(options_voiture==2)
{
//lavoitureal'optionclimatisation
}
if(options_voiture==3)
{
//lavoitureal'optionvitreautomatique
}
if(options_voiture==4)
{
//lavoitureal'optionbarresdetoit
}
if(options_voiture==5)
{
//lavoitureal'optionsigejectable
}
else
{
//retentetachance)
}

Cecodeestindigrable!Cestinfme!Grotesque!Pasbeau!Enclair,ilfauttrouver
unesolutionpourchangercela.Cettesolutionexiste,cestleswitch.Leswitch,comme
son nom lindique, va tester la variable jusqu la fin des valeurs quon lui aura
donnes.Voicicommentcelaseprsente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

intoptions_voiture=0

switch(options_voiture)
{
case0:
//iln'yapasd'optionsdanslavoiture
break
case1:
//lavoitureal'optionGPS
break
case2:
//lavoitureal'optionclimatisation
break
case3:
//lavoitureal'optionvitreautomatique
break
case4:
//lavoitureal'optionbarresdetoit
break
case5:
//lavoitureal'optionsigejectable
break
default:
//retentetachance)
break
}

Siontestaitcecode,enralitcelanefonctionneraitpascarilnyapasdinstruction
pourafficherlcran,maisnousaurionsquelquechosedugenre:
64

1 iln'yapasd'optionsdanslavoiture

Sioption_voiturevautmaintenant5:
1 lavoitureal'optionsigejectable

Linstructionbreakesthyperimportante,carsivousnelamettezpas,lordinateur,
oupluttlacarteArduino,vaexcutertouteslesinstructions.Pourvitercela,on
metcetteinstructionbreak,quivientdelanglaiscasser/arrterpourdirelacarte
Arduino quil faut arrter de tester les conditions car on a trouv la valeur
correspondante.

Laconditionternaireoucondense
Cetteconditionestenfaitunesimplificationduntestifelse.Ilnyapasgrandchose
diredessus,parconsquentunexemplesuffira:Cecode:
1
2
3
4
5
6
7
8
9
10
11

intprix_voiture=5000
intachat_voiture=FALSE

if(prix_voiture==5000)//sic'estvrai
{
achat_voiture=TRUE//onachtelavoiture
}
else//sinon
{
achat_voiture=FALSE//onn'achtepaslavoiture
}

Estquivalentceluici:
1
2
3
4

intprix_voiture=5000
intachat_voiture=FALSE

achat_voiture=(prix_voiture==5000)?TRUE:FALSE

Cetteligne:
1 achat_voiture=(prix_voiture==5000)?TRUE:FALSE

Se lit comme ceci : Estce que le prix de la voiture est gal 5000 ? SI oui, alors
jachtelavoitureSINONjenachtepaslavoiture
Bon,vousntespasobligdutilisercetteconditionternaire,cestvraiment pour
lesgrosflemmardsjustepoursimplifierlecode,maispasforcmentlalecturedece
dernier.
NousnavonspasencorefiniaveclelangageArduino.Jevousinvitedoncpasser
lapartiesuivantepourpoursuivrelapprentissagedecelangage.

[Arduino106]LelangageArduino(2/2)
Jaiunequestion.Sijeveuxfairequelecodequejaicritserpte,jesuisoblig
65

delerecopierautantdefoisquejeveux?Oubienilexisteunesolution?o_O
Voiluneexcellentequestionquiintroduitlechapitrequevousallezcommencerlire
car cest justement lobjet de ce chapitre. Nous allons voir comment faire pour quun
boutdecodeserpte.Puisnousverrons,ensuite,commentorganisernotrecodepour
que celuici devienne plus lisible et facile dbugger. Enfin, nous apprendrons
utiliserlestableauxquinousseronttrsutiles.Voilleprogrammequivousattend!

Lesboucles
Questcequuneboucle?
En programmation, une boucle est une instruction qui permet de rpter un bout de
code. Cela va nous permettre de faire se rpter un bout de programme ou un
programmeentier.Ilexistedeuxtypesprincipauxdeboucles:
Laboucleconditionnelle,quitesteuneconditionetquiexcutelesinstructions
quellecontienttantquelaconditiontesteestvraie.
Labouclederptition,quiexcutelesinstructionsquellecontient,unnombre
defoisprdtermin.

Labouclewhile
Problme:Je veux que le volet lectrique de ma fentre se ferme automatiquement
quandlanuittombe.Nous ne nous occuperons pas de faire le systme qui ferme le
voletlarrivedelanuit.LacarteArduinodisposeduncapteurquiindiquelaposition
duvolet(ouvertouferm).Cequenouscherchonsfaire:cestcrerunboutdecode
quifaitdescendrelevolettantquilnestpasferm.Pourrsoudreleproblmepos,
ilvafalloirquelonutiliseuneboucle.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

/*ICI,unboutdeprogrammepermetdefaireleschosessuivantes:
_uncapteurdtectelatombedelanuitetlalevedujour
oSic'estlanuit,alorsondoitfermerlevolet
oSinon,sic'estlejour,ondoitouvrirlevolet

_leprogrammelitl'tatducapteurquiindiquesilevoletestouvertouferm

_enregistrementdecettatdanslavariabledetypeString:position_volet
oSilevoletestouvert,alors:position_volet="ouvert"
oSinon,silevoletestferm:position_volet="ferme"
*/

while(position_volet=="ouvert")
{
//instructionsquifontdescendrelevolet
}

Commentlirececode?
Enanglais,lemotwhilesignifietantque.Doncsionlitlaligne:
66

1 while(position_volet=="ouvert"){/*instructions*/}

Il faut la lire : TANT QUE la position du volet est ouvert, on boucle/rpte les
instructionsdelaboucle(entrelesaccolades).

Constructiondunebouclewhile
Voildonclasyntaxedecettebouclequilfautretenir:
1
2
3
4

while(/*conditiontester*/)
{
//lesinstructionsentrecesaccoladessontrptestantquelaconditionestvraie
}

Unexemple
Prenonsunexemplesimple,ralisonsuncompteur!
1
2
3
4
5
6
7
8

//variablecompteurquivastockerlenombredefoisquelaboucle
intcompteur=0
//auratexcute

while(compteur!=5)//tantquecompteurestdiffrentde5,onboucle
{
compteur++//onincrmentelavariablecompteurchaquetourdeboucle
}

Siontestececode(danslaralitriennesaffiche,cestjusteunexemplepourvous
montrer),celadonne:
1
2
3
4
5
6

compteur=0
compteur=1
compteur=2
compteur=3
compteur=4
compteur=5

Donc au dpart, la variable compteur vaut 0, on excute la boucle et on incrmente


compteur.Maiscompteur ne vaut pour linstant que 1, donc on rexcute la boucle.
Maintenantcompteurvaut2.Onrptelaboucle,jusqu5.Sicompteurvaut5,la
boucle nest pas rexcute et on continu le programme. Dans notre cas, le
programmesetermine.

Laboucledowhile
Cette boucle est similaire la prcdente. Mais il y a une diffrence qui a son
importance!Eneffet,sionprteattentionlaplacelaconditiondanslabouclewhile,
onsaperoitquelleesttesteavantderentrerdanslaboucle.Tandisquedansune
boucle dowhile, la condition est teste seulement lorsque le programme est rentr
danslaboucle:
1
2
3
4

do
{
//lesinstructionsentrecesaccoladessontrptesTANTQUElaconditionestvrai
}while(/*conditiontester*/)

67

Le mot do vient de langlais et se traduis par faire. Donc la boucle dowhile


signifiefairelesinstructions,tantquelaconditiontesteestfausse.Tandisque
dansunebouclewhileonpourraitdire:tantquelaconditionestfausse,faiscequi
suit.
Questcequeachange?
Etbien,dansunewhile,silaconditionestvraiedsledpart,onentrerajamaisdans
cetteboucle.Alinverse,avecuneboucledowhile,onentredanslabouclepuison
testlacondition.Reprenonsnotrecompteur:
1
2
3
4
5
6
7

//variablecompteur=5
intcompteur=5

do
{
compteur++//onincrmentelavariablecompteurchaquetourdeboucle
}while(compteur<5)//tantquecompteurestinfrieur5,onboucle

Danscecode,ondfinitdsledpartlavaleurdecompteur5.Or,leprogrammeva
rentrerdanslabouclealorsquelaconditionestfausse.Donclaboucleestaumoins
excuteunefois!Etcequellequesoitlavracitdelacondition.Entestceladonne
:
1 compteur=6

Concatnation
Une boucle est une instruction qui a t rpartie sur plusieurs lignes. Mais on peut
lcriresuruneseuleligne:
1
2
3
4

//variablecompteur=5
intcompteur=5

do{compteur++}while(compteur<5)

Cestpourquoiilnefautpasoublierlepointvirgulelafin(aprslewhile).Alors
quedansunesimplebouclewhilelepointvirgulenedoitpastremis!

Labouclefor
Voil une boucle bien particulire. Ce quelle va nous permettre de faire est assez
simple.CetteboucleestexcuteXfois.Contrairementauxdeuxbouclesprcdentes,
ondoitluidonnertroisparamtres.
1
2
3
4

for(intcompteur=0compteur<5compteur++)
{
//codeexcuter
}

Fonctionnement
68

1 for(intcompteur=0compteur<5compteur++)

Dabord, on cre la boucle avec le terme for (signifie pour que). Ensuite, entre les
parenthses,ondoitdonnertroisparamtresquisont:
lacrationetlassignationdelavariableunevaleurdedpart
suivitdeladfinitiondelaconditiontester
suivitdelinstructionexcuter
Donc,sionlicetteligne:POURcompteur=0etcompteurinfrieur5,onincrmente
compteur. De faon plus concise, la boucle est excute autant de fois quil sera
ncessairecompteurpourarriver5.Doncici,lecodequisetrouvelintrieurdela
boucleseraexcut5fois.

Aretenir
Lastructuredelaboucle:
1 for(/*initialisationdelavariable*//*conditionlaquellelaboucles'arrte*/

Laboucleinfinie
Laboucleinfinieesttrssimpleraliser,dautantplusquelleestparfoistrsutile.Il
suffitsimplementdutiliserunewhileetdeluiassignercommeconditionunevaleurqui
nechangejamais.Enloccurrence,onmetsouventlechiffre1.
1
2
3
4

while(1)
{
//instructionsrpterjusqu'l'infinie
}

On peut lire : TANT QUE la condition est gale 1, on excute la boucle. Et cette
conditionseratoujoursrempliepuisque1nestpasunevariablemaisbienunchiffre.
galement,ilestpossibledemettretoutautrechiffreentier,oubienleboolenTRUE:
1
2
3
4

while(TRUE)
{
//instructionsrpterjusqu'l'infinie
}

Cela ne fonctionnera pas avec la valeur 0. En effet, 0 signifie condition fausse


donclabouclesarrteraaussitt
La fonction loop() se comporte comme une boucle infinie, puisquelle se rpte
aprsavoirfinidexcutersestches.

Lesfonctions
Dansunprogramme,leslignessontsouventtrsnombreuses.Ildevientalorsimpratif
desparerleprogrammeenpetitsboutsafindamliorerlalisibilitdeceluici,enplus
69

damliorerlefonctionnementetdefaciliterledbogage.Nousallonsvoirensemblece
questunefonction,puisnousapprendronslescreretlesappeler.

Questcequunefonction?
Unefonctionestunconteneurmaisdiffrentdesvariables.Eneffet,unevariablene
peutcontenirquunnombre,tandisquunefonctionpeutcontenirunprogrammeentier!
Parexemplececodeestunefonction:
1
2
3
4

voidsetup()
{
//instructions
}

Enfait,lorsquelonvaprogrammernotrecarteArduino,onvacrirenotreprogramme
dans des fonctions. Pour linstant nous nen connaissons que 2 : setup() et loop().
Danslexempleprcdent,laplaceducommentaire,onpeutmettredesinstructions
(conditions, boucles, variables, ). Cest ces instructions qui vont constituer le
programmeenluimme.Pourtreplusconcret,unefonctionestunboutdeprogramme
quipermetderaliserunetchebienprcise.Parexemple,pourmettreenformeun
texte,onpeutcolorierunmotenbleu,mettrelemotengrasouencoregrossircemot.
Achaquefois,onautilisunefonction:
gras,pourmettrelemotengras
colorier,pourmettrelemotenbleu
grossir,pouraugmenterlatailledumot
Enprogrammation,onvautiliserdesfonctions.Alorscesfonctionssontrpartiesdans
deuxgrandesfamilles.Cequejentendsparl,cestquilexistedesfonctionstoutes
prtesdanslelangageArduinoetdautresquelonvadevoircrernousmme.Cest
cedernierpointquivanousintresser.
Onnepeutpascrireunprogrammesansmettredefonctionslintrieur!Onest
obligdutiliserlafonctionsetup()etloop() (mme si on ne met rien dedans). Si
vouscrivezdesinstructionsendehorsdunefonction,lelogicielArduinorefusera
systmatiquementdecompilervotreprogramme.Ilnyaquelesvariablesglobales
quevouspourrezdclarerendehorsdesfonctions.
Jaipastropcomprisquoiasert?o_O
Lutilitdunefonctionrsidedanssacapacitsimplifierlecodeetlespareren
petits bouts que lon assemblera ensemble pour crer le programme final. Si vous
voulez,cestunpeucommelesjeuxdeconstructionenplastique:chaquepiceson
propremcanismeetraliseunefonction.Parexempleunerouepermetderoulerun
bloc permet de runir plusieurs autres blocs entre eux un moteur va faire avancer
lobjet cr Et bien tous ces lments seront assembls entre eux pour former un
objet (voiture, maison, ). Tout comme, les fonctions seront assembles entre elles
pour former un programme. On aura par exemple la fonction : mettre au carr un
nombrelafonction:additionnera+betc.Quiaufinaldonneralersultatsouhait.

Fabriquerunefonction
70

Pourfabriquerunefonction,nousavonsbesoindesavoirtroischoses:
Quelestletypedelafonctionquejesouhaitecrer?
Quelserasonnom?
Quel(s)paramtre(s)prendratelle?

Nomdelafonction
Pour commencer, nous allons, en premier lieu, choisir le nom de la fonction. Par
exemple, si votre fonction doit rcuprer la temprature dune pice fournie par un
capteur de temprature : vous appellerez la fonction lireTemperaturePiece, ou bien
lire_temperature_piece,ouencorelecture_temp_piece.Bon,desnomsonpeutluien
donnerplein,maissoyezlogiquequantauchoixdecedernier.Ceseraplusfacilepour
comprendrelecodequesivouslappeleztmp(pourtemprature ).
Un nom de fonction explicite garantit une lecture rapide et une comprhension
aiseducode.Unlecteurdoitsavoircequefaitlafonctionjustegrcesonnom,
sanslirelecontenu!

Lestypesetlesparamtres
Lesfonctionsontpourbutdedcoupervotreprogrammeendiffrentesunitslogiques.
Idalement,leprogrammeprincipalnedevraitutiliserquedesappelsdefonctions,en
faisantunminimumdetraitement.Afindepouvoirfonctionner,ellesutilisent,laplupart
dutemps,deschosesenentresetrenvoientquelquechoseensortie.Lesentres
seront appeles des paramtres de la fonctionetla sortie sera appele valeur de
retour.
Notez quune fonction ne peut renvoyer quun seul rsultat la fois. Notez
galement quune fonction ne renvoie pas obligatoirement un rsultat. Elle nest
pasnonplusobligedutiliserdesparamtres.

Lesparamtres
Lesparamtresserventnourrirvotrefonction.Ilsserventdonnerdesinformationsau
traitementquelledoiteffectuer.Prenonsunexempleconcret.Pourchangerltatdune
sortie du microcontrleur, Arduino nous propose la fonction suivante: digitalWrite(pin,
value). Ainsi, la rfrence nous explique que la fonction a les caractristiques
suivantes:
paramtrepin:lenumrodelabrochechanger
paramtrevalue:ltatdanslequelmettrelabroche(HIGH,(haut,+5V)ouLOW
(bas,masse))
retour:pasderetourdersultat
Comme vous pouvez le constater, lexemple est explicite sans lire le code de la
fonction.Sonnom,digitalWrite(crituredigitalepourlesanglophobes),signifiequon
vachangerltatdunebrochenumrique(doncpasanalogique).Sesparamtresont
euxaussidesnomsexplicites,pinpourlabrochechangeretvaluepourltatlui
donner.Lorsquevousallercrerdesfonctions,cestvousdevoirsiellesontbesoin
71

deparamtresounon.Parexemple,vousvoulezfaireunefonctionquimetenpause
votre programme, vous pouvez faire une fonction Pause() et dterminera la dure
pendant laquelle le programme sera en pause. On obtiendra donc, par exemple, la
syntaxe suivante : void Pause(char duree). Pour rsumer un peu, on a le choix de
crerdesfonctionsvides,doncsansparamtres,oubiendesfonctionstypesqui
acceptentunouplusieursparamtres.
Maiscestquoiavoid?
Jyarrive!Souvenezvous,unpeuplushautjevousexpliquaisquunefonctionpouvait
retournerunevaleur,lafameusevaleurdesortie,jevaismaintenantvousexpliquerson
fonctionnement.

Letypevoid
On vient de voir quune fonction pouvait accepter des paramtres et ventuellement
renvoyer quelque chose. Mais ce nest pas obligatoire. En effet, si lon reprend notre
fonctionPause,ellenerenvoieriencarcenestpasncessairedesignalerquoique
ce soit. Dans ce cas, on prfixera le nom de notre fontion avec le motcl void. La
syntaxeutiliseestlasuivante:
1
2
3
4

voidnom_de_la_fonction()
{
//instructions
}

Onutilisedoncletypevoidpourdirequelafonctionnaurapasderetour.Unefonction
detypevoidnepeutdoncpasretournerdevaleur.Parexemple:
1
2
3
4
5

voidfonction()
{
intvar=24
returnvar//nefonctionnerapascarlafonctionestdetypevoid
}

Ce code ne fonctionnera pas, parce que la fonction int. Ce qui est impossible ! Le
compilateur le refusera et votre code final ne sera pas gnr. Vous connaissez
dailleurs dj au moins deux fonctions qui nont pas de retour Et oui, la fonction
setupetlafonctionloop .Ilnyenapasplussavoir.

Lesfonctionstypes
L,celadevientlgrementplusintressant.Eneffet,sionveutcrerunefonctionqui
calcule le rsultat dune addition de deux nombres (ou un calcul plus complexe), il
seraitbiendepouvoirrenvoyerdirectementlersultatpluttquedelestockerdansune
variablequiauneporteglobaleetdaccdercettevariabledansuneautrefonction.
Enclair,lappeldelafonctionnousdonnedirectementlersultat.Onpeutalorsfaire
ce que lon veut avec ce rsultat (le stocker dans une variable, lutiliser dans une
fonction,luifairesubiruneopration,)

Commentcrerunefonctiontype?
72

En soit, cela na rien de compliqu, il faut simplement remplacer long, ) Voil un


exemple:
1
2
3
4
5

intmaFonction()
{
intresultat=44//dclarationdemavariablersultat
returnresultat
}

Notez que je nai pas mis les deux fonctions principales, savoir loop(), mais elles
sontobligatoires!Lorsquelleseraappele,lafonctionresultat.Voyezcetexemple:
1
2
3
4
5
6
7
8
9
10
11
12

intcalcul=0

voidloop()
{
calcul=10*maFonction()
}

intmaFonction()
{
intresultat=44//dclarationdemavariablersultat
returnresultat
}

Danslafonction calcul = 10 * 44;Cequinousdonne:calcul=440.Boncenest


quun exemple trs simple pour vous montrer un peu comment cela fonctionne. Plus
tard, lorsque vous serez au point, vous utiliserez certainement cette combinaison de
faonpluscomplexe.
Comme cet exemple est trs simple, je nai pas inscrit la valeur retourne par la
fonction maFonction() dans une variable, mais il est prfrable de le faire. Du
moins,lorsquecestutile,cequinestpaslecasici.

Lesfonctionsavecparamtres
Cestbiengentiltouta,maismaintenantvousallezvoirquelquechosedebienplus
intressant.Voiluncode,nousverronscequilfaitaprs:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

intx=64
inty=192

voidloop()
{
maFonction(x,y)
}

intmaFonction(intparam1,intparam2)
{
intsomme=0
somme=param1+param2
//somme=64+192=255

returnsomme
}

73

Quesepassetil?
Jaidfinitroisvariables:maFonction()esttypeetacceptedesparamtres.Lisons
lecodedudbut:
Ondclarenosvariables
LafonctionmaFonction()quelonacre
Cestsurcedernierpointquelonvasepencher.Eneffet,onadonnlafonctiondes
paramtres.Cesparamtresserventnourrirlafonction.Pourfairesimple,onditla
fonction:Voildeuxparamtres,jeveuxquetutenservespourfairelecalculqueje
veuxEnsuitearrivelasignaturedelafonction.
Lasignaturedequoituparles?
Lasignaturecestletitrecompletdelafonction.Grceelleonconnaitlenomdela
fonction,letypedelavaleurretourn,etletypedesdiffrentsparamtres.
1 intmaFonction(intparam1,intparam2)

La fonction rcupre dans des variables les paramtres que lon lui a envoys.
Autrementdit,danslavariabley.Soit:param2 = y = 192.Pourfinir,onutilisecesdeux
variables cres la vole dans la signature de la fonction pour raliser le calcul
souhait(unesommedansnotrecas).
Aquoiasertdefairetouta?Pourquoionutilisepassimplementlesvariablesx
etydanslafonction?
Cela va nous servir simplifier notre code. Mais pas seulement ! Par exemple, vous
voulezfaireplusieursoprationsdiffrentes(addition,soustraction,etc.)etbienaulieu
decrerplusieursfonctions,onnevaencrerquunequilesfaittoutes!Mais,afinde
luidirequelleoprationfaire,vousluidonnerezunparamtreluidisant:Multiplieces
deuxnombresoubienadditionnecesdeuxnombres.Cequeceladonnerait:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

unsignedcharoperation=0
intx=5
inty=10

voidloop()
{
//leparamtre"opration"donneletyped'oprationfaire
maFonction(x,y,operation)
}

intmaFonction(intparam1,intparam2,intparam3)
{
intresultat=0
switch(param3)
{
case0://addition,resultat=15
resultat=param1+param2
break
case1://soustraction,resultat=5
resultat=param1param2

74

21
22
23
24
25
26
27
28
29
30
31
32
33
34

break
case2://multiplication,resultat=50
resultat=param1*param2
break
case3://division,resultat=0(carnombreentier)
resultat=param1/param2
break
default:
resultat=0
break
}

returnresultat
}

Doncsilavariablex.Simplecomprendre,nestcepas?

Lestableaux
Commesonnomlindique,cettepartievaparlerdestableaux.
Quel est lintrt de parler de cette surface ennuyeuse quutilisent nos chers
enseignants?
Eh bien dtrompezvous, en informatique un tableau a na rien voir ! Si on devait
(beaucoup)rsumer,untableauestunegrossevariable.Sonbutestdestockerdes
lmentsdemmestypesenlesmettantdansdescases.Parexemple,unprofqui
stockelesnotesdeseslves.Ilutiliserauntableaudefloat(nombrevirgule),avec
unecaseparlves.Nousallonsutilisercetexempletoutaulongdecettepartie.Voici
quelquesprcisionspourbientoutcomprendre:
chaquelveseraidentifiparunnumroallantde0(lepremierlve)19(le
vingtimelvedelaclasse)
onpartde0careninformatiquelapremirevaleurdansuntableauest0!

Untableauenprogrammation
Un tableau, tout comme sous Excel, cest un ensemble constitu de cases, lesquels
vont contenir des informations. En programmation, ces informations seront des
nombres. Chaque case dun tableau contiendra une valeur. En reprenant lexemple
desnotesdeslves,letableaurpertoriantlesnotesdechaquelveressemblerait
ceci:
lve0 lve1 lve2 [...] lven1 lven
10
15,5
8
[...] 18
7

Aquoiasert?
On va principalement utiliser des tableaux lorsque lon aura besoin de stocker des
informations sans pour autant crer une variable pour chaque information. Toujours
avec le mme exemple, au lieu de crer une variable eleve2 et ainsi de suite pour
chaquelve,oninscritlesnotesdeslvesdansuntableau.
75

Mais,concretementcestquoiuntableau:unevariable?unefonction?
Nilun,nilautre.Enfait,onpourraitcomparercelaavecunindexquipointeversles
valeursdevariablesquisontcontenusdanschaquecasedutableau.Unpetitschma
poursimplifier:
lve0
lve1
variabledontonneconnatpaslenommaisqui idem,maisvariablediffrentedela
stockeunevaleur
caseprcdente
Parexemple,celadonnerait:
lve0
lve1
variablenote_eleve0variablenote_eleve1
Avecnotreexemple:
lve0 lve1
10
15,5
Soit,lorsquelondemanderalavaleurdelacase1(correspondantlanotedellve
1),letableaunousrenverralenombre:15,5.Alors,dansunpremiertemps,onvavoir
commentdclareruntableauetlinitialiser.Vousverrezquilyadiffrentesmanires
de procder. Aprs, on finira par apprendre comment utiliser un tableau et aller
chercher des valeurs dans celuici. Et pour finir, on terminera ce chapitre par un
exemple.Yaencoreduboulot!

Dclareruntableau
Comme expliqu plus tt, un tableau contient des lments de mme type. On le
dclaredoncavecuntypesemblable,etunetaillereprsentantlenombredlments
quilcontiendra.Parexemple,pournotreclassede20tudiants:
1 floatnotes[20]

Onpeutgalementcreruntableauvide,lasyntaxeestlgrementdiffrente:
1 floatnotes[]={}

Onveutstockerdesnotes,doncdesvaleursdcimalesentre0et20.Onvadonccrer
un tableau de float (car cest le type de variable qui accepte les nombres virgule,
souvenezvous! ).Danscetteclasse,ilya20lves(de019)doncletableau
contiendra20lments.Sionvoulaitfaireuntableaude100tudiantsdanslesquels
onrecenseleursnombresdabsence,onferaitletableausuivant:
1 charabsenteisme[100]

Accderetmodifierunecasedutableau
76

Pour accder une case dun tableau, il suffit de connatre lindice de la case
laquelleonveutaccder.Lindicecestlenumrodelacasequonveutlire/crire.Par
exemple,pourlirelavaleurdelacase10(doncindice9caroncommence0):
1
2
3
4
5

floatnotes[20]//notretableau
floatvaleur//unevariablequicontiendraunenote

//valeurcontientdsormaislanotedudiximelve
valeur=notes[9]

Cecodesetraduitparlenregistrementdelavaleurcontenuedansladiximecasedu
tableau,dansunevariablenomme valeur. A prsent, si on veut aller modifier cette
mmevaleur,onfaitcommeavecunevariablenormale,ilsuffitdutiliserloprateur=
:
1 notes[9]=10,5//onchangelanotedudiximelve

Enfait,onprocdedelammemanirequepourchangerlavaleurdunevariable,car,
jevouslaidit,chaquecaseduntableauestunevariablequicontientunevaleurou
non.
Faitesattentionauxindicesutiliss.Sivousessayezdelire/criredansunecase
de tableau trop loin (indice trop grand, par exemple 987362598412 ), le
comportement pourrait devenir imprvisible. Car en pratique vous modifierez des
valeurs qui seront peuttre utilises par le systme pour autre chose. Ce qui
pourraitavoirdegravesconsquences!
Vousavezsrementrencontrdescrashsdeprogrammesurvotreordinateur,ils
sont souvent d la modification de variable qui nappartiennent pas au
programme,donclOStueceprogrammequiessaidemanipulerdestrucsquine
luiappartiennentpas.

Initialiseruntableau
Audpart,notretableautaitvide:

1 floatnotes[20]//oncreruntableaudontlecontenuestvide,onsaitsimplementqu'ilcontiendra

Cequelonvafaire,cestinitialisernotretableau.Onalapossibilitderemplirchaque
caseuneparuneoubienutiliserunebouclequirempliraletableaunotreplace.Dans
le premier cas, on peut mettre la valeur que lon veut dans chaque case du tableau,
tandisquavecladeuximesolution,onrempliralescasesdutableauaveclamme
valeur, bien que lon puisse le remplir avec des valeur diffrentes mais cest un peu
pluscompliqu.Dansnotreexempledesnotes,onpartduprincipequelexamennest
paspass,donctoutlemonde0. Pourcela,onparcourttouteslescasesenleur
mettantlavaleur0:
1
2
3
4
5

chari=0//unevariablequel'onvaincrmenter
floatnotes[20]//notretableau

voidsetup()
{

77

6
7
8
9
10
11

//boucleforquirempliraletableaupournous
for(i=0i<20i++)
{
notes[i]=0//chaquecasedutableauvaudra0
}
}

Linitialisation dun tableau peut se faire directement lors de sa cration, comme


ceci:
1 floatnote[]={0,0,0,0/*,etc.*/}

Oubienmme,commecela:
1
2
3
4
5
6
7
8
9
10

floatnote[]={}

voidsetup()
{
note[0]=0
note[1]=0
note[2]=0
note[3]=0
//...
}

Exempledetraitement
Boncestbienbeautouta,onadesnotescoincesdansuntableau,onenfait
quoi?
Excellentequestion,etadpendradelusagequevousenaurez !Voyonsdescas
dutilisationspournotretableaudenotes(enutilisantdesfonctions ).

Lanotemaximale
Comme le titre lindique, on va rechercher la note maximale (le meilleur lve de la
classe). La fonction recevra en paramtre le tableau de float, le nombre dlments
danscetableauetrenverralameilleurenote.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

floatmeilleurNote(floattableau[],intnombreEleve)
{
inti=0
intmax=0//variablescontenantlafuturemeilleurenote

for(i=0i<nombreEleve,i++)
{
if(tableau[i]>max)//silanotelueestmeilleurequelameilleureactuelle
{
max=tableau[i]//alorsonl'enregistre
}
}
returnmax//onretournelameilleurenote
}

Ce que lon fait, pour lire un tableau, est exactement la mme chose que lorsquon
78

linitialiseavecunebouclefor.
Ilesttoutfaitpossibledemettrelavaleurdelacaserecherchdansunevariable
:
1 intvaleur=tableau[5]//onenregistrelavaleurdelacase6dutableaudansunevariable

Voila,centaitpassidur,vouspouvezfairepareilpourchercherlavaleurminimale
afinvousentrainer!

Calculdemoyenne
Ici,onvachercherlamoyennedesnotes.Lasignaturedelafonctionseraexactement
lammequecelledelafonctionprcdente,ladiffrencedunom!Jevouslaisse
rflchir, voici la signature de la fonction, le code est plus bas mais essayez de le
trouvervousmmeavant:
1 floatmoyenneNote(floattableau[],intnombreEleve)

Unesolution:
1
2
3
4
5
6
7
8
9
10
11
12

floatmoyenneNote(floattableau[],intnombreEleve)
{
inti=0
doubletotal=0//additiondetouteslesnotes
floatmoyenne=0//moyennedesnotes
for(i=0i<nombreElevei++)
{
total=total+tableau[i]
}
moyenne=total/nombreEleve
returnmoyenne
}

Onentermineaveclestableaux,onverrapeuttreplusdechosesenpratique.
Maintenant vous pouvez pleurer, de joie bien sr, car vous venez de terminer la
premirepartie!Aprsent,faisonsplacelapratique

79

[Arduino2]Gestiondesentres/sorties
Maintenant que vous avez acquis assez de connaissances en programmation et
quelquesnotionsdlectronique,onvasepenchersurlutilisationdelacarteArduino.
Je vais vous parler des entres et des sorties de la carte et vous aider crer votre
premierprogramme!

[Arduino201]Notrepremierprogramme!
Vous voil enfin arriv au moment fatidique o vous allez devoir programmer ! Mais
avantcela,jevaisvousmontrercequivanousservirpourcechapitre.Enloccurrence,
apprendreutiliseruneLEDetlarfrence,prsentesurlesitearduino.ccquivous
seratrsutilelorsquevousaurezbesoindefaireunprogrammeutilisantunenotionqui
nestpastraitedanscecours.

Ladiodelectroluminescente
DEL/LED?
Laquestionnestpasdesavoirquelleabrviationchoisirmaispluttde
savoirquestcequecest.UneDEL/LED:DiodeElectroLuminescente,
ou bien Light Emitting Diode en anglais. Cest un composant
lectroniquequicredelalumirequandilestparcouruparuncourant
lectrique. Je vous en ai fait acheter de diffrentes couleurs. Vous
pouvez,pourcechapitre,utilisercellequevousvoudrez,celamestgal.
Vousvoyez,survotredroite,laphotoduneDELdecouleurrouge.La
taillenestpasrelle,satte(enrouge)nefaitque5mmdediamtre.
Cestcecomposantquenousallonsessayerdallumeravecnotrecarte
Arduino.Maisavant,voyonsunpeucommentilfonctionne.
Jappellerai la diode lectroluminescente, tout au long du cours, une
LED. Une LED est en fait une diode qui met de la lumire. Je vais
donc vous parler du fonctionnement des diodes en mme temps que
celuidesLED.

Symbole
Surunschmalectronique,chaquecomposantestreprparunsymbolequiluiest
propre.Celuideladiodeestceluici:

80

CeluidelaLEDest:

Ilyadonctrspeudediffrenceentrelesdeux.LaLEDestsimplementunediodequi
metdelalumire,dolesflchessursonsymbole.

Astucemnmotechnique
Pourcesouvenirdequelctestlanodeoulacathode,voiciunetoutesimpleeten
image

KcommeKthode

AcommeAnode

Fonctionnement
Polarisationdirecte
Onparledepolarisationlorsquuncomposantlectroniqueestutilisdansuncircuit
lectroniquedelabonnemanire.Enfaitlorsquilestpolaris,cestquonlutilisede
lafaonsouhaite.Pourpolariserladiode,ondoitfaireensortequelecourantdoitla
parcourirdelanodeverslacathode.Autrementdit,latensiondoittreplusleve
lanodequlacathode.

81

Figure1:diodepolarisedirectement

Polarisationinverse
Lapolarisationinversedunediodeestlopposdelapolarisationdirecte.Pourcrerce
type de montage, il suffit simplement, dans notre cas, de retourner la diode enfin la
brancherlenvers.Danscecas,lecourantnepassepas.

Figure2:diodepolariseeninverse
Note : une diode polarise en inverse ne grillera pas si elle est utilise dans de
bonnes conditions. En fait, elle fonctionne de la mme faon pour le courant
positifetngatif.

Utilisation
Sivousnevoulezpasfairepartirvotrepremirediodeenfume,jevousconseille
delirelesprochaineslignesattentivement
Enlectronique,deuxparamtressontprendreencompte:lecourantetlatension.
82

Pour une diode, deux tensions sont importantes. Il sagit de la tension maximum en
polarisation directe, et la tension maximum en polarisation inverse. Ensuite, pour un
bonfonctionnementdesLED,lecourantluiaussisonimportance.

Latensionmaximumdirecte
Lorsque lon utilise un composant, on doit prendre lhabitude dutiliser la datasheet
(documentationtechniqueenanglais)quinousdonnetouteslescaractristiquessur
le composant. Dans cette datasheet, on retrouvera quelque chose appel Forward
Voltage,pourladiode.Cetteindicationreprsentelachutedetensionauxbornesdela
diode lorsque du courant la traverse en sens direct. Pour une diode classique (type
1N4148), cette tension sera denviron 1V. Pour une led, on considrera plutt une
tensionde1,21,6V.
Bon,pourfairenospetitsmontages,onnevapaschipoter,maiscestladmarche
faire lorsque lon conoit un schma lectrique et que lon dimensionne ses
composants.

Latensionmaximuminverse
Cettetensionreprsenteladiffrencemaximumadmissibleentrelanodeetlacathode
lorsque celleci est branche lenvers. En effet, si vous mettez une tension trop
importantecesbornes,lajonctionnepourrapaslesupporteretpartiraenfume.En
anglais, on retrouve cette tension sous le nom de Reverse Voltage (ou mme
BreakdownVoltage).Silonreprendladiode1N4148,elleseracompriseentre75et
100V.Audeldecettetension,lajonctioncasseetladiodedevientinutilisable.Dans
ce cas, la diode devient soit un courtcircuit, soit un circuit ouvert. Parfois cela peu
causerdesdommagesimportantsdansnosappareilslectroniques!Quoiquilensoit,
onnemanipulerajamaisdu75V!

Lecourantdepassage
PouruneLED,lecourantquilatraversesonimportance.Silonbranchedirectement
la led sur une pile, elle va sallumer, puis tt ou tard finira par steindre
dfinitivement.Eneffet,sionnelimitepaslecouranttraversantlaLED,elleprendrale
courantmaximum,etacestpasboncarcenestpaslecourantmaximumquellepeut
supporter. Pour limiter le courant, on place une rsistance avant (ou aprs) la LED.
Cette rsistance, savamment calcule, lui permettra dassurer un fonctionnement
optimal.
Maiscommentonlacalculecettersistance?
Simplementaveclaformuledebase,laloidohm. Petitrappel:

U =RI
DanslecasduneLED,onconsidre,engnral,quelintensitlatraversantdoittre
de20mA.Sionveuttrerigoureux,ilfautallercherchercettevaleurdansledatasheet.
OnadoncI = 20mA .Ensuite,onprendrapourlexempleunetensiondalimentation
de 5V (en sortie de lArduino, par exemple) et une tension aux bornes de la LED de
83

1,2Venfonctionnementnormal.Onpeutdonccalculerlatensionquiseraauxbornes
de la rsistance : U r = 5 1, 2 = 3, 8V Enfin, on peut calculer la valeur de la
U

3,8

rsistanceutiliser:Soit:R = I R = 0,02 R = 190 Etvoila,vousconnaissezla


valeurdelarsistanceutiliserpourtresurdenepasgrillerdesLEDtourdebras.
Avotreavis,vautilmieuxutiliserunersistancedeplusfortevaleuroudeplusfaible
valeur?
SionveuttresrdenepasdtriorerlaLEDcauseduncouranttropfort,ondoit
placerunersistancedontlavaleurestplusgrandequecellecalcule.Autrement,la
diode admettrait un courant plus intense qui circulerait en elle et cela pourrait la
dtruire.

Parquoioncommence?
Lebut
Lebutdecepremierprogrammeestdevousfaireprogrammer! Non,jenerigole
pas!Carcestenpratiquantlaprogrammationquelonretientlemieuxlescommandes
utilises.Deplus,enfaisantdeserreurs,vousvousforgerezdebonnesbasesquivous
seront trs utiles ensuite, lorsquil sagira de gagner du temps. Mais avant tout, cest
aussiparcequecetutoestcentrsurlaprogrammationquelonvaprogrammer!

Objectif
LobjectifdecepremierprogrammevaconsisterallumeruneLED.Cestnulmedirez
vous. Jen conviens. Cependant, vous verrez que ce nest pas trs simple. Bien
entendu,jenallaispascrerunchapitreentierdontlebutultimeauraittdallumer
uneLED!Non.Alorsjaiprvudevousmontrerdeuxtroistrucsquipourrontvousaider
dslorsquevousvoudrezsortirdunidetprendrevotreenvolversdenouveauxcieux!

Matriel
Pourpouvoirprogrammer,ilvousfaut,bienvidemment,unecarteArduinoetuncble
USB pour relier la carte au PC. Mais pour voir le rsultat de votre programme, vous
aurezbesoindlmentssupplmentaires.Notamment,uneLEDetunersistance.

Unoutilformidable:labreadboard!
Jevaismaintenantvousprsenterunoutiltrspratiquelorsquelonfaitsesdbutsen
lectronique ou lorsque lon veut tester rapidement/facilement un montage. Cet
accessoiresappelleunebreadboard(littralement:Planchepain,techniquement:
plaquedessaisanssoudure).Pourfairesimple,cestuneplaquepleinedetrous!

Principedelabreadboard
Certes la plaque est pleine de trous, mais pas de manire innocente ! En effet, la
plupart dentre eux sont relis. Voici un petit schma rapide qui va aider la
84

comprhension.

Commevouspouvezlevoirsurlimage,jaidessindeszones.Leszonesrougeset
noirescorrespondentlalimentation.Souvent,onretrouvedeuxlignescommecelles
cipermettantdereliervoscomposantsauxalimentationsncessaires.Parconvention,
lenoirreprsentelamasseetlerougeestlalimentation(+5V,+12V,5Vcequevous
voulezyamener).Habituellementtouslestrousdunemmelignesontrelissurcette
zone. Ainsi, vous avez une ligne dalimentation parcourant tout le long de la carte.
Ensuite, on peut voir des zones en bleu. Ces zones sont relies entre elles par
colonne. Ainsi, tous les trous sur une mme colonne sont relis entre eux. En
revanche, chaque colonne est distincte. En faisant chevaucher des composants sur
plusieurs colonnes vous pouvez les connecter entre eux. Dernier point, vous pouvez
remarquerunespacecoupantlacarteendeuxdemaniresymtrique.Cetteespace
coupe aussi la liaison des colonnes. Ainsi, sur le dessin cidessus on peut voir que
chaquecolonnepossde5trousrelisentreeux.Cetespaceaumilieuestnormaliset
doitfairelalargeurdescircuitsintgrsstandards.Enposantuncircuitintgrcheval
aumilieu,chaquepattedecedernierseretrouvedoncsurunecolonne,isoledela
prcdenteetdelasuivante.
Si vous voulez voir plus concrtement ce fonctionnement, je vous conseille
dessayer le logiciel Fritzing, qui permet de faire des circuits de manire assez
simpleetintuitive.Vousverrezainsicommentlescolonnessontspareslesunes
desautres.Deplus,celogicielserautilispourlerestedututopourlescaptures
dcransdesschmaslectroniques.

Ralisation
AveclebrochagedelacarteArduino,vousdevrezconnecterlaplusgrandepatteau
+5V(broche5V).Lapluspetitepattetantrelielarsistance,ellemmereliela
brochenumro2delacarte.Toutceciauneimportance.Eneffet,onpourraitfairele
contraire, brancher la LED vers la masse et lallumer en fournissant le 5V depuis la
broche de signal. Cependant, les composants comme les microcontrleurs naiment
pas trop dlivrer du courant, ils prfrent labsorber. Pour cela, on prfrera donc
alimenterlaLEDenlaplacantau+5VetenmettantlabrochedeArduinolamasse
pourfairepasserlecourant.Sionmetlabroche5V,danscecaslepotentielestle
mmedechaquectdelaLEDetellenesallumepas!Cenestpaspluscompliqu
quea! Schmadelaralisation(unexempledebranchementsansbreadboardet
deuxexemplesavec):
85

Figure3:ralisationmontage,schmadelacarte

86

Crerunnouveauprojet
Pour pouvoir programmer notre carte, il faut que lon crer un nouveau programme.
OuvrezvotrelogicielArduino.AllezdanslemenuFileEtchoisissezloptionSaveas:

87

Figure4:Enregistrersous
Vousarrivezdanscettenouvellefentre:

88

Figure5:Enregistrer
Tapezlenomduprogramme,dansmoncas,jelaiappeltest_1.Enregistrez.vous
arriver dans votre nouveau programme, qui est vide pour linstant, et dont le nom
safficheenHautdelafentreetdansunpetitonglet:

89

Figure6:Votrenouveauprogramme!

Lecodeminimal
Pour commencer le programme, il nous faut un code minimal. Ce code va nous
permettredinitialiserlacarteetvaservircrirenotrepropreprogramme.Cecode,le
voici:
1
2
3
4
5
6
7
8
9
10
11

//fonctiond'initialisationdelacarte
voidsetup()
{
//contenudel'initialisation
}

//fonctionprincipale,elleserpte(sexcute)l'infini
voidloop()
{
//contenudevotreprogramme
}

90

Crerleprogramme:lesbonsoutils!
LarfrenceArduino
Questcequecest?
LArduino tant un projet dont la communaut est trs active, nous offre sur son site
internetunerfrence. Mais quest ce que cest ? Et bien il sagit simplement de la
noticedutilisationdulangageArduino.Plusexactement,unepageinternetdeleursite
est ddie au rfrencement de chaque code que lon peut utiliser pour faire un
programme.

Commentlutiliser?
Pourlutiliser,ilsuffitdallersurlapagedeleursite,malheureusementenanglais,mais
dontilexisteunetraductionpastoutfaitcompltesurlesiteFranaisArduino.Ceque
lonvoitenarrivantsurlapage:troiscolonnesavecchacuneuntypedlmentsqui
formentleslangagesArduino.
Structure : cette colonne rfrence les lments de la structure du langage
Arduino.Onyretrouvelesconditions,lesoprations,etc.
Variables : Comme son nom lindique, elle regroupe les diffrents types de
variablesutilisables,ainsiquecertainesoprationsparticulires
Functions:Icicesttoutlereste,maissurtoutlesfonctionsdelecture/crituredes
brochesdumicrocontrleur(ainsiquedautresfonctionsbienutiles)
IlesttrsimportantdesavoirutiliserladocumentationquenousoffreArduino!Car
en sachant cela, vous pourrez faire des programmes sans avoir appris
pralablement utiliser telle fonction ou telle autre. Vous pourrez devenir les
maitresdumonde!!!Euh,non,jecroispasenfait

AllumernotreLED
1retape
Il faut avant tout dfinir les broches du microcontrleur. Cette tape constitue elle
mmedeuxsoustapes.Lapremiretantdecrerunevariabledfinissantlabroche
utilise,ensuite,dfinirsilabrocheutilisedoittreuneentredumicrocontrleurou
unesortie.Premirement,donc,dfinissonslabrocheutilisedumicrocontrleur:
1 constintled_rouge=2//dfinitiondelabroche2delacarteentantquevariable

Le terme const signifie que lon dfinit la variable comme tant constante. Par
consquent,onchangelanaturedelavariablequidevientalorsconstante.Letermeint
correspond un type de variable. En dfinissant une variable de ce type, elle peut
stockerunnombreallantde2147483648+2147483647!Celanoussuffitamplement
! Noussommesdoncenprsencedunevariable,nommeled_rouge,quiestenfait
une constante, qui peut prendre une valeur allant de 2147483648 +2147483647.
Dansnotrecas,cettevariable,pardonconstante,estassigne2.Lechiffre2.
91

Lorsquevotrecodeseracompil,lemicrocontrleursauraainsiquesursabroche
numro2,ilyaunlmentconnect.
Bon,celanesuffitpasdedfinirlabrocheutilise.Ilfautmaintenantdiresicettebroche
est une entre ou une sortie. Oui, car le microcontrleur a la capacit dutiliser
certaines de ses broches en entre ou en sortie. Cest fabuleux ! En effet, il suffit
simplementdinterchangerUNElignedecodepourdirequilfaututiliserunebrocheen
entre(rcuprationdedonne)ouensortie(envoidedonne).Cettelignedecode
justement,parlonsen!Elledoitsetrouverdanslafonctionsetup().Danslarfrence,
cedontnousavonsbesoinsetrouvedanslacatgorieFunctions,puisdansDigital
I/O.I/OpourInput/Output,cequisignifiedanslalanguedeMolire:Entre/Sortie.La
fonctionsetrouvetrepinMode().Pourutilisercettefonction,ilfautluienvoyerdeux
paramtres:
Lenomdelavariablequelonadfinilabroche
Letypedebrochequecelavatre(entreousortie)
1
2
3
4
5
6

//fonctiond'initialisationdelacarte
voidsetup()
{
//initialisationdelabroche2commetantunesortie
pinMode(led_rouge,OUTPUT)
}

Cecodevadoncdfinirlaled_rouge(quiestlabrochenumro2dumicrocontrleur)
ensortie,carOUTPUTsignifieenfranais:sortie.Maintenant,toutestprtpourcrer
notreprogramme.Voicilecodequasimentcomplet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

//dfinitiondelabroche2delacarteentantquevariable
constintled_rouge=2

//fonctiond'initialisationdelacarte
voidsetup()
{
//initialisationdelabroche2commetantunesortie
pinMode(led_rouge,OUTPUT)
}

//fonctionprincipale,elleserpte(sexcute)l'infini
voidloop()
{
//contenudevotreprogramme
}

2etape
Cette deuxime tape consiste crer le contenu de notre programme. Celui qui va
aller remplacer le commentaire dans la fonction loop(), pour raliser notre objectif :
allumerlaLED!Lencore,onneclaquepasdesdoigtspouravoirleprogrammetout
prt! IlfautretournerchercherdanslarfrenceArduinocedontonabesoin.
Oui,maisl,onnesaitpascequelonveut?o_O
OnchercheunefonctionquivanouspermettredallumercetteLED.Ilfautdoncquelon
92

sedbrouillepourlatrouver.Etavecnotreniveaudanglais,onvafacilementtrouver.
Soyonsunpeulogique,sivouslevoulezbien.Noussavonsquecestunefonctionquil
nousfaut(jelaidisilyauninstant),onregardedoncdanslacatgorieFunctionsde
larfrence.Siongardenotreespritlogique,onvasoccuperdallumeruneLED,donc
dedirequelestltatdesortiedelabrochenumro2olaquelleestconnectenotre
LED. Donc, il est fort parier que cela se trouve dans DigitalI/O. Tiens, il y a une
fonction suspecte qui se prnomme digitalWrite(). En franais, cela signifie criture
numrique. Cest donc lcriture dun tat logique (0 ou 1). Quel se trouve tre la
premire phrase dans la description de cette fonction ? Celleci : Write a HIGH or a
LOWvaluetoadigitalpin.Daprsnotreniveaubilingue,onpeuttraduirepar:Ecriture
dunevaleurHAUTEouunevaleurBASSEsurunesortienumrique.Bingo!Cestce
quelonrecherchait!Ilfautdirequejevousaiunpeuaid.
CesignifiequoivaleurHAUTEouvaleurBASSE?
Enlectroniquenumrique,unniveauhautcorrespondraunetensionde+5Vetun
niveauditbasseraunetensionde0V(gnralementlamasse).Saufquonaconnect
laLEDauplepositifdelalimentation,doncpourquellesallume,ilfautquellesoit
relie au 0V. Par consquent, on doit mettre un tat bas sur la broche du
microcontrleur. Ainsi, la diffrence de potentiel aux bornes de la LED permettra
cellecidesallumerVoyonsunpeulefonctionnementdedigitalWrite()enregardant
dans sa syntaxe. Elle requiert deux paramtres. Le nom de la broche que lon veut
mettreuntatlogiqueetlavaleurdecettatlogique.Nousallonsdonccrirelecode
quisuit,daprscettesyntaxe:
1 digitalWrite(led_rouge,LOW)//critureensortie(broche2)d'untatBAS

Siontestelecodeentier:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//dfinitiondelabroche2delacarteentantquevariable
constintled_rouge=2

//fonctiond'initialisationdelacarte
voidsetup()
{
//initialisationdelabroche2commetantunesortie
pinMode(led_rouge,OUTPUT)
}

//fonctionprincipale,elleserpte(sexcute)l'infini
voidloop()
{
//critureensortie(broche2)d'untatBAS
digitalWrite(led_rouge,LOW)
}

OnvoitsclairerlaLED!!!Cestfantastique!

Commenttoutcelafonctionne?
Et comment a se passe lintrieur ?? o_O Je comprends pas comment le
microcontrleuryfaitpourtoutcomprendreettoutfaire.Jesaisquilutiliseles0et
93

les 1 du programme quon lui a envoy, mais comment il sait quil doit aller
chercherleprogramme,lelire,lexcuter,etc.?
Ehbien,ehbien!Envoildesquestions!Jevaisessayerdyrpondresimplement,
sansentrerdansledtailquiestquandmmetrscompliqu.Bon,sivoustesprt,
cestpartit!Dabord,toutsepassedanslecerveaudumicrocontrleur

Ledmarrage
Unpeucommevousdmarreriezunordinateur,lacarteArduinoaussidmarre.Alors
cestunpeutransparentparcequelledmarredansdeuxcasprincipaux:lepremier
cestlorsquevouslabranchezsurleportUSBouunesurautresourcedalimentation
ledeuximecestlorsquelecompilateurafinidechargerleprogrammedanslacarte,il
laredmarre.Etaudmarragedelacarte,ilsepassedestrucs.

Chargez!
Vousvoussouvenezduchapitreojevousprsentaisunpeulefonctionnementglobal
de la carte ? Oui, celuil. Je vous parlais alors de lexcution du programme. Au
dmarrage,lacarte(aprsunpetittempsdevrificationpourvoirsilecompilateurne
luichargepasunnouveauprogramme)commenceparallerchargerlesvariablesen
mmoirededonnes.Cestunpetitmcanismelectroniquequivasimplementfaireen
sortedecopierlesvariablesinscritesdansleprogrammeverslammoirededonnes.
Enloccurrence,dansleprogrammequelonvientdecrer,ilnyaquunevariableet
elle est constante en plus. Ce ne sera donc pas bien long mettre a en mmoire !
Ensuite,vientlalectureduprogramme.Etl,quepeutilbiensepasserlintrieurdu
microcontrleur?Enfait,cenestpastrscompliqu(surleprincipe ).

Lavraieformeduprogramme
A prsent, le cerveau du microcontrleur va aller lire la premire instruction du
programme.Cellequisetrouvedanslafonction setup().Saufque,linstructionnest
plussouslammeforme.Noncettefoiscijeneparlepasdes0etdes1,maisbien
dune transformation de linstruction. Cest le compilateur qui a dcoup chaque
instructionduprogrammeenplusieurspetitesinstructionsbeaucoupplussimples.
Etpourquoicela?Lemicrocontrleurnesaispasfaireuneinstructionaussisimple
quededclarerunebrocheensortieouallumeruneLED?o_O
Oui.Cestpourquoiilabesoinqueleprogrammesoitnonplussousformedegrandes
instructionscommeonlacrit,maisbiensousformedeplusieurspetitesinstructions.
Etcelaestduaufaitquilnesaitexcuterquedesinstructionstrssimples!

94

Bienentendu,ilnyapasdelimite6instructions,ilpeutyenavoirbeaucoupplusou
beaucoupmoins!Donc,enmmoiredeprogramme,loleprogrammedelacarteest
stock,onvaavoirpluttquelquechosequiressemblea:

95

Chaquegrandeinstructionestdcoupeenpetiteinstructionsparlecompilateuretest
ensuitestockedanslammoiredeprogramme.Pourtreencoreplusdtaill,chaque
instructionagitsurunregistre.Unregistre,cestlaformelaplussimplifidelammoire
entermedeprogrammation.Onentrouveplusieurs,parexempleleregistredestimers
ouceluidesentres/sortiesduportA(ouB,ouC)ouencoredesregistresgnraux
pour manipuler les variables. Par exemple, pour additionner 3 la variable a le
microcontrleurferalesoprationssuivantes:
chargementdelavariableadansleregistregnral8(parexemple)depuisla
RAM
chargementdelavaleur3dansleregistregnral9
misedursultatderegistre8+registre9dansleregistre8
changementdelavaleurdeaenRAMdepuisleregistre8

Etlexcutionduprogramme
Aprsentquelonapleindepetitesinstructions,quavonsnousdeplus?Pasgrand
96

chose me direzvous. Le Schmilblick na gure avanc Pour comprendre, il faut


savoirquelemicrocontrleurnesaisfairequequelquesinstructions.Cesinstructions
sont encore plus simple que dallumer une LED ! Il peut par exemple faire des
oprations logique (ET, OU, NON, dcalage de bits, ), des oprations numrique
(additionetsoustraction,lesmultiplicationetdivisionsontfaitavecdesoprationsde
typesdcalagedebits)ouencorecopieretstockerdesdonnes.Ilsaitenfaire,donc,
maispastantquea.Toutcequilsaitfaireestrgieparsonjeudinstructions.Cest
dire quil a une liste des instructions possible quil sait excuter et il sy tient. Le
compilateur doit donc absolument dcouper chaque instruction du programme en
instructionsquelemicrocontrleursaitexcuter.

Le cerveau du microcontrleur va aller lire le programme, il compare ensuite chaque


instructionsonregistredinstructionetlesexcute.PourallumeruneLED,ilferapeut
treunETlogique,chargeraunedonne,feraunesoustraction,onnesaitpasmais
il va y arriver. Et pour terminer, il communiquera son gestionnaire dentres/sortie
pourluiinformerquilfautactiverteltransistorinternepourmettreunetensionsurtelle
brochedelacartepourainsiallumerlaLEDquiyestconnecte.
Waoou!Etavavitetouta?
Extrmementvite!Celadit,toutdpenddesavitessedexcution

Lavitessedexcution
Lemicrocontrleurestcapabledefaireuntrsgrandnombredoprationsparseconde.
Cenombreestdfiniparsavitesse,entreautre.SurlacarteArduinoDuemilanoveou
Uno,ilyauncomposant,quelonappelunquartz,quivadfinirquellevitesseva
allerlemicrocontrleur.Cequartzpermetdecadencerlemicrocontrleur.Cestenfait
97

unehorlogequipermetaumicrocontrleurdesereprer.Achaquetopdelhorloge,le
microcontrleur va faire quelque chose. Ce quelque chose peut, par exemple, tre
lexcutionduneinstruction,ouunelectureenmmoire.Cependant,chaqueactionne
durepasquunseultopdhorloge.Suivantlactionralise,celapeutprendreplusou
moinsdetemps,enfindetopdhorloge.

La carte Arduino atteint au moins le million dinstructions par secondes ! Cela peut
paratre norme, mais comme je le disais, si il y a des instructions qui prennent
beaucoupdetemps,ehbienilsepeutquellenexcutequunecentainedinstruction
en une seconde. Tout dpend du temps pris par une instruction tre excut.
Certaines oprations sont aussi paralllises. Par exemple, le microcontrleur peut
faire une addition dun ct pour une variable et en mme temps il va mesurer le
nombre de coup dhorloge pour faire sincrmenter un compteur pour grer un timer.
Ces opration sont rellement faite en parrallle, ce nest pas un faux multitche
commesurunordinateur.Icilesdeuxregistrestravailleenmmetemps.Lenombrede
lafin?62.5nanoSecondes.CestletempsquilfautaumicrocontrleurdArduinopour
faire une instruction la plus simple possible. (En prenant en compte lArduino Uno et
sonquartz16MHz).
Aprsent,voussavezutiliserlessortiesdumicrocontrleur,nousallonsdoncpouvoir
passerauxchosessrieusesetfaireclignoternotreLED!

[Arduino202]Introduireletemps
CestbienbeaudallumeruneLED,maissiellenefaitriendautre,cenestpastrs
utile.Autantlabrancherdirectementsurunepile(avecunersistancetoutdemme!
).AlorsvoyonscommentrendreintressantecetteLEDenlafaisantclignoter!Ceque
98

nesaitpasfaireunepilePourcelailvanousfalloirintroduirelanotiondetemps.Et
biendevinezquoi?Ilexisteunefonctiontouteprtelencore!Jenevousendispas
plus,passonslapratique!

Commentfaire?
Trouverlacommande
Jevouslaissechercheunpeuparvousmme,celavousentrainera!:Pirate:Pour
ceuxquiontfaitleffortdechercheretnontpastrouv(causedelanglais?),jevous
donnelafonctionquivabien:Onvautiliser:delay()Petitedescriptiondelafonction,
ellevaservirmettreenpauseleprogrammependantuntempsprdtermin.

Utiliserlacommande
La fonction admet un paramtre qui est le temps pendant lequel on veut mettre en
pause le programme. Ce temps doit tre donn en millisecondes. Cestdire que si
vousvoulezarrterleprogrammependant1seconde,ilvafalloirdonnerlafonction
cemmetemps,critenmillisecondes,soit1000ms.Lecodeestsimpleutiliser,ilest
lesuivant:
1 //onfaitunepauseduprogrammependant1000ms,soit1seconde
2 delay(1000)

Riendeplussimpledonc.Pour20secondesdepause,ilauraitfallucrire:
1 //onfaitunepauseduprogrammependant20000ms,soit20secondes
2 delay(20000)

Mettreenpratique:faireclignoteruneLED
Ducoup,sionveutfaireclignoternotreLED,ilvafalloirutilisercettefonction.Voyons
unpeuleschmadeprincipeduclignotementduneLED:

99

Vouslevoyez,laLEDsallume.Puis,onfaitintervenirlafonctiondelay(),quivamettre
leprogrammeenpausependantuncertaintemps.Ensuite,onteintlaLED.Onmeten
pauseleprogramme.Puisonrevientaudbutduprogramme.Onrecommenceetainsi
desuite.Cestcettesommedecommande,quiformeleprocessusquifaitclignoterla
LED.
Dornavant,prenezlhabitudedefairecegenredeschmalorsquevousfaitesun
programme.Celaaidegrandementlarflexion,croyezmoi! Cestleprincipede
perdredutempspourengagner.Autrementdit:lorganisation!
Maintenant, il faut que lon traduise ce schma, portant le nom dorganigramme, en
code.Ilsuffitpourceladeremplacerlesphrasesdanschaquecadreparunelignede
code.Parexemple,onallumelaLED,vatretraduisparlinstructionquelonavue
danslechapitreprcdent:
100

1 digitalWrite(led_rouge,LOW)//allumelaLED

Ensuite,ontraduitlecadresuivant,cequidonne:
1 //faitunepausede1seconde(=1000ms)
2 delay(1000)

Puis,ontraduitlalignesuivante:
1 //teintlaLED
2 digitalWrite(led_rouge,HIGH)

Enfin,ladernireligneestidentiqueladeuxime,soit:
1 //faitunepausede1seconde
2 delay(1000)

Onseretrouveaveclecodesuivant:
1
2
3
4
5
6
7
8

//allumelaLED
digitalWrite(led_rouge,LOW)
//faitunepausede1seconde
delay(1000)
//teintlaLED
digitalWrite(led_rouge,HIGH)
//faitunepausede1seconde
delay(1000)

Lafonctionquivabouclerlinfinilecodeprcdentestlafonctionloop().Oninscrit
donclecodeprcdentdanscettefonction:
1
2
3
4
5
6
7
8
9
10
11

voidloop()
{
//allumelaLED
digitalWrite(led_rouge,LOW)
//faitunepausede1seconde
delay(1000)
//teintlaLED
digitalWrite(led_rouge,HIGH)
//faitunepausede1seconde
delay(1000)
}

EtonnoubliepasdedfinirlabrocheutiliseparlaLED,ainsiquedinitialisercette
brocheentantquesortie.Cettefois,lecodeesttermin!
1
2
3
4
5
6
7
8
9
10
11
12

//dfinitiondelabroche2delacarteentantquevariable
constintled_rouge=2

//fonctiond'initialisationdelacarte
voidsetup()
{
//initialisationdelabroche2commetantunesortie
pinMode(led_rouge,OUTPUT)
}

voidloop()
{

101

13
14
15
16
17
18
19
20
21

//allumelaLED
digitalWrite(led_rouge,LOW)
//faitunepausede1seconde
delay(1000)
//teintlaLED
digitalWrite(led_rouge,HIGH)
//faitunepausede1seconde
delay(1000)
}

Vousnavezplusquchargerlecodedanslacarteetadmirermonvotretravail!La
LED clignote ! Libre vous de changer le temps de clignotement : vous pouvez par
exempleteindrelaLEDpendant40msetlallumerpendant600ms:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

//dfinitiondelabroche2delacarteentantquevariable
constintled_rouge=2

//fonctiond'initialisationdelacarte
voidsetup()
{
//initialisationdelabroche2commetantunesortie
pinMode(led_rouge,OUTPUT)
}

voidloop()
{
//allumelaLED
digitalWrite(led_rouge,LOW)
//faitunepausede600ms
delay(600)
//teintlaLED
digitalWrite(led_rouge,HIGH)
//faitunepausede40ms
delay(40)
}

EtHop,unepetitevidodillustration!

0:00/0:12

FaireclignoterungroupedeLED
Vousavouerezfacilementquecentaitpasbiendifficiledarriverjusquel.Alors,
prsent,accentuonsladifficult.Notrebut:faireclignoterungroupedeLED.

Lematrieletlesschmas
102

CegroupedeLEDseracomposdesixLED,nommesL1,L2,L3,L4,L5etL6.Vous
aurezparconsquentbesoindunnombresemblabledersistances.Leschmadela
ralisation:

Laphotodelaralisation:

103

Leprogramme
Leprogrammeestunpeupluslongqueleprcdent,carilnesagitplusdallumer1
seuleLED,mais6!Voillorganigrammequevasuivrenotreprogramme:

104

Cet organigramme nest pas trs beau, mais il a le mrite dtre assez lisible. Nous
allonsessayerdelesuivrepourcrernotreprogramme.Traductiondessixpremires
instructions:
1
2
3
4
5
6

digitalWrite(L1,LOW)//notezquelenomdelabrochechang
digitalWrite(L2,LOW)//etcepourtouteslesLEDconnectes
digitalWrite(L3,LOW)//aumicrocontroleur
digitalWrite(L4,LOW)
digitalWrite(L5,LOW)
digitalWrite(L6,LOW)

Ensuite,onattend1,5seconde:
1 delay(1500)

Puisontraduislessixautresinstructions:
1 digitalWrite(L1,HIGH)//onteintlesLED
2 digitalWrite(L2,HIGH)

105

3
4
5
6

digitalWrite(L3,HIGH)
digitalWrite(L4,HIGH)
digitalWrite(L5,HIGH)
digitalWrite(L6,HIGH)

Enfin,ladernirelignedecode,disonsquenousattendrons4,32secondes:
1 delay(4320)

Touscesboutsdecodesontmettrelasuiteetdanslafonctionloop()pourquilsse
rptent.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

voidloop()
{
digitalWrite(L1,LOW)//allumerlesLED
digitalWrite(L2,LOW)
digitalWrite(L3,LOW)
digitalWrite(L4,LOW)
digitalWrite(L5,LOW)
digitalWrite(L6,LOW)

delay(1500)//attenteduprogrammede1,5secondes

digitalWrite(L1,HIGH)//onteintlesLED
digitalWrite(L2,HIGH)
digitalWrite(L3,HIGH)
digitalWrite(L4,HIGH)
digitalWrite(L5,HIGH)
digitalWrite(L6,HIGH)

delay(4320)//attenteduprogrammede4,32secondes
}

Je lai mentionn dans un de mes commentaires entre les lignes du programme, les
noms attribus aux broches sont changer. En effet, car si on dfinit des noms de
variables identiques, le compilateur naimera pas a et vous affichera une erreur. En
plus, le microcontrleur ne pourrait pas excuter le programme car il ne saurait pas
quellebrochemettreltatHAUTouBAS.Pourdfinirlesbroches,onfaitlamme
chosequnotrepremierprogramme:
1
2
3
4
5
6

constintL1=2//broche2dumicrocontrleursenommemaintenant:L1
constintL2=3//broche3dumicrocontrleursenommemaintenant:L2
constintL3=4//...
constintL4=5
constintL5=6
constintL6=7

Maintenantquelesbrochesutilisessontdfinies,ilfautdiresicesontdesentresou
dessorties:
1
2
3
4
5
6

pinMode(L1,OUTPUT)//L1estunebrochedesortie
pinMode(L2,OUTPUT)//L2estunebrochedesortie
pinMode(L3,OUTPUT)//...
pinMode(L4,OUTPUT)
pinMode(L5,OUTPUT)
pinMode(L6,OUTPUT)

106

Leprogrammefinal
Ilnestcertespastrsbeau,maisilfonctionne:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

constintL1=2//broche2dumicrocontrleursenommemaintenant:L1
constintL2=3//broche3dumicrocontrleursenommemaintenant:L2
constintL3=4//...
constintL4=5
constintL5=6
constintL6=7

voidsetup()
{
pinMode(L1,OUTPUT)//L1estunebrochedesortie
pinMode(L2,OUTPUT)//L2estunebrochedesortie
pinMode(L3,OUTPUT)//...
pinMode(L4,OUTPUT)
pinMode(L5,OUTPUT)
pinMode(L6,OUTPUT)
}

voidloop()
{
//allumerlesLED
digitalWrite(L1,LOW)
digitalWrite(L2,LOW)
digitalWrite(L3,LOW)
digitalWrite(L4,LOW)
digitalWrite(L5,LOW)
digitalWrite(L6,LOW)

//attenteduprogrammede1,5secondes
delay(1500)

//onteintlesLED
digitalWrite(L1,HIGH)
digitalWrite(L2,HIGH)
digitalWrite(L3,HIGH)
digitalWrite(L4,HIGH)
digitalWrite(L5,HIGH)
digitalWrite(L6,HIGH)

//attenteduprogrammede4,32secondes
delay(4320)
}

Voil, vous avez en votre possession un magnifique clignotant, que vous pouvez
attachervotrevlo!
Une question me chiffonne. Doiton toujours crire ltat dune sortie, ou peuton
faireplussimple?
Tusoulvesunpointintressant.Sijecomprendsbien,tutedemandescommentfaire
pourremplacerlintrieurdelafonctionloop()?Cestvraiquecesttrslourdcrireet
lire!IlfauteneffetsoccuperdedfinirltatdechaqueLED.Cestrbarbatif,surtout
si vous en aviez mis autant quil y a de broches disponibles sur la carte ! Il y a une
solutionpourfairecequetudis.Nousallonslavoirdansquelqueschapitres,nesois
107

pasimpatient! Enattendant,voiciunevidodillustrationduclignotement:

Raliserunchenillard
Lebutduprogramme
Lebutduprogrammequenousallonscrervaconsisterraliserunchenillard.Pour
ceuxquinesaventpascequestunchenillard,jevousaiprparunepetiteimage.gif
anime:

Commeonditsouvent,uneimagevautmieuxquunlongdiscours! Voildoncce
quest un chenillard. Chaque LED sallume alternativement et dans lordre
chronologique.Delagaucheversladroiteoulinverse,cestauchoix.

Organigramme
Commejenaimarredefairedesdessinsavecpaint.net,jevouslaisserflchirtout
seul comme des grands lorganigramme du programme. Bon, aller, le voil cet
organigramme!Attention,ilnestpascomplet,maissivousavezcomprisleprincipe,le
complternevousposerapasdeproblmes:

108

Avousdejouer!

Leprogramme
Normalement,saconceptionnedevraitpasvousposerdeproblmes.Ilsuffiteneffet
dercuprerlecodeduprogrammeprcdent(allumerungroupedeLED)etdele
modifierenfonctiondenotrebesoin.Cecode,jevousledonne,aveclescommentaires
quivontbien:
1
2
3
4
5
6
7
8
9
10
11
12

constintL1=2//broche2dumicrocontrleursenommemaintenant:L1
constintL2=3//broche3dumicrocontrleursenommemaintenant:L2
constintL3=4//...
constintL4=5
constintL5=6
constintL6=7

voidsetup()
{
pinMode(L1,OUTPUT)//L1estunebrochedesortie
pinMode(L2,OUTPUT)//L2estunebrochedesortie
pinMode(L3,OUTPUT)//...

109

13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

pinMode(L4,OUTPUT)
pinMode(L5,OUTPUT)
pinMode(L6,OUTPUT)
}

//onchangesimplementlintrieurdelabouclepouratteindrenotreobjectif

voidloop()//lafonctionloop()excutelecodequisuitenlerptantenboucle
{
digitalWrite(L1,LOW)//allumerL1
delay(1000)//attendre1seconde
digitalWrite(L1,HIGH)//onteintL1
digitalWrite(L2,LOW)//onallumeL2enmmetempsquel'onteintL1
delay(1000)//onattend1seconde
digitalWrite(L2,HIGH)//onteintL2et
digitalWrite(L3,LOW)//onallumeimmdiatementL3
delay(1000)//...
digitalWrite(L3,HIGH)
digitalWrite(L4,LOW)
delay(1000)
digitalWrite(L4,HIGH)
digitalWrite(L5,LOW)
delay(1000)
digitalWrite(L5,HIGH)
digitalWrite(L6,LOW)
delay(1000)
digitalWrite(L6,HIGH)
}

Vous le voyez, ce code est trs lourd et nest pas pratique. Nous verrons plus loin
comment faire en sorte de lallger. Mais avant cela, un TP arrive Au fait, voici un
exempledecequevouspouvezobtenir!

Fonctionmillis()
Nous allons terminer ce chapitre par un point qui peuttre utile, notamment dans
certainessituationsolonveutnepasarrterleprogramme.Eneffet,sionveutfaire
clignoter une LED sans arrter lexcution du programme, on ne peut pas utiliser la
fonctiondelay()quimetenpauseleprogrammedurantletempsdfini.

Leslimitesdelafonctiondelay()
Vousavezprobablementremarqu,lorsquevousutilisezlafonctiondelay()toutnotre
programme sarrte le temps dattendre. Dans certains cas ce nest pas un problme
maisdanscertainscasapeuttreplusgnant.Imaginons,voustesentraindefaire
110

avancerunrobot.Vousmettezvosmoteursunevitessemoyenne,tranquille,jusqu
ce quun petit bouton sur lavant soit appuy (il clic lorsquon touche un mur par
exemple).Pendantcetempsl,vousdcidezdefairedessignauxenfaisantclignoter
vos LED. Pour faire un joli clignotement, vous allumez une LED rouge pendant une
seconde puis lteignez pendant une autre seconde. Voil par exemple ce quon
pourraitfairecommecode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

voidsetup()
{
pinMode(moteur,OUTPUT)
pinMode(led,OUTPUT)
pinMode(bouton,INPUT)
//onmetlemoteurenmarche(enadmettantqu'ilsoitenmarcheHIGH)
digitalWrite(moteur,HIGH)
//onallumelaLED
digitalWrite(led,LOW)
}

voidloop()
{
//sileboutonestcliqu(onrentredansunmur)
if(digitalRead(bouton)==HIGH)
{
//onarrtelemoteur
digitalWrite(moteur,LOW)
}
else//sinononclignote
{
digitalWrite(led,HIGH)
delay(1000)
digitalWrite(led,LOW)
delay(1000)
}
}

Attention ce code nest pas du tout rigoureux voire faux dans son criture, il sert
justecomprendreleprincipe!
Maintenantimaginez.Vousroulez,testerqueleboutonnestpasappuy,doncfaites
clignoterlesLED(casduelse).Letempsquevousfassiezlaffichageenentierscoule
2longuessecondes!Lerobotapupendantcetteternitseprendrelemurenpleine
poireetlesmoteurscontinuentavancerttebaissejusqufumer!Cenestpasbon
dutout!Voicipourquoilafonctionmillis()peutnoussauver.

Dcouvronsetutilisonsmillis()
Toutdabord,quelquesprcisionssonsujet,avantdallersenservir.Alintrieurdu
curdelacarteArduinosetrouveunchronomtre.Cechronomesurelcoulementdu
tempsdepuislelancementdelapplication.Sagranularit(laprcisiondesontemps)
estlamilliseconde.Lafonctionmillis()noussertsavoirquelleestlavaleurcourante
dececompteur.Attention,commececompteurestcapabledemesurerunedureallant
jusqu50jours,lavaleurretournedoittrestockedansunevariabledetypelong.
Cestbiengentilmaisconcrtementonlutilisecomment?
111

Etbiencesttrssimple.Onsaitmaintenantlirelheure.Maintenant,aulieudedire
allumetoipendantunesecondeetnefaissurtoutrienpendantcetemps,onvafaire
untrucdugenreAllumetoi,faistespetitesaffaires,vrifielheuredetempsentempset
siunesecondeestcoule,alorsragis!.Voicilecodeprcdenttransformselonla
nouvellephilosophie:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

longtemps//variablequistockelamesuredutemps
booleanetat_led

voidsetup()
{
pinMode(moteur,OUTPUT)
pinMode(led,OUTPUT)
pinMode(bouton,INPUT)
//onmetlemoteurenmarche
digitalWrite(moteur,HIGH)
//pardfautlaLEDserateinte
etat_led=0
//onteintlaLED
digitalWrite(led,etat_led)
}

voidloop()
{
//sileboutonestcliqu(onrentredansunmur)
if(digitalRead(bouton)==HIGH)
{
//onarrtelemoteur
digitalWrite(moteur,LOW)
}
else//sinononclignote
{
//oncomparel'anciennevaleurdutempsetlavaleursauve
//silacomparaison(l'unmoinsl'autre)dpasse1000...
//...celasignifiequ'aumoinsunesecondes'estcoule
if((millis()temps)>1000)
{
etat_led=!etat_led//oninversel'tatdelaLED
digitalWrite(led,etat_led)//onallumeouteint
temps=millis()//onstockelanouvelleheure
}
}
}

Etvoil,grcecetteastuceplusdefonctionbloquante.Ltatduboutonestvrifitrs
frquemmentcequipermetdesassurerquesijamaisonrentredansunmur,oncoupe
lesmoteurstrsvite.Danscecode,toutseffectuedemanirefrquente.Eneffet,onne
reste jamais bloqu attendre que le temps passe. A la place, on avance dans le
programme et test souvent la valeur du chronomtre. Si cette valeur est de 1000
itrationssuprieuresladernirevaleurmesure,alorscelasignifiequuneseconde
estpasse.
Attention,auifdelaligne25nefaitessurtoutpasmillis()temp==1000.Cela
signifieraitquevousvoulezvrifierque1000millisecondesEXACTEMENTsesont
coules,cequiesttrspeuprobable(vouspourrezplusprobablementmesurer
plusoumoinsmaisrarementexactement)

112

Maintenant que vous savez matriser le temps, vos programmes/animations vont


pouvoir possder un peu plus de vie en faisant des pauses, des motifs, etc.
Impressionnezmoi!

[Arduino203][TP]Feuxdesignalisationroutire
VousvoilarrivpourvotrepremierTP,quevousferezseul! Jevousaideraiquand
mmeunpeu.LebutdeceTPvatrederaliserunfeudesignalisationroutire.Je
vousdonneendtailtoutcequilvousfautpourmenerbiencetobjectif.

Prparation
Cedontnousavonsbesoinpourralisercesfeux.

Lematriel
Lematrielestlabasedenotrebesoin.Onadjutilis6LEDetrsistances,mais
ellestaientpourmoienloccurrencetoutesrouges.Pourfaireunfeuroutier,ilvanous
falloir6LED,maisdontlescouleursnesontpluslesmmes.
LED:unnombrede6,dont2rouges,2jaune/orangeet2vertes
Rsistors:6galement,delammevaleurqueceuxquevousavezutiliss.
Arduino:unecarteArduinovidemment!

Leschma
Cest le mme que pour le montage prcdent, seul la couleur des LED change,
commececi:

113

Vousnavezdoncplusqureprendrelederniermontageetchangerlacouleurde4
LED,pourobtenirceci:

114

Noubliezpasdetestervotrematrielenchargeantunprogrammequifonctionne!
Cela vite de sacharner faire un nouveau programme qui ne fonctionne pas
causedunmatrieldfectueux.Onestjamaissurderien,croyezmoi!

noncdelexercice
Lebut
Jelaidit,cestderaliserdesfeuxdesignalisation.Alors,vulenombredeLED,vous
vous doutez bien quil faut raliser 2 feux. Ces feux devront tre synchroniss. L
encore,jevousaiprparunebelleimageanime:

Letempsdelasquence
Vousallezmettreundlaide3secondesentrelefeuvertetlefeuorange.Undlaide
1secondeentrelefeuorangeetlefeurouge.Etundlaide3secondesentrelefeu
rougeetlefeuvert.

Parocommencer?
Dabord,vousdevezfairelorganigramme.Ouijenevousledonnepas!Ensuite,vous
commencezunnouveauprogramme.Dansceprogramme,vousdevezdfinirquelles
sont les broches du microcontrleur que vous utilisez. Puis dfinir si ce sont des
entres,dessorties,ousilyadesdeux.Pourterminer,vousallezfaireleprogramme
115

completdanslafonctionquiraliseuneboucle.

Cestparti!
Allez, cest parti ! A vous de mpater. Vous avez thoriquement toutes les bases
ncessairespourraliserceTP.Enplusonapresquedjtoutfait.Mince,jenaitrop
ditPendantcetemps,moijevaismefaireuneraclette. Etvoiciunrsultatpossible
:

Correction!
Fini!
Vous avez fini ? Votre code ne fonctionne pas, mais vous avez eu beau cherch
pourquoi, vous navez pas trouv ? Trs bien. Dans ce cas, vous pouvez lire la
correction.Ceuxquinontpascherchnesontpaslesbienvenusici!

Lorganigramme
Cettefois,lorganigrammeachangdeforme,cestuneliste.Commentlelire?Dehaut
en bas ! Le premier lment du programme commence aprs le dbut, le deuxime
lment,aprslepremier,etc.
DEBUT
//premirepartieduprogramme,onsoccupeprincipalementdudeuximefeu
Allumerled_rouge_feux_1
Allumerled_verte_feux_2
Attendre3secondes
teindreled_verte_feux_2
Allumerled_jaune_feux_2
Attendre1seconde
teindreled_jaune_feux_2
Allumerled_rouge_feux_2
/*deuxime partie du programme, pour linstant : led_rouge_feux_1 et
led_rouge_feux_2 sont allumes on teint donc la led_rouge_feux_1 pour
allumerlaled_verte_feux_1*/
Attendre3secondes
teindreled_rouge_feux_1
Allumerled_verte_feux_1
Attendre3secondes
116

teindreled_verte_feux_1
Allumerled_jaune_feux_1
Attendre1seconde
teindreled_jaune_feux_1
Allumerled_rouge_feux_1
FIN
Voil donc ce quil faut suivre pour faire le programme. Si vous avez trouv comme
ceci,cesttrsbien,sinonilfautsentranercarcesttrsimportantdorganisersoncode
etenpluscelapermetdvitercertaineserreurs!

Lacorrection,enfin!
Voillemomentquevousattendeztous:lacorrection!Alors,jeprvienstoutdesuite,
le code que je vais vous montrer nest pas absolu, on peut le faire de diffrentes
manires

Lafonctionsetup
Normalementiciaucunedifficult,onvanommerlesbroches,puislesplacerensortie
etlesmettredansleurtatdedpart.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

//dfinitiondesbroches
constintled_rouge_feux_1=2
constintled_jaune_feux_1=3
constintled_verte_feux_1=4
constintled_rouge_feux_2=5
constintled_jaune_feux_2=6
constintled_verte_feux_2=7

voidsetup()
{
//initialisationensortiedetouteslesbroches
pinMode(led_rouge_feux_1,OUTPUT)
pinMode(led_jaune_feux_1,OUTPUT)
pinMode(led_verte_feux_1,OUTPUT)
pinMode(led_rouge_feux_2,OUTPUT)
pinMode(led_jaune_feux_2,OUTPUT)
pinMode(led_verte_feux_2,OUTPUT)

//oninitialisetouteslesLEDteintesaudbutduprogramme(sauflesdeuxfeuxrouges)
digitalWrite(led_rouge_feux_1,LOW)
digitalWrite(led_jaune_feux_1,HIGH)
digitalWrite(led_verte_feux_1,HIGH)
digitalWrite(led_rouge_feux_2,LOW)
digitalWrite(led_jaune_feux_2,HIGH)
digitalWrite(led_verte_feux_2,HIGH)
}

Vousremarquerezlutilitdavoirdesvariablesbiennommes.

Lecodeprincipal
Sivoustesbienorganis,vousnedevriezpasavoirdeproblmeicinonplus!Point
tropdeparoles,lasolutionarrive
117

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

voidloop()
{
//premiresquence
digitalWrite(led_rouge_feux_1,HIGH)
digitalWrite(led_verte_feux_1,LOW)

delay(3000)

//deuximesquence
digitalWrite(led_verte_feux_1,HIGH)
digitalWrite(led_jaune_feux_1,LOW)

delay(1000)

//troisimesquence
digitalWrite(led_jaune_feux_1,HIGH)
digitalWrite(led_rouge_feux_1,LOW)

delay(1000)

/*deuximepartieduprogramme,ons'occupedufeuxnumro2*/

//premiresquence
digitalWrite(led_rouge_feux_2,HIGH)
digitalWrite(led_verte_feux_2,LOW)

delay(3000)

//deuximesquence
digitalWrite(led_verte_feux_2,HIGH)
digitalWrite(led_jaune_feux_2,LOW)

delay(1000)

//deuximesquence
digitalWrite(led_jaune_feux_2,HIGH)
digitalWrite(led_rouge_feux_2,LOW)

delay(1000)

/*leprogrammevareboucleretreveniraudbut*/
}

Siamarche,tantmieux,sinonrfrezvouslarsolutiondesproblmesenannexe
du cours. Ce TP est donc termin, vous pouvez modifier le code pour par exemple
changer les temps entre chaque squence, ou bien mme modifier les squences
ellesmmes,
Bon, ctait un TP gentillet. Lintrt est seulement de vous faire pratiquer pour vous
enfoncerdanslecrnecequelonavujusquprsent.

[Arduino204]Unsimplebouton
Danscettepartie,vousallezpouvoirinteragirdemaniresimpleavecvotrecarte.Ala
findecechapitre,vousserezcapabledutiliserdesboutonsoudesinterrupteurspour
interagiravecvotreprogramme.
118

Questcequunbouton?
Derrire ce titre trivial se cache un composant de base trs utile, possdant de
nombreux dtails que vous ignorez peuttre. Commenons donc ds maintenant
lautopsiedecedernier.

Mcaniquedubouton
Vouslesavezsrementdj,unboutonnestjamaisquunfilquiestconnectounon
selon sa position. En pratique, on en repre plusieurs, qui diffrent selon leur taille,
leurscaractristiqueslectriques,lespositionsmcaniquespossibles,etc.

Leboutonpoussoirnormalementouvert(NO)
Danscettepartiedututoriel,nousallonsutilisercetypedeboutonspoussoirs(ouBP).
Cesderniersontdeuxpositions:
Relch:lecourantnepassepas,lecircuitestdconnectonditquelecircuit
estouvert.
Appuy:lecourantpasse,onditquelecircuitestferm.
Retenezbiencesmotsdevocabulaire!
Habituellementleboutonpoussoiradeuxbroches,maisengnralilsenont4relies
deuxdeux.

Leboutonpoussoirnormalementferm(NF)
Cetypedeboutonestlopposdutypeprcdent,cestdirequelorsquelebouton
estrelch,illaissepasserlecourant.Etinversement:
Relch : le courant passe, le circuit est connect on dit que le circuit est
ferm.
Appuy:lecourantnepassepas,onditquelecircuitestouvert.

Lesinterrupteurs
Aladiffrencedunboutonpoussoir,linterrupteuragitcommeunebascule.Unappui
fermelecircuitetilfautunsecondappuipourlouvrirdenouveau.Ilpossdedoncdes
tats stables (ouvert ou ferm). On dit quun interrupteur est bistable. Vous en
rencontreztouslesjourslorsquevousallumezlalumire .

Llectroniquedubouton
Symbole
Le BP et linterrupteur ne possdent pas le mme symbole pour les schmas
lectroniques.Pourlepremier,ilestreprsentparunebarrequidoitvenirfairecontact
pour fermer le circuit ou dfaire le contact pour ouvrir le circuit. Le second est
reprsentparunfilquiouvreuncircuitetquipeutbougerpourlefermer.Voicileurs
119

symboles,ilestimportantdesenrappeler:

BoutonPoussoirNO

BoutonPoussoirNF

Interrupteur

Tensionetcourant
Voicimaintenantquelquespetitesprcisionssurlesboutons:
Lorsquilestouvert,latensionsesbornesnepeuttrenulle(oualorscestque
lecircuitnestpasaliment).Enrevanche,lorsquilestfermcettemmetension
doittrenulle.Eneffet,auxbornesdunfillatensionestde0V.
Ensuite,lorsqueleboutonestouvert,aucuncourantnepeutpasser,lecircuitest
donc dconnect. Par contre, lorsquil est ferm, le courant ncessaire au bon
fonctionnement des diffrents composants le traverse. Il est donc important de
prendreencomptecetaspect.Unboutondevantsupporterdeuxampresnesera
pasaussigrosquunboutontolrant100ampres(etpasaussicher )
Ilesttrsfrquentdetrouverdesboutonsdanslesstarterskit.
Souvent ils ont 4 pattes (comme sur limage cidessous). Si cest le cas,
sachez que les broches sont relies deux deux. Cela signifie quelles
fonctionnentparpaire.Ilfautdoncsemfierlorsquevouslebranchersinon
vous obtiendrez le mme comportement quun fil (si vous connectez deux
broches relis). Utilisez un multimtre pour dterminer quels broches sont distinctes.
Pournepassetromper,onutiliseengnraldeuxbrochesquisontopposes
surladiagonaledubouton.

Contraintepourlesmontages
Voicimaintenantunpointtrsimportant,soyezdoncattentifcarjevaisvousexpliquer
lerledunersistancedepullup!
Cestquoistanimal,lepouleeup?
Lorsquelonfaitdellectronique,onatoujourspeurdesperturbations(gnrespar
pleindechoses:deslampesproximit,untlphoneportable,undoigtsurlecircuit,
llectricitstatique,).OnappelleadescontraintesdeCEM.Cesperturbationssont
souventinoffensives,maisperturbentbeaucouplesmontageslectroniques.Ilestalors
ncessaire den prendre compte lorsque lon fait de llectronique de signal. Par
exemple,danscertainscasonpeutseretrouveravecunbitdesignalquivaut1la
placede0,lesdonnesreuessontdoncfausses.Pourcontrerceseffetsnuisibles,ont
placeensrieavecleboutonunersistancedepullup.Cettersistanceserttirer
(topullinenglish)lepotentielverslehaut(up)afindavoirunsignalclairsurlabroche
tudie. Sur le schma suivant, on voit ainsi quen temps normal le signal un
potentielde5V.Ensuite,lorsquelutilisateurappuierasurleboutonuneconnexionsera
faite avec la masse. On lira alors une valeur de 0V pour le signal. Voici donc un
deuximeintrtdelarsistancedepullup,viterlecourtcircuitquiseraitgnr
120

lappui!

Filtrerlesrebonds
Lesboutonsnesontpasdessystmesmcaniquesparfaits.Ducoup,lorsquunappui
estfaitdessus,lesignalnepassepasimmdiatementetproprementde5V0V.En
lespacedequelquesmillisecondes,lesignalvasauterentre5Vet0Vplusieursfois
avantdesestabiliser.Ilsepasselemmephnomnelorsquelutilisateurrelchele
bouton.Cegenredeffetnestpasdsirable,carilpeutengendrerdesparasitesausein
de votre programme (si vous voulez dtecter un appui, les rebonds vont vous en
gnrer une dizaine en quelques millisecondes, ce qui peuttre trs gnant dans le
cas dun compteur par exemple). Voil un exemple de chronogramme relev lors du
relchementdunboutonpoussoir:

Pourattnuercephnomne,nousallonsutiliseruncondensateurenparallleavecle
bouton.Cecomposantserviraicidamortisseurquiabsorberalesrebonds(commesur
une voiture avec les cahots de la route). Le condensateur, initialement charg, va se
dchargerlorsdelappuisurlebouton.Silyadesrebonds,ilsserontencaisssparle
condensateur durant cette dcharge. Il se passera le phnomne inverse (charge du
condensateur) lors du relchement du bouton. Ce principe est illustr la figure
suivante:
121

Schmarsum
Enrsum,voilunmontagequevouspourriezobteniravecunbouton,sarsistance
depullupetsonfiltreantirebondsurvotrecarteArduino:

Lespullupsinternes
Comme expliqu prcdemment, pour obtenir des signaux clairs et viter les courts
122

circuits,onutilisedesrsistancesdepullup.Cependant,cesderniresexistentaussi
eninternedumicrocontrleurdelArduino,cequivitedavoirlesrajouterparnous
mmesparlasuite.Cesderniresontunevaleurde20kiloOhms.Ellespeuventtre
utilisssansaucunecontraintestechniques.Cependant,sivouslesmettezenmarche,
il faut se souvenir que cela quivaut mettre la broche ltat haut (et en entre
videmment). Donc si vous repassez un tat de sortie ensuite, rappelez vous bien
quetantquevousnelavezpaschangeelleseraltathaut.Cequejevientdedire
permetdemettreenplacecesderniresdanslelogiciel:
1
2
3
4
5
6
7
8
9
10
11
12
13
14

constintunBouton=2//unboutonsurlabroche2

voidsetup()
{
//onmetleboutonenentre
pinMode(unBouton,INPUT)
//onactivelarsistancedepullupenmettantlabrochel'tathaut(maiscelarestetoujou
digitalWrite(unBouton,HIGH)
}

voidloop()
{
//votreprogramme
}

Schmarsum

123

Rcuprerlappuidubouton
Montagedebase
Pour cette partie, nous allons apprendre lire ltat dune entre numrique. Tout
dabord,ilfautsavoirquuneentrenumriquenepeutprendrequedeuxtats,HAUT
(HIGH) ou BAS (LOW). Ltat haut correspond une tension de +5V sur la broche,
tandisqueltatbasestunetensionde0V.Dansnotreexemple,nousallonsutiliserun
simplebouton.Danslaralit,vouspourriezutilisernimportequelcapteurquipossde
unesortienumrique.Nousallonsdoncutiliser:
Unboutonpoussoir(etunersistancede10kdepullupetuncondensateuranti
rebondde10nF)
UneLED(etsarsistancedelimitationdecourant)
LacarteArduino
Voicimaintenantleschmaraliser:

MontagesimpleavecunboutonetuneLED

124

Paramtrerlacarte
Afin de pouvoir utiliser le bouton, il faut spcifier Arduino quil y a un bouton de
connectsurunedesesbroches.Cettebrocheseradoncuneentre.Bienentendu,
comme vous tes de bons lves, vous vous souvenez que tous les paramtrages
initiaux se font dans la fonction setup(). Vous vous souvenez galement que pour
dfinirletype(entreousortie)dunebroche,onutiliselafonction:pinMode().Notre
boutontantbranchsurlapin2,oncrira:
1 pinMode(2,INPUT)

Pour plus de clart dans les futurs codes, on considrera que lon a dclar une
variableglobalenommeboutonetayantlavaleur2.Commececi:
1
2
3
4
5
6

constintbouton=2

voidsetup()
{
pinMode(bouton,INPUT)
}

Voil,maintenantnotrecarteArduinosaitquilyaquelquechosedeconnectsursa
broche2etquecettebrocheestconfigureenentre.

Rcuprerltatdubouton
Maintenantqueleboutonestparamtr,nousallonscherchersavoirquelestsontat
(appuyourelch).
Silestrelch,latensionsesbornesserade+5V,doncuntatlogiqueHIGH.
Silestappuy,elleserade0V,doncLOW.
Un petit tour sur la rfrence et nous apprenons quil faut utiliser la fonction
digitalRead() pour lire ltat logique dune entre logique. Cette fonction prend un
paramtrequiestlabrochetesteretelleretourneunevariabledetypeint.Pourlire
ltatdelabroche2nousferonsdonc:
1
2
3
4
5
6
7
8
9
10
11

intetat

voidloop()
{
etat=digitalRead(bouton)//Rappel:bouton=2

if(etat==HIGH)
actionRelache()//leboutonestrelach
else
actionAppui()//leboutonestappuy
}

Observez dans ce code, on appelle deux fonctions qui dpendent de ltat du


bouton.Cesfonctionsnesontpasprsentesdanscecode,sivousletestezainsi,il
nefonctionnerapas.Pourcefaire,vousdevrezcrerlesfonctionsactionAppui().

125

Testsimple
Nousallonspasserunpetittest,quevousallezfaire.Moijeregarde!

But
Lobjectifdecetestestassezsimple:lorsquelonappuiesurlebouton,laLEDdoit
sallumer.Lorsquelonrelchelebouton,laLEDdoitsteindre.Autrementdit,tantque
leboutonestappuy,laLEDestallume.

Correction
Allez, cest vraiment pas dur, en plus je vous donnais le montage dans la premire
partieVoicilacorrection:
Lesvariablesglobales
1
2
3
4
5
6
7

//leboutonestconnectlabroche2delacarteAdruino
constintbouton=2
//laLEDlabroche13
constintled=13

//variablequienregistrel'tatdubouton
intetatBouton

Lafonctionsetup()
1
2
3
4
5
6

voidsetup()
{
pinMode(led,OUTPUT)//laledestunesortie
pinMode(bouton,INPUT)//leboutonestuneentre
etatBouton=HIGH//oninitialisel'tatduboutoncomme"relach"
}

Lafonctionloop()
1
2
3
4
5
6
7
8
9
10
11
12
13

voidloop()
{
etatBouton=digitalRead(bouton)//Rappel:bouton=2

if(etatBouton==HIGH)//testsileboutonaunniveaulogiqueHAUT
{
digitalWrite(led,HIGH)//laLEDresteteinte
}
else//testsileboutonaunniveaulogiquediffrentdeHAUT(doncBAS)
{
digitalWrite(led,LOW)//leboutonestappuy,laLEDestallume
}
}

Jesprequevousytesparvenusanstropdedifficults!Sioui,passonslexercice
suivant

126

InteragiraveclesLEDs
Nousallonsmaintenantfaireunexempledapplicationensemble.

Montagefaire
Pourcetexercice,nousallonsutiliserdeuxboutonsetquatreLEDsdenimporte
quellescouleurs.
Les deux boutons seront considrs actifs (appuys) ltat bas (0V) comme
danslapartieprcdente.Ilsserontconnectssurlesbroches2et3delArduino.
Ensuite,les4LEDsserontconnectessurlesbroches1013delArduino.
Voildonclemontageeffectuer:

127

128

Montagede
lexercice,avecdeuxboutonsetquatreLEDs

Objectif:BarregrapheLED
Dans cet exercice, nous allons faire un minibarregraphe. Un barregraphe est un
afficheur qui indique une quantit, provenant dune information quelconque (niveau
deau,puissancesonore,etc.),sousuneformelumineuse.Leplussouvent,onutilise
des LEDs alignes en guise daffichage. Chaque LED se verra allume selon un
niveauquiseraunefractionduniveautotal.Parexemple,sijeprendsuneinformation
qui varie entre 0 et 100, chacune des 4 LED correspondra au quart du maximum de
cettevariation.Soit100/4=25.Enloccurrence,linformationentrantecestlappuides
boutons. Par consquent un appui sur un bouton allume une LED, un appui sur un
autre bouton teint une LED. En fait ce nest pas aussi direct, il faut incrmenter ou
dcrmenter la valeur dune variable et en fonction de cette valeur, on allume telle
quantitdeLED.

Cahierdescharges
Laralisationprvuedevra:
possder4LED(oupluspourlesplustmraires)
possder2boutons:unquiincrmenteralenombredeLEDallumes,lautre
quiledcrmentera
Vousdevrezutiliserunevariablequivoitsavaleuraugmenteroudiminuerentre1et4
selonlappuiduboutondincrmentationoudedcrmentation.
Vouspouvezmaintenantvouslancerdanslaventure.Pourceuxquisesentiraient
encoreunpeumallaiseaveclaprogrammation,jevousautorisepoursuivrela
lecture qui vous expliquera pas pas comment procder pour arriver au rsultat
final.

Correction
129

Initialisation
Pour commencer, on crer et on initialise toutes les variables dont on a besoin dans
notreprogramme:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

/*dclarationdesconstantespourlesnomsdesbrochesceciselonleschma*/
constintbtn_minus=2
constintbtn_plus=3
constintled_0=10
constintled_1=11
constintled_2=12
constintled_3=13

/*dclarationdesvariablesutilisespourlecomptageetledcomptage*/

intnombre_led=0//lenombrequiseraincrmentetdcrment
intetat_bouton//lecturedel'tatdesboutons(unseullafoismaisunevariablesuffit)

/*initilisationdesbrochesenentre/sortie*/
voidsetup()
{
pinMode(btn_plus,INPUT)
pinMode(btn_minus,INPUT)
pinMode(led_0,OUTPUT)
pinMode(led_1,OUTPUT)
pinMode(led_2,OUTPUT)
pinMode(led_3,OUTPUT)
}

voidloop()
{
//lesinstructionsdevotreprogramme
}

Dtectiondesdiffrencesappuy/relch
Afindedtecterunappuisurunbouton,nousdevonscomparersontatcourantavec
sontatprcdent.Cestdirequavantquilsoitappuyourelch,onlitsontatet
onlinscritdansunevariable.Ensuite,onrelitsisontatchang.Sicestlecasalors
onincrmentelavariablenombre_led.Pourfairecela,onvautiliserunevariabledeplus
parbouton:
1 intmemoire_plus=HIGH//tatrelchpardfaut
2 intmemoire_minus=HIGH

Dtectionduchangementdtat
Commeditprcdemment,nousdevonsdtecterlechangementdepositiondubouton,
sinononneverrariencartoutsepasseratropvite.Voilleprogrammedelaboucle
principale:
1
2
3
4
5

voidloop()
{
//lecturedel'tatduboutond'incrmentation
etat_bouton=digitalRead(btn_plus)

130

6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

//SileboutonauntatdiffrentqueceluienregistrETquecettatest"appuy"
if((etat_bouton!=memoire_plus)&&(etat_bouton==LOW))
{
nombre_led++//onincrmentelavariablequiindiquecombiendeLEDdevronss'allumer
}

memoire_plus=etat_bouton//onenregistrel'tatduboutonpourletoursuivant

//etmaintenantpareilpourleboutonquidcrmente
etat_bouton=digitalRead(btn_minus)//lecturedesontat

//SileboutonauntatdiffrentqueceluienregistrETquecettatest"appuy"
if((etat_bouton!=memoire_minus)&&(etat_bouton==LOW))
{
nombre_led//ondcrmentelavaleurdenombre_led
}
memoire_minus=etat_bouton//onenregistrel'tatduboutonpourletoursuivant

//onappliquedeslimitesaunombrepournepasdpasser4ou0
if(nombre_led>4)
{
nombre_led=4
}
if(nombre_led<0)
{
nombre_led=0
}

//appeldelafonctionaffiche()quel'onauracre
//onluipasseenparamtrelavaleurdunombredeLEDclairer
affiche(nombre_led)
}

Nousavonstermindecrerlesqueletteduprogrammeetladtectiondvnement,il
neresteplusquafficherlersultatdunombre!

Laffichage
Pour viter de se compliquer la vie et dalourdir le code, on va crer une fonction
daffichage. Celle dont je viens de vous parler : affiche(int le_parametre). Cette
fonctionreoitunparamtrereprsentantlenombreafficher.Aprsent,nousdevons
allumerlesLEDsselonlavaleurreue.OnsaitquelondoitafficheruneLEDlorsque
lonreoitlenombre1,2LEDslorsquonreoitlenombre2,
1
2
3
4
5
6
7
8
9
10
11
12
13
14

voidaffiche(intvaleur_recue)
{
//onteinttouteslesLEDs
digitalWrite(led_0,HIGH)
digitalWrite(led_1,HIGH)
digitalWrite(led_2,HIGH)
digitalWrite(led_3,HIGH)

//Puisonlesallumeuneune
if(valeur_recue>=1)
{
digitalWrite(led_0,LOW)
}
if(valeur_recue>=2)

131

15
16
17
18
19
20
21
22
23
24
25
26

{
digitalWrite(led_1,LOW)
}
if(valeur_recue>=3)
{
digitalWrite(led_2,LOW)
}
if(valeur_recue>=4)
{
digitalWrite(led_3,LOW)
}
}

Donc,silafonctionreoitlenombre1,onallumelaLED1.Siellereoitlenombre2,
elleallumelaLED1et2.Siellereoit3,elleallumelaLED1,2et3.Enfin,siellereoit
4,alorselleallumetouteslesLEDs.Lecodeaugrandcomplet:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

/*dclarationdesconstantespourlesnomdesbrochesceciselonleschma*/
constintbtn_minus=2
constintbtn_plus=3
constintled_0=10
constintled_1=11
constintled_2=12
constintled_3=13

/*dclarationdesvariablesutilisespourlecomptageetledcomptage*/

intnombre_led=0//lenombrequiseraincrmentetdcrment
intetat_bouton//lecturedel'tatdesboutons(unseullafoismaisunevariablesuffit)

intmemoire_plus=HIGH//tatrelchpardfaut
intmemoire_minus=HIGH

/*initilisationdesbrochesenentre/sortie*/
voidsetup()
{
pinMode(btn_plus,INPUT)
pinMode(btn_minus,INPUT)
pinMode(led_0,OUTPUT)
pinMode(led_1,OUTPUT)
pinMode(led_2,OUTPUT)
pinMode(led_3,OUTPUT)
}

voidloop()
{
//lecturedel'tatduboutond'incrmentation
etat_bouton=digitalRead(btn_plus)

//SileboutonauntatdiffrentqueceluienregistrETquecettatest"appuy"
if((etat_bouton!=memoire_plus)&&(etat_bouton==LOW))
{
nombre_led++//onincrmentelavariablequiindiquecombiendeLEDdevronss'allumer
}

memoire_plus=etat_bouton//onenregistrel'tatduboutonpourletoursuivant

132

44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94

//etmaintenantpareilpourleboutonquidcrmente
etat_bouton=digitalRead(btn_minus)//lecturedesontat

//SileboutonauntatdiffrentqueceluienregistrETquecettatest"appuy"
if((etat_bouton!=memoire_minus)&&(etat_bouton==LOW))
{
nombre_led//ondcrmentelavaleurdenombre_led
}
memoire_minus=etat_bouton//onenregistrel'tatduboutonpourletoursuivant

//onappliquedeslimitesaunombrepournepasdpasser4ou0
if(nombre_led>4)
{
nombre_led=4
}
if(nombre_led<0)
{
nombre_led=0
}

//appeldelafonctionaffiche()quel'onauracre
//onluipasseenparamtrelavaleurdunombredeLEDclairer
affiche(nombre_led)
}

voidaffiche(intvaleur_recue)
{
//onteinttouteslesleds
digitalWrite(led_0,HIGH)
digitalWrite(led_1,HIGH)
digitalWrite(led_2,HIGH)
digitalWrite(led_3,HIGH)

//Puisonlesallumeuneune
if(valeur_recue>=1)
{
digitalWrite(led_0,LOW)
}
if(valeur_recue>=2)
{
digitalWrite(led_1,LOW)
}
if(valeur_recue>=3)
{
digitalWrite(led_2,LOW)
}
if(valeur_recue>=4)
{
digitalWrite(led_3,LOW)
}
}

Unepetitevidodursultatquevousdevriezobtenir,mmesivotrecodeestdiffrent
dumien:

133

Lesinterruptionsmatrielles
Voicimaintenantunsujetplusdlicat(maispastantquea!:ninja:)quidemande
votreattention.
Comme vous lavez remarqu dans la partie prcdente, pour rcuprer ltat du
boutonilfautsurveillerrgulirementltatdecedernier.Cependant,sileprogrammea
quelquechosedelongtraiter,parexemplesoccuperdelallumageduneLEDetfaire
unepauseavecdelay()(bienquelonpuisseutilisermillis()),lappuisurleboutonne
serapastrsractifetlentladtente.Pourcertainesapplications,celapeutgner.
Problme:silutilisateurappuieetrelcherapidementlebouton,vouspourrieznepas
dtecterlappui(sivoustesdansuntraitementlong).Solution:Utiliserlemcanisme
dinterruption.

Principe
Dans les parties prcdentes de ce chapitre, la lecture dun changement dtat se
faisait en comparant rgulirement ltat du bouton un moment avec son tat
prcdent.Cettemthodefonctionnebien,maisposeunproblme:lappuinepeutpas
tredtectsilesttropcourt.Autresituation,silutilisateurfaitunappuitrslong,mais
quevoustesdjdansuntraitementtrslong(calculdelamillimedcimaledePI,
soyons fous), le temps de rponse lappui ne sera pas du tout optimal, lutilisateur
aura une impression de lag (= pas ractif). Pour pallier ce genre de problme, les
constructeurs de microcontrleurs ont mis en place des systmes qui permettent de
dtecterdesvnementsetdexcuterdesfonctionsdsladtectiondecesderniers.
Par exemple, lorsquun pilote davion de chasse demande au sige de sjecter, le
sigedoitragiraumomentdelappui,pasuneminuteplustard(troptard).
Questcequuneinterruption?
Uneinterruptionestenfaitundclenchementquiarrtelexcutionduprogrammepour
faireunetchedemande.Parexemple,imaginonsqueleprogrammecomptejusqu
linfinie. Moi, programmeur, je veux que le programme arrte de compter lorsque
jappuie sur un bouton. Or, il savre que la fonction qui compte est une boucle for(),
dontonnepeutsortirsansavoiratteintlinfinie(autrementditjamais,enthorie).Nous
allons donc nous tourner vers les interruptions qui, ds que le bouton sera appuy,
interrompronsleprogrammepourluidire:Arrtedecompter,cestlutilisateurquile
demande!.Pourrsumer:uneinterruptionduprogrammeestgnrelorsdun
vnement attendu. Ceci dans le but deffectuer une tche, puis de reprendre
134

lexcutionduprogramme.Arduinoproposeaussicegenredegestiondvnements.
Onlesretrouverasurcertainesbroches,surdestimers,desliaisonsdecommunication,
etc.

Miseenplace
Nousallonsillustrercemcanismeaveccequinousconcerneici,lesboutons.Dansle
cas dune carte Arduino UNO, on trouve deux broches pour grer des interruptions
externes(quinesontpasduesauprogrammeluimme),la2etla3.Pourdclencher
uneinterruption,plusieurscasdefiguresontpossibles:
LOW:Passageltatbasdelabroche
FALLING:Dtectiondunfrontdescendant(passagedeltathautltatbas)
RISING:Dtectiondunfrontmontant(pareilquavant,maisdanslautresens)
CHANGE:Changementdtatdelabroche
Autrementdit,silyaunchangementduntypenumraudessus,alorsleprogramme
serainterrompupoureffectueruneaction.

Crerunenouvelleinterruption
Comme dhabitude, nous allons commencer par faire des rglages dans la fonction
setup(). La fonction importante utiliser est attachInterrupt(interrupt, function,
mode).Elleacceptetroisparamtres:
interrupt : qui est le numro de la broche utilise pour linterruption (0 pour la
broche2et1pourlabroche3)
function : qui est le nom de la fonction appeler lorsque linterruption est
dclenche
mode:quiestletypededclenchement(cf.cidessus)
Silonveutappelerunefonctionnomme Reagir()lorsquelutilisateurappuiesurun
boutonbranchsurlabroche2onfera:
1 attachInterrupt(0,Reagir,FALLING)

VousremarquerezlabsencedesparenthsesaprslenomdelafonctionReagir
Ensuite,ilvoussuffitdecodervotrefonctionReagir()unpeuplusloin.
Attention, cette fonction ne peut pas prendre dargument et ne retournera aucun
rsultat.
Lorsquequelquechosedclencheralinterruption,leprogrammeprincipalseramisen
pause.Ensuite,lorsquelinterruptionauratexcuteettraite,ilreprendracommesi
riennestaitproduit(avecpeuttredesvariablesmisesjour).

Miseengarde
Si je fais une partie entire sur les interruptions, ce nest pas que cest difficile mais
135

cest surtout pour vous mettre en garde sur certains points. Tout dabord, les
interruptionsnesontpasunesolutionmiracle.Eneffet,gardezbienenttequeleur
utilisationrpondunbesoinjustifi.Ellesmettenttoutvotreprogrammeenpause,et
une mauvaise programmation (ce qui narrivera pas, je vous fais confiance ) peut
entraner une altration de ltat de vos variables. De plus, les fonctions delay() et
millis()naurontpasuncomportementcorrect.Eneffet,pendantcetempsleprogramme
principalestcompltementstopp,donclesfonctionsgrantletempsnefonctionneront
plus,ellesserontaussienpauseetlaisserontlaprioritlafonctiondinterruption.La
fonctiondelay()estdoncdsactiveetlavaleurretourneparmillis()nechangerapas.
Justifiezdoncvotrechoixavantdutiliserlesinterruptions.
Et voil, vous savez maintenant comment donner de linteractivit lexprience
utilisateur. Vous avez pu voir quelques applications, mais nul doute que votre
imaginationfertilevaenapporterdenouvelles!

[Arduino205]Afficheurs7segments
Vous connaissez les afficheurs 7 segments ? Ou alors vous ne savez pas que a
sappellecommea?Ilsagitdespetiteslumiresquiformentlechiffre8etquisontde
couleurrougeouverte,laplupartdutemps,maispeuventaussitrebleus,blancs,etc.
Onentrouvebeaucoupdanslesradiorveils,carilsserventprincipalementafficher
lheure. Autre particularit, non seulement de pouvoir afficher des chiffres (0 9), ils
peuventgalementaffichercertaineslettresdelalphabet.

Matriel
Pourcechapitre,vousaurezbesoinde:
Un(etplus)afficheur7segments(videmment)
8rsistancesde330
Un(oudeux)dcodeursBCD7segments
UnecarteArduino!Maisdansunpremiertempsonvadabordbiensaisirletruc
avantdefaireducode
Nous allons commencer par une dcouverte de lafficheur, comment il fonctionne et
commentlebrancheton.EnsuitenousverronscommentlutiliseraveclacarteArduino.
Enfin,lechapitresuivantamneraunTPrsumantlesdiffrentespartiesvues.

Premireapproche:ctlectronique
Unpeu(beaucoup)dlectronique
Comme son nom lindique, lafficheur 7 segments possde 7 segments. Mais un
segmentcestquoiaujuste?Etbiencestuneportiondelafficheur,quiestallumeou
teintepourraliserlaffichage.CetteportionnestenfaitriendautrequuneLEDqui
au lieu dtre ronde comme dhabitude est plate et encastr dans un boiter. On
dnombredonc8portionsencomptantlepointdelafficheur(maisilnecomptepasen
136

tantquesegmentpartentirecarilnestpastoujoursprsent).Regardezquoia
ressemble:

Afficheur7segments

DesLED,encoredesLED
EtdesLED,ilyena!Entre7et8selonlesmodles(cestcequejeviensdexpliquer),
voir beaucoup plus, mais on ne sy attardera pas dessus. Voici un schma vous
prsentant un modle dafficheur sans le point (qui au final est juste une LED
supplmentairerappelezvous):

Lesinterrupteursa,b,c,d,e,f,greprsententles
signauxpilotantchaquesegments
Commevouslevoyezsurceschma,touteslesLEDpossdentunebrochecommune,
relieentreelle.Selonquecettebrocheestlacathodeoulanodeonparleradafficheur
cathode commune ou anode commune (vous suivez ?). Dans labsolu, ils
fonctionnentdelammefaon,seulelamaniredelesbrancherdiffre(actifsurtat
basousurtathaut).

CathodecommuneouAnodecommune
Danslecasdunafficheurcathodecommune,touteslescathodessontreliesentre
elles en un seul point luimme connect la masse. Ensuite, chaque anode de
chaquesegmentserarelieunebrochedesignal.Pourallumerchaquesegment,le
signal devra tre une tension positive. En effet, si le signal est 0, il ny a pas de
diffrencedepotentielentrelesdeuxbrochesdelaLEDetdoncellenesallumerapas
!Sinoussommesdanslecasduneanodecommune,lesanodesdetouteslesLED
sont relies entre elles en un seul point qui sera connect lalimentation. Les
cathodesellesserontreliesuneparuneauxbrochesdesignal.Enmettantunebroche
designal0,lecourantpasseraetlesegmentenquestionsallumera.Silabrochede
signalestltathaut,lepotentielestlemmedechaquectdelaLED,doncelleest
bloqueetnesallumepas!Quelafficheursoitanodeoucathodecommune,on
doittoujoursprendreencomptequilfautajouterunersistancedelimitationdecourant
entre la broche isole et la broche de signal. Traditionnellement, on prendra une
137

rsistancede330ohmspourunetensionde+5V,maiscelasecalcul(cf.chapitre1,
partie2).Sivousvoulezaugmenterlaluminosit,ilsuffitdediminuercettevaleur.Siau
contrairevousvoulezdiminuerlaluminosit,augmenterlarsistance.

Choixdelafficheur
Pourlardactionjaifaitlechoixdutiliserdesafficheursanodecommuneetcenest
pasanodin.Eneffetetonlavujusqumaintenant,onbranchelesLEDdu+5Vversla
broche de la carte Arduino. Ainsi, dans le cas dun afficheur anode commune, les
LEDserontbranchsdunctau+5V,etdelautrectauxbrochesdesignaux.Ainsi,
pourallumerunsegmentonmettralabrochedesignal0etonlteindraenmettantle
signal1.Onatoujoursfaitcommeadepuisledbut,anevousposeradoncaucun
problme.

Branchementcompletdelafficheur
Nousallonsmaintenantvoircommentbrancherlafficheuranodecommune.

Prsentationdubotier
Lesafficheurs7segmentsseprsententsurunbotierdetypeDIP10.LeformatDIP
rgie lespacement entre les diffrentes broches du circuit intgr ainsi que dautres
contraintes(prsencedchangeurthermiqueetc).Lechiffre10signifiequilpossde
10broches(5departetdautreduboitier).Voiciunereprsentationdecedernier(
gauche):

Voicilasignificationdesdiffrentesbroches:
1. LEDdelacathodeE
2. LEDdelacathodeD
3. AnodecommunedesLED
4. LEDdelacathodeC
5. (facultatif)lepointdcimal.
6. LEDdelacathodeB
7. LEDdelacathodeA
8. AnodecommunedesLED
138

9. LEDdelacathodeF
10. LEDdelacathodeG
Pourallumerunsegmentcesttrssimple,ilsuffitdelerelierlamasse!
Nous cherchons allumer les LED de lafficheur, il est donc impratif de ne pas
oubliezlesrsistancesdelimitationsdecourant!

Exemple
Pour commencer, vous allez tout dabord mettre lafficheur cheval sur la plaque
dessai (breadboard). Ensuite, trouvez la broche reprsentant lanode commune et
reliezlalafuturecolonnedu+5V.Prochainetape,mettreunersistancede 330
surchaquebrochedesignal.Enfin,reliezquelquesunedecesrsistanceslamasse.
Si tous se passe bien, les segments relis la masse via leur rsistance doivent
sallumerlorsquevousalimentezlecircuit.Voiciunexempledebranchement:

139

Dans cet exemple de montage, vous verrez que tous les segment de lafficheur
sallument ! Vous pouvez modifier le montage en dconnectant quelques unes des
rsistancedelamasseetafficherdenombreuxcaractres.
Pensez couper lalimentation lorsque vous changer des fils de place. Les
composants naiment pas forcment tre (d)branchs lorsquils sont aliments.
Vouspourriezventuellementleurcauserdesdommages.

Seulement7segmentsmaispleindecaractre(s)!
Vouslavezpeuttreremarquaveclexerciceprcdent,unafficheurs7segments
neselimitepasafficherjustedeschiffres.Voiciuntableauillustrantlescaractres
possibles et quels segments allums. Attention, il est possible quil manque certains
caractres!
Caractre seg.A seg.B seg.C seg.D seg.E seg.F seg.G
0
x
x
x
x
x
x
1
x
x
2
x
x
x
x
x
3
x
x
x
x
x
4
x
x
x
x
5
x
x
x
x
x
6
x
x
x
x
x
x
140

7
8
9
A
b
C
d
E
F
H
I
J
L
o
P
S
t
U
y

x
x
x
x

x
x
x
x

x
x
x
x
x

x
x

x
x
x
x
x

x
x
x
x

x
x

x
x
x
x
x
x

x
x
x

x
x
x
x
x

x
x

x
x
x
x
x
x
x
x
x
x
x
x

x
x
x

x
x

x
x
x
x
x
x
x
x
x

x
x
x
x

x
x
x

x
x
x
x
x
x
x

x
x
x
x
x
x

Aidezvousdecetableaulorsquevousaurezcoderlaffichagedecaractres!

Affichersonpremierchiffre!
Pourcommencer,nousallonsprendreenmainunafficheuretluifairesaffichernotre
premierchiffre!Cestassezsimpleetnerequiertquunprogrammetrssimple,maisun
peurbarbatif.

Schmadeconnexion
Je vais reprendre le schma prcdent, mais je vais connecter chaque broche de
lafficheurunesortiedelacarteArduino.Commececi:

141

VousvoyezdoncquechaqueLEDdelafficheurvatrecommandesparmentles
unesdesautres.Ilnyariendeplusfaire,sicenestquprogrammer

Leprogramme
Lobjectifduprogrammevatredafficherunchiffre.Ehbiencestpartit!Quoi?!Vous
voulezdelaide?o_OBenjevousaidjtoutdityaplusqufaire.Enplusvousavez
untableauaveclequelvouspouvezvousaiderpouraffichervotrechiffre.Cherchez,je
vousdonneraislasolutionensuite.
1
2
3
4

/*OnassignechaqueLEDunebrochedel'arduino*/
constintA=2
constintB=3
constintC=4

142

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

constintD=5
constintE=6
constintF=7
constintG=8
//notezquel'onnegrepasl'affichagedupoint,maisvouspouvezlerajoutersicelavouschante

voidsetup()
{
//dfinitiondesbrochesensortie
pinMode(A,OUTPUT)
pinMode(B,OUTPUT)
pinMode(C,OUTPUT)
pinMode(D,OUTPUT)
pinMode(E,OUTPUT)
pinMode(F,OUTPUT)
pinMode(G,OUTPUT)

//misel'tatHAUTdecessortiespourteindrelesLEDdel'afficheur
digitalWrite(A,HIGH)
digitalWrite(B,HIGH)
digitalWrite(C,HIGH)
digitalWrite(D,HIGH)
digitalWrite(E,HIGH)
digitalWrite(F,HIGH)
digitalWrite(G,HIGH)
}

voidloop()
{
//affichageduchiffre5,d'aprsletableauprcdent
digitalWrite(A,LOW)
digitalWrite(B,HIGH)
digitalWrite(C,LOW)
digitalWrite(D,LOW)
digitalWrite(E,HIGH)
digitalWrite(F,LOW)
digitalWrite(G,LOW)
}

Vous le voyez par vousmme, cest un code hyper simple. Essayez de le bidouiller
pour afficher des messages, par exemple, en utilisant les fonctions introduisant le
temps. Ou bien complter ce code pour afficher tous les chiffres, en fonction dune
variabledfinieaudpart(ex:var=1,affichelechiffre1etc.).

Techniquesdaffichage
Vousvousendoutezpeuttre,lorsquelonveututiliserplusieursafficheurilvanous
falloirbeaucoupdebroches.Imaginons,nousvoulonsafficherunnombreentre0et99,
ilnousfaudrautiliserdeuxafficheursavec2 7 = 14brochesconnectessurlacarte
Arduino. Rappel : une carte Arduino UNO possde 14 broches entres/sorties
classiques. Si on ne fais rien dautre que dutiliser les afficheurs, cela ne nous gne
pas,cependant,ilestfortprobablequevousserezamenerutiliserdautresentres
avecvotrecarteArduino.Maissionnelibrepasdeplacevousserezembt.Nous
allonsdoncvoirdeuxtechniquesqui,unefoiscumules,vontnouspermettredutiliser
seulement4brochespourobtenirlemmersultatquavec14broches!
143

Lesdcodeurs4bits>7segments
Lapremiretechniquequenousallonsutilisermetenuvreuncircuitintgr.Vous
voussouvenezquandjevousaiparldecesbtesl?Oui,cestlemmetypequele
microcontrleurdelacarteArduino.Cependant,lecircuitquenousallonsutilisernefait
pasautantdechosesqueceluisurvotrecarteArduino.

DcodeurBCD>7segments
Cest le nom du circuit que nous allons utiliser. Son rle est simple. Vous vous
souvenez des conversions ? Pour passer du binaire au dcimal ? Et bien cest le
momentdevousenservir,doncsivousnevousrappelezplusdea,allezrevoirun
peulecours.Jedisaisdoncquesonrleestsimple.Etvousleconstaterezparvous
mme, il va sagir de convertir du binaire cod sur 4 bits vers un code utilis pour
afficher les chiffres. Ce code correspond en quelque sorte au tableau prcdemment
voqu.

Principedudcodeur
Surunafficheur7segments,onpeutreprsenteraismentleschiffresde09(eten
insistantunpeuleslettresdeAF).Eninformatique,pourreprsenterceschiffres,il
nousfautaumaximum4bits.Commevoustesdesexpertsetquevousavezbienlula
partie sur le binaire, vous navez pas de mal le comprendre. (0000)2 fera (0)10 et
(1111)2 fera (15)10 ou (F)16. Pour faire 9 par exemple on utilisera les bits 1001. En
partant de se constat, des ingnieurs ont invent un composant au doux nom de
dcodeur ou driver 7 segments. Il reoit sur 4 broches les 4 bits de la valeur
afficher, et sur 7 autres broches ils pilotent les segments pour afficher ladite valeur.
Ajoutercelaunebrochedalimentationetunebrochedemasseonobtient13broches
!Etcenestpasfini.Laplupartdescircuitsintgrsdetypedcodeurpossdeaussi
unebrochedactivationetunebrochepourtestersitouslessegmentsfonctionnent.

Choixdudcodeur
NousallonsutiliserlecomposantnommMC14543Bcommeexemple.Toutdabord,
ouvrez ce lien dans un nouvel onglet, il vous menera directement vers le pdf du
dcodeur:

DatasheetduMC14543B
Lesdatasheetssecomposentsouventdelammemanire.Ontrouvetoutdabordun
rsumdesfonctionsduproduitpuisunschmadesonbotier.Dansnotrecas,onvoit
quil est mont sur un DIP 16 (DIP : Dual Inline Package, en gros botier avec deux
lignesdebroches).Siloncontinue,onvoitlatabledevritfaisantlelienentreles
signauxdentres(INPUT)etlessorties(OUTPUT).Onvoitainsiplusieurschoses:
SilonmetlabrocheBl(Blank,n7)un,touteslessortiespassentzro.En
effet,commesonnomlindiquecettebrocheserteffacerltatdelafficheur.Si
vous ne voulez pas lutiliser il faut donc la connecter la masse pour la
dsactiver.
LesentresA,B,CetD(broches5,3,2et4respectivement)sontactivesltat
144

HAUT. Les sorties elles sont actives ltat BAS (pour piloter un afficheur
anode commune) OU HAUT selon ltat de la broche PH (6). Cest l un gros
avantagedececomposant,ilpeutinverserlalogiquedelasortie,lerendantalors
compatible avec des afficheurs anode commune (broche PH ltat 1) ou
cathodecommune(Ph=0)
LabrocheBI(BlankInput,n7)sersinhiberlesentres.Onnesenservirapas
etdonconlamettraltatHAUT(+5V)
LD(n1)sertfaireunemmoiredeltatdessorties,onnesenservirapasici
Enfin,lesdeuxbrochesdalimentationsontla8(GND/VSS,masse)etla16(VCC,
+5V)
Noubliez pas de mettre des rsistances de limitations de courant entre chaque
segmentetlabrochedesignalducircuit!

Fonctionnement
Cestbienbeautoutamaiscommentjeluidisaudcodeurdafficherlechiffre5
parexemple?
Ilsuffitderegarderledatasheetetsatabledevrit(cestletableauaveclesentreset
lessorties).Cequereoitledcodeursursesentres(A,B,CetD)dfinilestatsde
sesbrochesdesortie(a,b,c,d,e,fetg).Cesttout!Donc,onvadonneruncodebinaire
sur4bitsnotredcodeuretenfonctiondececode,ledcodeurafficheralecaractre
voulu.Enpluslefabricantestsympa,ilmetdispositiondesnotesdapplicationsla
page6pourbienbrancherlecomposant:

On voit alors quil suffit simplement de brancher la rsistance entre le CI et les


segmentsetsassurerquePHlabonnevaleuretcesttout!Entitredexerciceafinde
vouspermettredemieuxcomprendre,jevousproposedechangerlestatsdesentres
A, B, C et D du dcodeur pour observer ce quil affiche. Aprs avoir raliser votre
schma, regarder sil correspond avec celui prsent dans cette balise secrte. Cela
vousviterapeuttreunmauvaisbranchement,quisait?

145

Laffichageparalternance
La seconde technique est utilise dans le cas o lon veut faire un affichage avec
plusieurs afficheurs. Elle utilise le phnomne de persistance rtinienne. Pour faire
simple,cestgrcecelaquelecinmavousparaitfluide.Onchangeuneimagetoutes
les40msetvotreilnapasletempsdelevoir,donclesimagessemblesenchainer
sanstransition.BrefIci,lammestratgieserautilise.Onvaallumerunafficheurun
certain temps, puis nous allumerons lautre en teignant le premier. Cette action est
146

assezsimpleraliser,maisncessitelemploidedeuxbrochesupplmentaires,de
quatreautrescomposantsetdunpeudecode.Nousltudieronsunpetitpeuplustard,
lorsquenoussauronsgrunafficheurseul.

UtilisationdudcodeurBCD
Nousysommes,nousallons(enfin)utiliserlacarteArduinopourfaireunaffichageplus
pouss quun unique afficheur. Pour cela, nous allons trs simplement utiliser le
montage prcdent compos du dcodeur BCD, de lafficheur 7 segments et bien
entendudesrsistancesdelimitationsdecourantpourlesLEDdelafficheur.Jevais
vousmontrerdeuxtechniquesquipeuventtreemployespourfaireleprogramme.

Initialisation
Vous avez lhabitude maintenant, nous allons commencer par dfinir les diffrentes
brochesdentres/sorties.Pourdbuter(etconformmentauschma),nousutiliserons
seulement 4 broches, en sorties, correspondantes aux entres du dcodeur 7
segments.Voicilecodepouvanttraduirecetteexplication:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

constintbit_A=2
constintbit_B=3
constintbit_C=4
constintbit_D=5

voidsetup()
{
//onmetlesbrochesensorties
pinMode(bit_A,OUTPUT)
pinMode(bit_B,OUTPUT)
pinMode(bit_C,OUTPUT)
pinMode(bit_D,OUTPUT)

//oncommenceparcrirelechiffre0,donctouteslessoritesl'tatbas
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)
}

Ce code permet juste de dclarer les quatre broches utiliser, puis les affectes en
sorties.Onlesmetensuitetouteslesquatrezro.Maintenantquelafficheurestprt,
nousallonspouvoircommencerafficherunchiffre!

Programmeprincipal
Si tout se passe bien, en ayant la boucle vide pour linstant vous devriez voir un
superbe 0 sur votre afficheur. Nous allons maintenant mettre en place un petit
programmepourafficherlesnombresde09enlesincrmentant(partirde0)toutes
les secondes. Cest donc un compteur. Pour cela, on va utiliser une boucle, qui
compterade09.Danscetteboucle,onexcuteraappelleralafonction afficher()
quisoccuperadoncdelaffichage(belledmonstrationdecequiestunevidence
).
147

1
2
3
4
5
6
7
8
9

voidloop()
{
chari=0//variable"compteur"
for(i=0i<10i++)
{
afficher(i)//onappellafonctiond'affichage
delay(1000)//onattend1seconde
}
}

Fonctiondaffichage
Nous touchons maintenant au but ! Il ne nous reste plus qu raliser la fonction
daffichagepourpouvoirconvertirnotrevariableenchiffresurlafficheur.Pourcela,il
existediffrentessolutions.Nousallonsenvoiriciunequiestassezsimplemettreen
uvremaisquincessitedebientrecomprise.Danscettemthode,onvafairedes
oprations mathmatiques (tout de suite cest moins drle ) successives pour
dterminerquelsbitsmettreltathaut.Rappelezvous,nousavonsquatrebroches
notre disposition, avec chacune un poids diffrent (8, 4, 2 et 1). En combinant ces
diffrentes broches ont peu obtenir nimporte quel nombre de 0 15. Voici une
dmarchemathmatiqueenvisageable:

148

On peut coder cette mthode de manire assez simple et direct, en suivant cet
organigramme:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

//fonctioncrivantsurunseulafficheur
voidafficher(charchiffre)
{
//onmetzrotoutlesbitsdudcodeur
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)

//Onallumelesbitsncessaires
if(chiffre>=8)
{
digitalWrite(bit_D,HIGH)
chiffre=chiffre8
}
if(chiffre>=4)
{
digitalWrite(bit_C,HIGH)
chiffre=chiffre4
}
if(chiffre>=2)
{
digitalWrite(bit_B,HIGH)
chiffre=chiffre2
}
if(chiffre>=1)
{
digitalWrite(bit_A,HIGH)
chiffre=chiffre1
}
}

149

Quelques explications simposent Le code grant laffichage rside sur les valeurs
binairesdeschiffres.Rappelonslesvaleursbinairesdeschiffres:
Chiffre DCBA
(0000)2
0
(0001)2
1
2

(0010)2

(0011)2

(0100)2

(0101)2

(0110)2

(0111)2

(1000)2

(1001)2

Daprscetableau,sionveutlechiffre8,ondoitallumerlesegmentD,car8scrit
(1000)2 ayant pour segment respectif DCBA. Soit D=1, C=0, B=0 et A=0. En suivant
cettelogique,onarrivedterminerlesentresdudcodeurquisontmettreltat
HAUTouBAS.Dunemanirepluslourde,onauraitpucrireuncoderessemblant
a:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

//fonctioncrivantsurunseulafficheur
voidafficher(charchiffre)
{
switch(chiffre)
{
case0:
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)
break
case1:
digitalWrite(bit_A,HIGH)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)
break
case2:
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,HIGH)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)
break
case3:
digitalWrite(bit_A,HIGH)
digitalWrite(bit_B,HIGH)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)
break
case4:
digitalWrite(bit_A,LOW)

150

32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67

digitalWrite(bit_B,LOW)
digitalWrite(bit_C,HIGH)
digitalWrite(bit_D,LOW)
break
case5:
digitalWrite(bit_A,HIGH)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,HIGH)
digitalWrite(bit_D,LOW)
break
case6:
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,HIGH)
digitalWrite(bit_C,HIGH)
digitalWrite(bit_D,LOW)
break
case7:
digitalWrite(bit_A,HIGH)
digitalWrite(bit_B,HIGH)
digitalWrite(bit_C,HIGH)
digitalWrite(bit_D,LOW)
break
case8:
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,HIGH)
break
case9:
digitalWrite(bit_A,HIGH)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,HIGH)
break
}
}

Mais,cestbientroplourdcrire.Enfincestvousquivoyez.

Utiliserplusieursafficheurs
Maintenantquenousavonsaffichunchiffresurunseulafficheur,nousallonspouvoir
apprendreenutiliserplusieurs(avecunminimumdecomposantsenplus!).Comme
expliqu prcdemment, la mthode employe ici va reposer sur le principe de la
persistance rtinienne, qui donnera limpression que les deux afficheurs fonctionnent
enmmetemps.

Problmatique
Noussouhaiterionsutiliserdeuxafficheurs,maisnousnedisposonsquedeseulement
6 broches sur notre Arduino, le reste des broches tant utilis pour une autre
application. Pour rduire le nombre de broches, on peut dores et dj utilis un
dcodeurBCD,cequinousferait4brochesparafficheurs,soit8brochesautotal.Bon,
cenesttoujourspascequelonveut.Etsionconnectaitlesdeuxafficheursensemble,
enparallle,surlessortiesdudcodeur?Ouimaisdanscecas,onnepourraitpas
151

afficherdeschiffresdiffrentssurchaqueafficheur.Toutlheure,jevousaiparlde
commutation.Oui,laseulesolutionquisoitenvisageableestdallumerunafficheuret
dteindre lautre tout en les connectant ensemble sur le mme dcodeur. Ainsi un
afficheur sallume, il affiche le chiffre voulu, puis il steint pour que lautre puisse
sallumersontour.Cetteoprationestenfaitunclignotementdechaqueafficheurpar
alternance.

Unpeudlectronique
Pour faire commuter nos deux afficheurs, vous allez avoir besoin dun nouveau
composant,jainomm:letransistor!
Transistor ? Jai entendu dire quil y en avait plusieurs milliards dans nos
ordinateurs?
Etcesttoutfaitvrai.Destransistors,ilenexistedediffrentstypesetpourdiffrentes
applications:amplificationdecourant/tension,commutation,etc.rpartisdansplusieurs
familles.Bonjenevaispasfairetropdedtails,sivousvoulezensavoirplus,allezlire
lapremirepartiedecechapitre(lienrajouter,enattentedelavalidationduchapitreenquestion).

Letransistorbipolaire:prsentation
Jeledisais,jenevaispasfairededtails.Onvavoircommentfonctionneuntransistor
bipolaireselonlesbesoinsdenotreapplication,savoir,fairecommuterlesafficheurs.
Untransistor,celaressemblea:

Photoduntransistor
Pour notre application, nous allons utiliser des transistors bipolaires. Je vais vous
expliquer comment cela fonctionne. Dj, vous pouvez observer quun transistor
possdetroispattes.Celanestpasdelamoindreimportance,aucontraireilsagitl
dune chose essentielle ! En fait, le transistor bipolaire une broche dentre
(collecteur),unebrochedesortie(metteur)etunebrochedecommande(base).Son
152

symboleestlesuivant:

CesymboleestceluiduntransistorbipolairedetypeNPN.Ilenexistequisont
detypePNP, mais ils sont beaucoup moins utiliss que les NPN. Quoi quil en
soit,nousnutiliseronsquedestransistorsNPNdanscechapitre.

Fonctionnementencommutationdutransistorbipolaire
Pourfairesimple,letransistorbipolaireNPN (cest la dernire fois que je prcise ce
point)estuninterrupteurcommandencourant.
Ceci est une prsentation trs vulgarise et simplifie sur le transistor pour
lutilisationquenousenferonsici.Lesusagesetpossibilitsdestransistorssont
trs nombreux et ils mriteraient un bigtuto eux seuls ! Si vous voulez plus
dinformations, rendezvous sur le cours sur llectronique ou approfondissez en
cherchantdestutorielssurleweb.
Cest tout ce quil faut savoir, pour ce qui est du fonctionnement. Aprs, on va voir
ensemblecommentlutiliseretsanslefairegriller!

Utilisationgnrale
On peut utiliser notre transistor de deux manires diffrentes (pour notre application
toujours, mais on peut bien videmment utiliser le transistor avec beaucoup plus de
flexibilits).Acommencerparlecblage:

153

Cblagedu
transistorencommutation
Dans le cas prsent, le collecteur (qui est lentre du transistor) se trouve tre aprs
lampoule,ellemmeconnectelalimentation.Lmetteur(brocheoilyalaflche)
est reli la masse du montage. Cette disposition est universelle, on ne peut pas
inverserlesensdecesbrochesetmettrelecollecteurlaplacedelmetteuretvice
versa. Sans quoi, le montage ne fonctionnerait pas. Pour le moment, lampoule est
teinte car le transistor ne conduit pas. On dit quil est bloqu et empche donc le
courant I C de circuler travers lampoule. Soit I C = 0 car I B = 0 . A prsent,
appuyonssurlinterrupteur:

Lampouleest
154

allume
Quesepassetil?Ehbienlabasedutransistor,quitaitjusquprsentenlair,est
parcourue par un courant lectrique. Cette cause pour consquence de rendre le
transistorpassantousaturetpermetaucourantdestablirtraverslampoule.Soit
I C 0 carI B 0 .
Larsistancesurlabasedutransistorpermetdeleprotgerdescourantstropforts.
Pluslarsistanceestdefaiblevaleur,pluslampouleseralumineuse.Alinverse,
unersistancetropfortesurlabasedutransistorpourralempcherdeconduireet
de faire sallumer lampoule. Rassurez_vous, je vous donnerais les valeurs de
rsistancesutiliser.

Utilisationavecnosafficheurs
VoyonsunpeucommentonvapouvoirutilisercetransistoravecnotreArduino.Lacarte
Arduinoestenfaitlegnrateurdetension(schmaprcdent)dumontage.Elleva
dfinirsisasortieestde0V(transistorbloqu)oude5V(transistorsatur).Ainsi,onva
pouvoir allumer ou teindre les afficheurs. Voil le modle quivalent de la carte
Arduinoetdelacommandedelafficheur:

LAcarteArduinovasoitmettrelamasselabasedutransistor,soitlamettre+5V.
Dans le premier cas, il sera bloqu et lafficheur sera teint, dans le second il sera
saturetlafficheurallum.Ilenestdemmepourchaquebrochedelafficheur.Elles
155

seront au +5V ou la masse selon la configuration que lon aura dfinie dans le
programme.

Schmafinal
Etcommevouslattendezsurementdepuistoutlheure,voicileschmatantattendu
(nousverronsjusteaprscommentprogrammercenouveaumontage)!

Quelquesdtailstechniques
Dansnotrecas(etjevouspasselesdtailsvraimenttechniquesetcalculatoires),
156

2.2k

larsistancesurlabasedutransistorserade 2.2k (sivousnavezpascette


valeur,ellepourratrede3.3k ,ouencorede3.9k ,voirmmede4.7k ).
Les transistors seront des transistors bipolaires NPN de rfrence 2N2222, ou
bienunquivalentquiestleBC547.Ilenfaudradeuxdonc.
LedcodeurBCDestlemmequeprcdemment(ouquivalent).
Etavectouta,onestprtpourprogrammer!

etdeprogrammation
Nous utilisons deux nouvelles broches servant piloter chacun des interrupteurs
(transistors).Chacunedecesbrochesdoiventdonctredclaresenglobal(pourson
numro) puis rgler comme sortie. Ensuite, il ne vous restera plus qu alimenter
chacun des transistors au bon moment pour allumer lafficheur souhait. En
synchronisant lallumage avec la valeur envoy au dcodeur, vous afficherez les
nombressouhaitscommebonvoussemble.Voiciunexempledecodecomplet,dela
fonction setup() jusqu la fonction daffichage. Ce code est comment et vous ne
devriezdoncavoiraucunmallecomprendre!Ceprogrammeestuncompteursur2
segments,ilcomptedoncde099etrecommenceaudbutdsquilaatteint99.La
vidosetrouvejusteaprscecode.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

//dfinitiondesbrochesdudcodeur7segments(vouspouvezchangerlesnumrossibonvoussembl
constintbit_A=2
constintbit_B=3
constintbit_C=4
constintbit_D=5

//dfinitionsdesbrochesdestransistorspourchaqueafficheur(dizainesetunits)
constintalim_dizaine=6
constintalim_unite=7

voidsetup()
{
//Lesbrochessonttoutesdessorties
pinMode(bit_A,OUTPUT)
pinMode(bit_B,OUTPUT)
pinMode(bit_C,OUTPUT)
pinMode(bit_D,OUTPUT)
pinMode(alim_dizaine,OUTPUT)
pinMode(alim_unite,OUTPUT)

//Lesbrochessonttoutesmisesl'tatbas
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)
digitalWrite(alim_dizaine,LOW)
digitalWrite(alim_unite,LOW)
}

voidloop()//fonctionprincipale
{
for(chari=0i<100i++)//bouclequipermetdecompterde099(=100valeurs)
{
afficher_nombre(i)//appeldelafonctionaffichageavecenvoidunombreafficher
}
}

157

37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

//fonctionpermettantd'afficherunnombresurdeuxafficheurs
voidafficher_nombre(charnombre)
{
longtemps//variableutilisepoursavoirletempscoul...
charunite=0,dizaine=0//variablepourchaqueafficheur

if(nombre>9)//silenombrereudpasse9
{
dizaine=nombre/10//onrcuprelesdizaines
}

unite=nombre(dizaine*10)//onrcuprelesunits

temps=millis()//onrcupreletempscourant

//tantqu'onapasaffichcechiffrependantaumoins500millisecondes
//permetdoncdepouvoirlirelenombreaffich
while((millis()temps)<500)
{
//onaffichelenombre

//d'abordlesdizainespendant10ms
digitalWrite(alim_dizaine,HIGH)/*letransistordel'afficheurdesdizainesestsatur,
doncl'afficheurestallum*/
afficher(dizaine)//onappellafonctionquipermetd'afficherlechiffredizaine
digitalWrite(alim_unite,LOW)//l'autretransistorestbloquetl'afficheurteint
delay(10)

//puislesunitspendant10ms
digitalWrite(alim_dizaine,LOW)//onteintletransistorallum
afficher(unite)//onappellafonctionquipermetd'afficherlechiffreunit
digitalWrite(alim_unite,HIGH)//etonallumel'autre
delay(10)
}
}

//fonctioncrivantsurunseulafficheur
//onutiliselemmeprincipequevuplushaut
voidafficher(charchiffre)
{
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)

if(chiffre>=8)
{
digitalWrite(bit_D,HIGH)
chiffre=chiffre8
}
if(chiffre>=4)
{
digitalWrite(bit_C,HIGH)
chiffre=chiffre4
}
if(chiffre>=2)
{
digitalWrite(bit_B,HIGH)
chiffre=chiffre2
}

158

98
99
100
101
102
103
104
105

if(chiffre>=1)
{
digitalWrite(bit_A,HIGH)
chiffre=chiffre1
}
}

//lecodeesttermin!

Voildonclavidoprsentantlersultatfinal:

Contraintesdesvnements
Comme vous lavez vu juste avant, afficher de manire alternative nest pas trop
difficile. Cependant, vous avez surement remarqu, nous avons utilis des fonctions
bloquantes (delay). Si jamais un vnement devait arriver pendant ce temps, nous
aurions beaucoup de chance de le rater car il pourrait arriver pendant un dlai
dattentepourlaffichage.Pourparercela,jevaismaintenantvousexpliqueruneautre
mthode, prfrable, pour faire de laffichage. Elle sappuiera sur lutilisation de la
fonction millis(), qui nous permettra de gnrer une boucle de rafrachissement de
laffichage.Voiciunorganigrammequiexpliqueleprincipe:

159

Comme vous pouvez le voir, il ny a plus de fonction qui attend. Tout se passe de
manirecontinue,sansquilnyaijamaisdepause.Ainsi,aucunvnementnesera
rat(enthorie,unvnementtrsrapidepourratoujourspasserinaperu).Voici
unexempledeprogrammationdelaboucleprincipal(suividesesfonctionsannexes):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

boolafficheur=false//variablepourlechoixdel'afficheur

//setup()

voidloop()
{
//gestiondurafraichissement
//siafaitplusde10msqu'onaffiche,onchangede7segments(alternanceunit<>dizaine
if((millis()temps)>10)
{
//oninverselavaleurde"afficheur"pourchangerd'afficheur(unitoudizaine)
afficheur=!afficheur
//onaffichelavaleursurl'afficheur
//afficheur:true>dizaines,false>units
afficher_nombre(valeur,afficheur)

160

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76

temps=millis()//onmetjourletemps
}

//ici,onpeuttraiterlesvnements(bouton...)
}

//fonctionpermettantd'afficherunnombre
//elleaffichesoitlesdizainessoitlesunits
voidafficher_nombre(charnombre,boolafficheur)
{
charunite=0,dizaine=0
if(nombre>9)
dizaine=nombre/10//onrecuperelesdizaines
unite=nombre(dizaine*10)//onrecuperelesunits

//si"
if(afficheur)
{
//onaffichelesdizaines
digitalWrite(alim_unite,LOW)
afficher(dizaine)
digitalWrite(alim_dizaine,HIGH)
}
else//gal:elseif(!afficheur)
{
//onaffichelesunits
digitalWrite(alim_dizaine,LOW)
afficher(unite)
digitalWrite(alim_unite,HIGH)
}
}

//fonctioncrivantsurunseulafficheur
voidafficher(charchiffre)
{
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)

if(chiffre>=8)
{
digitalWrite(bit_D,HIGH)
chiffre=chiffre8
}
if(chiffre>=4)
{
digitalWrite(bit_C,HIGH)
chiffre=chiffre4
}
if(chiffre>=2)
{
digitalWrite(bit_B,HIGH)
chiffre=chiffre2
}
if(chiffre>=1)
{
digitalWrite(bit_A,HIGH)
chiffre=chiffre1
}
}

161

Si vous voulez tester le phnomne de persistance rtinienne, vous pouvez


changerletempsdelabouclederafraichissement(ligne9).Sivouslaugmenter,
vouscommencerezvoislesafficheursclignoter.Enmettantunevaleurdunpeu
moinsdeunesecondevousverrezlesafficheurssilluminerlunaprslautre.
Cechapitrevousaapprisutiliserunnouveaumoyenpourafficherdesinformations
avec votre carte Arduino. Lafficheur peut sembler peu utilis mais en fait de
nombreusesapplicationsexiste!(chronomtre,rveil,horloge,compteurdepassage,
afficheurdescore,etc.).Parexemple,ilpourravousservirpourdboguervotrecodeet
afficherlavaleurdesvariablessouhaites

[Arduino206][TP]Parking
ayest,unepagesetourneaveclacquisitiondenombreusesconnaissancesdebase.
Cestdoncloccasionidalepourfaireun(gros )TPquiutiliseralensembledevos
connaissancesdurementacquises.Jaimeutiliserlessituationsdelavierelle,jevais
doncenprendreunepourcesujet.Jevousproposederaliserlagestiondunparking
souterrainRDVauxconsignespourlesdtails.

Consigne
Aprs tant de connaissances chacune spare dans son coin, nous allons pouvoir
mettreenuvretoutcepetitmondedansunTPtraitantsurunsujetdelaviecourante:
lesparkings!

Histoire
LemairedezCitydcidderentabiliserleparkingcommunaldunecapacitde99
places(pasunedeplusnidemoins).Eneffet,chaquejourdescentainesdezTouristes
viennent se promener en voiture et ont besoin de la garer quelque part. Le parking,
ntantpourlemomentpasrentable,servirafinancerlentretiendelaville.Pourcela,
ilfautrajouterauparkingexistantunafficheurpermettantdesavoirlenombredeplaces
disponibles en temps rel (le systme de paiement du parking ne sera pas trait). Il
disposeaussidanslavilledeslumiresvertesetrougessignalantunparkingcomplet
ounon.Enfin,lentreduparkingestquipededeuxbarrires(unepourlentreet
lautre pour la sortie). Chaque entre de voiture ou sortie gnre un signal pour la
gestion du nombre de places. Le maire vous a choisi pour vos comptences, votre
espritdecrativitetilsaitquevousaimezlesdfis.Vousacceptezvidemmentenlui
promettantderussirdanslesplusbrefsdlais!

Matriel
PourmenerbienceTPvoicilalistedescoursesconseille:
UnecarteArduino(videmment)
2LEDsavecleurrsistancedelimitationsdecourant(habituellement330Ohms)
>Ellessymbolisentlestmoinslumineuxdispossdanslaville
2boutons(avec2rsistancesde10kOhmset2condensateursde10nF)>Ce
162

sontlescapteursdentreetdesortie.
2afficheurs7segments>pourafficherlenombredeplacesdisponibles
1dcodeur4bitsvers7segments
7rsistancesde330Ohms(pourles7segments)
Unebreadboardpourassemblerletout
Unpaquetdefils
Votrecerveauetquelquesdoigts
Voiciunevidopourvousmontrerlersultatattenduparlemaire:

0:00/1:11

Boncourage!

Correction!
Jespre que tout sest bien pass pour vous et que le maire sera content de votre
travail. Voil maintenant une correction (parmi tant dautres, comme souvent en
programmation et en lectronique). Nous commencerons par voir le schma
lectronique,puisensuitenousrentreronsdanslecode.

Montage
Lemontagelectroniqueestlabasedecequivanousservirpourraliserlesystme.
Une fois quil est termin on pourra lutiliser grce aux entres/sorties de la carte
Arduinoetluifairefairepleinsdechoses.Maisa,vouslesavezdj.Alorsicipasde
grand discours, il suffit de reprendre les diffrents blocs vus un par un dans les
chapitresprcdentsetdefairelemontagedefaonsimple.

Schma
Jevousmontreleschmaquejairalis,ilnestpasabsoluetpeutdiffrerselonce
quevousavezfait,maisilreprendessentiellementtouslesblocs(ouminimontages
lectroniques) que lon a vus dans les prcdents chapitres, en les assemblant de
faonlogiqueetordonne:

163

Procduredemontage
Voicilordrequejaisuivipourraliserlemontage:
DbrancherlacarteArduino!
Mettrelesboutons
Mettrelesrsistancesdepullup
164

Puislescondensateursdefiltrage
EttirezdesfilsdesignauxjusqulacarteArduino
Enfin,vrifiezlapositiondesalimentations(+5Vetmasse)
MettrelesLEDsrougeetverteavecleurrsistancedelimitationdecourantetun
filversArduino
Mettrelesdcodeurs
RelierlesfilsABCDArduino
Mettreau+5Voulamasselessignauxdecommandesdudcodeur
Mettrelesrsistancesdelimitationsdecourantdes7segments
Enfin,vrifierlapositiondesalimentations(+5Vetmasse)
Puismettrelesafficheurs>lesrelierentreledcodeuretleurssegments)>les
connecterau+5V
Amenerdu+5Vetlamassesurlabreadboard
Ce tant termin, la maquette est fin prte tre utilise ! videmment, cela fait un
montage(unpeu)pluscompletquelesprcdents!

Programme
Nousallonsmaintenantvoirunesolutiondeprogrammepourleproblmededpart.La
vtre sera peuttre (voire surement) diffrente, et ce nest pas grave, un problme
nexige pas une solution unique. Je nai peuttre mme pas la meilleure solution !
(maisamtonnerait :ninja:)

Lesvariablesutilesetdclarations
Toutdabord,nousallonsvoirlesvariablesglobalesquenousallonsutiliserainsique
les dclarations utiles faire. Pour ma part, jutilise six variables globales. Vous
reconnatrezlaplupartdentreellescarellesviennentdeschapitresprcdents.
Deuxpourstockerltatdesboutonsuncoupsurlautreetunepourlestockerde
manirecourante
Uncharstockantlenombredeplacesdisponiblesdansleparking
Unboolendsignantlafficheurutilisendernier
Unlongstockantlinformationdetempspourlerafraichissementdelaffichage
Voicicesdiffrentesvariablescommentes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//lesbrochesdudcodeur7segments
constintbit_A=2
constintbit_B=3
constintbit_C=4
constintbit_D=5
//lesbrochesdestransistorspourl'afficheurdesdizainesetceluidesunits
constintalim_dizaine=6
constintalim_unite=7
//lesbrochesdesboutons
constintbtn_entree=8
constintbtn_sortie=9
//lesledsdesignalements
constintled_rouge=12
constintled_verte=11
//lesmmoiresd'tatdesboutons
intmem_entree=HIGH

165

17
18
19
20
21
22

intmem_sortie=HIGH
intetat=HIGH//variablestockantl'tatcourantd'unbouton

charplace_dispo=99//contenudesplacesdispos
boolafficheur=false
longtemps

Linitialisationdelafonctionsetup()
Je ne vais pas faire un long baratin sur cette partie car je pense que vous serez en
mesure de tout comprendre trs facilement car il ny a vraiment rien doriginal par
rapporttoutcequelonafaitavant(rglagesdesentres/sortiesetdeleursniveaux).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

voidsetup()
{
//Lesbrochessonttoutesdessorties(sauflesboutons)
pinMode(bit_A,OUTPUT)
pinMode(bit_B,OUTPUT)
pinMode(bit_C,OUTPUT)
pinMode(bit_D,OUTPUT)
pinMode(alim_dizaine,OUTPUT)
pinMode(alim_unite,OUTPUT)
pinMode(led_rouge,OUTPUT)
pinMode(led_verte,OUTPUT)

pinMode(btn_entree,INPUT)
pinMode(btn_sortie,INPUT)

//Lesbrochessonttoutesmisel'tatbas(saufledrougeteinte)
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)
digitalWrite(alim_dizaine,LOW)
digitalWrite(alim_unite,LOW)
digitalWrite(led_rouge,HIGH)//rappelonsquedanscetteconfiguration,laLEDestteintel
digitalWrite(led_verte,LOW)//vertpardfaut

temps=millis()//enregistre"l'heure"
}

Laboucleprincipale(loop)
IcisetrouvelapartielapluscompliqueduTP.Eneffet,elledoitsoccuperdegrer
dunepartunebouclederafraichissementdelallumagedesafficheurs7segmentset
dautre part grer les vnements. Rappelonsnous de lorganigramme vu dans la
dernirepartiesurles7segments:

166

Dansnotreapplication,lagestiondvnementsseraunevoiturerentret/sortelledu
parking ? qui sera symbolise par un appui sur un bouton. Ensuite, il faudra aussi
prendreencomptelaffichagedeladisponibilitsurlesLEDsselonsileparkingest
completounonVoiciunemaniredecodertoutcela:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

voidloop()
{
//sicafaitplusde10msqu'onaffiche,onchangede7segments
if((millis()temps)>10)
{
//oninverselavaleurde"afficheur"pourchangerd'afficheur(unitoudizaine)
afficheur=!afficheur
//onaffiche
afficher_nombre(place_dispo,afficheur)
temps=millis()//onmetjourletemps
}

//ontestmaintenantsilesboutonsontsubiunappui(oupas)
//d'abordleboutonpluspuislemoins
etat=digitalRead(btn_entree)

167

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

if((etat!=mem_entree)&&(etat==LOW))
place_dispo+=1
mem_entree=etat//onenregistrel'tatduboutonpourletoursuivant

//etmaintenantpareilpourleboutonquidcrmente
etat=digitalRead(btn_sortie)
if((etat!=mem_sortie)&&(etat==LOW))
place_dispo=1
mem_sortie=etat//onenregistrel'tatduboutonpourletoursuivant

//onappliquedeslimitesaunombrepournepasdpasser99ou0
if(place_dispo>99)
place_dispo=99
if(place_dispo<0)
place_dispo=0

//onmetjourl'tatdesleds
//oncommenceparlesteindres
digitalWrite(led_verte,HIGH)
digitalWrite(led_rouge,HIGH)
if(place_dispo==0)//s'iln'yaplusdeplace
digitalWrite(led_rouge,LOW)
else
digitalWrite(led_verte,LOW)
}

Dans les lignes 4 11, on retrouve la gestion du rafraichissement des 7 segments.


Ensuite,onsoccupederceptionnerlesvnementsenfaisantuntestparboutonpour
savoir si son tat a chang et sil est ltat bas. Enfin, on va borner le nombre de
placesetfairelaffichagesurlesLEDenconsquence.Vousvoyez,centaitpassi
difficileenfait!Si,unpeuquandmme,non? Ilnerestemaintenantplusqufaire
lesfonctionsdaffichages.

Lesfonctionsdaffichages
L encore, je ne vais pas faire de grand discours puisque ces fonctions sont
exactement les mmes que celles ralises dans la partie concernant laffichage sur
plusieursafficheurs.Siellesnevoussemblentpasclaires,jevousconseillederevenir
surlechapitreconcernantles7segments.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

//fonctionpermettantd'afficherunnombre
voidafficher_nombre(charnombre,boolafficheur)
{
longtemps
charunite=0,dizaine=0
if(nombre>9)
dizaine=nombre/10//onrecuperelesdizaines
unite=nombre(dizaine*10)//onrecuperelesunits

if(afficheur)
{
//onaffichelesdizaines
digitalWrite(alim_unite,LOW)
digitalWrite(alim_dizaine,HIGH)
afficher(dizaine)
}
else
{

168

19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

//onaffichelesunits
digitalWrite(alim_dizaine,LOW)
digitalWrite(alim_unite,HIGH)
afficher(unite)
}
}

//fonctioncriveantsurunseulafficheur
voidafficher(charchiffre)
{
//oncommenceparcrire0,donctoutl'tatbas
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)

if(chiffre>=8)
{
digitalWrite(bit_D,HIGH)
chiffre=chiffre8
}
if(chiffre>=4)
{
digitalWrite(bit_C,HIGH)
chiffre=chiffre4
}
if(chiffre>=2)
{
digitalWrite(bit_B,HIGH)
chiffre=chiffre2
}
if(chiffre>=1)
{
digitalWrite(bit_A,HIGH)
chiffre=chiffre1
}
}

Etlecodeaucomplet
Sivousvouleztesterlensembledelapplicationsansfairederreursdecopier/coller,
voici le code complet (qui doit fonctionner si on considre que vous avez branch
chaquecomposantaummeendroitquesurleschmafourniaudpart!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//lesbrochesdudcodeur7segments
constintbit_A=2
constintbit_B=3
constintbit_C=4
constintbit_D=5
//lesbrochesdestransistorspourl'afficheurdesdizainesetceluidesunits
constintalim_dizaine=6
constintalim_unite=7
//lesbrochesdesboutons
constintbtn_entree=8
constintbtn_sortie=9
//lesledsdesignalements
constintled_rouge=12
constintled_verte=11
//lesmmoiresd'tatdesboutons
intmem_entree=HIGH

169

17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

intmem_sortie=HIGH
intetat=HIGH//variablestockantl'tatcourantd'unbouton

charplace_dispo=10//contenudesplacesdispos
boolafficheur=false
longtemps

voidsetup()
{
//Lesbrochessonttoutesdessorties(sauflesboutons)
pinMode(bit_A,OUTPUT)
pinMode(bit_B,OUTPUT)
pinMode(bit_C,OUTPUT)
pinMode(bit_D,OUTPUT)
pinMode(alim_dizaine,OUTPUT)
pinMode(alim_unite,OUTPUT)
pinMode(btn_entree,INPUT)
pinMode(btn_sortie,INPUT)
pinMode(led_rouge,OUTPUT)
pinMode(led_verte,OUTPUT)

//Lesbrochessonttoutesmisesl'tatbas(saufledrougeteinte)
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)
digitalWrite(alim_dizaine,LOW)
digitalWrite(alim_unite,LOW)
digitalWrite(led_rouge,HIGH)
digitalWrite(led_verte,LOW)//vertpardfaut
temps=millis()//enregistre"l'heure"
}

voidloop()
{
//sicafaitplusde10msqu'onaffiche,onchangede7segments
if((millis()temps)>10)
{
//oninverselavaleurde"afficheur"pourchangerd'afficheur(unitoudizaine)
afficheur=!afficheur
//onaffiche
afficher_nombre(place_dispo,afficheur)
temps=millis()//onmetjourletemps
}

//ontestmaintenantsilesboutonsontsubiunappui(oupas)
//d'abordleboutonpluspuislemoins
etat=digitalRead(btn_entree)
if((etat!=mem_entree)&&(etat==LOW))
place_dispo+=1
mem_entree=etat//onenregistrel'tatduboutonpourletoursuivant

//etmaintenantpareilpourleboutonquidcrmente
etat=digitalRead(btn_sortie)
if((etat!=mem_sortie)&&(etat==LOW))
place_dispo=1
mem_sortie=etat//onenregistrel'tatduboutonpourletoursuivant

//onappliquedeslimitesaunombrepournepasdpasser99ou0
if(place_dispo>99)
place_dispo=99

170

78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138

if(place_dispo<0)
place_dispo=0

//onmetjourl'tatdesleds
//oncommenceparlesteindre
digitalWrite(led_verte,HIGH)
digitalWrite(led_rouge,HIGH)
if(place_dispo==0)//s'iln'yaplusdeplace
digitalWrite(led_rouge,LOW)
else
digitalWrite(led_verte,LOW)
}

//fonctionpermettantd'afficherunnombre
voidafficher_nombre(charnombre,boolafficheur)
{
longtemps
charunite=0,dizaine=0
if(nombre>9)
dizaine=nombre/10//onrcuprelesdizaines
unite=nombre(dizaine*10)//onrcuprelesunits

if(afficheur)
{
//onaffichelesdizaines
digitalWrite(alim_unite,LOW)
digitalWrite(alim_dizaine,HIGH)
afficher(dizaine)
}
else
{
//onaffichelesunits
digitalWrite(alim_dizaine,LOW)
digitalWrite(alim_unite,HIGH)
afficher(unite)
}
}

//fonctioncrivantsurunseulafficheur
voidafficher(charchiffre)
{
//oncommenceparcrire0,donctoutl'tatbas
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)

if(chiffre>=8)
{
digitalWrite(bit_D,HIGH)
chiffre=chiffre8
}
if(chiffre>=4)
{
digitalWrite(bit_C,HIGH)
chiffre=chiffre4
}
if(chiffre>=2)
{
digitalWrite(bit_B,HIGH)
chiffre=chiffre2

171

139
140
141
142
143
144
145
146

}
if(chiffre>=1)
{
digitalWrite(bit_A,HIGH)
chiffre=chiffre1
}
}
//Finduprogramme!

Conclusion
Bon,sivousnecomprenezpastoutdupremiercoup,cestunpetitpeunormal,cesten
effet difficile de reprendre un programme que lon a pas fait soimme et ce pour
diversesraisons.Leprincipalestquevousayezcherchunesolutionparvousmme
etquevoussoyezarrivraliserlobjectiffinal.Sivousnavezpasrussimaisque
vouspensiezytrepresque,alorsjevousinvitechercherprofondmentlepourquoi
ducommentvotreprogrammenefonctionnepasoupasentirement,celavousaidera
trouvervoserreursetneplusenrefaire!
Ilestpasmagnifiqueceparking?Jesprequevousavezapprcisaralisation.Nous
allonsmaintenantcontinuerapprendredenouvelleschoses,toujoursplussympasles
unes que les autres. Un conseil, gardez votre travail quelques part au chaud, vous
pourriezlamlioreravecvosconnaissancesfutures!

172

[Arduino3]Communicationparlavoiesrie
[Arduino301]Gnralitssurlavoiesrie
La communication que feraiton sans ! Le tlphone, Internet, la tlvision, les
journaux,lapublicitriendetoutcelanexisteraitsilnyavaitpasdecommunication.
videmment,cenestpasdecesmoyensldontnousallonsfairelobjetdanslapartie
prsente. Non, nous allons voir un moyen de communication que possde la carte
Arduino.Vouspourrezainsifairecommuniquervotrecarteavecunordinateuroubien
uneautrecarteArduino!Etoui!Elleenasouslecapotcettepetitecarte!

Communiquer,pourquoi?
Nous avons vu dans la partie prcdente o nous faisions nos premiers pas avec
Arduino, comment utiliser la carte. Nous avons principalement utilis des LED pour
communiquer lutilisateur (donc vous, priori) certaines informations. Cela pouvait
treuneLEDouungroupedeLEDquipeutindiquertoutetnimportequoi,oubienun
afficheur7segmentsquiaffichedeschiffresoucertainscaractrespouvanttoutaussi
bien indiquer quelque chose. Tout dpend de ce que vous voulez signaler avec les
moyensquevousmettezdisposition.OnpeuttrsbienimaginerunensembledeLED
ayant chacune un nom, sigle ou autre marqueur pour indiquer, selon ltat dune ou
plusieursdentreelles,unmodedefonctionnementoubienuneerreuroupannedun
systme. Cependant, cette solution reste tout de mme prcaire et demande
lutilisateurdtredevantlesystmedesignalisation.Aujourdhui,aveclavancedela
technologieetdutoutconnect,ilseraitfcheuxdenepouvoirallerplusloin.Jevais
doncvousprsenterunnouveaumoyendecommunicationgrcelavoiesrie(ou
liaisonsrie),quivavouspermettredecommuniquerdesinformationslutilisateur
pardiversintermdiaires.Alafindelapartie,vousserezcapabledetransmettredes
informationsunordinateurouuneautrecarteArduino.

Transmettredesinformations
Tel est le principal objectif de la communication. Mais comment transmettre des
informations et puis quelles informations ? Avec votre carte Arduino, vous aurez
certainementbesoindetransmettredesmesuresdetempraturesouautresgrandeurs
(tension, luminosit, etc.). Ces informations pourront alimenter une base de donne,
servirdansuncalcul,ouautrechose.Toutdpendradecequevousenferez.

metteuretrcepteur
Lorsqueloncommuniquedesinformations,ilfautncessairementunmetteur,quiva
transmettre les informations communiquer, et un rcepteur, qui va recevoir les
informationspourlestraiter.

173

Dans le cas prsent, deux carte Arduino communiquent. Lune communique lautre
tandisquelautrerceptionnelemessageenvoyparlapremire.
Pourtant, il y a deux flches sur ton dessin. Lautre aussi, qui rceptionne le
message,peutenvoyerdesdonnes?
Absolument!Cependant,toutdpenddutypedecommunication.

Lacommunicationentroiscas
Pour parler, on peut par exemple diffrencier trois types de conversations. A chaque
conversation, il ny a que deux interlocuteurs. On ne peut effectivement pas en faire
communiquerplusdansnotrecas!Onditquecestunecommunicationpointpoint.
Lepremiertypeseraitlorsquuninterlocuteurparlesoncompresansquecelui
cidisequoiquecesoitpuisquilnepeutpasrpondre.Ilestmuetetsecontente
dcouter. Cest une communication sens unilatrale, ou techniquement
appelecommunicationsimplex.Lunparleetlautrecoute.
Ledeuximetypeseraituneconversationnormaleochacundesinterlocuteurs
estpolietattendquelautreestfiniedeparlerpourparlersontour.Ilsagitdune
communicationhalfduplex.Chaqueinterlocuteurparletourderle.
Enfin,ilyalaconversationdutypedbatpolitique(cenestvidemmentpasson
vrainom )ochaqueinterlocuteurparleenmmetempsquelautre.Bon,cela
dit,cetypedecommunicationmarchetrsbien(pasausenspolitique,jeparleau
niveautechnique!)etesttrsutilis!Cestunecommunicationditefullduplex.
Anotrechelle,Arduinoestcapabledefairedescommunicationsdetypefullduplex,
puisquelle est capable de comprendre son interlocuteur tout en lui parlant en mme
temps.

Lercepteur
Quenestil?Ehbienilpeutsagir,commejelesousentendaisplustt,duneautre
carte Arduino. Cela tant, nimporte quel autre appareil utilisant la voie srie et son
protocoledecommunicationpourraitcommuniqueravec.Celapeuttrenotamment
un ordinateur, cest dailleurs le principal interlocuteur que nous mettrons en relation
avecArduino.
Cestquoia,unprotocoledecommunication?
Cestunensemblederglesquirgissentlafaondontcommuniquentdeuxdispositifs
entreeux.Celadfinitparexemplelerythmedelaconversation(ledbitdeparoledes
acteurssivousprfrez),lordredesinformationsenvoyes(lagrammaireenquelque
174

sorte),lenombredinformations,etcOnpeutanalogiquementcomparerunephrase
en franais, qui place le sujet, le verbe puis le complment. Cest une forme de
protocole.Sijemlangetouta,enplaantparexemplelesujet,lecomplmentetle
verbe, cela donnerait un style parl de matre Yoda bon cest moins facilement
comprhensible, mais a le reste. En revanche, deux dispositifs qui communiquent
avecunprotocolediffrentnesecomprendrontpascorrectementetpourraientmme
interprterdesactionseffectuerquiseraientlopposdecequiestdemand.Ce
serait en effet dommage que votre interlocuteur donne le chat manger alors que
vous lui avez demand donne manger au chat Bref, si les dispositifs
communiquant nutilisent pas le bon protocole, cela risque de devenir un vritable
capharnam!

LanormeRS232
Desliaisonssries,ilenexisteunpaquet!Jepeuxenciterquelquesunes:RS232,
Universal Serial Bus (USB), Serial ATA, SPI, Et pour dire, vous pouvez trs bien
inventervotreproprenormedecommunicationpourlavoiesriequevousdcidezde
crer. Linconvnient, bien que cela puisse tre galement un avantage, il ny a que
vousseulquipuissiezalorsutiliserunetellecommunication.
Et nous, laquelle allonsnous voir parmi cellesl ? Il y en a des meilleurs que
dautres?oO
Dabord,nousallonsvoirlavoiesrieutilisantlanormeRS232.Ensuite,oui,ilyena
qui ont des avantages par rapport dautres. On peut essentiellement noter le type
dutilisation que lon veut en faire et la vitesse laquelle les dispositifs peuvent
communiqueravec.

Applicationsdelanorme
LanormeRS232sappliquesurtroischampsdunecommunicationdetypesrie.Elle
dfinitlesignallectrique,leprotocoleutilisettoutcequiestlilamcanique(la
connectique,lecblage,etc).

Lamcanique
Pourcommuniquervialavoiesrie,deuxdispositifsdoiventavoir3cblesminimum.
Le premier cble est la rfrence lectrique, communment appele masse
lectrique.Celapermetdeprendrelesmesuresdetensionensefixantunmme
rfrentiel.Unpeulorsquevousvousmesurez:vousmesurez1,7mtredusolau
sommetdevotretteetnonpas4,4mtreparcequevoustesaupremiertage
etquevousvousbasezparrapportausoldurezdechauss.Dansnotrecas,on
considreraquele0Vseranotrerfrentiellectriquecommun.
Les deux autres cbles permettent la transmission des donnes. Lun sert
lenvoi des donnes pour un metteur, mais sert aussi pour la rception des
donnesvenantdelautremetteur.Idempourlautrecble.Ilpermetlmission
delunetlarceptiondelautre.
175

DeuxcartesArduinoreliespar3cbles:
Lenoirestlamasselectriquecommune
Levertestceluiutilispourlenvoidesdonnesdelapremirecarte(gauche),
maissertgalementlarceptiondesdonnesenvoyespourladeuximecarte
(droite)
Le orange est celui utilis pour lenvoi des donnes de la deuxime carte (
droite), mais sert galement la rception des donnes envoyes pour la
premirecarte(gauche)
Cela, il sagit du strict minimum utilis. La norme ninterdit pas lutilisation dautres
cblesquiserventfaireducontrledefluxetdelagestiondeserreurs.

Lesignallectriqueetleprotocole
Avant tout, il faut savoir que pour communiquer, deux dispositifs lectronique ou
informatiqueutilisentdesdonnessousformedebits.Cesbits,jelerappel,sontdes
tatslogiques(vraioufaux)quipeuventtreregroupspourfairedesensemblesde
bits.Gnralement,cesensemblessontconstitusde8bitsquiformentalorsunoctet.

Lestensionsutilises
Ces bits sont en fait des niveaux de tension lectrique. Et la norme RS232 dfinit
quelles tensions doivent tre utilises. On peut spcifier les niveaux de tension
impossparlanormedansuntableau,quevoici:
Niveaulogique0 Niveaulogique1
Tensionlectriqueminimale +3V
3V
Tensionlectriquemaximale +25V
25V
Ainsi, toutes les tensions au del des valeurs imposes, donc entre 3V et +3V, au
dessous de 25V et au dessus de +25V, sont hors normes. Pour les tensions trop
leves(auxextrmesde+et25V)ellespourraientendommagerlematriel.Quand
auxtensionscomprisesentre+et3V,ehbienellessontignorescarcestdansces
176

zones l que se trouvent la plupart et mme la quasi totalit des parasites. Cest un
moyenpermettantdviteruncertainnombrederreursdetransmissions.
Les parasites dont je parle sont simplement des pics de tensions qui peuvent
survenircausedediffrentessources(interrupteur,tlviseur,microondes,)et
quirisquentalorsdemodifierdesdonneslorsdunetransmissioneffectuegrce
lavoiesrie.
Lorsquilnyapasdecommunicationsurlavoiesrie,ilyacequonappelleuntatde
repos.Cestdireunniveaulogiquetoujoursprsent.Ilsagitduniveaulogique1.Soit
unetensioncompriseentre3Vet25V.Sicettatdereposnestpasprsent,cestquil
peutyavoirunproblmedecblage.

Lesdonnes
Les donnes qui transitent par la voie srie sont transmises sous une forme binaire.
Cestdireavecdesniveauxlogiques0et1.Prenonsunedonnequenousvoudrions
envoyer,parexemplelalettrePmajuscule.Vousnelesaviezpeuttrepasmaisune
lettreduclavierestcodsurunnombrede8bits,doncunoctet.Rellementcestenfait
sur7bitsquelleestcode,maisenrajoutantun0devantlecodage,celaconservesa
valeuretpermetdavoiruncodagedelalettresur8bits.Cescodessontdfinisselonla
tableASCII.Ainsi,pourchaquecaractreduclavier,onretrouveuncodagesur8bits.
Vous pouvez aller consulter cette table pour comprendre un peu comment elle
fonctionneensuivantcelien.EnhautgauchedelatableASCII,onobservelaligne:
Code en base et l vous avez : 10, 8, 16, 2. Respectivement, ce sont les bases
dcimale(10),octale(8),hexadcimale(16)etbinaire(2).Certainesnevoussontdonc
pas inconnues puisque lon en a vu. Nous, ce qui va nous intresser, cest la base
binaire.Ouicarlebinaireestunesuccessionde0etde1,quisontlestatslogiques0
(LOW)et1(HIGH).Enobservantlatable,ontombesurlalettrePmajusculeetlon
voitsacorrespondanceenbinaire:01010000.
Jecroisnepasbiencomprendrepourquoionenvoieunelettrequivalarecevoir
etpourquoifaire?o_O
Ilfautvousimaginerquilyaundestinataire.Dansnotrecas,ilsagiraavanttoutde
lordinateur avec lequel vous programmez votre carte. On va lui envoyer la lettre P
mais cela pourrait tre une autre lettre, une suite de lettres ou autres caractres, voir
mme des phrases compltes. Pour ne pas aller trop vite, nous resterons avec cette
unique lettre. Lorsque lon enverra la lettre lordinateur, nous utiliserons un petit
moduleintgrdanslelogicielArduinopourvisualiserlemessagerceptionn.Cest
doncnousquiallonsvoircequelontransmetvialavoiesrie.

Lordreetlesdlimiteurs
Onvaprsentvoircommentesttransmitunoctetsurlavoiesrieenenvoyantnotre
exemple,lalettreP.Analogiquement,jevaisvousmontrerquecettecommunication
parlavoiesrieseprsenteunpeucommeunappeltlphonique:
1. Lorsque lon passe un coup de fil, bien gnralement on commence par dire
Bonjour ou Allo. Ce dbut de message permet de faire louverture de la
177

conversation. En effet, si lon reoit un appel et que personne ne rpond aprs


avoirdcroch,laconversationnepeutavoirlieu.DanslanormeRS232,onva
avoiruneouverturedelacommunicationgrceunbitdedpart.Cestluiquiva
engager la conversation avec son interlocuteur. Dans la norme RS232, ce
dernierestuntat0.
2. Ensuite, vous allez commencer parler et donner les informations que vous
souhaitez transmettre. Ce sera les donnes. Llment principal de la
conversation(icinotrelettreP).
3. Enfin, aprs avoir renseign tout ce que vous aviez dire, vous terminez la
conversation par un Au revoir ou Salut !, A plus ! etc. Cela termine la
conversation.Ilyauradoncunbitdefinoubitdestopquiferademmesurla
voiesrie.DanslanormeRS232,cestuntat1.

Cestdecettemanirelquelacommunicationsriefonctionne.Dailleurs,savezvous
pourquoi la voie srie sappelle ainsi ? En fait, cest parce que les donnes
transmettre sont envoyes une par une. Si lon veut, elles sont la queue leuleu.
Exactementcommeuneconversationentredeuxpersonnes:lapersonnequiparlene
peut pas dire plusieurs phrases en mme temps, ni plusieurs mots ou sons. Chaque
lmentsesuitselonunordrelogique.Limageprcdentersumelacommunication
quelonvientdavoir,ilnyaplusqulacomplterpourenvoyerlalettreP.
Ha,jevois.Doncilyalebitdestart,notrelettrePetlebitdestop.Daprscequon
adit,celadonnerait,danslordre,ceci:0(Start)01010000(Donnes)et1(Stop).
Eh bien cest presque a. Sauf que les petits malins ingieurs qui ont invent ce
protocoleonteulabonneidedetransmettrelesdonneslenversParconsquent,
labonnerponsetait:0000010101.Avecunchronogramme,onobserveraitceci:

Unpeudevocabulaire
Avant de continuer voir ce que compose le protocole RS232, voyons un peu de
vocabulaire, mais sans trop en abuser bien sr ! Les donnes sont envoyes
lenvers,jeledisais.Cequilfautsavoircestquelebitdedonnequivientaprslebit
destartsappellelebitdepoidsfaibleouLSBenanglaispourLessSignificantBit.
178

Cest un peu comme un nombre qui a des units (tout droite), des dizaines, des
centaines,desmilliers(gauche),etc.Parexemplelenombre6395possde5units
(droite),9dizaines,3centaineset6milliers(gauche).Onpeutfairerfrenceaubit
de poids faible en binaire qui est donc droite. Plus on sloigne et plus on monte
verslebitdepoidsfortouMSBenanglaispourMostSignificantBit.Etcommeles
donnessontenvoyeslenverssurlaliaisonssrie,onauralebitdepoidsfaible
juste aprs le start, donc gauche et le bit de poids fort droite. Avec le nombre
prcdent, si lon devait le lire lenvers cela donnerait : 5396. Bit de poids faible
gaucheetdroitelebitdepoidsfort.
Il est donc essentiel de savoir o est le bit de poids faible pour pouvoir lire les
donneslendroit.Sinononseretrouveavecunedonneerrone!
PourregrouperunpeutoutcequelonavusurleprotocoledelanormeRS232,voici
uneimageextraitedecettepageWikipdia:

Vous devrez tre capable de trouver quel est le caractre envoy sur cette trame
alors? Indice:cestunelettreOnlitlesniveauxlogiquesdegauchedroite,soit
11010010puisonlesretournesoit01001011enfinoncomparelatableASCIIeton
trouve la lettre K majuscule. Attention aux tensions ngatives qui correspondent
ltatlogique1etlestensionspositivesltatlogique0.

Lavitesse
La norme RS232 dfinit la vitesse laquelle sont envoye les donnes. Elles sont
exprims en bit par seconde (bit/s). Elle prconise des vitesse infrieures 20 000
bits/s. Sauf quen pratique, il est trs courant dutiliser des dbits suprieurs pouvant
179

atteindreles115200bits/s.Quandonvautiliserlavoiesrie,onvadfinirlavitesse
laquelle sont transfres les donnes. Cette vitesse dpend de plusieurs contraintes
que sont : la longueur du cble utilis reliant les deux interlocuteurs et la vitesse
laquelle les deux interlocuteurs peuvent se comprendre. Pour vous donner un ordre
dide,jereprendletableaufournisurlapageWikipdiasurlanormeRS232:
Dbitenbit/s Longueurducbleenmtres(m)
2400
900
4800
300
9600
150
19200
15
Pluslecbleestcourt,plusledbitpourratrelevcarmoinsilyadaffaiblissement
des tensions et de risque de parasites. Tandis que si la distance sparant les deux
interlocuteursgrandie,lavitessedecommunicationdiminueradefaoneffective.

Lagestiondeserreurs
Malgrlestensionsimposesparlanorme,ilarrivequilyaidautresparasitesetque
deserreursdetransmissionsurviennent.Pourlimitercerisque,ilexisteunesolution.
Elleconsisteajouterunbitdeparit.Vousallezvoir,cesthypersimple! Juste
avantlebitdestop,onvaajouterunbitquiserapairouimpair.Donc,respectivement,
soit un 0 soit un 1. Lorsque lon utilisera la voie srie, si lon choisi une parit paire,
alors le nombre de niveaux logiques 1 dans les donnes plus le bit de parit doit
donnerunnombrepaire.Donc,danslecasouilya5niveauxlogiques1sanslebitde
parit,cedernierdevraprendreunniveaulogique1pourquelenombrede1dansle
signalsoitpaire.Soit6autotal:

Danslecasolonchoisiraituneparitimpaire,alorsdanslemmesignaloilya5
niveauxlogiques1,ehbienlebitdeparitdevraprendrelavaleurquigardeunnombre
impairede1danslesignal.Soitunbitdeparitgal0dansnotrecas:

Aprs, cest le rcepteur qui va vrifier si le nombre de niveaux logiques 1 est bien
gale ce que indique le bit de parit. Dans le cas o une erreur de transmissions
180

serait survenu, ce sera au rcepteur de traiter le problme et de demander son


interlocuteurderpter.Aufait,nevousinquitezpas,onauraloccasiondevoirtout
aplustarddanslesprochainschapitres.Dequoisoccuperensomme

ConnexionsrieentreArduinoet
EtonconnectequoiopourutiliserlavoiesrieaveclacarteArduinoetlePC?
Cestlemmecblage?EtonconnecteosurlePC?
L,onvaavoirlechoix

mulationduportsrie
Le premier objectif et le seul que nous mettrons en place dans le cours, va tre de
connecteretdutiliserlavoiesrieaveclordinateur.Pourcela,riendeplussimple,il
nyaquelecbleUSBbrancherentrelacarteArduinoetlePC.Enfait,lavoiesrie
vatremuletraverslUSB.Cestuneformevirtuelledecetteliaison.Ellenexiste
pasrellement,maisellefonctionnecommesictaitbienunevraievoiesrie.Touta
vatregrparunpetitcomposantprsentsurvotrecarteArduinoetlegestionnairede
portUSBetpriphriquedevotreordinateur.

Lecomposantentourenrougegre
lmulationdelavoiesrie
Cestlasolutionlaplussimpleetcellequenousallonsutiliserpourvosdbuts.

Arduinoetunautremicrocontrleur
Onaunpeuabordcesujet,audbutdelaprsentationsurlavoiesrie.Mais,onva
voirunpeuplusdechoses.Lebutdeconnecterdeuxmicrocontrleurensembleestde
pouvoirlesfairecommuniquerentreeuxpourquilspuissentschangerdesdonnes.

Latensiondesmicrocontrleurs
Tension
NL0 0V
NL1 +5V
181

Contrairement ce quimpose la norme RS232, les microcontrleur ne peuvent pas


utiliserdestensionsngatives.Ducoup,ilsutilisentlesseulsetuniquestensionsquils
peuvent utiliser, savoir le 0V et le +5V. Il y a donc quelques petits changement au
niveaudelatransmissionsrie.Unniveaulogique0correspondunetensionde0Vet
un niveau logique 1 correspond une tension de +5V. (cf. tableau cicontre) Fort
heureusement,commelesmicrocontrleursutilisentquasimenttouscettenorme,ilny
aaucunproblmeconnecterdeuxmicrocontrleursentreeux.Cettenormesappelle
alors UART pour Universal Asynchronous Receiver Transmitter plutt que RS232.
Hormislestensionslectriquesetleconnecteur,cestlammechose!

Croisementdedonnes
Ilvasimplementfalloirfaireattentionbiencroiserlesfils.OnconnecteleTx(broche
de transmission) dun microcontrleur au Rx (broche de rception) de lautre
microcontrleur.Etinversement,leTxdelautreauRxdupremier.Etbiensr,lamasse
lamassepourfaireunerfrencecommune.Exactementcommelepremierschma
quejevousaimontr:

Tx>Rx,filvert||Rx
>Tx,filorangeMasse>Masse,filnoir
Lacouleurdesfilsimportepeu,videmment!

ArduinoauPC
Leconnecteursrie(ousortieDB9)
Alorsl,lesenfants,jevousparleduntempsquelesmoinsdevingtansnepeuvent
pas connaittttrrreuhhh Bon on reprend ! Comme nonc, je vous parle de quelque
chose qui nexiste presque plus. Ou du moins, vous ne trouverez certainement plus
cette chose sur la connectique de votre ordinateur. En effet, je vais vous parler du
connecteurDB9(ouDE9).Ilyaquelquesannes,lUSBntaitpassivloceetsurtout
pastantrpandu.Beaucoupdematriels(surtoutdunpointdevueindustriel)utilisaient
la voie srie (et le font encore). A lpoque, les quipements se branchaient sur ce
quon appelle une prise DB9 (9 car 9 broches). Sachez simplement que ce nom est
attribuunconnecteurquipermetderelierdiversmatrielsinformatiquesentreeux.
182

PhotosextraitesdusiteWikipdia
ConnecteurDB9MlegaucheFemelledroite
Aquoiasert?
Sijevousparledeadanslechapitresurlavoiesrie,cestquildoityavoirunlien,
non ? o_O Juste, car la voie srie (je parle l de la transmission des donnes) est
vhicule par ce connecteur dans la norme RS232. Donc, notre ordinateur dispose
dunconnecteurDB9,quipermetderelier,viauncbleadapt,saconnexionsrieun
autre matriel. Avant, donc, lorsquil tait trs rpandu, on utilisait beaucoup ce
connecteur. Dailleurs, la premire version de la carte Arduino disposait dun tel
connecteur!

183

Lapremireversiondela
carteArduino,avecunconnecteurDB9
Aujourdhui,leconnecteurDB9adjbiendisparumaisresteprsentsurlesvieux
ordinateursousurdautresappareilsutilisantlavoiesrie.Cestpourquoi,lejouro
vousaurezbesoindecommuniqueravecunteldispositif,ilvousfaudrafaireunpeu
dlectronique

Unepetitehistoiredadaptation
Si vous avez donc loccasion de connecter votre carte Arduino un quelconque
dispositifutilisantlavoiesrie,ilvafalloirfaireattentionauxtensionsoui,encoreelles
!Jelaidjdis,unmicrocontrleurutilisedestensionsde0Vet5V,quonappelTTL.
Hors,lanormeRS232imposedestensionspositivesetngativescompriseen+/3Vet
+/25V. Il va donc falloir adapter ces tensions. Pour cela, il existe un composant trs
courantettrsutilisdanscetypedecas,questleMAX232.

DatasheetduMAX232
Jevouslaisseregarderladatasheetetcomprendreunpeulefonctionnement.Aussi,je
vousmetunschma,extraitdusiteinternetsonelecmusique.com:

Le principe de ce composant, utilis avec quelques condensateur, est dadapter les


signaux de la voie srie dun microcontrleur vers des tensions aux standards de la
normeRS232etinversement.Ainsi,unefoislemontageinstall,vousnavezplus
voussoucierdesavoirquelletensionilfaut,etc

184

En revanche, nutilisez jamais ce composant pour relier deux microcontrleurs


entre eux ! Vous risqueriez den griller un. Ou alors il faut utiliser deux fois ce
composant (un pour TTL>RS232 et lautre pour RS232>TTL ), mais cela
deviendraitalorspeuutile.
DoncensortieduMAX232,vousaurezlessignauxRxetTxaustandardRS232.Elles
dpendent de son alimentation et sont en gnrale centres autour de +/12V. Vous
pourrezparexempleconnecterunconnecteurDB9lasortieduMAX232etrelierla
carteArduinoundispositifutilisantluiaussilavoiesrieetunconnecteurDB9.Ou
mme un dispositif nutilisant pas de connecteur DB9 mais un autre (dont il faudra
connaitrelebrochage)etquiutiliselavoiesrie.

AudeldArduinoaveclaconnexionsrie
Voiciunepetiteannexequivavousprsenterunpeulutilisationduvraiportsrie.Je
nevousobligepaslalire,ellenestpasindispensableetpeuseulementservirsivous
avezunjourbesoindecommuniqueravecundispositifquiexploitecettevoiesrie.

Leconnecteursrie(ousortieDB9)
Lebrochageaucomplet!
Oui,jeveuxsavoirpourquoiilpossdetantdebrochespuisquetunousasditque
lavoiesrienutilisaitque3fils.
Eh bien, toutes ces broches ont une fonction bien prcise. Je vais vous les dcrire,
ensuiteonverraplusendtailcequelonpeutfaireavec:
1. DCD:Dtectiondunsignalsurlaligne.Utiliseuniquementpourlaconnexion
delordinateurunmodemdtectelaporteuse
2. RXD:Brochederceptiondesdonnes
3. TXD:Brochedetransmissiondesdonnes
4. DTR:Lesupportquiveutrecevoirdesdonnessedclareprtcouterlautre
5. GND:Lerfrentiellectriquecommunlamasse
6. DSR:Lesupportvoulanttransmettredclareavoirdeschosesdire
7. RTS : Le support voulant transmettre des donnes indique quil voudrait
communiquer
8. CTS:Invitationmettre.Lesupportderceptionattenddesdonnes
9. RI:Trspeuutilis,indiquaitlasonneriedanslecasdesmodemsRS232
185

Vousvoyezdjunaperudecequevouspouvezfaireavectoutescesbroches.Mais
parlonsenplusamplement.

Dsol,jesuisoccup
Dans certains cas, et il nest pas rare, les dispositifs communicant entre eux par
lintermdiaire de la voie srie ne traitent pas les donnes la mme vitesse. Tout
commelorsqueloncommuniqueavecquelquun,ilarriveparfoisquilnarriveplus
suivre ce que lon dit car il en prend des notes. Il sannonce alors indisponible
recevoirplusdinformations.Dsquilestnouveauprt,ilnouslefaitsavoir.Ilyaun
moyen,misenplacegrcecertainesbrochesduconnecteurpoureffectuercegenre
dopration que lon appelle le contrle de flux. Il y a deux manires dutiliser un
contrledeflux,nousallonslesvoirtoutdesuite.

Contrledefluxlogiciel
Commenonsparlecontrledefluxlogiciel,plussimpleutiliserquelecontrlede
fluxmatriel.Eneffet,ilnencessitequetroisfils:lamasse,leRxetleTX.Ehoui,ni
plus ni moins, tout se passe logiciellement. Le fonctionnement trs simple de ce
contrle de flux utilise des caractres de la table ASCII, le caractre 17 et 19,
respectivementnommsXONetXOFF.CecisepasseentreunquipementE,quiest
lmetteur,etunquipementR,quiestrcepteur.Lercepteurreoitdesinformations,il
les traite et stockent celles qui continuent darriver en attendant de les traiter. Mais
lorsquilnepeutplusstockerdinformations,lercepteurenvoielecaractreXOFFpour
indiquer lmetteur quil sature et quil nest plus en mesure de recevoir dautres
informations. Lorsquil est nouveau apte traiter les informations, il envoie le
caractre XON pour dire lmetteur quil est nouveau prt couter ce que
lmetteuraluidire.

Contrledefluxmatriel
On nutilisera pas le contrle de flux matriel avec Arduino car la carte nen est pas
quipe, mais il est bon pour vous que vous sachiez ce que cest. Je ne parlerai en
revanche que du contrle matriel 5 fils. Il en existe un autre qui utilise 9 fils. Le
principe est le mme que pour le contrle logiciel. Cependant, on utilise certaines
brochesduconnecteurDB9dontjeparlaisplushaut.CesbrochessontRTSetCTS.

Voil le branchement adquat pour utilise ce contrle de flux matriel 5 fils. Une
transmissionseffectuedelamaniresuivante:
Ledispositif1,quejenommeraismaintenantlmetteur,metuntatlogique0sur
186

sabrocheRTS1.Ildemandedoncaudispositif2,lercepteur,pourmettredes
donnes.
Silercepteurestprtrecevoirdesdonnes,alorsilmetunniveaulogique0
sursabrocheRTS2.
Lesdeuxdispositifssontprts,lmetteurpeutdoncenvoyerlesdonnesquila
transmettre.
Unefoislesdonnesenvoyes,lmetteurpasse1ltatlogiqueprsentsursa
brocheRTS1.
Le rcepteur voit ce changement dtat et sait donc que cest la fin de la
communicationdesdonnes,ilpassealorsltatlogiquedesabrocheRTS21.
Cecontrlenestpastrscompliquetestutilislorsquelecontrledefluxlogicielne
lestpas.

Avecousanshorloge?
Pourterminer,faisonsunepetiteouverturesurdautresliaisonssriesclbres

LUSB
On la ctoie tout les jours sans sen soucier et pourtant elle nous entoure : Cest la
liaisonUSB!Commesonnomlindique,UniversalSerialBus,ilsagitbiendunevoie
srie. Cette dernire existe en trois versions. La dernire, la 3.1, vient juste de sortir.
Unedesparticularitsdecettevoiesrieestquelleseproposedelivrerlalimentation
de lquipement avec lequel elle communique. Par exemple votre ordinateur peut
alimentervotredisquedurportableetenmmetempsluidemanderdesfichiers.Dans
le cas de lUSB, la communication se fait de manire matreesclave. Cest lhte
(lordinateur) qui demande des informations lesclave (le disque dur). Tant quil na
pas t interrog, ce dernier nest pas cens parler. Afin de sy retrouver, chaque
priphriquesevoitattribueruneadresse.Latransmissionlectriquesefaitgrceun
procddiffrentielentredeuxfils,D+etD,afindelimiterlesparasites.

LI2C
LICestunautreprotocoledecommunicationquifuttoutdabordpropritaire(invent
parPhilips)etndelancessitdinterfacerdeplusenplusdemicrocontrleurs.En
effet,cemomentlunevoiesrieclassiquenesuffisaitpluscarellenepouvaitrelier
que deux deux les microcontrleurs. La particularit de cette liaison est quelle
transporte son propre signal dhorloge. Ainsi, la vitesse na pas besoin dtre connu
davance.Lesdonnessonttransportesenmmetempsquelhorlogegrcedeux
fils:SDA(Data)etSCL(Clock).CommepourlUSB,lacommunicationsefaitsurun
systmedematre/esclave.

[Arduino302]Envoyeretrecevoirdesdonnessurla
voiesrie
Dans ce chapitre, nous allons apprendre utiliser la voie srie avec Arduino. Nous
allons voir comment envoyer puis recevoir des informations avec lordinateur, enfin
187

nousferonsquelquesexercicespourvrifierquevousaveztoutcompris. Vousallez
le dcouvrir bientt, lutilisation de la voie srie avec Arduino est quasiment un jeu
denfant,puisquetoutestopaqueauxyeuxdelutilisateur

Prparerlavoiesrie
Notre objectif, pour le moment, est de communiquer des informations de la carte
Arduinoverslordinateuretinversement.Pourcefaire,onvadaborddevoirprparerle
terrain.

Ductdelordinateur
Pour pouvoir utiliser la communication de lordinateur, rien de plus simple. En effet,
Lenvironnement de dveloppement Arduino propose de base un outil pour
communiquer. Pour cela, il suffit de cliquer sur le bouton
(pour les versions
antrieures la version 1.0) dans la barre de menu pour dmarrer loutil. Pour la
version1.0,licneachangetdeplaceetdevisuel:

188

Unenouvellefentresouvre:cestleterminalsrie:

189

Danscettefentre,vousallezpouvoirenvoyerdesmessagessurlavoiesriedevotre
ordinateur (qui est mule par lArduino) recevoir les messages que votre Arduino
vousenvoieetrglerdeuxtroisparamtrestelsquelavitessedecommunicationavec
lArduino et lautoscroll qui fait dfiler le texte automatiquement. On verra plus loin
quoisertledernierrglage.

Ductduprogramme
LobjetSerial
Pour utiliser la voie srie et communiquer avec notre ordinateur (par exemple), nous
allons utiliser un objet (une sorte de variable mais plus volue) qui est intgr
nativementdanslensembleArduino:lobjetSerial.
Pourlemoment,considrezquunobjetestunevariablevoluequipeutexcuter
plusieurs fonctions. On verra (beaucoup) plus loin ce que sont rellement des
objets. On apprendra en crer et les utiliser lorsque lon abordera le logiciel
Processing.
Cetobjetrassembledesinformations(vitesse,bitsdedonnes,etc.)etdesfonctions
(envoi, lecture de rception,) sur ce quest une voie srie pour Arduino. Ainsi, pas
besoinpourleprogrammeurderecrertousleprotocole(sinononauraitducrirenous
mme TOUT le protocole, tel que Ecrire un bit haut pendant 1 ms, puis 1 bit bas
pendant1ms,puislecaractreaen8ms),bref,ongagneuntempsfouetonvite
lesbugs!

Lesetup
Pour commencer, nous allons donc initialiser lobjet Serial. Ce code sera copier
190

chaque fois que vous allez crer un programme qui utilise la voie srie. Le logiciel
Arduino prvu, dans sa bibliothqueSerial, tout un tas de fonctions qui vont nous
tres trs utiles, voir mme indispensables afin de bien utiliser la voie srie. Ces
fonctions, je vous les laisse dcouvrir par vous mme si vous le souhaitez, elles se
trouventsurcettepage.Danslebutdecrerunecommunicationentrevotreordinateur
etvotrecarteArduino,ilfautdclarercettenouvellecommunicationetdfinirlavitesse
laquelle ces deux dispositifs vont communiquer. Et oui, si la vitesse est diffrente,
lArduinonecomprendrapascequeveutluitransmettrelordinateuretviceversa!Ce
rglagevadoncsefairedanslafonctionsetup,enutilisantlafonctionbegin()delobjet
Serial.
Lorsdunecommunicationinformatique,unevitessesexprimeenbitsparseconde
oubauds.Ainsi,pourunevitessede9600baudsonenverrajusqu96000ou1
enuneseuleseconde.Lesvitesseslespluscourantessont9600,19200et115200
bitsparseconde.
1
2
3
4
5

voidsetup()
{
//ondmarrelaliaisonenlarglantunevitessede9600bitsparseconde.
Serial.begin(9600)
}

prsent,votrecarteArduinoaouvertunenouvellecommunicationverslordinateur.
Ilsvontpouvoircommuniquerensemble.

Envoyerdesdonnes
Le titre est pigeur, en effet, cela peut tre lArduino qui envoie des donnes ou
lordinateur. Bon, on est pas non plus dnu dune certaine logique puisque pour
envoy des donnes partir de lordinateur vers la carte Arduino il suffit douvrir le
terminal srie et de taper le texte dedans ! Donc, on va bien programmer et voir
commentfairepourquevotrecarteArduinoenvoiedesdonneslordinateur.
Etcesdonnes,ellesproviennentdo?
EhbiendelacarteArduinoEnfait,lorsquelonutiliselavoiesriepourtransmettre
delinformation,cestquonenadelinformationenvoyer,sinoncelanesertrien.
Cesinformationsproviennentgnralementdecapteursconnectslacarteoudeson
programme (par exemple la valeur dune variable). La carte Arduino traite les
informationsprovenantdecescapteurs,silfautelleadaptecesinformations,puiselle
lestransmet.Onauraloccasiondefaireadanslapartieddieauxcapteurs,comme
afficherlatempraturesursoncran,lheure,lepassagedunepersonne,etc.

ApprhenderlobjetSerial
Dansunpremiertemps,nousallonsutiliserlobjetSerialpourtesterquelquesenvois
de donnes. Puis nous nous attlerons un petit exercice que vous ferez seul ou
presque, du moins vous aurez eu auparavant assez dinformations pour pouvoir le
raliser(benoui,sinoncestplusunexercice!).
191

Phrase?Caractre?
On va commencer par envoyer un caractre et une phrase. ce propos, savezvous
quelle est la correspondance entre un caractre et une phrase ? Une phrase est
constitue de caractres les uns la suite des autres. En programmation, on parle
pluttdechainecaractrespourdsignerunephrase.
Uncaractreseulscritentreguillemetssimples:A,a,2,!,
Unephraseestunesuitedecaractreetscritentreguillemetsdoubles:Salut
toutlemonde,Jai42ans,ViveZozor!
Pourvousgarantirunsuccsdanslemondedelinformatique,essayezdypenser
etderespectercetteconvention,crireAcenestpaspareilqucrireA!

println()
Lafonctionquelonvautiliserpourdbuter,sagitde println(). Ces deux fonctions
sontquasimentidentiques,maisquoiserventelles?
print():cettefonctionpermetdenvoyerdesdonnessurlavoiesrie.Onpeut

parexempleenvoyeruncaractre,unechainedecaractreoudautresdonnes
dontjenevousaipasencoreparl.
println():cestlammefonctionquelaprcdente,ellepermetsimplementun
retourlalignelafindumessageenvoy.
Pourutilisercesfonctions,riendeplussimple:
1 Serial.print("Salutleszros!")

Biensr,aupralable,vousdevrezavoirdclar/crvotreobjetSerialetdfinisune
valeurdevitessedecommunication:
1
2
3
4
5
6
7

voidsetup()
{
//crationdel'objetSerial(=tablissementd'unenouvellecommunicationsrie)
Serial.begin(9600)
//envoiedelachaine"Salutleszros!"surlavoiesrie
Serial.print("Salutleszros!")
}

Cet objet, parlonsen. Pour vous aider reprsenter de faon plus concise ce quest
lobjetSerial,jevousproposecettepetiteillustrationdemonproprechef:

192

Commejevousleprsente,lobjetSerialestmunidunpaneldefonctionsquiluisont
propres.Cetobjetestcapablederalisercesfonctionsseloncequeleprogrammelui
ordonne de faire. Donc, par exemple, quand jcris : print() en lui passant pour
paramtre la chaine de caractre : Salut les zros !. On peut complter le code
prcdentcommececi:
1
2
3
4
5
6
7
8
9
10
11

voidsetup()
{
Serial.begin(9600)

//l'objetexcuteunepremirefonction
Serial.print("Salutleszros!")
//puisunedeuximefonction,diffrentecettefoisci
Serial.println("ViveZozor!")
//etexcutenouveaulamme
Serial.println("Cettephrasepasseendessousdesdeuxprcdentes")
}

Surleterminalsrie,onverraceci:
1 Salutleszros!ViveZozor!
2 Cettephrasepasseendessousdesdeuxprcdentes

Lafonctionprint()endtail
193

AprscettecourtepriseenmaindelobjetSerial,jevousproposededcouvrirplusen
profondeurlessurprisesquenousrservelafonctionprint().
Petiteprcision,jevaisutiliserdeprfrenceprint().
Rsumonsunpeucequenousvenonsdapprendre:onsaitmaintenantenvoyerdes
caractressurlavoiesrieetdesphrases.Cestdjbien,maiscenestquuntrsbref
aperudecequelonpeutfaireaveccettefonction.

Envoyerdesnombres
Aveclafonction print(),ilestaussipossibledenvoyerdeschiffresoudesnombres
carcesontdescaractres:
1
2
3
4
5
6
7
8
9

voidsetup()
{
Serial.begin(9600)

Serial.println(9)//chiffre
Serial.println(42)//nombre
Serial.println(32768)//nombre
Serial.print(3.1415926535)//nombrevirgule
}

1
2
3
4

9
42
32768
3.14

Tiens,lenombrepinestpasaffichcorrectement!Cestquoilebug?o_O
Rassurezvous,cenestniunbug,niunoubliinopindemapart. Enfait,pourles
nombresdcimaux,lafonctionprint()affichepardfautseulementdeuxchiffresaprs
la virgule. Cest la valeur par dfaut et heureusement elle est modifiable. Il suffit de
rajouterlenombrededcimalesquelonveutafficher:
1
2
3
4
5
6
7
8
9

voidsetup()
{
Serial.begin(9600)

Serial.println(3.1415926535,0)
Serial.println(3.1415926535,2)//valeurpardfaut
Serial.println(3.1415926535,4)
Serial.println(3.1415926535,10)
}

1
2
3
4

3
3.14
3.1415
3.1415926535

Envoyerlavaleurdunevariable
L encore, on utilise toujours la mme fonction (questce quelle polyvalente !). Ici
aucune surprise. Au lieu de mettre un caractre ou un nombre, il suffit de passer la
194

variableenparamtrepourquellesoitensuiteaffichelcran:
1
2
3
4
5
6
7
8
9
10

intvariable=512
charlettre='a'

voidsetup()
{
Serial.begin(9600)

Serial.println(variable)
Serial.print(lettre)
}

1 512
2 a

Tropfacilenestcepas?

Envoyerdautresdonnes
Cenestpasfini,onvaterminernotrepetittouraveclestypesdevariablesquelonpeut
transmettre grce cette fonction print() sur la voie srie. Prenons lexemple dun
nombrechoisijudicieusement:65.
Pourquoicenombreenparticulier?Etpourquoipas12ou900?
Ehbien,cestrelatiflatableASCIIquenousallonsutiliserdansuninstant.
Toutdabord,petitcoursdeprononciation,ASCIIseprononcecommesiondisait
Aski,onadonc:latableskienprononciationphontique.
LatableASCII,delamricainAmericanStandardCodeforInformationInterchange,
soit en bon franais : Code amricain normalis pour lchange dinformation est,
selonWikipdia:
lanormedecodagedecaractreseninformatiquelaplusconnue,laplus
ancienneetlapluslargementcompatible
Ensomme,cestuntableaudevaleurscodessur8bitsquichaquevaleurassocient
uncaractre.Cescaractressontleslettresdelalphabetenminusculeetmajuscule,
leschiffres,descaractresspciauxetdessymbolesbizarres.Danscettetable,ilya
plusieurscolonnesaveclavaleurdcimale,lavaleurhexadcimale,lavaleurbinaireet
lavaleuroctaleparfois.Nousnauronspasbesoindetouta,doncjevousdonneune
tableASCIIallge.

195

Sourcedelatable:http://www.commfront.com/asciicharttable.htm
Voiciunedeuximetableaveclescaractresetsymbolesaffichs:
196

Source
de
cette
table
http://www.lyceedupaysdesoule.fr/informatique/divers/table_ascii.htm

Revenonsnotreexemple,lenombre65.CesteneffetgrcelatableASCIIquelon
saitpasserdunnombreuncaractre,carrappelonsle,danslordinateurtoutesttrait
197

sousformedenombreenbase2(binaire).Donclorsqueloncode:
1 maVariable='A'//l'ordinateurstockelavaleur65danssammoire(cf.tableASCII)

Sivousfaitesensuite:
1 maVariable=maVariable+1//lavaleurstockepasse66(=65+1)
2
3 //l'cran,onverras'afficherlalettre"B"

Audbut,ontrouvaituneseuletableASCII,quiallaitde0127(codesur7bits)
et reprsentait lalphabet, les chiffres arabes et quelques signes de ponctuation.
Depuis,denombreusestablesditestenduessontapparuesetvontde0255
caractres(valeursmaximalescodablessuruntypecharquifait8bits).
Etquefaitonaveclafonctionprint()etcettetable?
Lesttoutlintrtdelatable,onpeutenvoyerdesdonnes,aveclafonctionprint(),de
toustypes!Enbinaire,enhexadcimal,enoctaletendcimal.
1
2
3
4
5
6
7
8
9

voidsetup()
{
Serial.begin(9600)

Serial.println(65,BIN)//envoielavaleur1000001
Serial.println(65,DEC)//envoielavaleur65
Serial.println(65,OCT)//envoielavaleur101(cen'estpasdubinaire!)
Serial.println(65,HEX)//envoielavaleur41
}

Vouspouvezdoncmanipulerlesdonnesquevousenvoyeztraverslavoiesrie!
Cestlquestlavantagedecettefonction.

Exercice:Envoyerlalphabet
Objectif
Nous allons maintenant faire un petit exercice, histoire de sentraner envoyer des
donnes. Le but, tout simple, est denvoyer lensemble des lettres de lalphabet de
manirela plus intelligente possible, autrement dit, sans crire 26 fois print() La
fonctionsetupresteralammequecellevueprcdemment.Undlaide250msest
attenduentrechaqueenvoidelettreetundelayde5secondesestattenduentrelenvoi
dedeuxalphabets.

Boncourage!

Correction
Bon jespre que tout cest bien pass et que vous navez pas jou au roi du
copier/collerenmemettant26print
1 voidloop()
2 {
3 chari=0

198

4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

charlettre='a'//ou'A'pourenvoyerenmajuscule

Serial.println("L'alphabetdesZros")//petitmessaged'accueil

//oncommencelesenvois
for(i=0i<26i++)
{
Serial.print(lettre)//onenvoielalettre
lettre=lettre+1//onpasselalettresuivante
delay(250)//onattend250msavantderenvoyer
}
Serial.println("")//onfaitunretourlaligne

delay(5000)//onattend5secondesavantderenvoyerl'alphabet
}

Si lexercice vous a paru trop simple, vous pouvez essayer denvoyer lalphabet
lenvers,oulalphabetminusculeETmajusculeETleschiffresde09Amusezvous
bien!

Recevoirdesdonnes
Cette fois, il sagit de lArduino qui reoit les donnes que nous, utilisateur, allons
transmettre travers le terminal srie. Je vais prendre un exemple courant : une
communicationtlphonique.Enrglegnrale,onditHallopourdirelinterlocuteur
quelonestprtcouterlemessage.Tantquelapersonnequiappellenapascette
confirmation,elleneditrien(oudanscecasellefaitunmonologue ).Pareillement
cetteconversion,lobjetSerialdisposedunefonctionpourcouterlavoiesrieafin
desavoirsiouiounonilyaunecommunicationdedonnes.

Rceptiondedonnes
Onmaparl?
Pourvrifiersionareudesdonnes,onvargulirementinterrogerlacartepourlui
demandersidesdonnessontdisponiblesdanssonbufferderception.Unbufferest
unezonemmoirepermettantdestockerdesdonnessuruncoursinstant.Dansnotre
situation,cettemmoireestddielarceptionsurlavoiesrie.Ilenexisteunaussi
pourlenvoidedonne,quimetlaqueueleuleulesdonnesenvoyeretlesenvoie
ds que possible. En rsum, un buffer est une sorte de salle dattente pour les
donnes. Je disais donc, nous allons rgulirement vrifier si des donnes sont
arrives. Pour cela, on utilise la fonction available() (de langlais disponible) de
lobjetSerial.Cettefonctionrenvoielenombredecaractresdanslebufferderception
delavoiesrie.Voiciunexempledetraitement:
1
2
3
4
5
6
7
8
9

voidloop()
{
intdonneesALire=Serial.available()//lecturedunombredecaractresdisponiblesdanslebuf
if(donneesALire>0)//silebuffern'estpasvide
{
//Ilyadesdonnes,onleslitetonfaitdutraitement
}
//onafinidetraiterlarceptionouiln'yarienlire
}

199

CettefonctiondelobjetSerial,available(),renvoielavaleur1quandilnyarien
liresurlebufferderception.

Lirelesdonnesreues
Unefoisquel'onsaitqu'ilyadesdonnes,ilfautallerleslirepourventuellementen
fairequelquechose.Lalectureseferatoutsimplementaveclafonction...read()!Cette
fonctionrenverralepremiercaractrearrivnontrait(commeunsupermarchtraitela
premire personne arrive dans la file d'attente de la caisse avant de passer au
suivant). On accde donc caractre par caractre aux donnes reues. Ce type de
fonctionnement est appel FIFO (First In First Out, premier arriv, premier trait). Si
jamaisrienn'estlire(personnedanslafiled'attente),jeledisais,lafonctionrenverra
1pourlesignaler.
1
2
3
4
5
6
7
8
9
10
11
12
13
14

voidloop()
{
//onlitlepremiercaractrenontraitdubuffer
charchoseLue=Serial.read()

if(choseLue==1)//silebufferestvide
{
//Rienlire,rienlu
}
else//lebuffern'estpasvide
{
//Onaluuncaractre
}
}

Cecodeestunefaonsimpledesepasserdelafonctionavailable().

LeserialEvent
Sivousvoulezviterdemettreletestdeprsencededonnessurlavoiesriedans
votre code, Arduino a rajouter une fonction qui sexcute de manire rgulire. Cette
dernireselancergulirementavantchaqueredmarragedelaloop.Ainsi,sivous
navezpasbesoindetraiterlesdonnesdelavoiesrieunmomentprcis,ilvous
suffitderajoutercettefonction.Pourlimplmentercesttrssimple,ilsuffitdemettredu
codedansunefonctionnommserialEvent()(attentionlacasse)quiseraarajout
endehorsdusetupetduloop.Lerestedutraitementdetextesefaitnormalement,avec
Serial.readparexemple.Voiciunexempledesquelettepossible:
1
2
3
4
5
6
7
8
9
10
11
12

constintmaLed=11//onmetuneLEDsurlabroche11

voidsetup()
{
pinMode(maLed,OUTPUT)//laLEDestunesortie
digitalWrite(maLed,HIGH)//onteintlaLED
Serial.begin(9600)//ondmarrelavoiesrie
}

voidloop()
{
delay(500)//faitunepetitepause

200

13
14
15
16
17
18
19
20
21
22
23
24
25

//onnefaitriendanslaloop
digitalWrite(maLed,HIGH)//onteintlaLED

voidserialEvent()//dclarationdelafonctiond'interruptionsurlavoiesrie
{
//littouteslesdonnes(videlebufferderception)
while(Serial.read()!=1)

//puisonallumelaLED
digitalWrite(maLed,LOW)
}

Exempledecodecomplet
Voicimaintenantunexempledecodecompletquivaallerlirelescaractresprsents
dans le buffer de rception sil y en a et les renvoyer tels quels lexpditeur
(mcanismedcho).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

voidsetup()
{
Serial.begin(9600)
}

voidloop()
{
charcarlu=0//variablecontenantlecaractrelire
intcardispo=0//variablecontenantlenombredecaractredisponiblesdanslebuffer

cardispo=Serial.available()

while(cardispo>0)//tantqu'ilyadescaractreslire
{
carlu=Serial.read()//onlitlecaractre
Serial.print(carlu)//puisonlerenvoilexpditeurtelquel
cardispo=Serial.available()//onrelitlenombredecaractresdispo
}
//finduprogramme
}

Avouezquetoutcelantaitpasbiendifficile.Jevaisdoncenprofiterpourprendredes
vacancesetvouslaisserfaireunexercicequidemandeunpeuderflexion.

[Exercice]Attentionlacasse!
Consigne
Le but de cet exercice est trs simple. Lutilisateur saisit un caractre partir de
lordinateur et si ce caractre est minuscule, il est renvoy en majuscule sil est
majusculeilestrenvoyenminuscule.Enfin,silecaractrenestpasunelettreonse
contentedelerenvoyernormalement,telquilest.Voillersultatdemonprogramme:

201

0:00/1:13

Correction
Je suppose que grce au superbe tutoriel qui prcde vous avez dj fini sans
problme,nestcepas?

Lafonctionsetup()etlesvariablesutiles
Unefoisnestpascoutume,onvacommencerparnumrerlesvariablesutilesetle
contenudelafonctionsetup().Pourcequiestdesvariablesglobales,onnenretrouve
quuneseule,carlu.Cettevariabledetypeintsertstockerlecaractrelusurlebuffer
delacarteArduino.Puisondmarreunenouvellevoiesrie9600bauds:
1
2
3
4
5
6

intcarlu//stocklecaractrelusurlavoiesrie

voidsetup()
{
Serial.begin(9600)
}

Leprogramme
Leprogrammeprincipalnestpastrsdifficilenonplus.Ilvasefaireentroistemps.
Toutdabord,onbouclejusqurecevoiruncaractresurlavoiesrie
Lorsquonareuuncaractre,onregardesicestunelettre
Si cest une lettre, on renvoie son acolyte majuscule sinon on renvoie
simplementlecaractrelu
Voicileprogrammedcrivantcecomportement:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

voidloop()
{
//oncommenceparvrifiersiuncaractreestdisponibledanslebuffer
if(Serial.available()>0)
{
carlu=Serial.read()//lecturedupremiercaractredisponible

if(carlu>='a'&&carlu<='z')//Estcequec'estuncaractreminuscule?
{
carlu=carlu'a'//ongardejustele"numrodelettre"
carlu=carlu+'A'//onpasseenmajuscule
}
elseif(carlu>='A'&&carlu<='Z')//Estcequec'estuncaractreMAJUSCULE?
{
carlu=carlu'A'//ongardejustele"numrodelettre"

202

16
17
18
19
20
21

carlu=carlu+'a'//onpasseenminuscule
}
//nil'unnil'autreonrenvoieentantqueBYTEoualorsonrenvoielecaractremodifi
Serial.write(carlu)
}
}

Jevaismaintenantvousexpliquerlespartiesimportantesdececode.Commevudans
lecours,laligne4vanousservirattendreuncaractresurlavoiesrie.Tantquon
nereoitrien,onnefaitrien!Sittquelonreoituncaractre,onvacherchersavoir
sicestunelettre.Pourcela,onvafairedeuxtests.Lunestlaligne8etlautrela
ligne13.Ilsseprsententdelammefaon:SIlecaractreluunevaleursuprieure
ougalelalettrea(ouA)ETinfrieureougalelalettrez(Z),alorsonesten
prsence dune lettre. Sinon, cest autre chose, donc on se contente de passer au
renvoi du caractre lu ligne 21. Une fois que lon a dtect une lettre, on effectue
quelquestransformationsafindechangersacasse.Voicilesexplicationstraversun
exemple:
Opration
(lettre)

Onrcuprelalettree
Onisolesonnumrodelettreenlui
enlevantlavaleurdea

Opration
(nombre)
101

ea

10197

OnajoutecenombrelalettreA

A+(ea)

Ilnesuffitplusquretournercettelettre

Description

Valeurde
carlu
e
4

65+(10197)=
E
69
69
E

On effectuera sensiblement les mmes oprations lors du passage de majuscule


minuscule.
A la ligne 19, jutilise la fonction write() qui envoie le caractre en tant que
variable de type byte, signifiant que lon renvoie linformation sous la forme dun
seuloctet.SinonArduinoenverraitlecaractreentantqueint,cequidonnerait
desproblmeslorsdelaffichage.
Vous savez maintenant lire et crire sur la voie srie de lArduino ! Grce cette
nouvelle corde votre arc, vous allez pouvoir ajouter une touche dinteractivit
supplmentairevosprogrammes.

[Arduino303][TP]Baignadeinterdite!
Afin dappliquer vos connaissances acquises durant la lecture de ce tutoriel, nous
allonsmaintenantfaireungrosTP.Ilregrouperatoutcequevoustescenssavoiren
terme de matriel (LED, boutons, voie srie et bien entendu Arduino) et je vous fais
aussiconfiancepourutiliseraumieuxvosconnaissancesentermedesavoircoder
(variables,fonctions,tableaux).Boncourageet,leplusimportant:Amusezvousbien
!

203

SujetduTPsurlavoiesrie
Contexte
Imaginezvousauborddelaplage.Lecielestbleu,lameraussiAhhhlerve.Puis,
toutuncoupledrapeaurougeselve!RequiiiinncrieunnageurLapplicationque
jevousproposededveloppericicorrespondcegenredesituation.VoustesauQG
de la zPlage, le nouvel endroit branch pour les vacances. Votre mission si vous
lacceptez est dafficher en temps rel un indicateur de qualit de la plage et de ses
flots. Pour cela, vous devez informer les zTouristes par laffichage dun code de 3
couleurs.DeszSurveillantssontlpourvousprvenirquetoutestrentrdanslordresi
unincidentsurvient.

Objectif
Commeexpliqucidessus,laffichagedequalitseferaautraversde3couleursqui
serontreprsentespardesLEDs:
Rouge:Danger,nepassebaigner
Orange:Baignaderisquepourlesnovices
Vert:Toutbaigne!
La zPlage est quipe de deux boutons. Lun servira dclencher un SOS (si
quelquunvoitunnageurendifficultparexemple).Lalumirepassealorsaurouge
clignotantjusqucequunsauveteuraitappuysurlautreboutonsignalantProblme
rgl, tout revient la situation prcdente. Enfin, dernier point mais pas des
moindres, le QG (vous) reoit des informations mtorologiques et provenant des
marinsaularge.Cesmessagessontretransmissousformedetextos(symbolissparla
voiesrie)auxsauveteurssurlaplagepourquilschangentlescouleursentempsrel.
Voicilesmotsclsetleursimpacts:
meduse,tempete,requin:DesanimauxdangereuxoulamtorendentlazPlage
dangereuse.Baignadeinterdite
vague:Lanatationestrserveauxbonsnageurs
surveillant,calme:Toutbaigne,leszSauveteurssontletlamerestcool

Conseil
Voiciquelquesconseilspourmenerbienvotreobjectif.

Ralisation
Une fois nest pas coutume, nommez bien vos variables ! Vous verrez que ds
quuneapplicationprendduvolumeilestagrabledenepasavoirchercherquisert
quoi. Nhsitez pas dcomposer votre code en fonction. Par exemple les
fonctionschangerDeCouleur()peuventtrelesbienvenues.

Prcisionsurleschainesdecaractres
204

Lorsqueloncritunephrase,onalhabitudedelafinirparunpoint.Eninformatique
cestpareilmaislchelledumot!Jemexplique.Unechanedecaractres(unmot)
est,commelindiquesonnom,unesuitedecaractres.Gnralementonladclarede
lafaonsuivante:
1 charmot[20]="coucou"

Lorsquevousfaitesa,vousnelevoyezpas,lordinateurrajoutejusteaprsledernier
caractre (ici u) un caractre invisible qui scrit \0 (antislashzro). Ce caractre
signifiefindelachane.Enmmoire,onadonc:
mot[0] c
mot[1] o
mot[2] u
mot[3] c
mot[4] o
mot[5] u
mot[6] \0
Cecaractreesttrsimportantpourlasuitecarjevaisvousdonnerunpetitcoup
depoucepourletraitementdesmotsreus.
Une bibliothque, nomme string (chane en anglais) et prsente nativement dans
votrelogicielArduino,permetdetraiterdeschanesdecaractres.Vouspourrezainsi
plus facilement comparer deux chanes avec la fonction strcmp(chaine1, chaine2).
Cette fonction vous renverra 0 si les deux chanes sont identiques. Vous pouvez par
exemplelutiliserdelamaniresuivante:
1
2
3
4
5
6

intresultat=strcmp(motRecu,"requin")//utilisationdelafonctionstrcmp(chaine1,chaine2)pour

if(resultat==0)
Serial.print("Leschainessontidentiques")
else
Serial.print("Leschainessontdiffrentes")

Letruc,cestquecettefonctioncomparecaractreparcaractreleschanes,orcellede
droite:requinpossdecefameux\0aprslen.Pourquelersultatsoitidentique,il
fautdoncquelesdeuxchanessoientparfaitementidentiques!Donc,avantdenvoyer
lachainetapesurlavoiesrie,ilfautluirajoutercefameux\0.
Jecomprendsquecepointsoitdlicatcomprendre,jenevoustaperaisdoncpas
surlesdoigtssivousavezdesdifficultslorsdelacomparaisondeschanesetque
vous allez vous balader sur la solution Mais essayez tout de mme, cest
tellementplussympaderussirenrflchissantetenessayant!

Rsultat
Prenezvotretemps,faitesmoiquelquechosedebeauetamusezvousbien!Jevous
laisse aussi choisir comment et o brancher les composants sur votre carte Arduino.
205

:ninja: Voici une photo dillustration du montage ainsi quune vido du montage en
action.

0:00/1:38

BonCourage!

Correction!
Oncorrige?
Jesprequevousavezrussiavoirunboutdesolutionouunesolutioncomplteet
que vous vous tes amus. Si vous tes nerv sans avoir trouv de solutions mais
que vous avez cherch, ce nest pas grave, regardez la correction et essayez de
comprendreoetpourquoivousavezfaituneerreur.

Leschmalectronique
Commenonsparleschmalectronique,voicilemien,entrevousetmoi,seulesles
entres/sorties ne sont probablement pas les mmes. En effet, il est difficile de faire
autrementquecommececi:

206

207

Quellesraisonsnousontpousssfairecesbranchements?Ehbien:
Onutiliselavoiesrie,doncilnefautpasbrancherdeboutonsoudeLEDsurles
broches0ou1(brochedetransmission/rception)
On utilisera les LED ltat bas, pour viter que la carte Arduino dlivre du
courant
Les rebonds des boutons sont filtrs par des condensateurs (au passage, les
boutonssontactifsltatbas)

Lesvariablesglobalesetlafonctionsetup()
Poursuivons notre explication avec les variables que nous allons utiliser dans le
programmeetlesparamtresdclarerdanslafonctionsetup().

Lesvariablesglobales
1
2
3
4
5
6
7
8
9
10
11

#defineVERT0
#defineORANGE1
#defineROUGE2

intetat=0//stockl'tatdelasituation(vert=0,orange=1,rouge=2)
charmot[20]//lemotlusurlavoiesrie

//numrodesbrochesutilises
constintbtn_SOS=2
constintbtn_OK=3
constintleds[3]={11,12,13}//tableaude3lmentscontenantlesnumrosdebrochesdesLED

Afindappliquerlecours,onseserviraiciduntableaupourcontenirlesnumrosdes
broches des LED. Cela nous vite de mettre trois fois int leds_xxx (vert, orange ou
rouge).Bienentendu,dansnotrecas,lintrtestfaible,maisasuffirapourlexercice.
Etcestquoia#define?
208

Le #define est ce que lon appelle une directive de prprocesseur. Lorsque le


logiciel Arduino va compiler votre programme, il va remplacer le terme dfini par la
valeurquilesuit.Parexemple,chaquefoisquelecompilateurverraletermeVERT(en
majuscule),ilmettralavaleur0laplace.Toutsimplement!Cestexactementlamme
chosequedcrire:const int btn_SOS = 2;

Lafonctionsetup()
Rien de particulier dans la fonction setup() par rapport ce que vous avez vu
prcdemment,oninitialiselesvariables
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

voidsetup()
{
Serial.begin(9600)//Ondmarrelavoiesrieavecunevitessede9600bits/seconde

//rglagedesentres/sorties
//lesentres(2boutons)
pinMode(btn_SOS,INPUT)
pinMode(btn_OK,INPUT)

//lessorties(3LED)teintes
for(inti=0i<3i++)
{
pinMode(leds[i],OUTPUT)
digitalWrite(leds[i],HIGH)
}
}

Danslecodeprcdent,lastucemiseenuvreestcelledutiliserunebouclefor
pourinitialiserlesbrochesentantquesortiesetlesmettreltathautenmme
temps!Sanscetteastuce,lecodedinitialisation(lignes1115)auraittcomme
ceci:
1
2
3
4
5
6
7
8
9

//ondfinitlesbroches,olesLEDsontconnectes,ensortie
pinMode(led_vert,OUTPUT)
pinMode(led_rouge,OUTPUT)
pinMode(led_orange,OUTPUT)

//OnteintlesLED
digitalWrite(led_vert,HIGH)
digitalWrite(led_orange,HIGH)
digitalWrite(led_rouge,HIGH)

Sivousnutilisezpascetteastucedansnotrecas,cenestpasdramatique.Enfait,cela
estutilislorsquevousavez20oumme100LEDetbrochesinitialiser!Cestmoins
fatigantcommeaQuiaditprogrammeur?o_O

Lafonctionprincipaleetlesautres
Algorithme
Prenezlhabitudedetoujoursrdigerunbrouillondetypealgorithmeouquelquechose
qui y ressemble avant de commencer coder, cela vous permettra de mieux vous
reprer dans lendroit o vous en tes sur lavancement de votre programme. Voil
lorganigrammequejaifaitlorsquejaicommencceTP:
209

Etvoilenquelquesmotslalecturedecetorganigramme:
Ondmarrelafonctionloop
SionaunappuisurleboutonSOS:
Oncommenceparfaireclignoterlaledrougepoursignalerlalarme
Etonclignotetantquelesauveteurnapasappuysurlesecondbouton
Sinon(ousilvnementestfini)onvrifielaprsencedunmotsurlavoiesrie
Silyaquelquechoselireonvalercuprer
Sinononcontinuedansleprogramme
Enfin,onmetjourlesdrapeaux
Puisonrepartaudbutetrefaisonslemmetraitement
Fortdecetoutil,nousallonspouvoircoderproprementnotrefonction loop()puistout
untasdefonctionsutilestoutautour.

Fonctionloop()
Voicidsmaintenantlafonctionloop(),quivaexcuterlalgorithmeprsentcidessus.
Vousvoyezquilestassezlgercarjefaisappeldenombreusesfonctionsquejai
cres.Nousverronsensuitelerledecesdiffrentesfonctions.Cependant,jaifaiten
sorte quelles aient toutes un nom explicite pour que le programme soit facilement
comprhensiblesansmmeconnatrelecodequellescontiennent.
210

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

voidloop()
{
//onregardesileboutonSOSestappuy
if(digitalRead(btn_SOS)==LOW)
{
//sioui,onmetl'alerteenappelantlafonctionprvueceteffet
alerte()
}

//puisoncontinuenvrifiantlaprsencedecaractresurlavoiesrie
//s'ilyadesdonnesdisponiblessurlavoiesrie(Serial.available()renvoiunnombresupr
if(Serial.available())
{
//alorsonvalirelecontenudelarception
lireVoieSerie()
//onentredansunevariablelavaleurretourneparlafonctioncomparerMot()
etat=comparerMot(mot)
}
//Puisonmetjourl'tatdesLED
allumerDrapeau(etat)
}

Lecturedesdonnessurlavoiesrie
Afin de garder la fonction loop lgre, nous avons rajout quelques fonctions
annexes.Lapremireseracelledelecturedelavoiesrie.Sonjobconsisteallerlire
lesinformationscontenuesdanslebufferderceptiondumicrocontrleur.Onvalire
lescaractresenlesstockantdansletableauglobalmot[]dclarplustt.Lalecture
sarrtesousdeuxconditions:
Soitonatropdecaractreetdonconrisquedinscriredescaractresdansdes
variablesnexistantpas(icitableaulimit20caractres)
Soitonarencontrlecaractresymbolisantlafindeligne.Cecaractreest\n.
Voicimaintenantlecodedecettefonction:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

//litunmotsurlavoiesrie(litjusqu'rencontrerlecaractre'\n')
voidlireVoieSerie(void)
{
inti=0//variablelocalepourl'incrmentationdesdonnesdutableau

//onlitlescaractrestantqu'ilyena
//OUsijamaislenombredecaractreslusatteint19(limitedutableaustockantlemot1ca
while(Serial.available()>0&&i<=19)
{
//onenregistrelecaractrelu
mot[i]=Serial.read()
//laisseunpeudetempsentrechaqueaccsalammoire
delay(10)
//onpassel'indicesuivant
i++
}
//onsupprimelecaractre'\n'etonleremplaceparceluidefindechaine'\0'
mot[i]='\0'
}

Allumerlesdrapeaux
211

Voiluntitreenrendrefouplusdun!Vouspouvezrangervosbriquets,onenaura
pasbesoin. Unedeuximefonctionestcellepermettantdallumeretdteindreles
LED. Elle est assez simple et prend un paramtre : le numro de la LED allumer.
Dans notre cas : 0, 1 ou 2 correspondant respectivement vert, orange, rouge. En
passantleparamtre1,onteinttouteslesLED.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

/*
Rappeldufonctionnementducodequiprcdeceluici:
>litunmotsurlavoiesrie(litjusqu'rencontrerlecaractre'\n')
FonctionallumerDrapeau():
>Allumeundestroisdrapeaux
>paramtre:lenumrodudrapeauallumer(note:sileparamtreest1,onteinttouteslesL
*/

voidallumerDrapeau(intnumLed)
{
//OncommenceparteindrelestroisLED
for(intj=0j<3j++)
{
digitalWrite(leds[j],HIGH)
}
//puisonallumeuneseuleLEDsibesoin
if(numLed!=1)
{
digitalWrite(leds[numLed],LOW)
}

/*Note:vouspourrezamliorercettefonctionen
vrifiantparexemplequeleparamtrene
dpassepaslenombreprsentdeLED
*/
}

Vous pouvez voir ici un autre intrt du tableau utilis dans la fonction setup() pour
initialiserlesLED.UneseulelignepermetdefairelallumagedelaLEDconcerne!

FaireclignoterlaLEDrouge
Lorsque quelquun appui sur le bouton dalerte, il faut immdiatement avertir les
sauveteurs sur la zPlage. Dans le programme principal, on va dtecter lappui sur le
bouton SOS. Ensuite, on passera dans la fonction alerte() code cidessous. Cette
fonctionestassezsimple.Ellevatoutdabordreleverletempslaquelleelleestau
momentmme(nombredemillisecondescoulesdepuisledmarrage).Ensuite,on
va teindre toutes les LED. Enfin, et cest l le plus important, on va attendre du
sauveteurunappuisurlebouton.TANTQUEcetappuinestpasfait,onchangeltat
de la LED rouge toute les 250 millisecondes (choix arbitraire modifiable selon votre
humeur).UnefoisquelappuiduSauveteuratralis,onvarepartirdanslaboucle
principaleetcontinuerlexcutionduprogramme.
1
2
3
4
5
6
7

//teintlesLEDetfaisclignoterlaLEDrougeenattendantl'appuidubouton"sauveteur"

voidalerte(void)
{
longtemps=millis()
booleanclignotant=false
allumerDrapeau(1)//onteinttouteslesLED

212

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

//tantqueleboutondesauveteurn'estpasappuyonfaitclignotlaLEDrouge
while(digitalRead(btn_OK)!=LOW)
{
//S'ils'estcoul250msouplusdepuisladernirevrification
if(millis()temps>250)
{
//onchangel'tatdelaLEDrouge
clignotant=!clignotant//siclignotanttaitFALSE,ildevientTRUEetinversement
//laLEDestallumeaugrdelavariableclignotant
digitalWrite(leds[ROUGE],clignotant)
//onserappeldeladatededernierpassage
temps=millis()
}
}
}

Comparerlesmots
Etvoicimaintenantleplusdurpourlafin,enfinjexagreunpeu.Eneffet,ilnevous
resteplusqucomparerlemotreusurlavoiesrieaveclabanquededonnesde
mots possible. Nous allons donc effectuer cette vrification dans la fonction
comparerMot(). Cette fonction recevra en paramtre la chane de caractres
reprsentantlemotquidoittrevrifietcompar.Ellerenverraensuiteltat(vert(0),
orange (1) ou rouge (2)) qui en rsulte. Si aucun mot na t reconnu, on renvoie
ORANGEcarincertitude.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

intcomparerMot(charmot[])
{
//oncomparelesmots"VERT"(surveillant,calme)
if(strcmp(mot,"surveillant")==0)
{
returnVERT
}
if(strcmp(mot,"calme")==0)
{
returnVERT
}
//oncomparelesmots"ORANGE"(vague)
if(strcmp(mot,"vague")==0)
{
returnORANGE
}
//oncomparelesmots"ROUGE"(meduse,tempete,requin)
if(strcmp(mot,"meduse")==0)
{
returnROUGE
}
if(strcmp(mot,"tempete")==0)
{
returnROUGE
}
if(strcmp(mot,"requin")==0)
{
returnROUGE
}

//sionarienreconnuonrenvoiORANGE
returnORANGE

213

33 }

Codecomplet
Commevousaveztsagejusquprsent,jairassemblpourvouslecodecomplet
de ce TP. Bien entendu, il va de pair avec le bon cblage des LED, places sur les
bonnesbroches,ainsiquelesboutonsetleresteJevousfaiscependantconfiance
pourchangerlesvaleursdesvariablessilesbrochesutilisessontdiffrentes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

#defineVERT0
#defineORANGE1
#defineROUGE2

intetat=0//stockl'tatdelasituation(vert=0,orange=1,rouge=2)
charmot[20]//lemotlusurlavoiesrie

//numrodesbrochesutilises
constintbtn_SOS=2
constintbtn_OK=3

//tableaude3lmentscontenantlesnumrosdebrochesdesLED
constintleds[3]={11,12,13}

voidsetup()
{
//Ondmarrelavoiesrieavecunevitessede9600bits/seconde
Serial.begin(9600)

//rglagedesentres/sorties
//lesentres(2boutons)
pinMode(btn_SOS,INPUT)
pinMode(btn_OK,INPUT)

//lessorties(3LED)teintes
for(inti=0i<3i++)
{
pinMode(leds[i],OUTPUT)
digitalWrite(leds[i],HIGH)
}
}

voidloop()
{
//onregardesileboutonSOSestappuy
if(digitalRead(btn_SOS)==LOW)
{
//sioui,onmetl'alerteenappelantlafonctionprvueceteffet
alerte()
}

//puisoncontinuenvrifiantlaprsencedecaractresurlavoiesrie
//s'ilyadesdonnesdisponiblessurlavoiesrie(Serial.available()renvoiunnombresup
if(Serial.available())
{
//alorsonvalirelecontenudelarception
lireVoieSerie()
//onentredansunevariablelavaleurretourneparlafonctioncomparerMot()
etat=comparerMot(mot)

214

51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

}
//Puisonmetjourl'tatdesLED
allumerDrapeau(etat)
}

//litunmotsurlavoiesrie(litjusqu'rencontrerlecaractre'\n')
voidlireVoieSerie(void)
{
inti=0//variablelocalepourl'incrmentationdesdonnesdutableau

//onlitlescaractrestantqu'ilyena
//OUsijamaislenombredecaractreslusatteint19(limitedutableaustockantlemot1c
while(Serial.available()>0&&i<=19)
{
mot[i]=Serial.read()//onenregistrelecaractrelu
delay(10)//laisseunpeudetempsentrechaqueaccsalammoire
i++//onpassel'indicesuivant
}
mot[i]='\0'//onsupprimelecaractre'\n'etonleremplaceparceluidefindechaine'\
}

/*
Rappeldufonctionnementducodequiprcdeceluici:
>litunmotsurlavoiesrie(litjusqu'rencontrerlecaractre'\n')
FonctionallumerDrapeau():
>Allumeundestroisdrapeaux
>paramtre:lenumrodudrapeauallumer(note:sileparamtreest1,onteinttoutesles
*/

voidallumerDrapeau(intnumLed)
{
//OncommenceparteindrelestroisLED
for(intj=0j<3j++)
{
digitalWrite(leds[j],HIGH)
}
//puisonallumeuneseuleLEDsibesoin
if(numLed!=1)
{
digitalWrite(leds[numLed],LOW)
}

/*Note:vouspourrezamliorercettefonctionen
vrifiantparexemplequeleparamtrene
dpassepaslenombreprsentdeLED
*/
}

//teintlesLEDetfaisclignoterlaLEDrougeenattendantl'appuidubouton"sauveteur"

voidalerte(void)
{
longtemps=millis()
booleanclignotant=false
allumerDrapeau(1)//onteinttouteslesLED

//tantqueleboutondesauveteurn'estpasappuyonfaitclignotlaLEDrouge
while(digitalRead(btn_OK)!=LOW)

215

112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159

{
//S'ils'estcoul250msouplusdepuisladernirevrification
if(millis()temps>250)
{
//onchangel'tatdelaLEDrouge
clignotant=!clignotant//siclignotanttaitFALSE,ildevientTRUEetinversement
//laLEDestallumeaugrdelavariableclignotant
digitalWrite(leds[ROUGE],clignotant)
//onserappeldeladatededernierpassage
temps=millis()
}
}
}

intcomparerMot(charmot[])
{
//oncomparelesmots"VERT"(surveillant,calme)
if(strcmp(mot,"surveillant")==0)
{
returnVERT
}
if(strcmp(mot,"calme")==0)
{
returnVERT
}
//oncomparelesmots"ORANGE"(vague)
if(strcmp(mot,"vague")==0)
{
returnORANGE
}
//oncomparelesmots"ROUGE"(meduse,tempete,requin)
if(strcmp(mot,"meduse")==0)
{
returnROUGE
}
if(strcmp(mot,"tempete")==0)
{
returnROUGE
}
if(strcmp(mot,"requin")==0)
{
returnROUGE
}

//sionarienreconnuonrenvoiORANGE
returnORANGE
}

Je rappel que si vous navez pas russi faire fonctionner compltement votre
programme,aidezvousdeceluicipourcomprendrelepourquoiducommentqui
empchevotreprogrammedefonctionnercorrectement!Abonsentendeurs.

Amliorations
Jepeuxvousproposerquelquesidesdamliorationsquejenaipasmisesenoeuvre,
maisquimesontpassesparlatteaumomentojcrivaisceslignes:
216

Amliorationslogicielles
AveclanouvelleversiondArduino,laversion1.0,ilexisteunefonctionSerialEvent()
quiestexcutedsquilyaunvnementsurlavoiesriedumicrocontrleur.Je
vouslaisselesoindecherchercomprendrecommentellefonctionneetsutilise,sur
cettepage.

Amliorationsmatrielles
On peut par exemple automatiser le changement dun drapeau en utilisant un
systmemcaniqueavecunouplusieursmoteurslectriques.Ceseraitdansle
casdutilisationrelledecemontage,cestdiresuruneplage
UneliaisonfilaireentreunPCetunecarteArduino,cenestpastoujourslajoie.
Et puis bon, ce nest pas toujours facile davoir un PC sous la main pour
commander ce genre de montage. Alors pourquoi ne pas rendre la connexion
sansfil en utilisant par exemple des modules XBee ? Ces petits modules
permettentuneconnexionsansfilutilisantlavoiesriepourcommuniquer.Ainsi,
dunctvousavezlatlcommande(basedArduinoetdunmoduleXBee)de
lautrevousavezlercepteur,toujoursavecunmoduleXBeeetuneArduino,puis
lemontagedeceTPaveclamliorationprcdente.
Srieusementsicemontagevenaittreralitaveclesamliorationsquejevousai
donnes,prvenezmoiparMPetfaitesenunevidopourquelonpuisselajouteren
lienicimme!
Voilaunegrossetchedetermine!Jesprequellevousaplummesivousavezpu
rencontrer des difficults. Souvenezvous, vaincre sans difficult on triomphe sans
gloire,donctantmieuxsivousavezpassquelquesheuresdessuset,surtout,jespre
quevousavezapprisdeschosesetprisduplaisirfairevotremontage,ledompteret
lefairefonctionnercommevouslesouhaitiez!

[Arduino 304] [Annexe] Votre ordinateur et sa voie


sriedansunautrelangagedeprogrammation
MaintenantquevoussavezcommentutiliserlavoiesrieavecArduino,ilpeuttrebon
de savoir comment visualiser les donnes envoyes avec vos propres programmes
(lmulateurterminalWindowsoulemoniteursrieArduinonecomptentpas ).Cette
annexeadoncpourbutdevousmontrercommentutiliserlavoiesrieavecquelques
langages de programmation. Les langages utiliss cidessous ont t choisis
arbitrairement en fonction de mes connaissances, car je ne connais pas tous les
langagespossiblesetunefoisvuquelquesexemples,ilnedevraitpastretropdurde
lutiliseravecunautrelangage.Nousallonsdonctravailleravec:
AfindeseconcentrersurlapartieInformatique,nousallonsreprendreunprogramme
travaillprcdemmentdanslecours.Ceseraceluidelexercice:Attentionlacasse.
PensezdonclechargerdansvotrecarteArduinoavantdefairelestests.

EnC++avecQt
217

Avant de commencer cette souspartie, il est indispensable de connatre la


programmation en C++ et savoir utiliser le framework Qt. Si vous ne connaissez
pastoutcela,vouspouveztoujoursallervousrenseigneravecletutorielC++!
LeC++,OK,maispourquoiQt?
JaichoisidevousfairetravailleravecQtpourplusieursraisonsdordrespratiques.
Qt est multiplateforme, donc les rfractaires Linux (ou Windows) pourront
quandmmetravailler.
Dans le mme ordre dide, nous allons utiliser une librairie tierce pour nous
occuperdelavoiesrie.Ainsi,aucunproblmepourinterfacernotrematrielque
lonsoitsurunsystmeouunautre!
Enfin,jaimebeaucoupQtetdoncjevaisvousenfaireprofiter
Enfait,sachezquechaquesystmedexploitationsamaniredecommuniqueravec
lespriphriquesmatriels.Lutilisationdunelibrairietiercenouspermetdoncdefaire
abstraction de tout cela. Sinon il maurait fallu faire un tutoriel par OS, ce qui, on
limagine facilement, serait une perte de temps (crire trois fois environ les mmes
choses)etvraimentgalremaintenir.

InstallerQextSerialPort
QextSerialPort est une librairie tierce ralise par un membre de la communaut Qt.
Pour utiliser cette librairie, il faut soit la compiler, soit utiliser les sources directement
dansvotreprojet.

1retape:tlchargerlessources
Le dbut de tout cela commence donc par rcuprer les sources de la librairie. Pour
cela,rendezvoussurlapagegooglecodeduprojet.Apartirdicivousavezplusieurs
choix.Soitvousrcuprezlessourcesenutilisantlegestionnairedesourcemercurial
(Hg).Ilsuffitdefaireunclonedudptaveclacommandesuivante:
1 hgclonehttps://code.google.com/p/qextserialport/

Sinon, vous pouvez rcuprer les fichiers un par un (une dizaine). Cest plus
contraignant mais a marche aussi si vous navez jamais utilis de gestionnaire de
sources(maiscestvraimentpluscontraignant!)
Cettederniremthodeestvraimentdconseille.Eneffet,vousvousretrouverez
aveclestrictminimum(fichierssourcessansexemplesoudocs).
LamanipulationestlammesousWindowsouLinux!

Compilerlalibrairie
Maintenantquenousavonstousnosfichiers,nousallonspouvoircompilerlalibrairie.
Pourcela,nousallonslaisserQttravaillernotreplace.
218

DmarrezQtCreatoretouvrezlefichier.prodeQextSerialPort
Compilez
Cestfini!
Normalementvousavezunnouveaudossierctdeceluidessourcesquicontient
desexemples,ainsiqueleslibrairiesQExtSerialPort.

Installerlalibrairie:SousLinux
Une fois que vous avez compil votre nouvelle librairie, vous allez devoir placer les
fichiers aux bons endroits pour les utiliser. Les librairies, qui sont apparues dans le
dossier build qui vient dtre cr, vont tre dplaces vers le dossier /usr/lib. Les
fichierssourcesquitaientaveclefichier.propourlacompilationsontcopierdans
unsousdossierQextSerialPortdanslerpertoiredetravaildevotreprojetcourant.
Aprioriilyauraitunbugaveclacompilationenmoderelease(lalibrairiegnre
nefonctionneraitpascorrectement).Jevousinvitedonccompileraussiladebug
ettravailleravec.

Installerlalibrairie:SousWindows
Cepointestencoursderdaction,mercidepatienteravantsamiseenligne.

Infosrajouterdansle.pro
Dans votre nouveau projet Qt pour traiter avec la voie srie, vous aller rajouter les
lignessuivantesvotre.pro:
1
2
3
4

INCLUDEPATH+=QextSerialPort

CONFIG(debug,debug|release):LIBS+=lqextserialportd
else:LIBS+=lqextserialport

LaligneINCLUDEPATHreprsenteledossierovousavezmislesfichierssources
deQextSerialPort.Lesdeuxautreslignesfontlelienversleslibrairiescopiesplustt
(les.sooules.dllselonvotreOS).

Lestrucsutiles
Linterfaceutilise
Comme expliqu dans lintroduction, nous allons toujours travailler sur le mme
exercice et juste changer le langage tudi. Voici donc linterface sur laquelle nous
allonstravailler,etquelssontlesnomsetlestypesdobjetsinstancis:

219

Cette interface possde deux parties importantes : La gestion de la connexion (en


haut) et lchange de rsultat (milieu > mission, bas > rception). Dans la partie
suprieure,nousallonschoisirleportdelordinateursurlequelcommuniquerainsique
lavitessedecettecommunication.Ensuite,deuxbotesdetextesontprsentes.Lune
pour crire du texte mettre, et lautre affichant le texte reu. Voici les noms que
jutiliseraidansmoncode:
Widget
Nom
Rle
QComboBox comboPort
Permetdechoisirleportsrie
QComboBox comboVitesse Permetdechoisirlavitessedecommunication
QButton
btnconnexion (D)Connectelavoiesrie(boutoncheckable)
QTextEdit
boxEmission Nouscrironsiciletexteenvoyer
QTextEdit
boxReception Iciapparaitraletexterecevoir

Listerlesliaisonssries
Avantdecreretdutiliserlobjetpourgrerlavoiesrie,nousallonsenvoirquelques
unspouvanttreutiles.Toutdabord,nousallonsapprendreobtenirlalistedesports
srieprsentssurnotremachine.Pourcela,unobjetatcrspcialement,ilsagit
deQextPortInfo.Voiciunexempledecodeleurpermettantdefonctionnerensemble:
1
2
3
4

//L'objetmentionnantlesinfos
QextSerialEnumeratorenumerateur
//onmetcesinfosdansuneliste
QList<QextPortInfo>ports=enumerateur.getPorts()

Une fois que nous avons rcupr une numration de tous les ports, nous allons
pouvoirlesajouteraucomboboxquiestcenslesafficher(comboPort).Pourcelaonva
parcourir la liste construite prcdemment et ajouter chaque fois une item dans le
220

menudroulant:
1 //onparcourtlalistedesports
2 for(inti=0i<ports.size()i++)
3 ui>ComboPort>addItem(ports.at(i).physName)

LesportssontnommsdiffremmentsousWindowsetLinux,nesoyezdoncpas
surprisavecmescapturesdcrans,ellesviennenttoutesdeLinux.
Une fois que la liste des ports est faite (attention, certains ports ne sont connects
rien),onvaconstruirelalistedesvitesses,pourselaisserlechoixlejourolonvoudra
faireuneapplicationunevitessediffrente.Cetteoprationnestpastrscomplique
puisquelle consiste simplement ajouter des items dans la liste droulante
comboVitesse.
1
2
3
4
5
6
7
8
9
10

ui>comboVitesse>addItem("300")
ui>comboVitesse>addItem("1200")
ui>comboVitesse>addItem("2400")
ui>comboVitesse>addItem("4800")
ui>comboVitesse>addItem("9600")
ui>comboVitesse>addItem("14400")
ui>comboVitesse>addItem("19200")
ui>comboVitesse>addItem("38400")
ui>comboVitesse>addItem("57600")
ui>comboVitesse>addItem("115200")

Votreinterfaceestmaintenantprte.Enladmarrantmaintenantvousdevrieztreen
mesuredevoirsafficherlesnomsdesportssriesexistantsurlordinateurainsiqueles
vitesses.Unclicsurleboutonneferavidemmentrienpuisquesoncomportementnest
pasencoreimplment.

Greruneconnexion
Lorsquetouslesdtailsconcernantlinterfacesonttermins,nouspouvonspasserau
cur de lapplication : la communicationsrie. La premire tape pour pouvoir faire
une communication est de se connecter (tout comme vous vous connectez sur une
borne WiFi avant de communiquer et dchanger des donnes avec cette dernire).
Cest le rle de notre bouton de connexion. A partir du systme de slot automatique,
nous allons crer une fonction qui va recevoir le clic de lutilisateur. Cette fonction
instanciera un objet QextSerialPort pour crer la communication, rglera cet objet et
enfin ouvrira le canal. Dans le cas o le bouton tait dj coch (puisquil sera
checkable rappelonsle) nous ferons la dconnexion, puis la destruction de lobjet
QextSerialPortcrauparavant.Pourcommencernousallonsdoncdclarerlesobjets
etmthodesutilesdansle.hdelaclasseaveclaquellenoustravaillons:
1
2
3
4
5
6
7
8
9
10

private:
//l'objetreprsentantleport
QextSerialPort*port

//unefonctionutilequej'expliqueraisaprs
BaudRateTypegetBaudRateFromString(QStringbaudRate)

privateslots:
//leslotautomatiqueduboutondeconnexion
voidon_btnconnexion_clicked()

221

Ensuite, il nous faudra instancier le slot du bouton afin de traduire un comportement.


Pourrappel,ildevra:
CrerlobjetportdetypeQextSerialPort
Lergleraveclesbonsparamtres
Ouvrirlavoiesrie
Danslecasolavoiesrieestdjouverte(leboutonestdjappuy)ondevrala
fermeretdtruirelobjet.Voicilecodecommentpermettantlouverturedelavoiesrie
(quelquesprcisionsviennentensuite):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

//Slotpourleclicksurleboutondeconnexion
voidFenetre::on_btnconnexion_clicked(){
//deuxcasdefiguresgrer,soitoncoche(connecte),soitondcoche(dconnecte)

//oncoche>connexion
if(ui>btnconnexion>isChecked()){
//onessaiedefairelaconnexionaveclacarteArduino
//oncommenceparcrerl'objetportsrie
port=newQextSerialPort()
//onrgleleportutilis(slectionndanslalistedroulante)
port>setPortName(ui>ComboPort>currentText())
//onrglelavitesseutilise
port>setBaudRate(getBaudRateFromString(ui>comboVitesse>currentText()))
//quelquesrglagespourquetoutmarchebien
port>setParity(PAR_NONE)//parit
port>setStopBits(STOP_1)//nombredebitsdestop
port>setDataBits(DATA_8)//nombredebitsdedonnes
port>setFlowControl(FLOW_OFF)//pasdecontrledeflux
//ondmarre!
port>open(QextSerialPort::ReadWrite)
//changelemessagedubouton
ui>btnconnexion>setText("Deconnecter")

//onfaitlaconnexionpourpouvoirobtenirlesvnements
connect(port,SIGNAL(readyRead()),this,SLOT(readData()))
connect(ui>boxEmission,SIGNAL(textChanged()),this,SLOT(sendData()))
}
else{
//onsedconnectedelacarteArduino
port>close()
//puisondtruitl'objetportsriedevenuinutile
deleteport
ui>btnconnexion>setText("Connecter")
}
}

Cecodenestpastrscompliqucomprendre.Cependantquelquespointsmritent
votreattention.Pourcommencer,pourrglerlavitesseduportsrieonfaitappella
fonctionsetBaudRate.CettefonctionprendunparamtredetypeBaudRateTypequi
faitpartiedunenumrationdeQextSerialPort.AfindefairelelienentrelecomboBox
qui possde des chaines et le type particulier attendu, on cre et utilise la fonction
getBaudRateFromString.ApartirdunsimpleBaudRateType.
1
2
3
4

BaudRateTypeFenetre::getBaudRateFromString(QStringbaudRate){
intvitesse=baudRate.toInt()
switch(vitesse){
case(300):returnBAUD300

222

5
6
7
8
9
10
11
12
13
14
15
16

case(1200):returnBAUD1200
case(2400):returnBAUD2400
case(4800):returnBAUD4800
case(9600):returnBAUD9600
case(14400):returnBAUD14400
case(19200):returnBAUD19200
case(38400):returnBAUD38400
case(57600):returnBAUD57600
case(115200):returnBAUD115200
default:returnBAUD9600
}
}

Un autre point important regarder est lutilisation de la fonction open() de lobjet


QextSerialPort.Eneffet,ilexisteplusieursfaonsdouvrirunportsrie:
Enlectureseule>QextSerialPort::ReadOnly
Encritureseule>QextSerialPort::WriteOnly
Enlecture/criture>QextSerialPort::ReadWrite
Ensuite,onconnectesimplementlessignauxmisparlavoiesrieetparlaboitede
texteservantlmission(quelonverrajusteaprs).Enfin,lorsquelutilisateurreclic
surlebouton,onpassedansleNULL).
Cecodeprsenteleprincipeetnestpasparfait!Ilfaudraitparexemplesassurer
que le port est bien ouvert avant denvoyer des donnes (faire un test if(port>isOpen())parexemple).

mettreetrecevoirdesdonnes
Maintenantquelaconnexionesttablie,nousallonspouvoirenvoyeretrecevoirdes
donnes.Ceseralerlededeuxslotsquionttbrivementvoqusdanslafonction
connect()ducodedeconnexionprcdent.

mettredesdonnes
LmissiondesdonnesseferadansleslotsendData.Ceslotseraappelchaque
foisquilyauraunemodificationducontenudelabotedetexteboxEmission.Pour
lapplicationconcerne(lenvoidunseulcaractre),ilnoussuffitdechercherledernier
caractre tap. On rcupre donc le dernier caractre du texte contenu dans la boite
avant de lenvoyer sur la voie srie. Lenvoi de texte se fait partir de la fonction
toAscii()etonpeutdonclesutiliserdirectement.Voicilecodequiillustretoutesces
explications(nepasoublierdemettrelesdclarationsdesslotsdansle.h):
1
2
3
4
5
6
7

voidFenetre::sendData(){
//Onrcuprelederniercaractretap
QStringcaractere=ui>boxEmission>toPlainText().right(1)
//sileportestinstanci(doncouvertapriori)
if(port!=NULL)
port>write(caractere.toAscii())
}

Recevoirdesdonnes
223

Le programme tudi est cens nous rpondre en renvoyant le caractre mis mais
dansunecasseoppose(majusculecontreminusculeetviceversa).Entempsnormal,
deux politiques diffrentes sappliquent pour savoir si des donnes sont arrives. La
premireestdallervoirdemanirergulire(oupas)sidescaractressontprsents
dansletamponderceptiondelavoiesrie.CettemthodeditedePollingnestpas
trs frquemment utilise. La seconde est de dclencher un vnement lorsque des
donnesarriventsurlavoiesrie.Cestlaformequiestutilisepardfautparlobjet
readyRead())estmisparlobjetetpeutdonctreconnectunslot.Pourchangerle
modedefonctionnement,ilfaututiliserlamthode QextSerialPort::EventDrivenpour
laseconde(pardfaut).Commelaconnexionentrelesignaletleslotestcredansla
fonctiondeconnexion,ilnenousrestequcrirelecomportementduslotderception
lorsquunedonnearrive.Letravailestsimpleetsersumeendeuxtapes:
LirelecaractrereugrcelafonctionQextSerialPort
Lecopierdanslaboitedetexterception
1
2
3
4

voidFenetre::readData(){
QByteArrayarray=port>readAll()
ui>boxReception>insertPlainText(array)
}

Et voil, vous tes maintenant capable de travailler avec la voie srie dans vos
programmesQtenC++.Aurisquedemerpter,jesuisconscientquilyadeslacunes
entermedescuritetdefficacit.Cecodeapourbutdevousmontrerlesbasesde
la classe pour que vous puissiez continuer ensuite votre apprentissage. En effet, la
programmationC++/Qtnestpaslesujetdecetutoriel.:ninja:Nous vous serons donc reconnaissants de
nepasnousharcelerdecommentairesrelatifsaututopournousdirebwaaaacestmalcod.Merci!

EnC#(.Net)
Dans cette partie (comme dans les prcdentes) je pars du principe que vous
connaissezlelangageetavezdjdessindesinterfacesetcrdesactionssur
desboutonsparexemple.CettesouspartienestpaslpourvousapprendreleC#
!
Lencorejevaisreprendrelammestructurequelesprcdentessousparties.

Lestrucsutiles
Linterfaceetlesimports
Voicitoutdesuitelinterfaceutilise!Jevousdonneraijusteaprslenomquejutilise
pourchacundescomposants(ettantqufairejevousdonneraiaussileurstypes).

224

Comme cette interface est la mme pour tout ce chapitre, nous retrouvons comme
dhabitudelebandeaupourgrerlaconnexionainsiquelesdeuxbotesdetextepour
lmissionetlarceptiondesdonnes.Voicilestypesdobjetsetleursnomspourle
bandeaudeconnexion:
Composant
Nom
System.Windows.Forms.ComboBox comboPort

Rle
Permetdechoisirleportsrie
Permetdechoisirlavitessede
System.Windows.Forms.ComboBox comboVitesse
communication
(D)Connectelavoiesrie(bouton
System.Windows.Forms.Button
btnConnexion
checkable)
System.Windows.Forms.TextBox
boxEmission Nouscrironsiciletexteenvoyer
System.Windows.Forms.TextBox
boxReception Iciapparaitraletexterecevoir
Avant de commencer les choses marrantes, nous allons dabord devoir ajouter une
librairie:celledesliaisonssries.Ellesenommesimplementusing System.IO.Ports;.
Nous allons en profiter pour rajouter une variable membre de la classe de type
SerialPortquejappelleraiport.Cettevariablereprsentera,vouslavezdevin,notre
portsrie!
1 SerialPortport

Maintenantquetouslesoutilssontprts,nouspouvonscommencer!

Listerlesliaisonssries
La premire tape sera de lister lensemble des liaisons sries sur lordinateur. Pour
celanousallonsnousservirdunefonctionstatiquedelaclasse String.Chaquecase
225

dutableauseraunechanedecaractrecomportantlenomdunevoiesrie.Unefois
quenousavonscetableau,nousallonslajoutersurlinterface,danslalistedroulante
prvue cet effet pour pouvoir laisser le choix lutilisateur au dmarrage de
lapplication.Danslemmelan,onvapeuplerlalistedroulantedesvitessesavec
quelquesunes des vitesses les plus courantes. Voici le code de cet ensemble.
Personnellementjelaiajoutdanslamthode InitializeComponent()quichargeles
composants.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

privatevoidForm1_Load(objectsender,EventArgse)
{
//oncommenceparlisterlesvoiessriesprsentes
String[]ports=SerialPort.GetPortNames()//fonctionstatique
//onajoutelesportsaucombobox
foreach(Stringsinports)
comboPort.Items.Add(s)

//onajoutelesvitessesaucombodesvitesses
comboVitesse.Items.Add("300")
comboVitesse.Items.Add("1200")
comboVitesse.Items.Add("2400")
comboVitesse.Items.Add("4800")
comboVitesse.Items.Add("9600")
comboVitesse.Items.Add("14400")
comboVitesse.Items.Add("19200")
comboVitesse.Items.Add("38400")
comboVitesse.Items.Add("57600")
comboVitesse.Items.Add("115200")
}

Si vous lancez votre programme maintenant avec la carte Arduino connecte, vous
devriezavoirlechoixdesvitessesmaisaussidaumoinsunportsrie.Sicenestpas
lecas,ilfauttrouverpourquoiavantdepasserlasuite(Vrifiezquelacarteestbien
connecteparexemple).

Greruneconnexion
Unefoisquelacarteestreconnueetquelonvoitbiensonportdanslalistedroulante,
nousallonspouvoirouvrirleportpourtablirlecanaldecommunicationentreArduino
et lordinateur. Comme vous vous en doutez surement, la fonction que nous allons
crireestcelleduclicsurlebouton.Lorsquenouscliquonssurleboutondeconnexion,
deuxactionspeuventtreeffectuesselonltatprcdent.Soitnousnousconnectons,
soitnousnousdconnectons.Lesdeuxcasserontgrsenregardantletextecontenu
danslebouton(ConnecterouDeconnecter).Danslecasdeladconnexion,ilsuffit
defermerleportlaidedelamthodeclose().Danslecasdelaconnexion,plusieurs
chosessontfaire.Danslordre,nousallonscommencerparinstancierunnouvelobjet
detype BaudRateetainsidesuite.Voicilecodecommentpourfairetoutcela.Ilya
cependant un dernier point voqu rapidement juste aprs et sur lequel nous
reviendronsplustard.
1
2
3
4
5
6
7

privatevoidbtnConnexion_Click(objectsender,EventArgse)
{
//ongrelaconnexion/dconnexion
if(btnConnexion.Text=="Connecter")//alorsonconnecte
{
//creunnouvelobjetvoiesrie
port=newSerialPort()

226

8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

//rglelavoiesrie
//parseenintlecombodesvitesses
port.BaudRate=int.Parse(comboVitesse.SelectedItem.ToString())
port.DataBits=8
port.StopBits=StopBits.One
port.Parity=Parity.None
//rcuprelenomslectionn
port.PortName=comboPort.SelectedItem.ToString()

//ajouteungestionnairederceptionpourlarceptiondedonnesurlavoiesrie
port.DataReceived+=newSerialDataReceivedEventHandler(DataReceivedHandler)

port.Open()//ouvrelavoiesrie

btnConnexion.Text="Deconnecter"
}
else//sinonondconnecte
{
port.Close()//fermelavoiesrie
btnConnexion.Text="Connecter"
}
}

Lepointquipeutparatretrangeestlaligne16,aveclapropritHandler()quidevra
tre appele lorsque des donnes arriveront. Je vais vous demander dtre patient,
nousenreparleronsplustardlorsquenousverronslarceptiondedonnes.Acestade
du dveloppement, lorsque vous lancez votre application vous devriez pouvoir
slectionner une voie srie, une vitesse, et cliquer sur Connecter et Dconnecter
sansaucunbug.

mettreetrecevoirdesdonnes
Lavoiesrieestprtetreutilise!Laconnexionestbonne,ilnenousresteplus
quenvoyerlesdonnesetespreravoirquelquechoseenretour.

Envoyerdesdonnes
Pour envoyer des donnes, une fonction toute prte existe pour les objets char qui
seraitenvoyunparun.Dansnotrecasdutilisation,cestcedeuximecasquinous
intresse. Nous allons donc implmenter la mthode TextChanged du composant
boxEmission afin de dtecter chaque caractre entr par lutilisateur. Ainsi, nous
enverrons chaque nouveau caractre sur la voie srie, un par un. Le code suivant,
comment,vousmontrelavoiesuivre.
1
2
3
4
5
6
7
8
9
10

//lorsd'unenvoidecaractre
privatevoidboxEmission_TextChanged(objectsender,EventArgse)
{
//metlederniercaractredansuntableauavecuneseulecaselecontenant
char[]car=newchar[]{boxEmission.Text[boxEmission.TextLength1]}
//ons'assurequeleportestexistantetouvert
if(port!=null&&port.IsOpen)
//envoieletableaudecaractre,depuislaposition0,etenvoie1seullment
port.Write(car,0,1)
}

227

Recevoirdesdonnes
La dernire tape pour pouvoir grer de manire complte notre voie srie est de
pouvoirafficherlescaractresreus.Cettetapeestunpetitpeupluscomplique.Tout
dabord,revenonslexplicationcommenceunpeuplustt.Lorsquenousdmarrons
la connexion et crons lobjet boxReception. Dans lidal nous aimerions faire de la
faonsuivante:
1
2
3
4
5
6

//gestionnairedelarceptiondecaractre
privatevoidDataReceivedHandler(objectsender,SerialDataReceivedEventArgse)
{
Stringtexte=port.ReadExisting()
boxReception.Text+=texte
}

Cependant, les choses ne sont pas aussi simples cette foisci. En effet, pour des
raisons de scurit sur les processus, C# interdit que le texte dun composant
(boxReception)soitmodifidemanireasynchrone,quandlesdonnesarrivent.Pour
contourner cela, nous devons crer une mthode dlgue qui on passera notre
texteafficheretquisechargeradafficherletextequandlinterfaceseraprte.Pour
crercettedlgue,nousallonscommencerparrajouterunemthodeditedecallback
pourgrerlamisejourdutexte.Lalignesuivanteestdoncajouterdanslaclasse,
commemembre:

1 //unedlguepourpouvoirmettrejourletextedelaboitederceptiondemanire"threadsafe"
2 delegatevoidSetTextCallback(stringtext)

Lecodedelarceptiondevientalorslesuivant:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

//gestionnairedelarceptiondecaractre
privatevoidDataReceivedHandler(objectsender,SerialDataReceivedEventArgse)
{
Stringtexte=port.ReadExisting()
//boxReception.Text+=texte
SetText(texte)
}

privatevoidSetText(stringtext)
{
if(boxReception.InvokeRequired)
{
SetTextCallbackd=newSetTextCallback(SetText)
boxReception.Invoke(d,newobject[]{text})
}
else
{
boxReception.Text+=text
}
}

Jesuisdsolsimesinformationssontconfuses.Jenesuismalheureusementpas
un maitre dans lart des threads UI de C#. Cependant, un tas de documentation
mieuxexpliquexistesurinternetsivousvoulezplusdedtails.
Unefoistoutcelainstanci,vousdevriezavoirunterminalvoiesrietoutbeaufaitpar
228

vous mme ! Libre vous maintenant toutes les cartes en main pour crer des
applications qui communiqueront avec votre Arduino et feront des changes
dinformationsavec.

EnPython
Commecelangagelairdtreenvogue,jemesuisunpeupenchdessuspourvous
fourniruneapprochedecommentutiliserpythonpourseservirdelavoiesrie.Mon
niveau en python tant quivalent grand dbutant, je vais vous proposer un code
simplereprenantlesfonctionsutilessavoirletoutsansinterfacegraphique.Nuldoute
quelespythonisteschevronnssaurontcreuserplusloin
Comme pour les exemples dans les autres langages, on utilisera lexercice
AttentionlacassedanslArduinopourtesternotreprogramme.
Pour communiquer avec la voie srie, nous allons utiliser une librairie externe qui
sappellepySerial.

Installation
Ubuntu
PourinstallerpySerialsurvotreunemachineUbuntucesttrssimple,ilsuffitdelancer
uneseulecommande:
1 sudoaptgetinstallpython3serial

Vous pouvez aussi linstaller partir des sources ladresse suivante :


https://pypi.python.org/pypi/pyserial. Ensuite, dcompresser larchive et excuter la
commande:(pourpython2)
1 pythonsetup.pyinstall

(pourpython3)
1 python3setup.pyinstall

Windows
SI vous utilisez Windows, il vous faudra un logiciel capable de dcompresser les
archivesdetypestar.gz(comme7zipparexemple).Ensuitevousdevrezrcuprerles
sourceslammeadressequepourLinux:https://pypi.python.org/pypi/pyserialEnfin,
commepourLinuxencoreilvoussuffiradexcuterlacommandequivabien:
1 pythonsetup.pyinstall

Utiliserlalibrairie
Pour utiliser la librairie, il vous faudra tout dabord limporter. Pour cela, on utilise la
commandeimport:
229

1 importserial

mais comme seule une partie du module nous intresse vraiment (Serial) on peut
restreindre:
1 fromserialimportSerial

(notezlimportancedesmajuscules/minuscules)

Ouvrirunportsrie
Maintenantquelemoduleestbiencharg,nousallonspouvoircommencerlutiliser.
Lapremirechoseimportantefaireestdeconnatreleportsrieutiliser.Onpeut
obtenirunelistedecesderniersgrcelacommande:
1 pythonmserial.tools.list_ports

Sicommechezmoicelanefonctionnepas,vouspouvezutiliserdautresmthodes.
SousWindows:enallantdanslegestionnairedepriphriquespourtrouverle
portsrieconcern(COMx)
SousLinux:enutilisantlacommande ls /dev,vouspourreztrouverlenomdu
portsriesouslenomttyACMxparexemple

LorsqueleportUSBestidentifi,onpeutcrerunobjetdetypeSerial.Leconstructeur
quelonvautiliserprenddeuxparamtres,lenomduportsrieetlavitesseutiliser
(lesautresparamtres(parit)conviennentpardfaut).
1 port=Serial('/dev/ttyACM0',9600)

Unefoiscetobjetcr,laconnexionpeuttreouverteaveclafonctionopen()
1 port.open()

Pourvrifierquelavoiesrieestbienouverte,onutiliseralamthodeisOpen()qui
retourneunboolenvraisilaconnexionesttablie.

Envoyerdesdonnes
Maintenantquelavoiesrieestouverte,nousallonspouvoirluienvoyerdesdonnes
traiter.Pourlebiendelexercice,ilnousfautrcuprerun(des)caractre(s)envoyer
etretourneraveclacasseinverse.Nousallonsdonccommencerparrcuprerune
chanedecaractredelutilisateur:
1 chaine=input("Quevoulezvoustransformer?")

230

Puisnousallonssimplementlenvoyeraveclafonctionwrite.Cettefonctionprenden
paramtre un tableau de bytes. Nous allons donc transformer notre chane pour
convenirceformataveclafonctionpythonbytes()quiprendenparamtreslachaine
decaractresetleformatdencodage.
1 bytes(chaine,'UTF8')

Cetableaupeutdirectementtreenvoydanslafonctionwrite():
1 port.write(bytes(chaine,'UTF8'))

Recevoirdesdonnes
Lasuitelogiquedeschosesvoudraitquelonrussisserecevoirdesdonnes.Cest
ce que nous allons voir maintenant. Nous allons tout dabord vrifier que des
donnessontarrivessurlavoiesrievialamthodeinWaiting().Cettedernirenous
renvoie le nombre de caractres dans le buffer de rception de la voie srie. Sil est
diffrentde0,celasignifiequilyadesdonneslire.Silyadescaractres,nous
allons utiliser la fonction read() pour les rcuprer. Cette fonction retourne les
caractres(byte)unparundanslordreoilsontarrivs.Unexempledercupration
decaractrepourraittre:
1 while(port.inWaiting()!=0):
2 car=port.read()#onlituncaractre
3 print(car)#onl'affiche

Vousensavezmaintenantpresqueautantquemoisurlavoiesrieenpython !Je
suisconscientquecestassezmaigrecomparauxautreslangages,maisjenevais
pasnonplusapprendretoutleslangagesdumonde

Codeexemplecompletetcomment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#!/usr/bin/python3
#*coding:Utf8*

fromserialimportSerial
importtime

port=Serial('/dev/ttyACM0',9600)

port.open()

if(port.isOpen()):#testqueleportestouvert
chaine=input("Quevoulezvoustransformer?")#demandedelachaneenvoyer
port.write(bytes(chaine,'UTF8'))#oncritlachaneenquestion
while(port.inWaiting()==0):#attendquedesdonnessoitrevenues
#onattend0.5secondepourquelesdonnesarrive
time.sleep(0.5)

#sionarrivel,desdonnessontarrives
while(port.inWaiting()!=0):#ilyadesdonnes!
car=port.read()#onlituncaractre
print(car)#onl'affiche
else:
print("Leportn'apasputreouvert!")

231

Cetteannexevousaurapermisdecomprendreunpeucommentutiliserlavoiesrieen
gnralavecunordinateur.Avecvosconnaissancesvoustesdornavantcapablede
crer des interfaces graphiques pour communiquer avec votre arduino. De grandes
possibilits soffrent vous, et de plus grandes vous attendent avec les parties qui
suivent

232

[Arduino4]Lesgrandeursanalogiques
Danscettepartie,jevaisintroduirelanotiondegrandeuranalogiquequisontopposes
augrandeurslogiques.Grcecechapitre,vousserezensuitecapabledutiliserdes
capteurspourinteragiraveclenvironnementautourdevotrecarteArduino,oubiendes
actionneurstelsquelesmoteurs.

[Arduino401]LesentresanalogiquesdelArduino
Cepremierchapitrevavousfairedcouvrircommentgrerdestensionsanalogiques
avecvotrecarteArduino.Vousallezdabordprendreenmainlefonctionnementdun
certain composant essentiel la mise en forme dun signal analogique, puis je vous
expliquerai comment vous en servir avec votre Arduino. Rassurezvous, il ny a pas
besoindematrielsupplmentairepourcechapitre!

Unsignalanalogique:petitsrappels
Faisons un petit rappel sur ce que sont les signaux analogiques. Dabord, jusqu
prsentnousnavonsfaitquutiliserdesgrandeursnumriquesbinaires.Autrementdit,
nous navons utilis que des tats logiques HAUT et BAS. Ces deux niveaux
correspondent respectivement aux tensions de 5V et 0V. Cependant, une valeur
analogique ne se contentera pas dtre exprime par 0 ou 1. Elle peut prendre une
infinitdevaleursdansunintervalledonn.Dansnotrecas,parexemple,lagrandeur
analogique pourra varier aisment de 0 5V en passant par 1.45V, 2V, 4.99V, etc.
Voiciunexempledesignalanalogique,letrsconnusignalsinusodal:

Onretiendraquelonnesoccupequedelatensionetnonducourant,enfonction
dutemps.
Sionessayedemettrecesignal(cequejevousdconseilledefaire)suruneentre
numriquedelArduinoetquonlitlesvaleursavecdigitalRead(),onneliraque0ou1.
Les broches numriques de lArduino tant incapable de lire les valeurs dun signal
analogique.
233

Signalpriodique
Dans la catgorie des signaux analogiques et mme numriques (dans le cas
dhorlogedesignalpourlecadencementdesmicrocontrleursparexemple)onales
signauxditspriodiques.Lapriodedunsignalestenfaitunmotifdecesignalqui
serpteetquidonneainsilaformedusignal.Prenonslexempledunsignalbinaire
quiprendunniveaulogique1puisun0,puisun1,puisun0,

Lapriodedecesignalestlemotifquiserptetantquelesignalexiste.Ici,cestle
niveaulogique1et0quiformelemotif.Maiscelaauraitputre11et0,oubien011,
voir000111,lespossibilitssontinfinies!Pourunsignalanalogique,ilenvade
mme.Reprenonslesignaldetoutlheure:

Icilemotifquiserpteestlabossedechameauouplusscientifiquementparlant:
unepriodedunsignalsinusodal. Pourterminer,lapriodedsigneaussiletemps
quemetunmotifserpter.Sijaiunepriodede1ms,celaveutdirequelemotifmet
1mspoursedessinercompltementavantdecommencerlesuivant.Etensachantle
nombredefoisqueserptelemotifen1seconde,onpeutcalculerlafrquencedu
signalselonlaformulesuivante:F = T1 avecFlafrquence,enHertz,dusignaletT
lapriode,enseconde,dusignal.

Notreobjectif
Lobjectif va donc tre double. Tout dabord, nous allons devoir tre capables de
convertir cette valeur analogique en une valeur numrique, que lon pourra ensuite
manipuler lintrieur de notre programme. Par exemple, lorsque lon mesurera une
tensionde2,5Vnousauronsdansnotreprogrammeunevariablenommetensionqui
prendralavaleur250lorsquelonferalaconversion(cenestquunexemple).Ensuite,
nousverronsavecArduinocequelonpeutfaireaveclessignauxanalogiques.Jene
vousendispasplus

234

Lesconvertisseursanalogiques>
numriqueouCAN
Questcequecest?
Cest un dispositif qui va convertir des grandeurs analogiques en grandeurs
numriques.Lavaleurnumriqueobtenueseraproportionnellelavaleuranalogique
fournie en entre, bien videmment. Il existe diffrentes faons de convertir une
grandeuranalogique,plusoumoinsfacilesmettreenuvre,plusoumoinsprcises
et plus ou moins onreuses. Pour simplifier, je ne parlerai que des tensions
analogiquesdanscechapitre.

Ladiversit
Jevaisvousciterquelquestypesdeconvertisseurs,sachezcependantquenousnen
tudieronsquunseultype.
Convertisseursimplerampe:ceconvertisseurfabriqueunetensionquivarie
proportionnellementenuncourslapsdetempsentredeuxvaleursextrmes.En
mmetempsquilproduitcettetension,ilcompte.Lorsquelatensiondentredu
convertisseur devient gale la tension gnre par ce dernier, alors le
convertisseurarrtedecompter.Etpourterminer,aveclavaleurducompteur,il
dtermine la valeur de la grandeur dentre. Malgr sa bonne prcision, sa
conversionresteassezlenteetdpenddelagrandeurmesurer.Ilest,decefait,
peuutilis.
Convertisseur flash : ce type de convertisseur gnre lui aussi des tensions
analogiques.Pourtreprcis,ilengnreplusieurs,chacuneayantunevaleur
plus grande que la prcdente (par exemple 2V, 2.1V, 2.2V, 2.3V, etc.) et
compare la grandeur dentre chacun de ces paliers de tension. Ainsi, il sait
entrequelleetquellevaleursetrouvelatensionmesure.Cenestpastrsprcis
commemesure,maisilalavantagedtrerapideetmalheureusementcher.
Convertisseur approximations successives : Pour terminer, cest ce
convertisseurquenousallonstudier

ArduinodisposedunCAN
VousvousdoutezbienquesijevousparledesCAN,cestquilyauneraison.Votre
carteArduinodisposedunteldispositifintgrdanssoncur:lemicrocontrleur.Ce
convertisseurestunconvertisseurapproximationssuccessives.Jevaisdtaillerun
peupluslefonctionnementdececonvertisseurparrapportauxautresdontjenaifait
quunbrefaperudeleurfonctionnement(bienquesuffisant).
Ceci rentre dans le cadre de votre culture gnrale lectronique, ce nest pas
ncessaire de lire comment fonctionne ce type de convertisseur. Mais je vous
recommandevivementdelefaire,carilesttoujoursplusagrabledecomprendre
commentfonctionnentlesoutilsquonutilise!

Principededichotomie
235

Ladichotomie,avousparle?Peuttrequelenomnevousditrien,maisilestsrque
vousenconnaissezlefonctionnement.Peuttrealorsconnaissezvouslejeuplusou
moinsenprogrammation?Siouialorsvousallezpouvoircomprendrecequejevais
expliquer, sinon lisez le principe sur le lien que je viens de vous donner, cela vous
aidera un peu. La dichotomie est donc une mthode de recherche conditionnelle qui
sapplique lorsque lon recherche une valeur comprise entre un minimum et un
maximum. Lexemple du jeu plus ou moins est parfait pour vous expliquer le
fonctionnement. Prenons deux joueurs. Le joueur 1 choisit un nombre compris entre
deuxvaleursextrmes,parexemple0et100.Lejoueur2neconnaitpascenombreet
doitletrouver.Lamthodelaplusrapidepourquelejoueur2puissetrouverquelestle
nombrechoisiparlejoueur1est:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

Joueur1dit:"quelestlenombremystre?"
&gt40

Joueur1dit:"Cenombreestplusgrand"
&gt80

Joueur1dit:"Cenombreestpluspetit"
&gt60

Joueur1dit:"Cenombreestplusgrand"
&gt70

Joueur1dit:"Cenombreestplusgrand"
&gt75

Joueur1dit:"Cenombreestpluspetit"
&gt72

Bravo,Joueur2atrouvlenombremystre!

Je le disais, le joueur 2, pour arriver le plus rapidement au rsultat, doit choisir une
mthode rapide. Cette mthode, vous laurez devin, consiste couper en deux
lespacederecherche.Audbut,cetespaceallaitde0100,puisaudeuximeessai
de40100,autroisimeessaide4080,etc.
Cetexemplenestqutitreindicatifpourbiencomprendreleconcept.
Enconclusion,cettemthodeestvraimentsimple,efficaceetrapide!Peuttrelaurez
vous observ, on est pas oblig de couper lespace de recherche en deux parties
gales.

LeCANapproximationssuccessives
Onyvient,jevaispouvoirvousexpliquercommentilfonctionne.Voyezvouslerapport
aveclejeuprcdent?Pasencore?Alorsjemexplique.Prenonsduconcretavecune
valeur de tension de 3.36V que lon met lentre dun CAN approximations
successives(jabrgeraiparCANdornavant).

236

NotezlesymboleduCANquisetrouvejusteaudessusdelimage.Ilsagitdun
Urenversetducaractre#.
Cettetensionanalogiquede3.36VvarentrerdansleCANetvaressortirsousforme
numrique (avec des 0 et 1). Mais que se passetil lintrieur pour arriver un tel
rsultat ? Pour que vous puissiez comprendre correctement comment fonctionne ce
typedeCAN,jevaistreobligdevousapprendreplusieurschosesavant.

Lecomparateur
Commenonsparlecomparateur. Comme son nom le laisse deviner, cest quelque
chosequicompare.Cequelquechoseestuncomposantlectronique.Jenerentrerai
absolumentpasdansledtail,jevaissimplementvousmontrercommentilfonctionne.
Comparer,oui,maisquoi?
Destensions! Regardezsonsymbole,jevousexpliqueensuite

Vousobservezquildisposededeuxentres E 1 etE 2 etdunesortieS .Leprincipe


estsimple:
Lorsque la tension E 1 > E 2 alors S = +Vcc (+Vcc tant la tension
dalimentationpositiveducomparateur)
Lorsque la tension E 1 < E 2 alors S = Vcc (Vcc tant la tension
dalimentationngative,oulamasse,ducomparateur)
E 1 = E 2 estuneconditionquasimentimpossible,sitelestlecas(sionrelieE 1
etE 2 )lecomparateurdonneraunrsultatfaux
Parlonsunpeudelatensiondalimentationducomparateur.Lemeilleurdescasestde
237

lalimenterentre0Vet+5V.Commecela,sasortieserasoitgale0V,soitgale
+5V.Ainsi,onrentredansledomainedestensionsacceptesparlesmicrocontrleurs
etdeplusilverrasoituntatlogiqueBAS,soituntatlogiqueHAUT.Onpeutrcrire
lesconditionsprcdemmentnoncescommececi:

E 1 > E 2 alorsS = 1
E 1 < E 2 alorsS = 0
E 1 = E 2 ,alorsS = indefini
Simplenestcepas?

Ledmultiplexeur
Maintenant,jevaisvousparlerdudmultiplexeur.Cestenfaitunnomunpeubarbare
pourdsigneruncomposantlectroniquequifaitdelaiguillagedeniveauxlogiques(il
en existe aussi qui font de laiguillage de tensions analogiques). Le principe est l
encoretrssimple.Ledmultiplexeurplusieurssorties,uneentreetdesentresde
slection:

E estlentreolonimposeunniveaulogique0ou1.
LessortiesS sontloseretrouveleniveaulogiquedentre.UNEseulesortie

peuttreactivelafoisetrecopierleniveaulogiquedentre.
Lesentres A permettentdeslectionnerquelleseralasortiequiestactive.La
slection se fait grce aux combinaisons binaires. Par exemple, si je veux
slectionner la sortie 4, je vais crire le code 0100 (qui correspond au chiffre
dcimal4)surlesentresA 1 A 4

238

Jerappelleque,pourlesentresdeslection,lebitdepoidsfortestA 4 etlebitde
poidsfaibleA 1 .Idempourlessorties,S 1 estlebitdepoidsfaibleetS 10 ,lebitde
poidsfort.

Lammoire
Cecomposantlectroniquesertsimplementstockerdesdonnessousformebinaire.

Leconvertisseurnumriqueanalogique
Pourcederniercomposantavantlactefinal,ilnyariensavoirsicenestquecest
lopposduCAN.Iladoncplusieursentresetuneseulesortie.Lesentresreoivent
desvaleursbinairesetlasortiedonnelersultatsousformedetension.

Fonctionnementglobal
Rentrons dans les explications du fonctionnement dun CAN approximations
successives.Jevousaifaitunpetitschmarassemblantleslmentsprcdemment
prsents:

239

VoildonccommentsecomposeleCAN.Sivousavezcomprislefonctionnementde
chacundescomposantsquileconstituent,alorsvousnaurezpastropdemalsuivre
mesexplications.Danslecascontraire,jevousrecommandederelirecequiprcde
et de bien comprendre et rechercher sur internet de plus amples informations si cela
vousestncessaire.
En
premier
commenons
par
conditionsinitiales:

lieu,
les

Ve est la tension

analogique dentre,
celle que lon veut
mesurer
en
la
convertissant
en
signalnumrique.
La mmoire contient
pour linstant que des
0saufpourlebitdepoidsfort(S 10 )quiest1.Ainsi,leconvertisseurnumrique
>analogiquevaconvertircenombrebinaireenunetensionanalogiquequiaura
pourvaleur2.5V.
Pourlinstant,ledmultiplexeurnentrepasenjeu.
Suivonslefonctionnementtapepartape:tape1:
JappliqueunetensionVe = 3.5100V prcisment.
LecomparateurcomparelatensionVcomp = 2.5V latension Ve = 3.5100V .
tant donn que Ve > Vcomp , on a un Niveau Logique 1 en sortie du
comparateur.
Le multiplexeur entre alors en jeux. Avec ses signaux de slections, il va
slectionnerlasortieayantlepoidslepluslev,soitS 10 .
La mmoire va alors enregistrer le niveau logique prsent sur la broche S 10 ,
dansnotrecascest1.
240

tape2:
Au niveau de la
mmoire, on change
le deuxime bit de
poidsfort(maismoins
fort que le premier)
correspondant la
broche S 9 en le
passant1.
En sortie du CNA, on
auraalorsunetension
de3.75V
Le
comparateur
compare,
il
voit
Vcomp > Ve donc il
donneuntatlogique
0.
Lammoireenregistre
alors le niveau sur la
brocheS 9 quiest0.
tape 3 : redondante aux
prcdentes
Onpasseletroisime
bitleplusfort(broche
S 8 )1.
Le CNA converti le
nombre
binaire
rsultant en une
tensionde3.125V .
Le comparateur voit
Ve > Vcomp ,sasortie
passe1.
Lammoireenregistre
ltat logique de la
brocheS 8 quiest1.
LeCANcontinuedecettemanirepourarriveraudernierbit(celuidepoidsfaible).En
mmoire, la fin de la conversion, se trouve le rsultat. On va alors lire cette valeur
binaire que lon convertira ensuite pour lexploiter. Bon, jai continu les calculs la
main(nayantpasdesimulateurpourlefairemaplace),voiciletableaudesvaleurs:
Poids
dubit
10
9
8
7

NLensortiedu
comparateur
1
0
1
1

Bitsstocksen
mmoire
1
0
1
1
241

Tensionensortiedu
convertisseurCNA(enV)
2.5
3.75
3.125
3.4375

6
5
4
3
2
1

0
0
1
1
1
0

0
0
1
1
1
0

3.59375
3.515625
3.4765625
3.49609375
3.505859375
3.5107421875

Rsultat:Lersultatdelaconversiondonne:
Rsultatdeconversion
(binaire)
1011001110

Rsultatdeconversion
(dcimale)
718

Rsultatdeconversion
(Volts)
3,505859375

Observez la prcision du convertisseur. Vous voyez que la conversion donne un


rsultat(trs)prochedelatensionrelle,maisellenestpasexactementgale.Ceciest
daupasduconvertisseur.

PasdecalculduCAN
Questce que le pas de calcul ? Eh bien il sagit de la tension minimale que le
convertisseurpuissevoir.Sijemetslebitdepoidsleplusfaible1,quelleserala
valeurdelatension Vcomp ?Leconvertisseuraunetensionderfrencede5V.Son
nombredebitestde10.Doncilpeutlire: 2 10 valeurspouruneseuletension.Ainsi,
5
saprcisionserade: 10 = 0, 0048828125V Laformuleretenirseradonc:
2

Vref
2N

Avec:

Vref :tensionderfrenceduconvertisseur
N :nombredebitduconvertisseur
Ilfautdoncretenirque,pourceconvertisseur,saprcisionestde 4.883mV .Donc,si
on lui met une tension de 2mV par exemple sur son entre, le convertisseur sera
incapabledelavoiretdonneraunrsultatgal0V.

Lesinconvnients
PourtermineravantdepasserlutilisationduCNAavecArduino,jevaisvousparler
desesinconvnients.Ilenexistetroisprincipaux:
laplagedetensiondentre:leconvertisseuranalogiquedelArduinonepeut
recevoirsonentrequedestensionscomprisesentre0Vet+5V.Onverraplus
loincommentamliorerlaprcisionduCAN.
la prcision : la prcision du convertisseur est trs bonne sauf pour les deux
derniers bits de poids faible. On dit alors que la prcision est de 2LSB (
causedupasdecalculquejeviensdevousexpliquer).
lavitessedeconversion:leconvertisseurN/AdelacarteArduinonapasune
242

trs grande vitesse de conversion par rapport un signal audio par exemple.
Ainsi,silonconvertitunsignalaudioanalogiqueennumriquegrcelacarte
Arduino,onnepourraentendrequelesfrquencesendessousde10kHz.Dans
bien des cas cela peut tre suffisant, mais den dautre il faudra utiliser un
convertisseur A/N externe (un composant en plus) qui sera plus rapide afin
dobtenirlespectreaudiocompletdunsignalsonore.

Lectureanalogique,onyvient
Lirelatensionsurunebrocheanalogique
UntructrssympaavecArduino,cestquecestfacileprendreenmain.Etasevoit
une fois de plus avec lutilisation des convertisseurs numrique > analogique ! En
effet,vousnavezquuneseulenouvellefonctionretenir:analogRead()!

analogRead(pin)
Cette fonction va nous permettre de lire la valeur lue sur une entre analogique de
lArduino.Elleprendunargumentetretournelavaleurlue:
Largumentestlenumrodelentreanalogiquelire(explicationcidessous)
La valeur retourne (un int) sera le rsultat de la conversion analogique
>numrique
SurunecarteArduinoUno,onretrouve6CAN.Ilssetrouventtousdummectdela
carte,loestcritAnalogIN:

Ces6entresanalogiquessontnumrotes,toutcommelesentres/sortieslogiques.
Parexemple,pourallerlirelavaleurensortieduncapteurbranchsurleconvertisseur
delabrocheanalogiquenumro3,onfera:valeur = analogRead(3);.
243

Neconfondezpaslesentresanalogiquesetlesentresnumriques!Ellesonten
effetlemmenumropourcertaines,maisseloncommentonlesutilise,lacarte
Arduinosaurasilabrocheestanalogiqueounon.
Mais comme nous sommes des programmeurs intelligents et organiss, on nommera
lesvariablesproprementpourbientravaillerdelamaniresuivante:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

//brocheanalogique3OUbrochenumrique3
constintmonCapteur=3

//lavaleurlueseracompriseentre0et1023
intvaleurLue=0

//fonctionsetup()
{

voidloop()
{
//onmesurelatensionducapteursurlabrocheanalogique3
valeurLue=analogRead(monCapteur)

//ducodeetencoreducode...
}

Convertirlavaleurlue
Boncestbien,onaunevaleurretourneparlafonctioncompriseentre0et1023,mais
anenousdonnepasvraimentunetensiona!Ilvatretempsdefaireunpeudecode
(etdemath)pourconvertircettevaleurEtsivousrflchissiezuntoutpetitpeupour
trouverlasolutionsansmoi? Trouve?

Conversion
Comme je suis super sympa je vais vous donner la rponse, avec en prime : une
explication ! Rcapitulons. Nous avons une valeur entre 0 et 1023. Cette valeur est
limage de la tension mesure, ellemme comprise entre 0V et +5V. Nous avons
ensuitedterminquelepasduconvertisseurtaitde4.88mVparunit.Donc,deux
mthodessontdisponibles:
avecunsimpleproduitencroix
enutilisantlepascalculplustt
Exemple:Lamesurenousretourneunevaleurde458.
Avecunproduitencroixonobtient: 4585
= 2.235V
1024
Enutilisantlepascalculplushautonobtient:458 4.88 = 2.235V
Les deux mthodes sont valides, et donnent les mmes rsultats. La premire
lavantagedefaireressortirlaspectphysiquedeschosesenutilisantlestensions
etlarsolutionduconvertisseur.
244

Voiciunefaondeletraduireencode:
1
2
3
4
5
6
7
8
9
10
11
12
13

//variablestockantlavaleurluesurleCAN
intvaleurLue
//rsultatstockantlaconversiondevaleurLueenVolts
floattension

voidloop()
{
valeurLue=analogRead(uneBrocheAvecUnCapteur)
//produitencroix,ATTENTION,donneunrsultatenmV!
tension=valeurLue*4.88
//formuleaspect"physique",donneunrsultatenmV!
tension=valeurLue*(5/1024)
}

Maisilnexistepasunemthodeplusautomatiquequefaireceproduitencroix?
EhbienSI!Eneffet,lquipeArduinoaprvuquevousaimeriezfairedesconversions
facilementetdoncunefonctionestprsentedanslenvironnementArduinoafindevous
faciliterlatche!Cettefonctionsenomme map().partirdunevaleurdentre,dun
intervalle dentre et dun intervalle de sortie, la fonction vous retourne la valeur
quivalentecompriseentreledeuximeintervalle.Voicisonprototypedemanireplus
explicite:
1
2
3
4
5
6
7

sortie=map(valeur_d_entree,
valeur_extreme_basse_d_entree,
valeur_extreme_haute_d_entree,
valeur_extreme_basse_de_sortie,
valeur_extreme_haute_de_sortie
)
//cettefonctionretournelavaleurcalculequivalenteentrelesdeuxintervallesdesortie

Prenons notre exemple prcdent. La valeur lue se nomme valeurLue. Lintervalle


dentreestlagammedelaconversionallantde01023.Lagamme(ouintervalle)de
sortie sera la tension relle lentre du microcontrleur, donc entre 0 et 5V. En
utilisantcettefonctionnouscrironsdonc:
1 tension=map(valeurLue,0,1023,0,5000)//conversiondelavaleurlueentensionenmV

Pourquoituutilises5000mVaulieudemettresimplement5V?
Pourlasimpleetbonneraisonquelafonctionmaputilisedesentiers.Sijutilisais5Vau
lieude5000mVjauraisdoncseulement6valeurspossiblespourmatension(0,1,2,3,
4et5V).Pourterminerlecalcul,ilseradoncjudicieuxderajouterunedernireligne:
1 tension=map(valeurLue,0,1023,0,5000)//conversiondelavaleurlueentensionenmV
2 tension=tension/1000//conversiondesmVenV

Auretourdelaliaisonsrie(seulementsionenvoielesvaleursparlaliaisonsrie)on
auraitdonc(valeurstitredexemple):
1 valeurLue=458
2 tension=2.290V

245

On est moins prcis que la tension calcule plus haut, mais on peut jouer en
prcisionenmodifiantlesvaleursdesortiedelafonctionmap().Oubiengarderle
calculthoriqueetleplacerdansunefonctionmaison.

Exempledutilisation
Lepotentiomtre
Questcequecestquecettebtelencore?
Le potentiomtre (ou potar pour les (trs) intimes) est un composant trs
frquemmentemployenlectronique.Onleretrouveaussisouslenomdersistance
variable.Commecederniernomlindiquesibien,unpotentiomtrenouspermetentre
autres de raliser une rsistance variable. En effet, on retrouve deux applications
principalesquejevaisvousprsenterjusteaprs.Avanttoutechose,voicilesymbole
dupotentiomtre:

Casn1:lepontdiviseurdetension
Onyremarqueunepremirechoseimportante,lepotentiomtreatroisbroches.Deux
serventbornerlestensionsmaximum(A)etminimum(B)quelonpeutobtenirses
bornes,etlatroisime(C)estrelieuncurseurmobilequidonnelatensionvariable
obtenueentrelesbornesprcdemmentfixes.Ainsi,onpeutreprsenternotrepremier
cas dutilisation comme un diviseur de tension rglable. En effet, lorsque vous
dplacez le curseur, en interne cela quivaut modifier le point milieu. En termes
lectroniques, vous pouvez imaginer avoir deux rsistances en srie (R1 et R2 pour
treoriginal).Lorsquevousdplacezvotrecurseurverslabornebasse,R1augmente
alorsqueR2diminueetlorsquevousdplacezvotrecurseurverslabornehaute,R2
augmentealorsqueR1diminue.Voiciuntableaumontrantquelquescasdefigurede
manireschmatique:
Schmaquivalent

Positiondu
curseur

TensionsurlabrocheC

Curseurla
moiti

Vsignal = (1

50
)
100

5 = 2.5V

Curseur25%
dudpart

Vsignal = (1

25
)
100

5 = 3.75V

Curseur75%
dudpart

Vsignal = (1

75
)
100

5 = 1.25V

Sivoussouhaitezavoirplusdinformationssurlesrsistancesetleursassociations
246

ainsi que sur les potentiomtres, je vous conseille daller jeter un il sur ce
chapitre.

Casn2:larsistancevariable
Le deuxime cas dutilisation du potentiomtre est la rsistance variable. Cette
configuration est trs simple, il suffit dutiliser le potentiomtre comme une simple
rsistancedontlesbornessontAetCouBetC.Onpourraalorsfairevarierlavaleur
ohmiquedelarsistancegrcelaxedupotentiomtre.
Attention,ilexistedespotentiomtreslinaires(lavaleurdelatensionvoluede
manire proportionnelle au dplacement du curseur), mais aussi des
potentiomtreslogarithmique/antilogarithmique (la valeur de la tension volue
de manire logarithmique ou antilogarithmique par rapport la position du
curseur). Choisissezen dont un qui est linaire si vous souhaitez avoir une
proportionnalit.

UtilisationavecArduino
VousallezvoirquelutilisationavecArduinonestpasvraimentcomplique.Ilvanous
suffirederaccorderlesalimentationssurlesbornesextrmesdupotentiomtre,puisde
relierlabrochedumilieusuruneentreanalogiquedelacarteArduino:

247

Unefoisleraccordementfait,nousallonsfaireunpetitprogrammepourtestercela.Ce
programme va simplement effectuer une mesure de la tension obtenue sur le
248

potentiomtre,puisenvoyerlavaleurluesurlaliaisonsrie(anousferarviser ).
Danslordre,voicileschosesfaire:
Dclarerlabrocheanalogiqueutilise(pourfaireducodepropre)
Mesurerlavaleur
Lafficher!
Jevouslaissechercher?Aller,auboulot! Voicilacorrection,cestleprogramme
quejaifait,peuttrequelevtreseramieux:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

//lepotentiomtre,branchsurlabrocheanalogique0
constintpotar=0
//variablepourstockerlavaleurlueaprsconversion
intvaleurLue
//onconvertitcettevaleurenunetension
floattension

voidsetup()
{
//onsecontentededmarrerlaliaisonsrie
Serial.begin(9600)
}

voidloop()
{
//onconvertitennombrebinairelatensionlueensortiedupotentiomtre
valeurLue=analogRead(potar)

//ontraduitlavaleurbruteentension(produitencroix)
tension=valeurLue*5.0/1024

//onaffichelavaleurluesurlaliaisonsrie
Serial.print("valeurLue=")
Serial.println(valeurLue)

//onaffichelatensioncalcule
Serial.print("Tension=")
Serial.print(tension,2)
Serial.println("V")

//onsauteuneligneentredeuxaffichages
Serial.println()
//onattendunedemisecondepourquel'affichagenesoitpastroprapide
delay(500)
}

VousvenezdecrervotrepremierVoltmtre!

Unemeilleureprcision?
Estilpossibledamliorerlaprcisionduconvertisseur?
Voilunequestionintressantelaquellejerpondraiquilexistedeuxsolutionsplus
oumoinsfacilesmettreenuvre.
249

Solution1:modifierlaplagedentreduconvertisseur
Cestlasolutionlaplussimple!Voyonsdeuxchoses

Tensionderfrenceinterne
Le microcontrleur de lArduino possde plusieurs tensions de rfrence utilisables
selonlaplagedevariationdelatensionquelonveutmesurer.Prenonsunetension,en
sortieduncapteur,quivarieraentre0Vet1Vetjamaisaudel.Pardfaut,lamesure
seferaentre0et5Vsur1024niveaux(soituneprcisionde4.88mV).Cequiveutdire
quon aura seulement les 204 premiers niveaux dutiles puisque tout le reste
correspondraplusdunvolt.Pouramliorerlaprcisiondelecture,onvarduirela
plagedemesuredentreduconvertisseuranalogique>numriqueenrduisantla
tensionderfrenceutilise(initialement5V).Pourcela,riendematriel,toutsepasse
au niveau du programme puisquil y a une fonction qui existe : analogReference().
Cettefonctionprendenparamtrelenomdelarfrenceutiliser:
DEFAULT : La rfrence de 5V par dfaut (ou 3,3V pour les cartes Arduino
fonctionnantsouscettetension,tellelaDue)
INTERNAL:Unerfrenceinternede1.1V(pourlaArduinoUno)
INTERNAL1V1:CommecidessusmaispourlaArduinoMega
INTERNAL2V56:Unerfrencede2.56V(uniquementpourlaMega)
EXTERNAL:LarfrenceseracelleappliquesurlabrocheARef
Dansnotrecas,leplusintressantseradeprendrelavaleurINTERNALpourpouvoir
faire des mesures entre 0 et 1.1V. Ainsi, on aura 1024 niveaux ce qui nous fera une
prcisionde1.07mV.Cestbienmeilleur!Lecodeestplacerdanslafonctionsetup()
devotreprogramme:
1
2
3
4
5

voidsetup()
{
//permetdechoisirunetensionderfrencede1.1V
analogReference(INTERNAL)
}

Tensionderfrenceexterne
Maintenant que se passe til si notre mesure devait tre faite entre 0 et 3V ? On ne
pourraitplusutiliserINTERNA1V1puisquondpasseles1.1V.Onrisqueraisalorsde
grillerlecomparateur.DanslecasduneArduinoMega,onnepeutpasnonplusutiliser
INTERNAL2V56puisquondpasseles2.56V.Nousallonsdoncruserenprenantune
rfrenceexternelaidedelavaleurEXTERNALcommececi:
1
2
3
4
5

voidsetup()
{
//permetdechoisirunetensionderfrenceexternelacarte
analogReference(EXTERNAL)
}

Ensuite,ilneresteraplusquapporterunetensionderfrencesuprieur3Vsurla
brocheARefdelacartepourobtenirnotrenouvellerfrence.

250

Astuce : la carte Arduino produit une tension de 3.3V ( ct de la tension 5V).


Vouspouvezdoncutilisercettetensiondirectementpourlatensionderfrencedu
convertisseur. Il suffit pour cela de relier avec un fil la sortie indique 3.3V
lentreAREF.
Attentioncependant,latensionmaximalederfrencenepeuttresuprieure
+5Vetla minimale infrieure 0V. En revanche, toutes les tensions comprises
entrecesdeuxvaleurssontacceptables.
Mais,sijeveuxquematensiondentrepuissevarieraudelde+5V,commentje
fais?Yatilunmoyendyparvenir?o_O
Oui,voyezcequisuit

Solution 2 : utiliser un pont


diviseurdetension
Nousavonsvucelalapartieprcdenteavecle
potentiomtre.Ilsagitenfaitdediviservotresignal
paruncertainratioafindeladapterauxcontraintes
dentres du convertisseur. Par exemple,
imaginonsquenousayonsunemesurefairesur
unappareilquidlivreunetensioncompriseentre
0et10V.Celanenousarrangepaspuisquenous
nesommescapabledeliredesvaleursquentre0Schmadupontdiviseurdetension
et 5V. Nous allons donc diviser cette mesure par
deux afin de pouvoir la lire sans risque. Pour cela, on utilisera deux rsistances de
valeuridentique(2fois 10k parexemple)pourfaireunpontdiviseurdetension.La
tension mesurer rentre dans le pont (U sur le schma cicontre) et la tension
mesurablesortaumilieudupont(tension Us ).Ilneresteplusquconnecterlasortie
dupontuneentreanalogiquedelacarteArduinoetlirelavaleurdelatensionde
sortie.
Libre vous de modifier les valeurs des rsistances du pont diviseur de tension
pour faire rentrer des tensions diffrentes (mme au del de 10V !). Attention
cependantnepasdpasserles+5Vensortiedupont!

Solution3:utiliserunCANexterne
La deuxime solution consisterait simplement en lutilisation dun convertisseur
analogique>numriqueexterne.Avousdechoisirlebon.Ilenexistebeaucoup,ce
quilfautprincipalementregardercest:
laprcision(10bitspourArduino,existedautreen12bits,16bits,)
lavitessedacquisition(celuidArduinoestunevitessede100s)
lemodedetransfertdelalecture(liaisonsrie,IC,)
lenombredentres(6surArduinoUno)
latensiondentremaximaleetminimale(max+5Vetmin0V)
251

Auprogramme:
LeprochainchapitreestunTPfaisantusagedecesvoiesanalogiques
Le chapitre qui le suit est un chapitre qui vous permettra de crer des tensions
analogiques avec votre carte Arduino, idal pour mettre en uvre la deuxime
solutiondamliorationdelaprcisiondelecteurduconvertisseur!
En somme, ce chapitre vous a permis de vous familiariser un peu avec les tensions
analogiques,cequivouspermettraparlasuitedegrerplusfacilementlesgrandeurs
renvoyespardescapteursquelconques.

[Arduino402][TP]VumtreLED
Oncommencecettepartiesurlanalogiquesurleschapeauxderouesenralisanttout
desuitenotrepremierTP.Cederniernestpastrscompliqu,conditionquevous
ayez suivi correctement le tuto et que vous nayez pas oubli les bases des parties
prcdentes!

Consigne
Vumtre,avousparle?
DansceTP,nousallonsraliserunvumtre.Mmesilenomnevousditrien,jesuis
surquevousenavezdjrencontr.Parexemple,surunechanehifiousurunetable
de mixage on voit souvent des loupiotes sallumer en fonction du volume de la note
jou. Et bien cest a un vumtre, cest un systme daffichage sur plusieurs LED,
disposes en ligne, qui permettent davoir un retour visuel sur une information
analogique(danslexemple,ceseralevolume).

Objectif
Pourlexercice,nousallonsraliserlavisualisationdunetension.Cettederniresera
donneparunpotentiomtreetseraaffichesur10LED.Lorsquelepotentiomtresera
0V,onallumera0LED,puislorsquilseraaumaximumonlesallumeratoutes.Pour
lesvaleurscomprisesentre0et5V,ellesdevrontallumerlesLEDproportionnellement.
Voil, ce nest pas plus compliqu que a. Comme dhabitude voici une petite vido
vousmontrantlersultatattenduetbienentendu

BONCOURAGE!

252

Correction!
Jespre que tout cest bien pass pour vous et que laffichage cartonne ! Voici
maintenantvenulheuredelacorrection,enesprantquevousnenaurezpasbesoin
etquevouslaconsulterezjustepourvotreculture. Commedhabitudenousallons
commencerparvoirleschmapuisensuitenoustudieronslecode.

Schmalectronique
Leschmanestpastrsdifficile.Nousallonsretrouver10LEDsetleursrsistancesde
limitations de courant branches sur 10 broches de lArduino (histoire dtre original
nousutiliserons211).Ensuite,nousbrancheronsunpotentiomtreentrele+5Vetla
masse. Sa broche centrale, qui donne la tension variable sera connecte lentre
analogique0delArduino.Voicileschmaobtenu:

253

254

Lecode
Lencorevouscommencezavoirlhabitude,nousallonsdabordtudierlecodedes
variablesglobales(pourquoiellesexistent?),voirlafonctionsetup(),puisenfintudier
laboucleprincipaleetlesfonctionsannexesutilises.

Variablesglobalesetsetup
Dans ce TP nous utilisons 10 LEDs, ce qui reprsente autant de sorties sur la carte
Arduinodoncautantdeconstintcrire.Afindenepassefatiguerdetrop,nous
allons dclarer un tableau de const int plutt que de copier/coller 10 fois la mme
ligne.Ensuite,nousallonsdclarerlabrocheanalogiquesurlaquelleserabranchle
potentiomtre.Enfin,nousdclaronsunevariablepourstockerlatensionmesuresur
lepotentiomtre.Etcesttoutpourlesdclarations!
1
2
3
4
5
6
7

//Dclarationetremplissagedutableau...
//...reprsentantlesbrochesdesLEDs
constintleds[10]={2,3,4,5,6,7,8,9,10,11}
//lepotentiomtreserabranchsurlabrocheanalogique0
constintpotar=0
//variablestockantlatensionmesure
inttension=0

Unefoisquelonfaitcesdclarations,ilnenousresteplusqudclarerlesbroches
en sortie et les mettre ltat HAUT pour teindre les LEDs. Pour faire cela de
manire simple (au lieu de 10 copier/coller), nous allons utiliser une boucle for pour
effectuerloprations10fois(afindutiliserlapuissancedutableau).
1 voidsetup()
2 {
3 inti=0

255

4
5
6
7
8
9
10
11

for(i=0i<10i++)
{
//dclarationdelabrocheensortie
pinMode(leds[i],OUTPUT)
//misel'tathaut
digitalWrite(leds[i],HIGH)
}
}

Boucleprincipale
Alorslvousallezpeuttretresurprismaisnousallonsavoirunefonctionprincipale
superlight.Eneffet,ellenevaeffectuerquedeuxoprations:Mesurerlatensiondu
potentiomtre,puisappelerunefonctiondaffichagepourfairelerenduvisueldecette
tension.Voicicesdeuxlignesdecode:
1
2
3
4
5
6
7

voidloop()
{
//onrcuprelavaleurdelatensiondupotentiomtre
tension=analogRead(potar)
//etonaffichesurlesLEDscettetension
afficher(tension)
}

Encoreplusfort,lammecrituremaisenuneseuleligne!
1
2
3
4
5

voidloop()
{
//lammechosequ'avantmmeenuneseuleligne!
afficher(analogRead(potar))
}

Fonctiondaffichage
Alorscerteslafonctionprincipaleesttrslgre,maiscenestpasuneraisonpourne
pasavoirunpeudecodeautrepart.Eneffet,legrosdutraitementvasefairedansla
fonction daffichage, qui, comme son nom et ses arguments lindiquent, va servir
afficher sur les LEDs la tension mesure. Le but de cette dernire sera dallumer les
LEDs de manire proportionnelle la tension mesur. Par exemple, si la tension
mesurvaut2,5V(sur5Vmax)onallumera5LEDs(sur10).Silatensionvaut5V,on
les allumera toutes. Je vais maintenant vous montrer une astuce toute simple qui va
tirerpleinementpartidutableaudebrochescrtoutaudbut.Toutdabord,mettons
nous daccord. Lorsque lon fait une mesure analogique, la valeur retourne est
compriseentre0et1023.Cequejevouspropose,cestdoncdallumeruneLEDpar
tranchede100units.Parexemple,silavaleurestcompriseentre0et100,uneseule
LEDestallume.Ensuite,entre100et200,onallumeuneLEDsupplmentaire,etc.
Pourunevaleurentre700et800onallumeradonc8LEDs,bravoceuxquisuivent!
:s Ce comportement va donc scrire simplement avec une boucle for, qui va
incrmenterunevariableide010.Danscetteboucle,nousallonstestersilavaleur
(image de la tension) est infrieure i multiplier par 100 (ce qui reprsentera nos
diffrentspas).SiletestvautVRAI,onallumelaLEDi,sinononlteint.Dmonstration
:
1 voidafficher(intvaleur)
2 {

256

3
4
5
6
7
8
9
10
11

inti
for(i=0i<10i++)
{
if(valeur<(i*100))
digitalWrite(leds[i],LOW)//onallumelaLED
else
digitalWrite(leds[i],HIGH)//ouonteintlaLED
}
}

Amlioration
Sijamaisvousaveztrouvlexercicetropfacile,pourquoinepasfaireunpeudezle
en ralisant carrment un minivoltmtre en affichant sur deux afficheurs 7 segments
unetensionmesure(unafficheurpourlesVoltsetunautrepourlapremiredcimale)
?Cecinestquuneidedamlioration,lasolutionseradonne,commente,maispas
expliqueendtailcarvousdevriezmaintenantavoirtoutlesavoirpourlacomprendre.
Lexercice est juste l pour vous entraner et pour vous inspirer avec un nouveau
montage.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

//lesbrochesdudcodeur7segments
constintbit_A=2
constintbit_B=3
constintbit_C=4
constintbit_D=5

//lesbrochesdestransistorspourl'afficheurdesdizainesetceluidesunits
constintalim_dizaine=6
constintalim_unite=7

//labrochedupotar
constintpotar=0

floattension=0.0//tensionmiseenforme
intval=0//tensionbrutelue(01023)
boolafficheur=false
longtemps

voidsetup()
{
//Lesbrochessonttoutesdessorties(sauflesboutons)
pinMode(bit_A,OUTPUT)
pinMode(bit_B,OUTPUT)
pinMode(bit_C,OUTPUT)
pinMode(bit_D,OUTPUT)
pinMode(alim_dizaine,OUTPUT)

257

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87

pinMode(alim_unite,OUTPUT)

//Lesbrochessonttoutesmisel'tatbas(saufledrougeteinte)
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)
digitalWrite(alim_dizaine,LOW)
digitalWrite(alim_unite,LOW)
temps=millis()//enregistre"l'heure"
}

voidloop()
{
//onfaitlalectureanalogique
val=analogRead(potar)
//miseenformedelavaleurlue
tension=val*5//simplerelationdetroispourlaconversion(*5/1023)
tension=tension/1023
//cestadeonaunevaleurdetype3.452Volts...quel'onvamultiplierpar10pourl'affic
tension=tension*10

//sicafaitplusde10msqu'onaffiche,onchangede7segments
if((millis()temps)>10)
{
//oninverselavaleurde"afficheur"pourchangerd'afficheur(unitoudizaine)
afficheur=!afficheur
//onaffiche
afficher_nombre(tension,afficheur)
temps=millis()//onmetjourletemps
}
}

//fonctionpermettantd'afficherunnombre
voidafficher_nombre(floatnombre,boolafficheur)
{
longtemps
charunite=0,dizaine=0
if(nombre>9)
dizaine=nombre/10//onrecuperelesdizaines
unite=nombre(dizaine*10)//onrecuperelesunits

if(afficheur)
{
//onaffichelesdizaines
digitalWrite(alim_unite,LOW)
digitalWrite(alim_dizaine,HIGH)
afficher(dizaine)
}
else
{
//onaffichelesunits
digitalWrite(alim_dizaine,LOW)
digitalWrite(alim_unite,HIGH)
afficher(unite)
}
}

//fonctioncriveantsurunseulafficheur
voidafficher(charchiffre)
{

258

88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115

//oncommenceparcrire0,donctoutl'tatbas
digitalWrite(bit_A,LOW)
digitalWrite(bit_B,LOW)
digitalWrite(bit_C,LOW)
digitalWrite(bit_D,LOW)

if(chiffre>=8)
{
digitalWrite(bit_D,HIGH)
chiffre=chiffre8
}
if(chiffre>=4)
{
digitalWrite(bit_C,HIGH)
chiffre=chiffre4
}
if(chiffre>=2)
{
digitalWrite(bit_B,HIGH)
chiffre=chiffre2
}
if(chiffre>=1)
{
digitalWrite(bit_A,HIGH)
chiffre=chiffre1
}
//Etvoil!!
}

Voussavezmaintenantcommentutiliseretafficherdesvaleursanalogiquesexternes
la carte Arduino. En approfondissant vos recherches et vos exprimentations, vous
pourrez certainement faire pas mal de choses telles quun robot en associant des
capteurs et des actionneurs la carte, des appareils de mesures (Voltmtre,
Ampremtre,Oscilloscope,etc.).Jecomptesurvouspourcrerparvousmme!
Direction, le prochain chapitre o vous dcouvrirez comment faire une conversion
numrique>analogique

[Arduino 403] Et les sorties analogiques, enfin


presque!
Vousvoussouvenezdupremierchapitredecettepartie?Oui,lorsquejevousparlais
deconvertirunegrandeuranalogique(tension)enunedonnenumrique.Ehbienl,il
vasagirdefaireloprationinverse.Comment?Cestcequenousallonsvoir.Jepeux
vousdirequeaunrapportaveclaPWM

Convertirdesdonnesbinairesensignal
analogique
Jevaisvousprsenterdeuxmthodespossiblesquivontvouspermettredeconvertir
desdonnesnumriquesengrandeuranalogique(jeneparlerailencoredetension).
Maisavant,plaonsnousdanslecontexte.
259

Convertirdubinaireenanalogique,pourquoifaire?Cestvrai,aveclaconversion
analogique>numriqueilyavaitunerelleutilit,maisl,quenestil?
Lutilit est tout aussi pesante que pour la conversion A>N. Cependant, les
applicationssontdiffrentes,chaqueoutilunbesoindiraisje.Eneffet,laconversion
A>Npermettaitdetransformerunegrandeuranalogiquenonutilisabledirectementpar
un systme base numrique en une donne utilisable pour une application
numrique. Ainsi, on a pu envoyer la valeur lue sur la liaison srie. Quant la
conversionoppose,conversionN>A,lesapplicationssontdiffrentes,jevaisenciter
une plus ou moins intressante : par exemple commander une, ou plusieurs, LED
tricolore(RougeVertBleu)pourcrerunluminairedontlacouleurestcommandepar
leson(ncessiteuneentranalogique ).Tiens,envoilunprojetintressant!Je
vaismelegardersouslamain:ninja:
Alors!alors!alors!!Commentonfait!?
Seraitce un lger soupon de curiosit que je perois dans vos yeux frtillants ?
Commentfaiton?Suivezleguide!

ConvertisseurNumrique>Analogique
La premire mthode consiste en lutilisation dun convertisseur Numrique
>Analogique(quejevaisabrgerCNA).Ilenexiste,toutcommeleCAN,deplusieurs
sortes:
CNA rsistances pondres : ce convertisseur utilise un grand nombre de
rsistancesquiontchacuneledoubledelavaleurdelarsistancequilaprcde.
OnadoncdesrsistancesdevaleurR,2R,4R,8R,16R,,256R,512R,1024R,
etc. Chacune des rsistances sera connecte grce au microcontrleur la
masseoubienau+5V.Cesniveauxlogiquescorrespondentauxbitsdedonnes
delavaleurnumriqueconvertir.Pluslebitestdepoidsfort,pluslarsistance
laquelle il est adjoint est grande (maximum R). linverse, plus il est de poids
faible,plusilverrasarsistancedesortiedepluspetitevaleur.Aprs,grceun
petit montage lectronique, on arrive crer une tension proportionnelle au
nombredebit1.
CNA de type R/2R : l, chaque sortie du microcontrleur est relie une
rsistancedemmevaleur(2R),ellemmeconnecteau+5Vparlintermdiaire
dunersistancedevaleurR.Toujoursavecunpetitmontage,onarrivecrer
unetensionanalogiqueproportionnelleaunombredebit1.
Cependant,jenexpliqueraipaslefonctionnementnilutilisationdecesconvertisseurs
carilsdoiventtreconnectsautantdebrochesdumicrocontrleurquilsnedoivent
avoir de prcision. Pour une conversion sur 10 bits, le convertisseur doit utiliser 10
sortiesdumicrocontrleur!

PWMouMLI
Bon, sil ny a pas moyen dutiliser un CNA, alors on va lecrer utiliser ce que peut
nousfournirlacarteArduino:laPWM.Vousvoussouvenezquejaivoquceterme
danslechapitresurlaconversionA>N?Maisconcrtement,cestquoi?
260

Avantdepoursuivre,jevousconseilledallerrelirecettepremirepartieduchapitre
sur les entres analogiques pour revoir les rappels que jai faits sur les signaux
analogiques.

Dfinition
Nayez point peur, je vais vous expliquer ce que cest au lieu de vous donner une
dfinitiontorduecommeonpeutentrouverparfoisdanslesdictionnaires. Dabord,la
PWMsaveutdire:PulseWidthModulationetenfranaisceladonneModulation
Largeur dImpulsion (MLI). La PWM est en fait un signal numrique qui, une
frquencedonne,aunrapportcycliquequichange.
Yapleindemotsquejecomprendspas,cestnormal?o_O
Oui,carpourlinstantjenenainullementparl.Voildoncnotreprochainobjectif.

Lafrquenceetlerapportcyclique
Lafrquencedunsignalpriodiquecorrespondaunombredefoisquelapriodese
rpte en UNE seconde. On la mesure en Hertz, not Hz. Prenons lexemple dun
signallogiquequimetun1,puisun0,puisun1,puisun0,etc.autrementditunsignal
crneaux,onvamesurersapriode(entemps)entreledbutduniveau1etlafindu
niveau0:

Ensuite,lorsquelonauramesurcettepriode,onvapouvoircalculersafrquence(le
nombredepriodesenuneseconde)grcelaformulesuivante:

F=

1
T

Avec:

F :frquencedusignalenHertz(Hz)
T :tempsdelapriodeenseconde(s)
Lerapportcyclique,unmotbienparticulierpourdsignerlefaitqueleniveaulogique1
peut ne pas durer le mme temps que le niveau logique 0. Cest avec a que tout
reposeleprincipedelaPWM.CestdirequelaPWMestunsignaldefrquencefixe
quiaunrapportcycliquequivarieavecletempssuivantlesordresquellereoit(on
reviendradansunpetitmomentsurcesmots).Lerapportcycliqueestmesurenpour
cent(%).Pluslepourcentageestlev,plusleniveaulogique1estprsentdansla
priodeetmoinsleniveaulogique0lest.Etinversement.Lerapportcycliquedusignal
estdonclepourcentagedetempsdelapriodedurantlequellesignalestauniveau
logique1.Ensomme,cetteimageextraitedeladocumentationofficielledArduinonous
montrequelquesexemplesdunsignalavecdesrapportscycliquesdiffrents:
261

Astuce:RapportcycliqueceditDutyCycleenanglais.
Ce nest pas tout ! Aprs avoir gnr ce signal, il va nous falloir le transformer en
signalanalogique.Etoui!Pourlinstantcesignalestencoreconstitudtatslogiques,
onvadoncdevoirletransformerenextrayantsavaleurmoyenneJenevousendis
pasplus,onverraplusbascequecelasignifie.

LaPWMdelArduino
Avantdecommencerprogrammer
LesbrochesdelaPWM
Sur votre carte Arduino, vous devriez disposer de 6 broches qui soient compatibles
aveclagnrationdunePWM.Ellessontrepresparlesymboletilde~.Voiciles
brochesgnrantunePWM:3,5,6,9,10et11.

LafrquencedelaPWM
Cettefrquence,jeledisais,estfixe,ellenevariepasaucoursdutemps.Pourvotre
carteArduinoelleestdeenviron490Hz.

LafonctionanalogWrite()
262

JepensequevousneserezpastonnsijevousdisqueArduinointgreunefonction
touteprtepourutiliserlaPWM?Plushaut,jevousdisaisceci:
laPWMestunsignaldefrquencefixequiaunrapportcycliquequivarie
avecletempssuivantlesordresquellereoit
Cestsurcepointquejaimeraisreveniruninstant.Enfait,lesordresdontjeparlesont
lesparamtrespasssdanslafonctionquignrelaPWM.Niplusnimoins.tudions
maintenantlafonctionpermettantderalisercesignal:analogWrite().Elleprenddeux
arguments:
LepremierestlenumrodelabrocheolonveutgnrerlaPWM
Le second argument reprsente la valeur du rapport cyclique appliquer.
Malheureusement on nexprime pas cette valeur en pourcentage, mais avec un
nombreentiercomprisentre0et255
Si le premier argument va de soi, le second mrite quelques prcisions. Le rapport
cyclique sexprime de 0 100 % en temps normal. Cependant, dans cette fonction il
sexprimera de 0 255 (sur 8 bits). Ainsi, pour un rapport cyclique de 0% nous
enverronslavaleur0,pourunrapportde50%onenverra127etpour100%cesera
255. Les autres valeurs sont bien entendu considres de manire proportionnelle
entrelesdeux.Ilvousfaudrafaireunpetitcalculpoursavoirquelestlepourcentagedu
rapportcycliquepluttquelargumentpassdanslafonction.

Utilisation
Voilunpetitexempledecodeillustranttouta:
1
2
3
4
5
6
7
8
9
10
11
12
13

//unesortieanalogiquesurlabroche6
constintsortieAnalogique=6

voidsetup()
{
pinMode(sortieAnalogique,OUTPUT)
}

voidloop()
{
//onmetunrapportcycliquede107/255=42%
analogWrite(sortieAnalogique,107)
}

Quelquesoutilsessentiels
Savezvousquevouspouvezdoresetdjutilisercettefonctionpourallumerplusou
moinsintensmentuneLED?Eneffet,pourunrapportcycliquefaible,laLEDvase
voirparcourirparuncourantmoinslongtempsquelorsquelerapportcycliqueestfort.
Or, si elle est parcourue moins longtemps par le courant, elle sclairera galement
moinslongtemps.Enfaisantvarierlerapportcyclique,vouspouvezainsifairevarierla
luminositdelaLED.

LaLEDRGBouRVB
263

RGB pour RedGreenBlue en anglais. Cette LED est compose de trois LED de
couleursprcdemmentnonces.Ellepossdedonc4brochesetexistesousdeux
modles:anodecommuneetcathodecommune.Exactementcommelesafficheurs
7segments.Choisissezenuneanodecommune.

Mixerlescouleurs
Lorsquelonutilisedescouleurs,ilestbondavoirquelquesbasesenartsplastiques.
Rvisonslesfondements.Lalumire,peuttrenelesavezvouspas,estcomposede
troiscouleursprimairesquisont:
Lerouge
Levert
Lebleu
partirdecestroiscouleurs,ilestpossibledecrernimportequelleautrecouleurdu
spectre lumineux visible en mlangeant ces trois couleurs primaires entre elles. Par
exemple,pourfairedelorangeonvamlangerdurouge(2/3duvolumefinal)etduvert
(1/3duvolumefinal).Jevousledisais,lafonctionanalogWrite()prendunargument
pourlaPWMquivade0255.Toutcommelaproportiondecouleurdansleslogiciels
de dessin ! On parle de norme RGB faisant rfrence aux trois couleurs primaires.
Pour connatre les valeurs RGB dune couleur, je vous propose de regarder avec le
logicielGimp(gratuitetmultiplateforme).Pourcela,ilsuffitdedeuxobservations/clics:
1. Toutdabordonslectionnelabotecouleursdanslaboteoutils
2. Ensuite,enjouantsurlesvaleursR,GetBonpeutvoirlacouleurobtenue

264

>

265

Afin de faire des jolies couleurs, nous utiliserons analogWrite() trois fois (une pour
chaque LED). Prenons tout de suite un exemple avec du orange et regardons sa
compositionsousGimp:

partirdecetteimagenouspouvonsvoirquilfaut:
100%derouge(255)
56%devert(144)
0%debleu(0)
266

Nousallonsdoncpouvoirsimplementutilisercesvaleurspourfaireunejoliecouleur
surnotreLEDRGB:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

constintledRouge=11
constintledVerte=9
constintledBleue=10

voidsetup()
{
//ondclarelesbrochesensorties
pinMode(ledRouge,OUTPUT)
pinMode(ledVerte,OUTPUT)
pinMode(ledBleue,OUTPUT)

//onmetlavaleurdechaquecouleur
analogWrite(ledRouge,255)
analogWrite(ledVerte,144)
analogWrite(ledBleue,0)
}

voidloop()
{
//onnechangepaslacouleurdoncrienfairedanslaboucleprincipale
}

Moijobtienspasdutoutdelorange!Pluttunbleutrange
Cest exact. Souvenezvous que cest une LED anode commune, or lorsquon met
unetensionde5Vensortiedumicrocontrleur,laLEDserateinte.LesLEDsontdonc
pilotes ltat bas. Autrement dit, ce nest pas la dure de ltat haut qui est
importantemaispluttcelledeltatbas.Afindepalliercela,ilvadoncfalloirmettrela
valeur inverse de chaque couleur sur chaque broche en faisant lopration
V aleurReelle = 255 V aleurT heorique .Lecodeprcdentdevientdonc:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

constintledRouge=11
constintledVerte=9
constintledBleue=10

voidsetup()
{
//ondclarelesbrochesensorties
pinMode(ledRouge,OUTPUT)
pinMode(ledVerte,OUTPUT)
pinMode(ledBleue,OUTPUT)

//onmetlavaleurdechaquecouleur
analogWrite(ledRouge,255255)
analogWrite(ledVerte,255144)
analogWrite(ledBleue,2550)
}

Onenafiniaveclesrappels,onvapouvoircommencerunpetitexercice.

vosclaviers,prtprogrammez!
Lobjectif
267

Lobjectifestassezsimple,vousallezgnrertroisPWMdiffrentes(unepourchaque
LEDdecouleur)etcrer7couleurs(lenoirnecomptepas! )distinctesquisontles
suivantes:
rouge
vert
bleu
jaune
bleuciel
violet
blanc
Cescouleursdevrontdfileruneparune(danslordrequevousvoudrez)toutesles
500ms.

Lemontageraliser
VousallezpeuttretresurpriscarjevaisutiliserpourlemontageuneLEDanode
commune, afin de bien clairer les LED avec la bonne proportion de couleur. Donc,
lorsquilyauralavaleur255dansanalogWrite(),laLEDdecouleurrouge,parexemple,
seracompltementillumine.

268

Cestparti!

Correction
Voillepetitprogrammequejaifaitpourrpondrelobjectifdemand:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

//dfinitiondesbrochesutilise(vousteslibredeleschanger)
constintled_verte=9
constintled_bleue=10
constintled_rouge=11

intcompteur_defilement=0//variablepermettantdechangerdecouleur

voidsetup()
{
//dfinitiondesbrochesensortie
pinMode(led_rouge,OUTPUT)
pinMode(led_verte,OUTPUT)
pinMode(led_bleue,OUTPUT)
}

voidloop()
{
couleur(compteur_defilement)//appeldelafonctiond'affichage
compteur_defilement++//incrmentationdelacouleurafficher
if(compteur_defilement>6)compteur_defilement=0//silecompteurdpasse6couleurs

delay(500)
}

voidcouleur(intnumeroCouleur)
{

269

28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

switch(numeroCouleur)
{
case0://rouge
analogWrite(led_rouge,0)//rapportcycliqueauminimumpourunemeilleureluminositdel
//quijelerappelestcommandeen"inverse"
//(0>LEDallume255>LEDteinte)
analogWrite(led_verte,255)
analogWrite(led_bleue,255)
break
case1://vert
analogWrite(led_rouge,255)
analogWrite(led_verte,0)
analogWrite(led_bleue,255)
break
case2://bleu
analogWrite(led_rouge,255)
analogWrite(led_verte,255)
analogWrite(led_bleue,0)
break
case3://jaune
analogWrite(led_rouge,0)
analogWrite(led_verte,0)
analogWrite(led_bleue,255)
break
case4://violet
analogWrite(led_rouge,0)
analogWrite(led_verte,255)
analogWrite(led_bleue,0)
break
case5://bleuciel
analogWrite(led_rouge,255)
analogWrite(led_verte,0)
analogWrite(led_bleue,0)
break
case6://blanc
analogWrite(led_rouge,0)
analogWrite(led_verte,0)
analogWrite(led_bleue,0)
break
default://"noir"
analogWrite(led_rouge,255)
analogWrite(led_verte,255)
analogWrite(led_bleue,255)
break
}
}

Bonbenjevouslaisselirelecodetoutseul,voustesassezprparpourlefaire,du
moinsjespre.Pendantcetempsjevaiscontinuerlardactiondecechapitre.

TransformationPWM>signalanalogique
Bon,onestarrivmodifierlescouleursduneLEDRGBjusteavecdesimpulsions,
plusexactementenutilisantdirectementlesignalPWM.
Maiscommentfairesijeveuxunsignalcompltementanalogique?
270

Cest justement lobjet de cette souspartie : crer un signal analogique partir dun
signalnumrique.
Cependant, avant de continuer, je tiens vous informer que lon va aborder des
notionsplusprofondesenlectroniqueetquevousntespasobligdelirecette
souspartiesivousnevousensentezpascapable.Revenezplustardsivousle
voulez.Pourceuxquicelaintresseraitvraiment,jenepeuxquevousencourager
vous accrocher et ventuellement lire ce chapitre pour mieux comprendre
certainspointsessentielsutilissdanscettesouspartie.

Lavaleurmoyennedunsignal
Surunepriodedunsignalpriodique,onpeutcalculersavaleurmoyenne.Enfait,il
faut faire une moyenne de toutes les valeurs que prend le signal pendant ce temps
donn. Cest une peu lorsque lon fait la moyenne des notes des lves dans une
classe, on additionne toutes les notes et on divise le rsultat par le nombre total de
notes.Jenevaisprendrequunseulexemple,celuidontnousavonsbesoin:lesignal
carr.

Lesignalcarr
Reprenonsnotresignalcarr:

Jaimodifiunpeulimagepourvousfaireapparaitrelestemps.Onobservedoncque
du temps 0 (lorigine) au temps T , on a une priode du signal. aT correspond au
moment o le signal change dtat. En somme, il sagit du temps de ltat haut, qui
donneaussiletempsltatbasetfinalementpermetdecalculerlerapportcycliquedu
signal.Donnonsquelquesvaleursnumriquestitredexemple:

T = 1ms
a = 0.5 (correspondunrapportcycliquede50%)
Laformulepermettantdecalculerlavaleurmoyennedecettepriodeestlasuivante:

U1 aT+U2 (TaT)
T

Lavaleurmoyennedunsignalsenoteavecdeschevrons<,>autourdelalettre
indiquantdequellegrandeurphysiqueilsagit.

Explications
Premirementdanslaformule,oncalculelatensiondusignalsurlapremirepartiede
lapriode,doncde0 aT .Pourcefaire,onmultiplie U1 ,quiestlatensiondusignal
271

aT

pendantcettepriode,parletempsdelapremirepartiedelapriode,soitaT .Cequi
donne:U1 aT .Deuximement,onfaitdemmeavecladeuximepartiedusignal.
Onmultiplieletempsdeceboutdepriodeparlatension U2 pendantcetemps.Ce
tempsvaut T aT .Lersultatdonnealors: U2 (T aT ) Finalement,ondivisele
tout par le temps total de la priode aprs avoir additionn les deux rsultats
prcdents.Aprssimplification,laformuledevient:= a U1 + U2 a U2 Etcela
sesimplifieencoreen:

= a (U1 U2 ) + U2 [/latex]
Dansnotrecas,commeilsagitdunsignalcarrayantquedeuxvaleurs:0Vet5V,
onvapouvoirsimplifierlecalculparceluici:= a U1 ,carU2 = 0
Les formules que lon vient dapprendre ne sappliquent que pour une seule
priode du signal. Si le signal a toujours la mme priode et le mme rapport
cycliquealorslersultatdelaformuleestadmissiblelensembledusignal.En
revanche,silesignalaunrapportcycliquequivarieaucoursdutemps,alorsle
rsultatdonnparlaformulenestvalablequepourunrapportcycliquedonn.Il
faudradonccalculerlavaleurmoyennepourchaquerapportcycliquequepossde
lesignal.
Decefait,sionmodifielerapportcycliquedelaPWMdefaonmaitrise,onvapouvoir
crer un signal analogique de la forme quon le souhaite, compris entre 0 et 5V, en
extrayantlavaleurmoyennedusignal.Onretiendragalementque,danscetteformule
uniquement,letempsnapasdimportance.

Extrairecettevaleurmoyenne
Alors,maiscommentfairepourextrairelavaleurmoyennedusignaldelaPWM,me
direzvous.Ehbienonvautiliserlespropritsduncertaincoupledecomposantstrs
connu:lecoupleRCoursistancecondensateur.
Larsistanceonconnait,mais,lecondensateurtunousavaispasditquilservait
supprimerlesparasites?o_O
Si, bien sr, mais il possde plein de caractristiques intressantes. Cest pour cela
quecestundescomposantslesplusutilisenlectronique.Cettefois,jevaisvous
montrer une de ses caractristiques qui va nous permettre dextraire cette fameuse
valeurmoyenne.

Lecondensateur
Jevousaidjparldelarsistance,voussavezquellelimitelecourantsuivantlaloi
dOhm. Je vous ai aussi parl du condensateur, je vous disais quil absorbait les
parasites crs lors dun appui sur un bouton poussoir. prsent, on va voir un peu
plusenprofondeursonfonctionnementcaronestloindavoirtoutvu!Lecondensateur,

272

je rappel ses symboles :


est constitu de deux
plaquesmtalliques,desarmatures,posesfacefaceetisolesparunisolant!
Donc,ensommelecondensateurestquivalentuninterrupteurouvertpuisquilnya
pasdecourantquipeutpasserentrelesdeuxarmatures.Chaquearmatureseramise
un potentiel lectrique. Il peut tre gal sur les deux armatures, mais lutilisation
majoritairefaitquelesdeuxarmaturesontunpotentieldiffrent.

LecoupleRC
Bon,etmaintenant?Maintenantonvafaireunpetitmontagelectrique,vouspouvezle
fairesivousvoulez,nonenfaitfaiteslevouscomprendrezmesexplicationsenmme
tempsquevousferezlexpriencequivasuivre.Voillemontageraliser:

Lesvaleursdescomposantssont:

U = 5V (utilisezlatension5VfournieparvotrecarteArduino)
C = 1000F
R charge = 1k
R decharge = 1k
Lemontageesttermin?Alorsfermezlinterrupteur
Quesepassetil?
Lorsque vous fermez linterrupteur, le courant peut stablir dans le circuit. Il va donc
aller allumer la LED. Ceci fait abstraction du condensateur. Mais, justement, dans ce
montage il y a un condensateur. Quobservezvous ? La LED ne sallume pas
immdiatement et met un peu de temps avant dtre compltement allume. Ouvrez
linterrupteur. Et l, quy atil de nouveau ? En thorie, la LED devrait tre teinte,
cependant,lecondensateurfaitdessiennes.OnvoitlaLEDsteindretoutdoucement
273

etpendantpluslongtempsquelorsquellesallumait.Troublant,nestcepas?
Vous pouvez ritrer lexprience en changeant la valeur des composants, sans
jamaisdescendreendessousde220Ohmpourlarsistancededcharge.

Explications
Jevaisvousexpliquercephnomneasseztrange.Vouslaurezsansdoutedevin,
cestlecondensateurquijouelepremierrle!Enfait,lorsquelonappliqueunpotentiel
diffrentsurchaquearmature,lecondensateurnaimepastropa.Jenedispasquea
risquedelendommager,simplementquilnaimepasa,commesivousonvousforait
mangerquelquechosequevousnaimezpas.Ducoup,lorsquonluiappliqueune
tensionde5Vsurunedessesarmaturesetlautrearmatureestrelielamasse,ilmet
dutempsaccepterlatension.Etpluslatensioncroit,moinsilaimeaetplusilmetdu
tempslaccepter.Sionregardelatensionauxbornesdecepauvrecondensateur,on
peutobserverceci:

Latensionaugmentedefaonexponentielleauxbornesducondensateurlorsquonle
chargetraversunersistance.Oui,onappellealachargeducondensateur.Cest
un peu comme si la rsistance donnait un mauvais got la tension et plus la
rsistanceestgrande,pluslegotesthorribleetmoinslecondensateursechargevite.
Cest lexplication de pourquoi la LED sest claire lentement. Lorsque lon ouvre
linterrupteur, il se passe le phnomne inverse. L, le condensateur peut se
dbarrasserdecemauvaisgotquilaaccumul,saufquelarsistanceetlaLEDlen
empchent.IlmetdoncdutempssedchargeretlaLEDsteintdoucement:

274

Pourterminer,onpeutdterminerletempsdechargeetdedchargeducondensateur
partirdunparamtretrssimple,quevoici:

=RC
Avec:

:(prononcezto)tempsdecharge/dchargeensecondes(s)
R :valeurdelarsistanceenOhm()
C :valeurdelacapacitducondensateurenFarad(F)
Cette formule donne le temps qui correspond 63% de la charge la tension
applique au condensateur. On considre que le condensateur est compltement
chargpartirde 3 (soit95%delatensiondecharge)ou 5 (99%delatensionde
charge).

ImposonsnotrePWM!
Bon,trsbien,maisquelestlerapportaveclaPWM?
Ha,haa!Alors,pourcommencer,vousconnaissezlarponse.
Depuisquand?o_O
Depuisquejevousaidonnlesexplicationsprcdentes.Dsquelonauraimpos
notrePWMaucoupleRC,ilvasepasserquelquechose.Quelquechosequejeviens
de vous expliquer. chaque fois que le signal de la PWM sera au NL 1, le
condensateurvasecharger.DsquelesignalrepasseauNL0,lecondensateurvase
dcharger. Et ainsi de suite. En somme, cela donne une variation de tension aux
bornesducondensateursemblablecelleci:

Quyatildenouveauparrapportausignalcarr,partsaformebizarrode!?
Danscecas,riendeplus,sioncalculelavaleurmoyennedusignalbleu,ontrouverala
mmevaleurquepourlesignalrouge.(Nemedemandezpaspourquoi,cestcomme
a,cestuneformuletrscompliquequiledit ).Prcisonsquedanscecas,encore
une fois, le temps de charge/dcharge 3 du condensateur est choisi de faon ce
quilsoitgalunedemipriodedusignal.Quesepasseratilsionchoisituntemps
decharge/dchargepluspetitouplusgrand?

Constantedetemps suprieurelapriode
275

Voil le chronogramme lorsque la constante de temps de charge/dcharge du


condensateurestplusgrandequelapriodedusignal:

Cechronogrammepermetdobserverunphnomneintressant.Eneffet,onvoitque
la tension aux bornes du condensateur natteint plus le +5V et le 0V comme au
chronogramme prcdent. Le couple RC tant plus grand que prcdemment, le
condensateurmetplusdetempssecharger,ducoup,commelesignalvaplusvite
que le condensateur, ce dernier ne peut se charger/dcharger compltement. Si on
continue daugmenter la valeur rsultante du couple RC, on va arriver un signal
commececi:

Etcesignal,MesdamesetMessieurs,cestlavaleurmoyennedusignaldelaPWM!!

CalibrercorrectementlaconstanteRC
Jevoussensveniravecvosgrandsairsenmedisant:Oui,maisllesignalilestpas
dutoutconstantpourunniveaudetension.Ilarrtepasdebougeretmonterdescendre
! Comment on fait si on veut une belle droite ? Eh bien, diraisje, cela nest pas
impossible,maisservletreunetchedifficileetcontraignante.Plusieursarguments
viennentconfortermesdires.

Letempsdestabilisationentredeuxpaliers
Je vais vous montrer un chronogramme qui reprsente le signal PWM avec deux
rapportscycliquesdiffrents.Vousallezpouvoirobserverunphnomnequisecache
276

Voyezdonccefameuxchronogramme.Quenpensezvous?Cenestpasmerveilleux
hein! Quelquesexplications:pourpasserdunpalierunautre,lecondensateur
met un certain temps. Ce temps est grosso modo celui de son temps de charge
(constante RC). Cestdire que plus on va augmenter le temps de charge, plus le
condensateurmettradutempspoursestabiliseraupaliervoulu.Orsilonveutcrerun
signalanalogiquequivarieassezrapidement,celavanousposerproblme.

Lapertedetempsenconversion
Cestcequejeviensdnoncer,pluslaconstantedetempsestgrande,plusilfaudrade
priodesdePWMpourstabiliserlavaleurmoyennedusignallatensionsouhaite.
linverse,siondiminuelaconstantedetemps,changerdepalierseraplusrapide,mais
la tension aux bornes du condensateur aura tendance suivre le signal. Cest le
premierchronogrammequelonavuplushaut.

Finalement,commentcalibrercorrectementlaconstanteRC?
Celasavretredlicat.Ilfauttrouverlejustemilieuenfonctiondubesoinquelona.
Silonveutunsignalquisoitleplusprochepossibledelavaleurmoyenne,ilfaut
uneconstantedetempstrsgrande.
Siaucontraireonveutunsignalquisoitleplusrapideetquelavaleurmoyenne
soituneapproximation,alorsilfautuneconstantedetempsfaible.
Sionveutunsignalrapideetleplusprochepossibledelavaleurmoyenne,ona
deuxsolutionsquisont:
mettre un deuxime montage ayant une constante de temps un peu plus
grande,encascadedupremier(onperdquandmmeenrapidit)
changerlafrquencedelaPWM

ModifierlafrquencedelaPWM
Onlavu,aveclafrquenceactuelledelaPWMensortiedelArduino,onvanepouvoir
crerquedessignauxlents.Lorsquevousaurezbesoindallerplusvite,vousvous
confronterezceproblme.Cestpourquoijevaisvousexpliquercommentmodifierla
277

frquencedecettePWM.
Nouveau message davertissement : cette fois, on va directement toucher aux
registres du microcontrleur, donc si vous comprenez pas tout, ce nest pas trs
grave car cela requiert un niveau encore plus lev que celui que vous avez
actuellement.
Commenonscettetrscourtesouspartie.

PourquoichangerlafrquencedelaPWM?
Oui,pourquoi?Toutsimplementpouressayerdecrerunsignalquiserapprochele
plus de la valeur moyenne de la PWM chaque instant. Lobjectif est de pouvoir
maximiser lavantage de la structure ayant une faible constante de temps tout en
liminant au mieux son dsavantage. Vous verrez peuttre mieux avec des
chronogrammes.Envoicideux,lepremierestceluiolafrquencedelaPWMestcelle
fourniedorigineparlArduino,lesecondestlaPWMunefrquencedeuxfoisplus
leve,aprsmodificationduprogramme:

Pouruneconstantedetempsidentiquepourchaquecourberalise,onrelvequele
tempsdestabilisationdusignalestplusrapidesurlechronogrammeolafrquence
est deux fois plus leve quavec la frquence standard dArduino. Ici donc, on a :
t 2 t 1 = 2 (t 4 t 3 ) . En effet car le temps (T) est proportionnel la frquence (F)

F=

278

selon cette formule : F = T1 Avec quelques mots pour expliquer cela, le temps de
charge du condensateur, pour se stabiliser au nouveau palier de tension, est plus
rapideavecunefrquenceplusleve.comparaison,pourlepremiersignal,letemps
dechargeestdeuxfoisplusgrandqueceluipourledeuximesignalolafrquence
estdeuxfoisplusleve.
Mesdessinsnesontpastrsrigoureux,maismestalentsdegraphistesmelimitent
a. Soyez indulgent mon gard. Quoi quil en soit, il sagissait, ici,
simplementdillustrermesproposetdonnerunexempleconcret.

Utilisationduregistre
Bigre!Jeviensdecomprendrepourquoionavaitbesoindechangerlafrquence
delaPWM. Maiseuhcommentonfait?Cestquoilesregistres?
Lesregistresehbiencestcompliqu!:ninja:Non,jenentrerai
pasdansledtailenexpliquantcequestunregistre,depluscestunsujetquejene
maitrisepasbienetquivousseracertainementinutiledanslecasprsent.Disonspour
linstantqueleregistreestunevariabletrsspciale.

CodedemodificationdelafrquencedelaPWM
Alors,pourmodifierlafrquencedelaPWMdelArduinoondoitutiliserlecodesuivant
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

//ondfinitunevariabledetypebyte
//quicontiendral'octetdonnerauregistrepourdiviserlafrquencedelaPWM

//divisionpar:1,8,64,256,1024
bytedivision_frequence=0x01
//frquence:62500Hz,7692Hz,...
//tempsdelapriode:16s,130s,...

voidsetup()
{
pinMode(6,OUTPUT)//brochedesortie

//TCCR0Bc'estleregistre,onopreunmasquagesurluimme
TCCR0B=TCCR0B&0b11111000|division_frequence
//cequipermetdemodifierlafrquencedelaPWM
}

voidloop()
{
//oncritsimplementlavaleurde0255durapportcycliquedusignal
analogWrite(6,128)
//quiestlanouvellefrquencechoisit
}

Vous remarquerez que les nombres binaires avec Arduino scrivent avec les
caractres0bdevant.
Cette souspartie peut ventuellement tre prise pour un truc et astuce. Cest
279

quelque peu le cas, malheureusement, mais pour viter que cela ne le soit
compltement,jevaisvousexpliquerdesnotionssupplmentaires,parexemplela
ligne12ducode.

Traductionsilvousplait!
Jeledisaisdonc,onvavoirensemblecommentfonctionnelaligne12duprogramme:

1 TCCR0B=TCCR0B&0b11111000|division_frequence

Trssimplement,TCCR0Bestlenomduregistreutilis.Cetteligneestdonclpour
modifier le registre puisquon fait une opration avec et le rsultat est inscrit dans le
registre.Cetteoprationest,ilfaudralavouer,peucommune.Oneffectue,cequelon
appelleenprogrammation,unmasquage.Lemasquageestuneoprationlogiqueque
lonutiliseavecdesdonnesbinaires.Onpeutfairediffrentsmasquagesenutilisant
lesoprationslogiquesET,OU,OUexclusif,Danslecasprsent,onalavariable
TCCR0BquiestsousformebinaireetoneffectueuneoprationET(symbole&)puis
uneoprationOU(symbole|).LesoprationsETetOUsontdfiniesparunetablede
vrit.Avecdeuxentres,onaunesortiequidonnelersultatdeloprationeffectue
aveclesdeuxniveauxdentre.
Entres SortieET SortieOU
A B AETB AOUB
0 0 0
0
0 1 0
1
1 0 0
1
1 1 1
1
LesoprationsdetypeETetOUontunniveaudeprioritcommelamultiplicationet
laddition. On commence toujours par effectuer lopration ET, puis on termine avec
loprationOU.Onpourraitdonccrirececi:
1 TCCR0B=(TCCR0B&0b11111000)|division_frequence

Prenons maintenant un exemple o la variable spciale TCCR0B serait un nombre


binairegal:
1 TCCR0B=0b10011101//valeurduregistre

prsent,onluifaitunmasquagedetypeET:
1 TCCR0B=0b10011101
2
3 TCCR0B=TCCR0B&0b11111000//masquagedetypeET

On fait lopration laide de la table de vrit du ET (voir tableau cidessus) et on


trouvelersultat:
1 TCCR0B=0b10011101
2
3 TCCR0B=TCCR0B&0b11111000

280

4
5 //TCCR0Bvautmaintenant:0b10011000

Ensomme,onconclutquelonagardlavaleurdes5premiersbits,maislonaeffac
la valeur des 3 derniers bits pour les mettre zro. Ainsi, quelle que soit la valeur
binaire de TCCR0B, on met les bits que lon veut ltat bas. Ceci va ensuite nous
permettredechangerltatdesbitsmisltatbaseneffectuantloprationOU:
1
2
3
4
5
6
7
8
9

bytedivision_frequence=0x01//nombrehaxadcimalquivaut0b00000001

TCCR0B=0b10011101

TCCR0B=TCCR0B&0b11111000
//TCCR0Bvautmaintenant:0b10011000

TCCR0B=TCCR0B|division_frequence
//TCCR0Bvautmaintenant:0b10011001

Daprs la table de vrit du OU logique, on a modifi la valeur de TCCR0B en ne


changeantqueleoulesbitsquelonvoulait.
LavaleurdeTCCR0Bquejevousaidonneestbidon.Cestunexemplequivous
permetdecomprendrecommentfonctionneunmasquage.
Cequilfautretenir,pourchangerlafrquencedelaPWM,cestquepourlavariable
division_frequence,ilfautluidonnerlesvaleurshexadcimalessuivantes:
1
2
3
4
5
6
7

0x01//lafrquencevaut62500Hz(frquencemaximalefournieparlaPWM=>provientdelafrquence
//effectueunedivisionpar1delafrquencemax

0x02//f=7692Hz(divisionpar8delafrquencemaximale)
0x03//f=976Hz,divisionpar64
0x04//f=244Hz,divisionpar256
0x05//f=61Hz,divisionpar1024

Voustrouverezplusdedtailssurcettepage(enanglais).

Testdevrification
Pourvrifierquelafrquenceabienchang,onpeutreprendrelemontagequelona
fait plus haut et enlever linterrupteur en le remplaant par un fil. On ne met plus un
gnrateurdetensioncontinue,maisonbrancheunesortiePWMdelarduinoavecle
programme qui va bien. Pour deux frquences diffrentes, on devrait voir la LED
sallumerplusoumoinsrapidement.Oncompareletempsltataulorsqueloncrit
1000 fois un niveau de PWM 255 celui mis par le mme programme avec une
frquencedePWMdiffrente,grceuneLED.
partirdemaintenant,vousallezpouvoirfairedeschosesamusantesaveclaPWM.
Celavanousservirpourlesmoteurspourneciterqueux.Maisavant,caronenestpas
encorel,jevousproposeunpetitTPassezsympa.Rendezvousauprochainchapitre
!

281

[Arduino404][Exercice]UneanimationYouTube
Danscepetitexercice,jevousproposedefaireuneanimationquevousaveztousvu
aumoinsunefoisdansvotrevie:le.gifdechargementYouTube!Pourceuxquise
posentdesquestions,nousnallonspasfairedePhotoshopouquoiquecesoitdece
genre. Non, nous (vous en fait ) allons le faire avec des LED ! Alors place
lexercice!

nonc
Pourclturervotreapprentissageaveclesvoiesanalogiques,nousallonsfaireunpetit
exercicepoursedtendre.Lebutdecedernierestderaliserunedesanimationsles
plus clbres de linternet : le .gif de chargement YouTube (qui est aussi utilis sur
dautres plateformes et applications). Nous allons le raliser avec des LED et faire
varier la vitesse de dfilement grce un potentiomtre. Pour une fois, plutt quune
longueexplicationjevaisjustevousdonnerunelistedecomposantsutilesetunevido
quiparledellemme!

Boncourage!
6LED+leursrsistancesdelimitationdecourant
Unpotentiomtre
UneArduino,unebreadboardetdesfils!

Solution
Leschma
Voici tout dabord le schma, car une bonne base lectronique permettra de faire un
beaucodeensuite.Pourtoutleslecteursquinepensentquauxcircuitsetneregardent
jamais la version photo du montage, je vous invite pour une fois y faire attention,
surtoutpourlaspectgomtriqueduplacementdesLED.Enpassant,dansloptiquede
fairevarierlaluminositdesLED,ilfaudralesconnectersurlesbrochesPWM(notes
avec un ~). Le potentiomtre quant lui sera bien entendu connect une entre
analogique(la0dansmoncas).Commetoujours,lesLEDaurontleuranodereliesau
+5Vetserontpilotespartatbas(importantdelerappelerpourlecodeensuite).
282

283

Lecode
AlorspetitdfiavantderegarderlasolutionEncombiendeligneavezvousrussi
crirevotrecode(proprement,sanstoutmettresuruneseuleligne,pasdetriche!)?
Personnellementjelaifaiten23lignes,enfaisantdesbeauxespacespropres. Bon
allez, trve de plaisanterie, voici la solution, comme laccoutum dans des balises
secrtes

Lesvariablesglobales
Commevousdevezvousendouter,nousallonscommencerpardclarerlesdiffrentes
broches que nous allons utiliser. Il nous en faut six pour les LED et une pour le
potentiomtrederglagedelavitessedanimation.Pourdesfinsdesimplicitdansle
code,jaimislessixsortiesdansuntableau.Pourdautresfinsdefacilit,jaiaussimis
les niveaux de luminosit dans un tableau de char que jappellerai pwm. Dans la
284

balisesuivantevoustrouverezlensembledecesdonnes:
1
2
3
4
5
6

//sortieLEDs
constintLED[6]={3,5,6,9,10,11}
//niveauxdeluminositutilis
constcharpwm[6]={255,210,160,200,220,240}
//potentiometresurlabroche0
constintpotar=0

Lesetup
Personnenedevraissetromperdanscettefonction,onestdansledomaineduconnu,
vuetrevu!Ilnoussuffitjustedemettreenentrelepotentiomtresursonconvertisseur
analogiqueetensortiemettrelesLED(unesimpleboucleforsuffitgraceautableau
).
1
2
3
4
5
6
7
8

voidsetup()
{
//lepotentiomtreenentre
pinMode(potar,INPUT)
//lesLEDsensorties
for(inti=0i<6i++)
pinMode(LED[i],OUTPUT)
}

Laloop
Passons au cur du programme, la boucle loop() ! Je vais vous la divulguer ds
maintenantpuislexpliquerensuite:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

voidloop()
{
//tapedel'animation
for(inti=0i<6i++)
{
//misejourdesLEDs
for(intn=0n<6n++)
{
analogWrite(LED[n],pwm[(n+i)%6])
}
//rcupreletemps
inttemps=analogRead(potar)
//tmax=190ms,tmin=20ms
delay(temps/6+20)
}
}

Commevouspouvezleconstater,cettefonctionsecontentedefairedeuxboucle.Lune
sert mettre jour les phases de mouvements et lautre met jour les PWM sur
chacunedesLED.

Lestapesdelanimation
Comme expliqu prcdemment, la premire boucle concerne les diffrentes phases
delanimation.CommenousavonssixLEDnousavonssixniveauxdeluminositet
donc six tapes appliquer (chaque LED prenant successivement chaque niveau).
Nous verrons la seconde boucle aprs. Avant de passer la phase danimation
285

suivante,nousfaisonsunepetitepause.Laduredecettepausedterminelavitesse
delanimation.Commedemanddanslecahierdescharges,cettedureserarglable
laidedunpotentiomtre.Laligne9nouspermetdoncdercuprerlavaleurluesur
lentreanalogique.Pourrappel,ellevarierade01023.Silonappliquecettevaleur
directementaudlai,nousaurionsuneanimationpouvantallerdetrstrstrsrapide
(potarauminimum)trstrstrslent(delayde1023ms)lorsquelepotarestdans
lautresens.Afindobtenirunrglageplussympa,onfaitunepetiteoprationsurcette
valeur. Pour ma part jai dcid de la diviser par 6, ce qui donne
0ms temps 170ms . Estimant que 0 ne permet pas de faire une animation
(puisquon passerait directement ltape suivante sans attendre), jajoute 20 ce
rsultat. Le temps final sera donc compris dans lintervalle :
20ms temps 190ms .

MisejourdesLED
Ladeuximebouclepossdeuneseulelignequiestlacldetoutelanimation!Cette
bouclesertmettrejourlesLEDpourquellesaienttoutelabonneluminosit.Pour
cela,onutiliseralafonctionanalogWrite()(caraprstoutcestlebutduchapitre!).Le
premierparamtreseralenumrodelaLED(grceunefoisdeplusautableau)etle
secondseralavaleurduPWM.Cestpourcettevaleurquetoutelastucesurvient.En
effet,jutiliseuneoprationmathmatiqueunpeuparticulirequelonappellemodulo.
Pourceuxquineserappellepasdecedernier,nouslavonsvuilyatrslongtemps
danslapremirepartie,deuximechapitressurlesvariables.Cetoprateurpermetde
donnerlersultatdeladivisioneuclidienne(maisjevouslaisseallervoirlecourspour
plusdedtail).Pourobtenirlabonnevaleurdeluminositilmefautlirelabonnecase
dutableaupwm[].Ayantsixniveauxdeluminosit,jaisixcasedansmontableau.Mais
commentobtenirlebonne?EhbiensimplementenadditionnantlenumrodelaLED
en train dtre mise jour (donn par la seconde boucle) et le numro de ltape de
lanimationencours(donnparlapremireboucle).Seulementimaginonsquenous
mettionsjourlasiximeLED(indice5)pourlaquatrimetape(indice3).anous
donne8.Hors8estplusgrandque5(nombremaximaledelindexpouruntableaude6
cases).Enutilisantlemodulo,nousprenonslersultatdeladivisionde8/5soit3.Il
nousfaudradoncutiliserlacasenumro3dutableaupwm[]pourcetteutilisation.Tout
simplement
Jesuisconscientquecettecriturenestpassimple.Ilesttoutafaitnormaldene
pas lavoir trouv et demande une certaine habitude de la programmation et ses
astucespourypenser.
Pourceuxquisedemandeencorequelestlintrtdutiliserdestableauxdedonnes,
voicideuxlmentsderponse.
AdmettonsjutiliseuneArduinoMegaquipossde15pwm,jauraispuallumer15
LEDsdansmonanimation.Maissijavaisfaitmonsetupdemanirelinaire,il
mauraitfallurajouter9lignes.Grceautableau,jaijustebesoindelesajouter
cedernieretdemodifierlindicedefinpourlinitialisationdanslabouclefor.
La mme remarque sapplique lanimation. En modifiant simplement les
tableaux je peux changer rapidement lanimation, ses niveaux de luminosit, le
nombredeLEDs,lordredclairageetc

Leprogrammecomplet
286

Etpourtoutceuxquidoutedufonctionnementduprogramme,voicidsmaintenantle
codecompletdelamachine!(Attentionlorsquevousfaitesvosbranchementmettre
lesLEDdanslebonordre,souspeinedavoirunesquenceanarchique).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

//sortieLEDs
constintLED[6]={3,5,6,9,10,11}
//niveauxdeluminositutilis
constcharpwm[6]={255,210,160,200,220,240}
//potentiometresurlabroche0
constintpotar=0

voidsetup()
{
pinMode(potar,INPUT)
for(inti=0i<6i++)
pinMode(LED[i],OUTPUT)
}

voidloop()
{
//tapedel'animation
for(inti=0i<6i++)
{
//misejourdesLEDs
for(intn=0n<6n++)
{
analogWrite(LED[n],pwm[(n+i)%6])
}
//rcupreletemps
inttemps=analogRead(potar)
//tmax=190ms,tmin=20ms
delay(temps/6+20)
}
}

La mise en bouche des applications possibles avec les entres/sortie PWM est
maintenanttermine.Jevouslaisserflchircequevouspourriezfaireavec.Tenez,
dailleursleschapitresdelapartiesuivanteutilisentcesentres/sortiesetcenestpas
parhasard

287

[Arduino 5] Les capteurs et lenvironnement autour


dArduino
Savoirprogrammercestbien,maiscrerdesapplicationsquiprennentencompteles
vnements de leur environnement, cest mieux ! Cette partie va donc vous faire
dcouvrirlescapteurscourammentutilissdanslessystmesembarqus.Alorsoui,le
bouton poussoir et le potentiomtres peuvent, en quelque sorte, tre dfinis comme
tantdescapteurs,maisvousallezvoirquilenexistepleindautres,chacunmesurant
unegrandeurphysiquedistincteetplusoumoinsutileselonlapplicationsouhaite.

[Arduino501]Gnralitssurlescapteurs
Ce premier chapitre va vous prsenter un peu ce que sont les capteurs, quoi ils
servent, oestce quon en trouve, etc. leur taille, leur forme et jen passe. Je vais
simplement vous faire dcouvrir le monde des capteurs qui, vous allez le voir, est
merveilleux!

CapteuretTransducteur
Uncapteurestundispositifcapabledetransformerunegrandeurphysique(tellequela
temprature,lapression,lalumire,etc.)enuneautregrandeurphysiquemanipulable.
Onpeutdailleursprendredesexemples:unmicrophoneestuncapteurquipermetde
transformer une onde sonore en un signal lectrique un autre capteur tel quune
photorsistancepermetdetransformerunsignallumineuxenrsistancevariableselon
sonintensit.

Pournous,utiliserunthermomtremercurerisquedtredifficileavecArduino,carce
capteur ne dlivre pas dinformation lectrique ou de rsistance qui varie. Il sagit
seulement dun niveau de liquide. Tandis quutiliser un microphone ou une
photorsistanceserabeaucoupplusfacile.Ondistinguedeuxtypesdecapteurs.

CapteursTransducteurspassifs
Ces capteurs ont pour objet de transformer ou plus exactement :
donner une image de la grandeur physique quils mesurent par une
rsistancelectriquevariable(enfaitilsagitduneimpdance,mais
restonssimples).Parexemple,lepotentiomtredonneunersistance
qui varie selon la position de son axe. Pour ce qui est de leur
utilisation,ilfaudrancessairementlesutiliseravecunmontagepourPhotorsistance
288

pouvoirlesutiliseravecArduino.Nousauronsloccasiondevoirtoutcelaendtailplus
loin. Ainsi, il ne sagit pas rellement de capteur, mais de transducteurs car nous
sommesobligsdedevoirutiliserunmontageadditionnelpourassureruneconversion
delagrandeurmesureenunsignallectriqueexploitable.
Cesontprincipalementdestransducteursquenousallonsmettreenuvredansle
cours. Puisquils ont lavantage de pouvoir fonctionner seul et donc cela vous
permettradevousexercerauniveaulectronique!

Capteursactifs
Cetteautrecatgoriedecapteurestunpeuspcialeetnerecenseque
trspeudecapteursensonsein.Ilsagitdecapteurdontlagrandeur
physique ellemme mesure va directement tablir une relation
Thermocouple lectriquedesortie.Cestdirequensortiedecetypedecapteur,ily
aura une grandeur lectrique, sans adjonction de tension ses
bornes. On peut dire que la prsence de la tension (ou diffrence de potentiel, plus
exactement)estgnreparlagrandeurphysique.Nousnentreronspasdansledtail
decescapteursetresteronsdanscequiestabordablevotreniveau.

Lesautrescapteurs
Enfait,ilnenexistepasrellementdautres
Cesautrescapteurs,dontjeparle,sontlescapteurs
oudtecteurstoutprtsquelonpeutacheterdansle
commerce, entre autres les dtecteurs de
mouvements ou capteur de distance. Ils ne font pas
partie des deux catgories prcdemment cites,
puisquils possdent toute une lectronique
Dtecteurinfrarouge
dadaptation qui va soccuper dadapter la grandeur
physiquemesureparlecapteuretagirenfonction.
Parexempleallumeruneampoulelorsquildtecteunmouvement.Sachezcependant
quilenexistebeaucoupdautres!Cesontdoncbiendescapteursquiutilisentunou
destransducteurs.Onpourraenfabriquergalement,nousseronsmmeobligsafin
dutiliserlestransducteursquejevaisvousfairedcouvrir.
Retenez donc bien la diffrence entre transducteur et capteur : un transducteur
permet de donner une image de la grandeur physique mesure par une autre
grandeurphysique,maisildoittreadditionnunmontagepourtreutilisun
capteurestncessairementconstituduntransducteuretdunmontagequiadapte
la grandeur physique donne par le transducteur en une information facilement
manipulable.

Uncapteur,acapte!
Un capteur, on la vu, est donc constitu dun transducteur et dune lectronique
dadaptation.Letransducteurvadabordmesurerlagrandeurphysiquemesurer,par
exemple la luminosit. Il va donner une image de cette grandeur grce une autre
289

grandeur,danscecasunersistancelectriquevariable.Etllectroniquedadaptation
vasecharger,parexemple,detransformercettegrandeurenunetensionlectrique
imagedelagrandeurmesure.Attentioncependant,celaneveutpasdirequelasortie
sera toujours une tension variable. Ainsi, on pourrait par exemple plutt avoir un
courant variable (et tension fixe), ou carrment un message via une liaison de
communication(voirsrieparexemple).Uncapteurplussimpleparexemplepourrait
simplement nous dlivrer un niveau logique pour donner une information telle que
obstacleprsent/absent.

A gauche se trouve la grandeur physique mesurable. En sortie du transducteur cest


une autre grandeur physique, manipulable cette fois. Et en sortie de llectronique
dadaptation,cestlinformationquipeuttresousformedesignallectriqueoudune
simpleimagedelagrandeurphysiquemesureparuneautregrandeurphysiquetelle
quunetensionlectriqueouuncourant.

Mesure,lerledutransducteur
Gardonsnotreexempleavecuncapteur,pardon,transducteurquimesurelaluminosit.
LetransducteurquiopreaveccettegrandeurestunephotorsistanceouLDR(Light
Depending Resistor). Cest une rsistance photosensible, ou si vous prfrez qui
ragitlalumire.Larelationtablieparlaphotorsistanceentrelaluminositetsa
rsistance de sortie permet davoir une image de lintensit lumineuse par une
rsistancelectriquequivarieseloncetteintensit.Voicisonsymbolelectriqueetune
petitephotodidentit:

290

Onadonc,ensortiedutransducteur,unerelationdutypeyenfonctiondex:y = f(x) .
Ilsagitsimplementdurapport entre la grandeur physique dentre du capteur et sa
grandeurphysiquedesortie.Ici,lerapportentrelaluminositetlarsistancelectrique
desortie.Danslesdocstechniques,voustrouvereztoujourscerapportexprimsous
formegraphique(onappelleaunecourbecaractristique).Ici,nousavonsdoncla
rsistanceenfonctiondelalumire:

Lintrtdadapter
Adapterpourquoifaire?Ehbienjepensedjavoirrponducettequestion,mais
reprenonslesexplicationsaveclexemplecidessus.Laphotorsistancevafournirune
rsistancelectriquequifluctueselonlaluminositdefaonquasiproportionnelle(en
faitcenestpasrellementlecas,maisfaisonscommesi ).Ehbien,quevatonfaire
dune telle grandeur ? Estce que nous pouvons lutiliser avec notre carte Arduino ?
291

Directementcenestpaspossible.Noussommesobligdeladapterenunetension
quivarie de faon proportionnelle cette rsistance, puisque nous ne sommes pas
capable de mesurer une rsistance directement. Ensuite nous pourrons simplement
utiliser la fonction analogRead() pour lire la valeur mesure. Nanmoins, il faudra
certainementfairedescalculsdansleprogrammepourdonnerunerelleimagedela
luminosit.Etensuite,ventuellement,affichercettegrandeuroulatransmettreparla
liaisonsrie(oulutiliserdelamanirequivousfaitplaisir !).Denouveau,voicila
relationtablissantlerapportentrelesdeuxgrandeursphysiquesdentretdesortie
duntransducteur:

y = f(x)
Apartirdecetterelation,onvapouvoirgrerllectroniquedadaptationpourfaireen
sortedtablirunenouvellerelationquisoitgalementuneimagedelamesureralise
parlecapteur.Cestdirequelonvacreruneimageproportionnelledelagrandeur
physique dlivre en sortie du capteur par une nouvelle grandeur physique qui sera,
cette foisci, bien mieux exploitable. En loccurrence une tension dans notre cas. La
nouvellerelationseradustyleyprime(attention,ilnesagitpasdeladrivedeymais
deyimage)enfonctiondey:

y = g(y)
Cequirevientdirequeyprimeestlarelationdesortieducapteurenfonctiondela
grandeurdemesuredentr.Soit:

y = g(y)y = g(f(x))
Concrtement,nousretrouvonscesformulesdanschaquepartieducapteur:

Llectroniquedadaptation
Elleseraproprechaquecapteur.Cependant,jelainoncaudbutdecechapitre,
nous utiliserons principalement des transducteurs qui ont en sortie une rsistance
lectrique variable. Llectronique dadaptation sera donc quasiment la mme pour
tous.Laseulechosequichangeracertainement,cestleprogramme.Ouicarlacarte
Arduino fait partie intgrante du capteur puisque cest avec elle que nous allons
fabriquer nos capteurs. Le programme sera donc diffrent pour chaque capteur,
dautantplusquilsnontpastouslesmmesrelationsdesortievouslaurezcompris,
onauradequoisamuser! Pourconcluresurlintrieurducapteur,rentronsdansla
partielectroniquedadaptation.LacarteArduinofaisantpartiedecettelectronique,
onvaavoirunschmatelqueceluici:

292

Alentredellectroniquedadaptationsetrouvelagrandeurdesortiedutransducteur
lasortiedellectroniquedadaptationsetrouvelagrandeurdesortieducapteur.On
peutaprsfairecequelonveutdelamesurepriseparlecapteur.Toujoursavecla
carte Arduino, dans une autre fonction du programme, on pourra alors transformer la
valeurmesurepourlatransmettrevialaliaisonsrieousimplementlaffichersurun
cranLCD,voirlutiliserdansunefonctionquidterminesilamesuredpasseunseuil
limiteafindefermerlesvoletsquandilfaitnuit

Lescaractristiquesduncapteur
Pour terminer cette introduction gnrale sur les capteurs, nous allons aborder les
caractristiquesessentiellesconnaitre.

Lescritresnepasngliger
Laplagedemesure
Laplagedemesure,ougammedemesure,estlapremirechoseregarderdansle
choix dun capteur ou dun transducteur. Cest elle qui dfinit si vous allez pouvoir
mesurer la grandeur physique sur une grande plage ou non. Par exemple pouvoir
mesurerunetempraturede50C+200C.Toutdpendradecequevousvoudrez
mesurer.

Laprcision
Laprcisionestledeuximecritredechoixleplusimportant.Eneffet,sivotrecapteur
detempratureauneprcisionde1C,vousaurezdumallutiliserdansunprojetqui
demande une prcision de mesure de tempratures de 0.1C ! En rgle gnrale, la
prcision est plus grande lorsque la plage de mesure est faible et inversement elle
devient moins grande lorsque la plage de mesure augmente. Il est en effet assez
difficiledefabriquerdescapteursquiontuneplagedemesuretrsgrandeparexemple
unvoltmtrequimesureraitjusqu1000Vavecuneprcisionde0.001V!Etpuis,cest
rarementutiledavoircesdeuxparamtresleurvaleurlaplusleve(grandeplage
demesureetgrandeprcision).Dansuncasleplusgnral,prixgaluncapteurqui
mesureuneplusgrandeplageaurasurementuneprcisionplusfaiblequuncapteur
mesurantuneplageplusrduite.
293

Satensiondalimentation
Ilesteneffetimportantdesavoirquelletensionilfonctionne,pournepasavoirde
mauvaisesurpriseslorsquelonveutlutiliser!

Dautrescaractristiquesconnaitre
Larsolution
Certainscapteursproposentunesortieviaunecommunication(srie,IC,SPI).Du
coup,lasortieestditenumrique(puisquonrcupreuneinformationlogiqueplutt
quanalogique). Un facteur prendre en compte est la rsolution propose. Certains
capteursserontdoncsur8bits(lavaleurdesortieseracodsur256niveaux),dautres
10 bits, 16 bits, 32 bits Il est vident que plus la rsolution est leve et plus la
prcisionofferteestgrande.

Lareproductibilit
Cefacteursertdterminerlafiabilitdunemesure.Siparexemplevoussouhaitez
mesurerunetemprature0.1Cprs,etquelecapteurquevousutilisezoscilleentre
10.3 et 10.8C lorsque vous faites une srie de mesures conscutives dans un
intervalledetempscourt,vousntespasprcis.Lareproductibilitestdonclecritre
servantexprimerlafiabilitdunemesureautraversderptitionsconscutives,etle
caschantexprimelcarttypeetladispersiondecesdernires.Siladispersionest
leve,ilpeuttreutiledefaireplusieursmesuresenuncourttempspourensuitefaire
unemoyennedecesdernires.

Letempsderponse
Comme son nom lindique, cela dtermine la vitesse laquelle le capteur ragit par
rapport au changement de lenvironnement. Par exemple, les changements de
tempraturesontdesphnomnessouventlentsmesurer.Sivouspassezlecapteur
dunmilieutrschaudunmilieutrsfroid,lecapteurvamettredutemps(quelques
secondes) pour proposer une information fiable. A contrario, certains capteurs
ragissenttrsviteetontdoncuntempsderponsetrsfaible.

Labandepassante
Cettecaractristiqueestplusdifficilecomprendreetestliautempsderponse.Elle
correspond la capacit du capteur rpondre aux sollicitations de son
environnement. Si sa bande passante est leve, il peut mesurer aussi bien des
phnomnes lents que des phnomnes rapides. Si au contraire elle est faible, sa
capacit mesurer des phnomnes lents ou rapides sera rduite sur une certaine
plagedefrquences.

Lagammedetempraturedutilisation
Ce titre est assez explicite. En effet, lorsque lon mesure certains phnomnes
physiques, le capteur doit avoir une certaine rponse. Cependant, il arrive que le
phnomnesoitconditionnparlatemprature.Lecapteurdoitdonctreutilisdans
certainesconditionspouravoirunerponsecorrecte(etnepastredtrior).
294

Lorsque vous utilisez un capteur pour la premire fois, il est souvent utile de
pratiquer un talonnage. Cette opration consiste prendre quelques mesures
pourvrifier/corrigerlajustessedesacaractristiqueparrapportladatasheetou
auxconditionsambiantes.
Nous verrons tout au long des chapitres certaines caractristiques. Aprs ce sera
vousdechoisirvoscapteursenfonctiondescaractristiquesdontvousaurezbesoin.

[Arduino502]Diffrentstypesdemesures
Pour commencer ce chapitre sur les capteurs, jai rassembl un petit nombre de
capteurs qui sont trs utiliss en robotique et en domotique. Vous pourrez ainsi
comprendre certains concepts gnraux tout en ayant accs une base de
connaissancequipuissevousaiderlorsquevousaurezbesoindemettreenplacevos
projets personnels. On va commencer en douceur avec les capteurs logiques, aussi
appels Tout Ou Rien (TOR). Puis on continuera vers les capteurs utilisant des
transducteurs rsistance de sortie variable. On verra ensuite des capteurs un peu
particulierspuispourfinirdescapteursunpeucompliqus.Cestparti!

ToutOuRien,uncapteurquisaitcequil
veut
Onvadonccommencerparvoirquelquescapteursdontlasortieestuntatlogiquequi
indique un tat : OuvertouFerm. Ces capteurs sont appels des capteur Tout Ou
Rien,capteurslogiquesouencorecapteursrupturedetension.

Deuxtats
Lorsquelecapteurestditouvert(ouopenenanglais),le
courant ne passe pas entre ses bornes. Sil sagit de la
position de repos, cest dire lorsque le capteur ne
captepaslagrandeurquildoitcapter,onditalorsquele
capteur a un contact de type Normalement Ouvert (ou
NormallyOpenenanglais).Tandisquesilecapteurest
dit ferm (ou close en anglais), le courant peut passer
entre ses bornes. Sil sagit cette fois de sa position de
repos,alorsonditquilpossdeuncontactNormalement
Ferm(ouNormallyClosed).
Jaischmatislescontactspardesinterrupteursrelis
deuxbornes(lescarrsdroite)ducapteur.Cestle
principe dun capteur TOR (Tout Ou Rien), mais ce
nestpasforcmentdesinterrupteursquilyadedans,
onvalevoirbientt.

295

LecapteurILSouInterrupteurLameSouple
LeprincipeduTOR
Unequestionquivousestpeuttrepasseparlatte:maiscommentcecapteurpeut
mesurer une grandeur physique avec seulement deux tats en sortie ? Cest assez
facilecomprendre.Imaginons,danslecadredundevosprojetspersonnels,quevous
ayez lintention de faire descendre les volets lectriques lorsquil fait nuit. Vous allez
alors avoir recours un capteur de luminosit qui vous donnera une image, par une
autregrandeurphysique,delintensitlumineusemesure.Hors,vousnevoulezpas
quececapteurvousdisesilfaitunpeujourouunpeunuit,ouentrelesdeuxnon,il
vousfautunerponsequisoitOUIouNONilfaitnuit.Vousaurezdoncbesoindun
capteurTOR.Alors,ilenexistequisontcapablesdedonnerunerponseTOR,mais
lorsquelonutiliserauntransducteur,ondevragreranousmmeavecArduinoetun
peudlectronique.

Champmagntique
Ne prenez pas peur, je vais simplement vous prsenter le capteur ILS qui utilise le
champ magntique pour fonctionner. En effet, ce capteur, est un capteur TOR qui
dtectelaprsencedechampmagntique.Ilestcomposdedeuxlamesmtalliques
souplesetsensiblesauchampmagntique.Lorsquunchampmagntiqueestproche
du capteur, par exemple un aimant, eh bien les deux lames se mettent en contact et
laissent alors passer le courant lectrique. Dune faon beaucoup plus simple, cest
relativement semblable un interrupteur mais qui est actionn par un champ
magntique.PhotoduninterrupteurILSetimage,extraitesdusiteWikipdia:

Dsquelonapprocheunaimant,partirduncertainseuildechampmagntique,le
capteuragit.Ildevientalorsuncontactfermetreprendsapositionderepos,contact
NO, ds que lon retire le champ magntique. Ce type de capteur est trs utilis en
scurit dans les alarmes de maison. On les trouve essentiellement au niveau des
portesetfentrespourdtecterleurouverture.

Cblage
Lecblagedececapteurpeuttreprocddediffrentesmanires.Onpeuteneffet
lutiliserdefaoncequelecourantnepassepaslorsqueriennesepasse,oubien
quilnepassepaslorsquilestactionn.
296

1. Danslepremiercas(imagedegauche),lasortievautHIGHquandlILSestau
297

reposetLOWlorsquilestactionnparunchampmagntique.
2. Surladeuximeimage,lecblageestdiffrentetfaitensortequelasortiesoit
LOWlorsquelecontactILSestaureposetpasseHIGHdsquilestactionn
parunchampmagntique.
UnpetitprogrammetoutsimplequipermetdevoirsilILSestactionnounon,selonle
schmautilis:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

constcharentree_ils=2//utilisationdelabrochenumriquenumro2commeentrepourlecapte

constcharled_indication=13//utilisationdelaLEDdelacartepourindiquersil'ILSestacti

unsignedcharconfiguration_ils=0//ou1,dpendducblagedel'ILSselonlesschmasprcden
/*
0pourlepremierschma(gauche)
1pourledeuximeschma(droite)
*/

voidsetup()
{
//dfinitiondesbrochesutilises
pinMode(entree_ils,INPUT)
pinMode(led_indication,OUTPUT)
}

voidloop()
{
if(configuration_ils)//sic'estledeuximeschma
{
digitalWrite(led_indication,digitalRead(entree_ils))//laLEDestteintelorsquel'ILSe
}
else//sic'estlepremierschma
{
digitalWrite(led_indication,!digitalRead(entree_ils))//laLEDestallumelorsquel'ILS
}
}

Capteurlogiqueprtlemploi
Bon,lavatretrstrscourt,puisquevoussavezdjfaire!Lescapteurstoutprts
que lon peut acheter dans le commerce et qui fournissent un tat de sortie logique
(LOWouHIGH)sontutilisablestelsquels.Ilsuffitdeconnecterlasortieducapteursur
uneentrenumriquedelacarteArduinoetdeliredansleprogrammeltatsurcette
broche.Voussaurezdoncenunriendetempscequelecapteurindique.Onpeutciter
pourexemplelescapteursdemouvements.
Le programme prcdent, utilis avec lILS, est aussi utilisable avec un capteur
logique quelconque. Aprs, vous de voir ce que vous voudrez faire avec vos
capteurs.

Capteursrsistancedesortievariable
Laphotorsistance
298

Nousyvoil,onvaenfinvoirletransducteurdontjarrtepasdevousparlerdepuistout
lheure:laphotorsistance!Jevoisquevouscommencieztreimpatients.

Petitaperu
Laphotorsistanceestuncomposantlectroniquequiestdetypetransducteur.Ilest
donc capable de donner une image de la grandeur physique mesure, la lumire ou
prcismentlaluminosit,grceuneautregrandeurphysique,larsistance.

PhotodunephotorsistanceWikipdia
Ontrouvegnralementcecomposantenutilisationdomotique,pourdevinezquoi?!
fairemonteroudescendrelesvoletslectriquesdunehabitation! Maisonpeut
galementleretrouverenrobotique,parexemplepourcrerunrobotsuiveurdeligne
noire. Enfin on le trouve aussi dans beaucoup dautres applications, vous saurez
trouvervousmmesoestcequevouslutiliserez,jevousfaisconfiancedecepoint
devuel.

Proprit
Laphotorsistancesuitunerelationtoutesimpleentresarsistanceetlaluminosit:

R = f(E)
Avec:
RlarsistanceenOhm( )
Elintensitlumineuseenlux(lx)
Pluslintensitlumineuseestleve,pluslarsistancediminue.linverse,plusilfait
sombre,pluslarsistanceaugmente.Malheureusement,lesphotorsistancesnesont
pas des transducteurs trs prcis. Ils ont notamment des problmes de linarit, un
temps de rponse qui peut tre lev et une grande tolrance au niveau de la
rsistance.Nouslesutiliseronsdoncpourdesapplicationsquinedemandentquepeu
derigueur.Cequiirabienpourcequonveutenfaire.

Symboledelaphotorsistance
Une photorsistance est une rsistance qui possde une valeur de base en Ohm.
Cest dire quelle est calibre pour avoir une valeur, par exemple 47 kOhm, un
certain seuil de luminosit. ce seuil on peut donc mesurer cette valeur, suivant la
299

tolrance quaffiche la photorsistance. Si la luminosit augmente, la rsistance de


basenestplusvraieetchute.Enrevanche,danslenoir,larsistanceaugmentebien
audeldelarsistancedebase.
Gnial!!Jenveux,jenveux!Commentonlutilise?
La photorsistance est principalement utilise dans un montage en pont diviseur de
tension. Vous le connaissez ce montage, cest exactement le mme principe de
fonctionnementquelepotentiomtre.Saufqueceneserapasvousquiallezmodifierle
curseurmaislaphotorsistancequi,selonlaluminosit,vadonnerunevaleurohmique
diffrente.Cequiaurapoureffetdavoiruneinfluencesurlatensionensortiedupont
diviseur.

Rappelsurlepontdiviseurdetension
Jevousrappellelemontagedunpontdiviseurdetension:

Laformuleassocieestlasuivante:

Vs = Ve

R2
R 1+R 2

CetteformulesappliqueuniquementdanslecasolasortieVsnedlivrepasde
courant (cas des entres numriques ou analogiques dun microcontrleur par
exemple). Dans le cas o il y a justement un courant qui sort de ce pont, cela
modifie la valeur de la tension de sortie. Cest comme si vous rajoutiez une
rsistanceenparallledelasortie.Celaadoncpoureffetdedonnerunrsistance
R2quivalenteplusfaibleetdoncdechangerlatension(enappliquantlaformule).
Reprenonsletableauprsentantquelquesexemples:
Schmaquivalent

Positiondu
curseur
Curseurla
moiti

TensionsurlabrocheC

Vsignal = (1

50
)
100

5 = 2.5V

Curseur25%
300 signal = (1

25

) 5 = 3.75V

dudpart

Vsignal = (1

25
)
100

5 = 3.75V

Curseur75%
dudpart

Vsignal = (1

75
)
100

5 = 1.25V

Vousallezdoncmaintenantcomprendrepourquoijevaisvousdonnerdeuxmontages
pouruneutilisationdiffrentedelaphotorsistance

Utilisationn1
Cepremiermontage,vatrelepremiercapteurquevousallezcrer!Facile,puisqueje
vousfaistoutletravail. Leprincipedecemontagersidesurlutilisationquelonva
fairedelaphotorsistance.Commejevousledisaislinstant,onvalutiliserdansun
pontdiviseurdetension.Exactementcommelorsquelonutiliseunpotentiomtre.Sauf
que dans ce cas, cest lintensit lumineuse qui va faire varier la tension en sortie.
Voyezplutt:

301

Oncalibrelepontdiviseurdetensiondemanirecequilsoitquitableetdivisela
tension dalimentation par 2 en sa sortie. Ainsi, lorsque la luminosit fluctuera, on
pourramesurercesvariationsaveclacarteArduino.Aveccemontage,pluslintensit
lumineuseestleve,pluslatensionensortiedupontseralevesontour.Et
inversement,plusilfaissombre,moinslatensionestleve.

Utilisationn2
Tandisquel,cestleffetinversequivaseproduire:plusilyauradelumire,moins
il y aura de tension en sortie du pont. Et plus il fera sombre, plus la tension sera
leve.

302

Riendebiensorcier.Ilsuffitdebiencomprendrelintrtdupontdiviseurdetension.

Unpeudeprogrammation
303

Etsivousaviezunrveil,quinevousdonnepaslheure?Fortutile,nestcepas!
Non,srieusement,ilvavousrveillerdsquelejourselvecequifaitquevous
dormirezpluslongtempsenhiver.Cestvosprofsquivontpastrecontents! Vous
naurezqudirequecestdemafaute. Bonallez,unpeudetenuequandmme,je
ne voudrais pas tre la cause de votre chec scolaire. Cette fois, vraiment
srieusement,nousallonsfaireuntoutpetitprogrammequivasimplementdtecterla
prsence ou labsence de lumire. Lorsque la tension en sortie du pont diviseur de
tensioncreaveclaphotorsistanceetlarsistancefixechute,cestquelaluminosit
augmente. vous de choisir le schma correspondant suivant les deux prsents
prcdemment.Pourcommencer,onvainitialiserlesvariablesettoutletralalaquiva
avec.
1
2
3
4
5
6
7
8
9
10
11
12
13

constcharled=2//UneLEDpourindiquers'ilfaitjour
constcharcapteur=0//brocheA0surlaquellevatreconnectlepontdiviseurdetension

floattension=0//variablequivaenregistrerlatensionlueensortieducapteur
floatseuilObscurite=1.5//valeurenV,seuilquidtermineleniveauauquell'obscuritest

voidsetup()
{
//dfinitiondesbrochesutilises
pinMode(led,OUTPUT)

Serial.begin(9600)//lavoiesriepourmonitorer
}

Quallonsnousretrouverdanslafonctionloop()?Ehbienavanttoutilvafalloirlirela
valeurprsenteenentredelabrocheanalogiqueA0.Puis,onvacalculerlatension
correspondantelavaleurlue.Enfin,onvalacomparerauseuilpralablementdfini
quiindiqueleniveaupourlequellabsencedelumirefaitloi.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

voidloop()
{
tension=(analogRead(capteur)*5.0)/1024//conversiondecettevaleurentension

if(tension>=seuilObscurite)
{
digitalWrite(led,LOW)//OnallumelaLED
}
else
{
digitalWrite(led,HIGH)//OnteintlaLED
}
//envoieversl'ordinateur,vialaliaisonsrie,lavaleurdelatensionlue
Serial.print("Tension=")
Serial.print(tension)
Serial.println("V")

delay(500)//dlaipourneprendredesmesuresquetouteslesdemisecondes
}

Unprogrammeplusvolu
Aprstantdedifficult( ),voiciunnouveauprogrammequivousserapeuttreplus
intressantfaire.Enfaitaledeviendradsquejevousauraisditlapplicationquien
304

estprvue

Prparation
Cettefois,jevaisvousdemanderdavoirdeuxphotorsistancesidentiques.Leprincipe
estsimpleonvafaireunecomparaisonentrelesdeuxvaleursretournesparlesdeux
capteurs(deuxfoislemontageprcdent).

305

Silavaleurdroiteestplusforte,onallumerauneLEDenbroche2.Sinon,onallume
enbroche3.Siladiffrenceestfaible,onallumelesdeux.Danstouslescas,ilnya
pas de cas intermdiaire. Cest soit gauche, soit droite (selon la disposition des
photorsistances). Ce principe pourrait tre appliqu un petit robot mobile avec un
comportement de papillon de nuit. Il cherche la source de lumire la plus intense
proximit.

Leprogramme
Ilparledeluimme,pasbesoindendireplus.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

//dclarationdesbrochesutilises
constcharledDroite=2
constcharledGauche=3
constcharcapteurDroit=0
constcharcapteurGauche=1

/*deuxvariablesparcapteurquiunestockeralavaleurluesurlabrocheanalogique
etl'autrestockeralersultatdelaconversiondelaprcdentevaleurentension*/
floatlectureDroite=0
floatlectureGauche=0
floattensionDroite=0
floattensionGauche=0

voidsetup()
{
pinMode(ledDroite,OUTPUT)
pinMode(ledGauche,OUTPUT)
Serial.begin(9600)
}

voidloop()
{
lectureDroite=analogRead(capteurDroit)//lecturedelavaleurensortieducapteurcapteur
lectureGauche=analogRead(capteurGauche)
tensionDroite=(lectureDroite*5.0)/1024//conversionentensiondelavaleurlue
tensionGauche=(lectureGauche*5.0)/1024

306

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

if(tensionDroite>tensionGauche)//silatensionlueensortieducapteur1estplusgrandeq
{
digitalWrite(ledDroite,LOW)//allume
digitalWrite(ledGauche,HIGH)//teinte
}
else
{
digitalWrite(ledDroite,HIGH)//teinte
digitalWrite(ledGauche,LOW)//allume
}
//envoidesdonnesluesversl'ordinateur
Serial.print("TensionDroite=")
Serial.print(tensionDroite)
Serial.println("V")
Serial.print("TensionGauche=")
Serial.print(tensionGauche)
Serial.println("V")

delay(100)//dlaipourneprendreunemesurequetoutesles100ms
}

Jenparlaisdoncbrivement,cepetitprogrammepeutservirdecerveauunpetitrobot
mobile qui cherchera alors la source de lumire la plus intense ses yeux. Vous
naurezplusquremplacerlesLEDparunecommandedemoteur(quelonverradans
laprochainepartiesurlesmoteurs)etalimenterletoutsurbatteriepourvoirvotrerobot
circuler entre vos pattes. Bien entendu ce programme pourrait largement tre
amlior!

Unautrepetitrobotmobile
On peut renverser la situation pour faire en sorte que le robot suive une ligne noire
traceausol.Cestunrobotsuiveurdeligne.Leprincipeestdecollerlesdeuxyeux
durobotausol.Ltatinitialvatredavoirunildechaquectdelalignenoire.Le
robot avance tant quil voit du blanc (car la ligne noire est sur une surface claire,
blancheengnral).Dsquilvavoirdunoir(lorsquelaluminositauradiminu),ilva
alorsarrterdefairetournerlemoteuropposlilquiavulalignenoire.Ainsi,le
robotvamodifiersatrajectoireetvacontinuerensuivantlaligne.partirdecela,je
vouslaisserflchirtoutcequevouspouvezfaire.Nonpasdeprogrammedonntout
frais,jeviensdedfiniruncahierdescharges,sommetoute,assezsimple.Vousnavez
doncplusqulesuivrepourarrivervosfins.

Capteurstensiondesortievariable
Passonsuncapteurunpetitpeuplusdrleetplustonnant,dontlesapplicationssont
trsvaries!

Llmentpizolectrique
Sous ce nom peu commun se cache un phnomne physique trs intressant.
Llmentpizolectrique,quelonretrouvedansdiversobjetsduquotidien(montres,
certains briquets, raquettes de tennis, ) prsente en effet toute une panoplie de
307

caractristiquesutilisesdansdesdizainesvoirecentainesdedomaines.Nousallons
voirtoutaendtail.Nous,cequivanousintresserpourlemoment,cestsaproprit
capterdessons.

lmentspizolectriquesdemontregaucheetallumeurdebriquetdroitesource
Wikipdia

Constitution
Avant de parler de son fonctionnement, voyons un peu sa constitution. Prenons les
lments pizolectriques de la premire image, gauche. On observe quils se
trouvent sous une forme de pastille compose de plusieurs couches. Gnralement
cest une pastille de cramique qui est monte sur une pastille mtallique. La
fabrication de ces lments tant trs complexe, nous en resterons ce niveau
dapproche.

Proprit
Jai trouv amusant de voir sur internet que lon parlait de sa proprit principale
comme tant analogue celle dune ponge. Je ne vous pargnerais donc pas cet
exemple. Dsquonmetunepongeencontactavecdeleau,ellelabsorbe.Tandis
que lorsquon la presse, elle se vide de leau quelle a absorbe. Le rapport avec
llment pizolectrique ? Eh bien il agit un peu de la mme manire. Un lment
pizolectrique, lui, subit un phnomne semblable : ds quon lui admet une
contrainte mcanique, il gnre une tension lectrique. En revanche, ds quon lui
administreunetensionlectrique,ilgnrealorsunecontraintemcanique,restitue
parexemplesousformesonore.

308

Gnrationdunetensionlectriqueparunlmentpizolectriquesouslactiondune
contraintemcaniquesourceWikipdia
Unexempledutilisationdontvousnevousdoutezcertainementpas,cestlutilisation
de cette proprit dans certaines raquettes de tennis. Llment pizolectrique se
trouvedanslemanchedelaraquette.Lorsquuneballefrappelaraquette,ellegnre
une contrainte mcanique sur llment pizolectrique qui en retour gnre une
tension lectrique. Cette tension est rcupre et injecte nouveau dans llment
pizolectrique qui gnre alors une contrainte mcanique oppose celle gnre
parlaballe.Vousmesuivez?Lintrt?Rduirelesvibrationscausesparlechocet
ainsiamliorerlastabilitdelaraquette(etdelafrappe)toutenrduisantlestress
provoqusurlepoignetdujoueur.Dinguenon?

Utilisation
Lutilisationquenousallonsfairedecetlmentvanouspermettredecapterunchoc.
Celapeuttreuntocsuruneporte,unedformationdesurface,voiremmeuneonde
sonoreunpeupuissante.Cecapteurdlivredirectementunetensionproportionnelle
la contrainte mcanique quon lui applique. Il sagit donc dun capteur actif. Nous
pouvonsdonclutilisersansrienenleconnectantdirectementavecArduino.

Montage
Vousallezprocderaumontagesuivantenrespectantleschmadecblage:

309

La rsistance de 1M en parallle de llment pizolectrique permet dviter les


courants trop forts qui peuvent tre gnrs par llment pizolectrique. Il est
accompagnparunediodeunpeuparticulirequelonappelleunediodezener.Cette
derniresertviterlessurtensions.Sijamaislatensiongnreparlepiezodpasse
sonseuil(4.7Venloccurence),elledeviendrapassanteetlecourantiradoncversla
310

massepluttquedanslemicrocontrleur(vitantainsidegrillerlentreanalogique).
Cettedernirenestpasindispensablemaisconseillecependant.

Programme
Leprogrammequenousallonsassociercemontage,etquivatrecontenudansla
carteArduino,vaexploiterlatensiongnreparllmentpizolectrique,lorsquon
luiadministreraunecontraintemcanique,pourallumerouteindreuneLEDprsente
en broche 2 de la carte Arduino. On pourra sen servir pour dtecter un vnement
sonore tel que le toc sur une porte. La condition pour que llment pizolectrique
captecorrectementletocduneporteestquildoittrepositionnsurlaportedefaon
cequesasurfacesoitbienplaquecontreelle.Aussinousutiliseronslaliaisonsrie
pourindiquerlatensionproduiteparllmentpizolectrique.Cestunpetitplus,par
forcmentutilemaisquivousdonnerauneidedelaforcequilfautpourgnrerune
tensionparticulire.Vousentrouverezcertainementuneapplicationutile. Allez,un
peudeprogrammation!

Fonctionsetup()
Audbutduprogrammenousdclaronsquelquesvariablesquenousutiliseronsparla
suite.Aussinousamoronslutilisationdelaliaisonsrieetdesbrochesutilisesdela
carteArduino.
1
2
3
4
5

constcharled=2//utilisationdelaLEDenbroche13delacarte
constcharpiezo=0//l'lmentpizolectriqueestconnectenbrocheanalogique0
constintseuil_detection=100
/*onpeutdfinirleseuildedtectionquivasimplement
permettredeconfirmerquec'estbienunvnementsonoresuffisantetnonparasite*/

Petiteparenthseparrapportauseuil.Iciilestconfigurdefaontrecomparla
lecturedirectedelavaleurenbrocheanalogique(compriseentre0et1023).Maison
peutaussiledfinirpourquilsoitcomparaucalculdelatensionensortieducapteur
(parexemplelemettre1,pour1V).
1
2
3
4
5
6
7
8
9

floatlecture_capteur=0//variablequivacontenirlavaleurlueenbrocheanalogique0
floattension=0//variablequivacontenirlersultatducalculdelatension
intetat_led=LOW//variableutilisepourallumerouteindrelaLEDchaque"Toc"

voidsetup()
{
pinMode(led,OUTPUT)//dclarationdelabroche13ensortie
Serial.begin(9600)//utilisationdelaliaisonsrie
}

Fonctionprincipale
tant donn que le code est plutt court et simple, nous le laisserons dans la seule
fonctionloop()pluttquedeledcouperenplusieurspetitesfonctions.Cependantlibre
vousdelagencerautrementselonvosbesoins.
1 voidloop()
2 {
3 lecture_capteur=analogRead(piezo)//lecturedelavaleurensortieducapteur

311

4
5
6
7
8
9
10
11
12
13
14
15
16
17

tension=(lecture_capteur*5.0)/1024//conversiondecettevaleurentension

if(lecture_capteur>=seuil_detection)
{
etat_led=!etat_led//onmodifiel'tatdelaLEDpourlepassersontato
digitalWrite(led,etat_led)//applicationdunouveltatenbroche13

//envoiversl'ordinateur,vialaliaisonsrie,desdonnescorrespondantauTocetla
Serial.println("Toc!")
Serial.print("Tension=")
Serial.print(tension)
Serial.println("V")
}
}

Ici pas de dlai la fin de la boucle. En effet, si vous mettez un dlai (qui est
bloquant) vous risqueriez de rater des toc puisque cet vnement est bref et
imprvisible.Sijamaisvoustapiezsurvotrelmentpizolectriqueaumomento
leprogrammeestdanslafonctiondelay(),vousnepourriezpaslintercepter.

Seuildetension
Commejeledisais,ilestaussipossibleetnonpasidiotdechangerleseuilpourquil
soit compar en tant que tension et non valeur abstraite comprise entre 0 et 1023.
Celarelvedelasimplicitextrme,voyezplutt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

constcharled=2//utilisationdelaLEDenbroche13delacarte
constcharpiezo=0//l'lmentpizolectriqueestconnectenbrocheanalogique0
constfloatseuil_detection=1.36//seuildedtectionentensionetnonplusennombreentre0

floatlecture_capteur=0//variablequivacontenirlavaleurlueenbrocheanalogique0
floattension=0//variablequivacontenirlersultatducalculdelatension
intetat_led=LOW//variableutilisepourallumerouteindrelaLEDchaque"Toc"

voidsetup()
{
pinMode(led,OUTPUT)//dclarationdelabroche13ensortie
Serial.begin(9600)//utilisationdelaliaisonsrie
}

voidloop()
{
lecture_capteur=analogRead(piezo)//lecturedelavaleurensortieducapteur
tension=(lecture_capteur*5.0)/1024//convestiondecettevaleurentension

if(tension>=seuil_detection)//comparaisondedeuxtensions
{
etat_led=!etat_led//onmodifiel'tatdelaLEDpourlepassersontatopp
digitalWrite(led,etat_led)//applicationdunouveltatenbroche13

//envoiversl'ordinateur,vialaliaisonsrie,desdonnescorrespondantauTocetla
Serial.println("Toc!")
Serial.print("Tension=")
Serial.print(tension)
Serial.println("V")
}
}

312

Jenaimodifiqueletypedelavariableseuil_detection.

Larversibilitdellmentpizolectrique
Toutlheurejevousdisaisquellmentpizolectriquetaitcapabledetransformer
une contrainte mcanique en une tension lectrique. Je vous ai galement parl du
phnomnepongeenvousdisantquelonpouvaitaussibienabsorberquerestituer
nonpasdeleaucommelpongemaisunecontraintemcaniquepartirdunetension
lectrique.Onvadoncsamusercrerdusonavecllmentpizolectrique!

Fairevibrerllmentpizolectrique!
Attention tout de mme, bien que vous laurez trs certainement compris, il nest
plusquestiondutiliserllmentpizolectriqueenentrecommeuncapteur,mais
bienensortiecommeunactionneur.
Toutdabord,ilvousfaudrabrancherllmentpizolectrique.Pourcela,mettezsonfil
noirlamasseetsonfilrougeunebrochenumrique,nimportelaquelle.Pasbesoin
de rsistance cette foisci. Et voil les branchements sont faits ! Il ne reste plus qu
gnrer un signal pour faire vibrer llment pizolectrique. Selon la frquence du
signal,lavibrationgnreparllmentpizolectriqueseraplusoumoinsgraveou
aigu.Essayonssimplementaveccepetitprogrammederiendutout(jenevousdonne
quelafonctionloop(),voussavezdjtoutfaire ):
1
2
3
4
5
6
7

voidloop()
{
digitalWrite(piezo,HIGH)
delay(5)
digitalWrite(piezo,LOW)
delay(5)
}

Ce code va gnrer un signal carr dune priode de 10ms, soit une frquence de
100Hz.Cestunsonpluttgrave.Vouspouvezaismentchangerlavaleurcontenue
dans les dlais pour couter les diffrents sons que vous allez produire. Essayez de
gnrerunsignalaveclaPWMetsoyezattentifaursultatenchangeantlavaleurdela
PWMavecunpotentiomtreparexemple.

Unefonctionencoretouteprte
Maintenant, si vous souhaitez gnrer ce signal et en mme temps faire dautres
traitements,celavadevenirpluscompliqu,carletempsseraplusdifficilematriser
(et les dlais ne sont pas toujours les bienvenus ). Pour contrer cela, nous allons
confier la gnration du signal une fonction dArduino qui sappelle tone(). Cette
fonctionprendenargumentlabrochesurlaquellevousvoulezappliquerlesignalainsi
quelafrquenceduditsignalraliser.Siparexemplejeveuxmettreunsignalde
440Hz(quicorrespondauladestlphones)jeferais:tone(piezo, 440);.Lesonva
alorsdevenirpermanent,cestpourquoi,sivousvoulezlarrter,ilvoussuffitdappeler
lafonctionnoTone()quivaalorsarrterlagnrationdusonsurlabrochespcifieen
argument.

313

La fonction tone() peut prendre un troisime argument qui spcifie en


millisecondes la dure pendant laquelle vous dsirez jouer le son, vous vitant
ainsidappelernoTone()ensuite.
Pourlesplusmotivsdentrevous,vouspouvezessayerdejouerunepetitemlodie
avecllmentpizolectrique. Ahlesjoiesnostalgiquesdelpoquedessonneries
monophoniques.

talonnersoncapteur
Faisons une petite pause dans notre dcouverte des capteurs pour parler dun
problmequipeutarrivertoutlemondeCommentfaitesvoussivouspossdezun
capteurmaisnepossdezpassacaractristiqueexacte?Commentferiezvouspour
fairecorrespondreunevaleuranalogiquelueavecunedonnephysiquerelle?Par
exemple,sijevousdonneuncomposantenvousdisanthey,tevoiluncapteurde
temprature,jesaisquilsalimenteen5Vsurtelleettellebroches,jesaisquelesignal
desortieestunetensionenfonctiondelatempraturemaisjesuisincapabledetedire
quelle est la caractristique (la courbe tension en fonction de la temprature). Nous
allons maintenant voir comment rsoudre ce problme en voyant une mthode pour
talonner son capteur. Nous allons ainsi nous mme dterminer la courbe
caractristiqueducapteuretdterminersoncoefficientliantlatempratureetlatension.
lafin,jevousdonneraislavraiecourbeconstructeuretnouspourronscomparernos
rsultatspratiquesavecceuxderfrence .

Lecapteurutilis
Pour tudier la mthode que je vous propose ici, nous allons utiliser un capteur de
tempratureassezrpanduquisenommeLM35.Ilexistedansdiffrentsbotiersque
voici:

314

Vousaurezdevinlebranchement,ilestassezsimple.Ilsuffitderelier+VSau5Vet
GNDlamasse.LesignalseraensuitelusurlabrocheVout.

Lamthode
Lamthodepourcaractriserlecapteurestassezsimple.laidedunemultitudede
mesuresetdunappareiltmoin,nousallonspouvoircreruntableauquinousservira
calculer la courbe ( laide dun logiciel comme Excel par exemple). Pour cela, en
plus de votre capteur vous aurez besoin dun appareil de mesure tmoin qui vous
serviraderfrence.Parexemplelebonvieuxthermomtrequitraneaccrochvotre
fentreferaparfaitementlaffaire .

Prisedemesures
Voustesprts,alorsallonsy,commenonstravailler.ReliezlecapteurlArduinoet
lArduinolordinateur,delamanirelaplussimplepossible,commececiparexemple
:

315

Ensuite, nous devons rcuprer les donnes envoyes par le capteur de manire
rgulire(ourajoutezunboutonetfaitedesenvoislorsdelappui ).Pourcela,voici
unpetitprogrammesansdifficultquivousenverralesvaleursbrutesouconvertiesen
voltstouteslesdemisecondes.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

constintcapteur=0//capteurbranchsurlapinanalogique0
floattension=0.0
intvaleur=0

voidsetup()
{
Serial.begin(9600)
}

voidloop()
{
valeur=analogRead(capteur)
tension=(valeur*5.0)/1024

Serial.print("Tension:")
Serial.print(tension)
Serial.println("V")
Serial.print("Valeur:")
Serial.println(valeur)
Serial.println("")

delay(500)
}

Maintenant que tout est prt, il nous faut un banc de test. Pour cela, prparez une
casserole avec de leau contenant plein de glaons (leau doit tre la plus froide
possible).Faitesunepremiremesureavecvotrecapteurplongdedans(attention,les
broches doivent tre isoles lectriquement ou alors mettez lensemble dans un petit
sacplastiquepourviterqueleaunaillefaireuncourtcircuit).Faitesenmmetemps
unemesuredelatempraturerelleobservelaideduthermomtre.Unefoiscela
fait,relevezcesmesuresdansuntableauquipossderalescolonnessuivantes:
Tempraturerelle(enC)
TensionselonArduino(enV)
ValeurbruteselonArduino
Quandlapremiremesureestfaite,commencezfairerchaufferleau(enlaplaant
316

sur une plaque de cuisson par exemple). Continuez faire des mesures intervalle
rgulier(tousles5degrsvoiremoinsparexemple).Plusvousfaitesdemesure,plus
llaborationdelacourbefinaleseraprcise.Voicititredexempleletableauquejai
obtenu:
Temprature(C) Tension(V) ValeurCAN
2
0,015
3
5
0,054
11
10
0,107
22
16
0,156
32
21
0,210
43
24
0,234
48
29
0,293
60
35
0,352
72
38
0,386
79
43
0,430
88
46
0,459
94
50
0,503
103

Ralisationdelacaractristique
Lorsque vous avez fini de prendre toutes vos valeurs, vous allez pouvoir passer
ltape suivante qui est : Calculer la caractristique de votre courbe !! Sortez vos
cahiers,votrecalculatriceetenavant!Nonjblague(encorequeaferaitunsuper
TP),onvacontinuerutilisernotrelogicieltableurpourfaireletravailpournous!Onva
donccommencerparregarderunpeulalluredelacourbe.Jevaisenfairedeux,une
symbolisantlesvaleursbrutesdelaconversionduCAN(entre0et1023)enrougeet
lautre qui sera limage de la tension en fonction de la temprature en bleu. Nous
pourronsalorsdterminerdeuxcaractristiques,seloncequivousarrangeleplus.

317

Unefoiscelafait,ilneresteplusqudemandergentimentaulogicieldegraphiquede
nousdonnerlacourbedetendance ralise par ces points. Sous Excel, il suffit de
cliquersurundespointsdugraphiqueetchoisirensuiteloptionAjouterunecourbede
tendance . Vous aurez alors le choix entre diffrents types de courbe (linaire,
exponentielle).Ici,onvoitquelespointssontaligns,ilsagitdoncdunequationde
courbelinaire,detypey=ax+b.CochezlacaseAfficherlquationsurlegraphique
pourpouvoirvoiretexploitercettedernireensuite.

318

Voicialorscequelonobtientlorsquelonrajoutenotrequation:

319

Grce lquation, nous pouvons dterminer la relation liant la temprature et la


tension(oulesvaleursduCAN).Icinousobtenons:

y = 0.01x 0.0003 (pourlatension)


y = 2.056x 0.0707 (pourlesvaleursduCAN)
Lecoefficientconstant(0.003ou0.0707)peuticitreignor.Eneffet,ilestfaible(on
ditngligeable) compar aux valeurs tudies. Dans les quations, x reprsente la
tempratureetyreprsentelatensionoulesvaleursduCAN.Onlitdonclquationde
lamaniresuivante:TensionenVoltgale0,01foislatempratureendegrscelsius.
Ce qui signifie que dornavant, en ayant une mesure du CAN ou une mesure de
tension,onestcapablededterminerlatempratureendegrscelsius Supernon?
Par exemple, si nous avons une tension de 300mV, avec la formule trouve
prcdemment on dterminera que lon a 0.3 = 0.01 T emperature , ce qui
quivautT emperature = 0.3/0.01 = 30 o C
.Onpeutaismentleconfirmerviale
graphique Maintenantjaitroisnouvelles,deuxbonnesetunemauvaiseLabonne
cestquevoustescapablededterminerlacaractristiqueduncapteur.Ladeuxime
bonnenouvelle,cestquelquationquelonatrouvestcorrecteparcequelle
est marque dans la documentation technique qui est super facile trouver (a
ctaitlamauvaisenouvelle,onatravaillpourrien!!)Maiscommecestpastoujours
lecas,cesttoujoursbiendesavoircommentfaire

Adaptationdanslecode
Puisque nous savons mesurer les valeurs de notre capteur et que nous avons une
quation caractristique, nous pouvons faire le lien en temps rel dans notre
application pour faire une utilisation de la grandeur physique de notre mesure. Par
exemple, sil fait 50C nous allumons le ventilateur. En effet, souvenezvous, avant
nousnavionsquunevaleurentre0et1023quinesignifiaitphysiquementpasgrand
chose. Maintenant nous sommes en mesure (oh oh oh ) de faire la conversion. Il
faudrapourcommencerrcuprerlavaleurdusignal.Prenonslexempledelalecture
dunetensionanalogiqueducapteurprcdent:
1 intvaleur=analogRead(monCapteur)//litlavaleur

320

Nousavonsensuitedeuxchoix,soitnousletransformonsentensionpuisensuiteen
valeur physique grce la caractristique du graphique bleu cidessus, soit nous
transformonsdirectementenvaleurphysiqueaveclacaractristiquerouge.Commeje
suis feignant, je vais chercher conomiser une instruction en prenant la dernire
solution. Pour rappel, la formule obtenue tait : y = 2.056x 0.0707 . Nous avions
aussi dit que le facteur constant tait ngligable, on a donc de manire simplifie
y
y = 2.056x soitlatempratureestgalelavaleurluedivispar2.056(x = 2.056 ).
Nousnavonsplusqufairelaconversiondansnotreprogramme!
1 floattemperature=valeur/2.056

.Etvoil!Silonvoulaitcrireunprogrammepluscomplet,onaurait:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

intmonCapteur=0//CapteursurlabrocheA0
intvaleur=0
floattemperature=0.0

voidsetup()
{
Serial.begin(9600)
}

voidloop()
{
valeur=analogRead(monCapteur)
temperature=valeur/2.056

Serial.println(temperature)

delay(500)
}

Etsijamaisnotrecoefficientconstantnestpasngligeable?
Ehbienprenonsunexemple!Admettonsquonobtiennelacaractristiquesuivante:
y = 10x + 22 OnpourraitlireacommemavaleurlueparleCANestgale10fois
lavaleurphysiqueplus22.Sionmanipulelquationpouravoirxenfonctiondey,on
aurait:

y = 10x + 22
y 22 = 10x
y22
x = 10
Danslecode,celanousdonnerait:
1
2
3
4
5
6
7
8
9

voidloop()
{
valeur=analogRead(monCapteur)
temperature=(valeur22)/10

Serial.println(temperature)

delay(500)
}

321

[Arduino503]Descapteursplusvolus
Commenousavonspulevoirplustt,certainscapteurstransmettentlinformationsous
formedunedonnelectriquequivarie:larsistanceoulatension.
Cependant, certains capteurs envoient linformation de manire code, afin quelle
soit plus rsistante au bruit (perturbations) et garantir le signal transmis. Parmi ces
mthodesdetransmission,onretrouvelutilisationdunePWM,delafrquenceoudun
protocoledecommunication.

Capteursortieenmodulationdelargeur
dimpulsion(PWM)
Principe
VousvoussouvenezdelaPWM?Nouslavonsutilisedanslechapitresurlessorties
analogiques.Danscetypedesignal,linformationestprsentedansladuredeltat
haut par rapport ltat bas. Ici, notre capteur va donc de la mme faon coder
linformationviauneduredtat(maiselleneserapasforcmentrelativesontat
antagoniste).Ilestdoncncessairedeconnaitrelescaractristiquesducapteurpour
pouvoirinterprterlesignalcorrectement.
Eneffet,sionprendlesignalsansriensavoirducapteur,commentdterminerceque
20msdtathautsignifieparexemple?
Pour cela, ce type de composant doit toujours tre utilis avec sa documentation
technique, afin de dterminer des paramtres comme ses bornes infrieure et
suprieure de mesure. Mais cest aussi vrai pour les autres (si vous tombez sur une
rsistance variable sans rien en connatre, vous devrez vous farcir une belle sance
dtalonnagepourlidentifier!).

Utilisation
Prenonsuncassimple.Imaginonsquenousavonsuncapteurdetempraturequinous
renvoielinformationsuivante:LatempratureenCCelsiusestproportionnellela
duredtathaut.Laplagedemesurevade0C75Cpouruneduredtathautde
0ms20ms.
Nous avons donc une relation proportionnelle entre une temprature et une dure.
Nous pouvons alors dduire une rgle mathmatique pour faire la conversion
degrsdure.
Eneffet,onalesquivalencessuivantes:

0C 0ms 0%
75C 20ms 100%
Une simple rgle de trois nous donne : x = 75
= 3.75C/ms
20
pourchaquemilliseconde,ona3.75C.
Voyonsmaintenantcommentlutiliser
322

ce qui signifie que

DanslapratiqueavecArduino
Bon,cestpasmalonalectthoriquedelachose,maisanenousdittoujourspas
commentonvalexploiteravecnotreArduino.Eneffet,gnrerunePWMonsaitfaire,
maismesureruneduredtathautaonnesaitpas!
Et bien rassurezvous, comme dhabitude cest assez simple. En effet, il existe une
fonction dans le framework Arduino qui sert exactement cela, mesurer une dure
dtathautoubas.
CettefonctionsappellepulseIn().Elleprendsimplementenparamtreslabrochesur
laquellevousvoulezfairelamesureetltatquevousvoulezmesurer(HIGHouLOW).
En option, un troisime paramtre permettra de spcifier un timeout, un temps
maximalattendreavantdedciderquelamesurenestpaspossible.Siletimeoutest
de2secondesetqueltatmesurernapascommenc2secondesaprslappelde
lafonction,alorscettedernireretournera0.Dernierdtail,lintervalledemesuredela
fonctionestde10s3minutesetrenvoieununsigned longreprsentantladurede
ltatenmicrosecondes.
Voil,voussaveztoutpourutilisercettefonction!Ilnefautpasoubliercependantque
la broche sur laquelle nous allons faire la mesure doit tre place en INPUT lors du
setup() .
Reprenonsmaintenantlexemplecommenccidessus.
Pour mesurer la temprature, nous allons mesurer ltat haut en sachant que celuici
seraproportionnellatemprature.Uncodesimpleseraitdonc:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

constcharcapteur=2//enadmettantquelecapteurdetempraturesoitsurlabroche2

voidsetup()
{
pinMode(capteur,INPUT)
Serial.begin(9600)//pourafficherlatemprature
}

voidloop()
{
unsignedlongduree=pulseIn(capteur,HIGH,25000)
//dansnotreexemplelavaleurestdansl'intervalle[0,20000]
floattemperature=duree*0.00375//3.75Cparmsdonc0.00375Cpars

/*Dansnotrecas,onn'utilisepas"map()"carlafonctionfaitdesarrondis,cequirisquerait

Serial.print("Dureelue:")
Serial.println(duree,DEC)
Serial.print("Temperature:")
Serial.println(temperature)

delay(200)//pournepasspammerlavoiesrie
}

Simulationdelexemple
SicommemoivousnavezpasdecapteurretournantunePWM,voiciunpetitmontage
toutsimplepermettantdetesterceconcept.
Pour cela, nous allons utiliser une PWM de lArduino ! En effet, on sait depuis le
chapitreSortiesanalogiques faire varier un rapport cyclique dans une PWM, on va
donclappliquericipourtesterpulseIn().
323

Pourcela,reliezunebrochePWMlabrochequivoussertdecapteurpuisessayezde
ralisercequelonvientdevoir.
La frquence de la PWM via Arduino est denviron 490Hz, ce qui signifie que la
duredtathautpourravarierentre0mset2,04ms
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

constcharcapteur=2//brochecapteur
constcharemetteur=3//brochePWM

voidsetup()
{
pinMode(capteur,INPUT)
pinMode(emetteur,OUTPUT)

Serial.begin(9600)
}

voidloop()
{
analogWrite(emetteur,127)//testavecunevaleurmoyenne:environ1ms
unsignedlongduree=pulseIn(capteur,HIGH)

Serial.print("Duree:")
Serial.println(duree,DEC)//vrifiequ'onabienladureattendue

delay(250)
}

tudedecas:lecapteurdedistanceSRF05
Prenons un exemple, le tlmtre ultrason SRF05 dont la doc. technique a t
retranscriteici.
Ce composant est lexemple classique du capteur renvoyant un crneau codant
linformation. En effet, ce dernier mesure ce que lon appelle un temps de vol.
Explications!
Le SRF05 est un tlmtre ultrason. Pour mesurer une distance, il compte le temps
que met une onde pour faire un allerretour. Un chronomtre est dclench lors du
dpartdelondeetestarrtlorsquelondtecteleretourdelonde(unefoisquecelle
ciarebondisurunobstacle).Puisquelonconnaitlavitessedepropagation(V)de
londedanslair,onpeutdterminerladistance(d)noussparantdelobjet.Onadonc
laformule:v = dt soitd = t v .
LetempsmesurcorrespondlallerETauretourdelonde,onadoncdeuxfoisla
distance. Il ne faudra pas oublier de diviser le rsultat par deux pour obtenir la
distancerellequinoussparedelobjet.
Commeexpliqudansladocumentation,pourutiliserlesonarilsuffitdegnreruntat
hautpendant10spuisensuitemesurerltathautgnrparlesonar.
Ce dernier reprsente le temps que met londe faire son allerretour. Si londe met
plusde30msfairesonvoyage,elleestalorsconsidrecommeperdueetlaligne
repasseLOW.
Et voil, vous avez maintenant toutes les informations pour faire un petit programme
dessaipourutilisercesonar.
324

Ah,unedernireinformationLavitesseduneondesonoredanslair15Cestde
340mtresparseconde.apourraittreutile!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

#defineVITESSE340//vitesseduson340m/s

constintdeclencheur=2//labrocheservantdclencherlamesure
constintcapteur=3//labrochequivalirelamesure

voidsetup()
{
pinMode(declencheur,OUTPUT)
pinMode(capteur,INPUT)

digitalWrite(declencheur,LOW)
Serial.begin(9600)
}

voidloop()
{
digitalWrite(declencheur,HIGH)
delayMicroseconds(10)//onattend10s
digitalWrite(declencheur,LOW)

//puisonrcuprelamesure
unsignedlongduree=pulseIn(capteur,HIGH)

if(duree&gt30000)
{
//siladureestsuprieure30ms,l'ondeestperdue
Serial.println("Ondeperdue,mesureechouee!")
}
else
{
//l'ondeestrevenue!onpeutfairelecalcul
duree=duree/2//ondivisepar2pourn'avoirqu'untrajet(pluttquel'allerretour)
floattemps=duree/1000000.0//onmetensecondes
floatdistance=temps*VITESSE//onmultiplieparlavitesse,d=t*v

Serial.print("Duree=")
Serial.println(temps)//afficheletempsdevold'untrajetensecondes
Serial.print("Distance=")
Serial.println(distance)//afficheladistancemesure
}

delay(250)
}

Capteursignaldesortiedefrquence
variable
Voyons maintenant un autre type de sortie trs similaire celui vu cidessus, la
frquence.Lescapteursdecetypevontdoncvousdlivrerunefrquencevariableen
fonctiondelavaleurmesure.Jenevaispasvousmentir,jenaipasdexempleentte
!
Cependant,ilestfaciledimaginercommentlesutiliserenprenantencompteceque
lonvientdevoirpourlecapteurrenvoyantunePWM.
325

En effet, considrons un capteur nous envoyant un signal de type crneau une


frquencef.Uncrneaupossdeenthorieuneduredtathautgaleladurede
ltat bas. Si on fait donc une mesure de cette dure dtat haut via pulseIn() vue
prcdemment, on peut aisment dduire la priode (T) du signal (qui sera gale
deuxfoislavaleurlue)etainsilafrquencepuisquef = 1/T .
Demanireprogrammatoire,onobtiendradonclecodesuivant:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

constcharcapteur=2//brochesurlaquelleestbranchelecapteur

voidsetup()
{
pinMode(capteur,INPUT)

Serial.begin(9600)
}

voidloop()
{
unsignedlongduree=pulseIn(capteur,HIGH)//ouLOW,ceseraitpareil!
duree=duree*2//pouravoirlapriodecomplte

floatfrequence=1.0/duree//hop!oncalculelafrquence!
frequence=frequence*1000000//passelafrquenceenHz(carlapriodetaitmesureens)
Serial.print("Frequence=")
Serial.println(frequence)

delay(250)
}

Exemple/Exercice
Afindemettretoutcelaenpratique,jevousproposeunpetitexercicepourmettreen
uvrecedernierpoint.Peudematrielestprvoir.

Principe
Pour cet exercice, je vous propose dmuler le comportement dun capteur gnrant
unefrquencevariable.
Nous allons utiliser un potentiomtre qui va nous servir de variateur. Ensuite nous
allonsutiliserunefonctionpropreArduinopourgnrerunefrquenceparticulirequi
seralimagemultipliepar10delavaleurmesuredupotentiomtre.Enfin,nousallons
reboucler la sortie frquence sur une entre quelconque sur laquelle nous
mesureronscettefrquence.
Cestclair?Jespre!
Lafonctiontone()

Pour faire cette exercice vous connaissez dj tout une chose prs : Comment
gnrer une frquence. Pour cela, je vous propose de partir la dcouverte de la
fonction tone(). Cette dernire gnre une frquence sur une broche, nimporte
laquelle.Elleprendenparamtrelabrochesurlaquellelesignaldoittremisainsi
que la frquence mettre. Par exemple, pour faire une frquence de 100Hz sur la
broche3onferasimplement:tone(3, 100);.
326

Un troisime argument peuttre utilis. Ce dernier sert indiquer la dure pendant


laquellelesignaldoittremis.Sionometcetargument,lafrquenceseratoujours
gnre jusqu lappel de la fonction antagoniste noTone() laquelle on passe en
paramtrelabrochesurlaquellelesignaldoittrearrt.
LutilisationdelafonctiontoneinterfreaveclemodulePWMdesbroches3et11.
Gardezle en mmoire . Cette fonction ne peut pas non plus descendre en
dessousde31Hz.
Vousaveztouteslesinformations,maintenantvousdejouer!

Correction
Voici ma correction commente. Comme il ny a rien de rellement compliqu, je ne
vaispasfairedeslignesdexplicationsetvouslaissersimplementaveclecodeetses
commentaires !
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

constcharpotar=0//potentiomtresurlabrocheA0
constcharemetteur=8//frquencemisesurlabroche8
constcharrecepteur=2//frquencemesuresurlabroche2

voidsetup()
{
pinMode(emetteur,OUTPUT)
pinMode(recepteur,INPUT)

Serial.begin(9600)
}

voidloop()
{
unsignedintmesure=100//faitlalectureanalogique(intervalle[01023])

tone(emetteur,mesure*10)//appliquelamesurecommefrquence(intervalle[010230])

unsignedlongperiode=pulseIn(recepteur,HIGH)//mesurelademipriode
periode=periode*2//pouravoirunepriodecomplteonmultipliepar2
floatfrequence=1.0/periode//transformeenfrquence
frequence=frequence*1000000//passelafrquenceenHz(carlapriodetaitmesureens)

Serial.print("Mesure:")
Serial.println(mesure,DEC)
Serial.print("Periode:")
Serial.println(periode,DEC)
Serial.print("Frequence:")
Serial.println(frequence)

delay(250)
}

Capteurutilisantunprotocolede
communication
327

Certainscapteursnerenvoientpaslinformationsousformephysiquedanslesensou
ilsnerenvoientpasquelquechosedemesurabledirectement,commeuntempsouune
tension. Non, ces derniers prfrent envoyer linformation encapsule bien au chaud
dansunetramedunprotocoledecommunication.
Legrosintrtdecettemthodeesttrsprobablementlarsistanceaubruit.Jene
parlebiensrpasdescrisdesenfantsduvoisinoulesklaxonsdanslaruemaisbien
de bruit lectronique. Ce dernier est partout et peut avoir des consquences
ennuyeuses sur vos mesures. Transmettre linformation par un protocole de
communicationestdoncunmoyenfiabledegarantirqueladonnearriverademanire
intgre jusquau destinataire. De plus, on peut facilement coupler cette transmission
avecunprotocoledevrificationsimpleoucompliqu(commelavrificationdeparit
ouuncalculdeCRC).
Cette partie ne vas pas vous enseigner comment utiliser chacun des moyens de
communication que nous allons voir. En effet, il sagit plutt dune
introduction/ouverturesurlexistencedecesderniers.Ilsseronttraitsdemanire
indpendantedansdeschapitresddiscommeleftlavoiesrie.

Quelquesprotocolesdecommunication
Voiesrie/UART
Ceprotocolevousdevezdjleconnatreparcurpuisquenouslutilisonspresque
danstousleschapitres!IlsagiteneffetdelavoiesrieviaSerial.Rienderellement
compliqudonctellementvousteshabituslevoir!
Ceciestuneliaisonpointpoint,doncseulsdeuxcomposants(lArduinoetlecapteur)
peuventtrerelisentreeuxdirectement.Elleestgnralementbidirectionnelle,cequi
signifiequelesdeuxcomposantsrelispeuventmettreenmmetemps.

I2C
LeprotocoleIC(InterIntegratedCircuit)ouTWI(TwoWireInterface)permetdtablir
une liaison de type matre/esclave. LArduino sera matre et le capteur lesclave
(lArduino peut aussi tre un esclave dans certains cas). Ainsi, lArduino mettra les
ordrespourfairelesdemandesdedonnesetlecapteur,lorsquilrecevracetordre,la
renverra.
Ce protocole utilise 3 fils. Un pour la masse et ainsi avoir un rfrentiel commun, un
servant mettre un signal dhorloge (SCL) et un dernier portant les donnes
synchronisesaveclhorloge(SDA).
ChezArduino,ilexisteunelibrairiepourutiliserlI2C,ellesappelleWire.
Onpeutplacerplusieursesclaveslasuite.Uncodedadresseestalorsutilispour
dciderquelcomposantlematrefaitunerequte.

SPI
LeSPI(SerialPeripheralInterface)estunesortedecomboentrelavoiesrieetlI2C.
Elleprendlemeilleurdesdeuxmondes.
Commeenvoiesrie,laliaisonestbidirectionnelleetpointpoint*.Celasignifieque
Arduinoetlecapteursontrelisdirectemententreeuxetnepeuventqueparlerentre
eux.Celasignifieaussiquelesdeuxpeuventsenvoyerdesdonnessimultanment.
CommeenI2C,laliaisonestdetypematre/esclave.Lunfaitunedemandelautre,le
328

matretransmetlhorlogelesclavepourtransmettrelesdonnes.
Cettetransmissionutilise4fils.Unemassepourlerfrentielcommun,unfildhorloge
(SCLK),unfilnommMOSI(MasterOutput,SlaveInputdonnespartantdelArduino
et allant vers le capteur) et MISO (Master Input, Slave Output, donnes partant du
capteuretallantverslArduino).
*Afindamliorercettevoiesrie,ilexisteuneautrebrochenommeSS(SlaveSelect)
permettantdechoisirquelcomposantlematreparle.Ainsilaliaisonnestpluslimite
unesclaveseulement.
ChezArduino,ilexisteunelibrairiepourutiliserleSPI,ellesappelleSPI.

Protocolepropritaire
Ici pas de solution miracle, il faudra manger de la documentation technique (trs
formateur!).Eneffet,sileconstructeurdcidedimplmenterunprotocolesasauce
alorsceseravousdevousplieretdecoderpourrussirlimplmenteretlutiliser.
Voussavezmaintenanttoutsurlescapteurs,votreArduinopeutmaintenantsentirle
monde qui lentoure comme promis en introduction de cette partie. Mais ce nest pas
fini,ilexisteungrandnombredecapteurs,beaucouptropimportantpourenfaireune
listeexhaustivedansuntutorielcommeceluici.
Maintenant que vous pouvez percevoir le monde, passons la suite en essayant
dinteragiraveccederniergrcelutilisationdemoteurs

329

[Arduino6]Lemouvementgrceauxmoteurs
Silyabienunechosesurlaquelleonnepeutpasfaireabstractionenrobotique,cest
le mouvement. Le mouvement permet dinteragir avec lenvironnement, il permet par
exemple un robot de rouler ou de prendre un objet voire mme dexprimer des
motions. Bref, ce mouvement est indispensable. Dans cette partie nous allons
apprendredonnerdumouvementnosapplications.Pourcela,nousallonsutiliser
desmoteurs.Cesonteuxqui,principalement,transformentlnergiequilsreoiventen
unmouvement.Nousverronsgalementcommentreconnatreetutiliserlesdiffrents
typesdemoteurs.
Chaquechapitreprsenteraunmoteur.Lepremierseraproposdumoteurcourant
continu.Ilestindispensabledelelirecarlesdeuxautreschapitresreprendrontdes
lmentsquiserontdoncconsidrscommeacquis(onnevapassamuserfairedes
copier/coller3foisdesmmesnotions )

[Arduino601]Lemoteurcourantcontinu
Nul doute que vous connaissez lexistence des moteurs car il en existe toute une
panoplie!Lepremierquivousviendracertainementlespritseralemoteurdevoiture,
oupeuttreceluiprsentdansuneperceuselectrique.Voildeuxexemplesdobjets
danslesquelsonpeuttrouverunmoteur.Bienentendu,cesdeuxmoteurssontdetype
diffrent,ilseraiteneffetpeuprobabledefaireavancervotrevoitureavecunmoteurde
perceuselectriqueetpuislutilisationduneperceuseintgrantunmoteurdevoiture
deplusieurscentainesdekilosseraitfastidieuse .Voyonsdonccommentfonctionne
lemoteurlectriqueleplusrpandu:lemoteurcourantcontinu

Unmoteur,afaitquoiaujuste?
Commenons en douceur par lexplication de ce quoi sert un moteur et son
fonctionnement.
Cechapitrenestpasundesplussimplescarilvafaireapparatredesnotionsde
mcanique qui sont indispensables pour comprendre le mouvement. Il prend en
gnralplusieursheuresdecourspourtrebienexpliqu.Nousallonsdoncvous
faireiciuniquementuneintroductionlamcaniquedumoteur.Cependant,cette
introductionprsentedesnotionstrsimportantespourbiencomprendrelasuite,
nelangligezdoncpas!
Prenonsunmoteurlectriquedesplusbasiquesquisoient:

330

Vousavezdevantvosyeuxunmoteurlectriquetelquelonpeutentrouverdansles
enginsdemodlismeoudanslesvoiturestlguides.Maissachezquilenexistede
toutesorte,allantduminiatureaugigantesque,adaptsdautrestypesdapplications.
Nousnouscontenteronsicidesmoteurslectriquesbasiques.

Transformationdelnergielectriqueennergiemcanique
Un moteur a fait quoi ? a tourne ! On dit quun moteur est un composant de
conversion dnergie lectrique en nergie mcanique. Les moteurs courant
continu(cetermedeviendraplusclairparlasuite)transformentlnergielectriqueen
nergiemcaniquederotation,pourtreprcis.Maisilspeuventgalementservirde
gnrateurdlectricitenconvertissantunenergiemcaniquederotationennergie
lectrique.Cestlecasparexempledeladynamosurvotrevlo!
Cedernierpointnestpasngliger,carmmesidanslaplupartdesapplications
votremoteurserviragnrerunmouvement,ilserapossiblequilsoitactionn
lenversetgnrealorsducourant.Ilfaudradoncprotgervotrecircuitpournepas
labmercausedecetteinjectiondnergienondsire.Onvarevenirdessus
plusloin.

Principedefonctionnementdumoteurcourantcontinu
Duvocabulaire
Tout dabord, nous allons prendre une bonne habitude. Le moteur courant continu
sappelle aussi Machine Courant Continu, que jabrgerais en MCC. Le moteur
courantcontinuestcomposdedeuxpartiesprincipales:lerotor(partiequitourne)et
lestator (partie qui ne tourne pas, statique). En lectrotechnique le stator sappelle
aussiinducteuretlerotorsappellelinduit.Surlimagedroite,vouspouvezobserver
au milieu entour par les aimants bleu et rouge qui constituent le stator le rotor
composdefilsdecuivreenroulssurunsupportluimmemontsurunaxe.Cetaxe,
cestlarbredesortiedumoteur.Cestluiquivatransmettrelemouvementlensemble
mcanique(pignons,chane,actionneur)quiluiestassocienaval.Danslecasdun
robot sur roues par exemple, on va mettre la roue sur cet axe, bien souvent par
lintermdiairedunrducteurquidiminuelavitessederotationtoutenaugmentantle
couple.Onverratoutlheurepourclaircircestermesquidoivent,pourlinstant,ne
331

pasvousdiregrandchose.

De nouvelles bases sur


llectricit
Vous le savez peuttre, lorsque un
courantcirculedansunfililgnreun
champmagntique.Pluslecourantqui
circulera dans le fil sera grand, plus
lintensitduchampsmagntiquesera
leve. Lorsquon enroule du fil
lectriquesurluimme,onformeune
bobine. Un des avantages de la
bobineestqueloncumulecechamp
magntique. Donc plus on a de tours
defil(desspires)etpluslechampmagntiqueseralevpouruncourantdonn.

Ensomme,onretiendraquelorsqueloncreunebobinedefillectrique,engnral
ducuivre,onadditionneleschampsmagntiquescrsparchaquespiredelabobine.
Ainsi, vous comprendrez aisment que plus la bobine contient de spires et plus le
champmagntiquequelleinduitestimportant.Jenevousaipastropperdu,avapour
lemoment? Bon,continuons.

Lemagntisme
Oui,parlonsen.Ceserabref,rassurezvous.Jevaisfaireappelvotreexprience
aveclesaimants.Vousaveztousdjeuloccasiondavoirdeuxaimantsdanslamain
et dobserver la rsistance quils mettent lorsque lon veut les rapprocher lun de
lautre,ouaucontrairelorsquilssattirentsoudainementdsquonlesmetunpeutrop
prs.Cephnomneestdauchampmagntiquequegnrentlesaimants.Voilun
aimantpermanentleplussimplesoitil:

Aimantpermanent
Il possde un ple Nord et un ple Sud. Cet aimant gnre un champ magntique
permanent,cestdirequelechampmagntiqueesttoujoursprsent.Cestquelque
332

chosedetotalementinvisiblemaisquipermetdefairedeschosesintressantes.

Champmagntiquegnrparunaimantpermanent
Notezbienquejaiajoutdesflchesreprsentativesdusensdeparcoursduchamp
magntique, cest important pour la suite. Bon, pour terminer mon explication sur le
champmagntique,jevousproposedimaginerquilsagissedunfluxinvisible,unpeu
commelecourant.Pourserapprocherdelanalogieavecleau,onpeutimagineraussi
que laimant est une fontaine qui propulse de leau (champ magntique) et qui la
rcupre loppos de l o il la jecte. Tout a, pour en arriver vous dire
quapprocher deux aimants avec le mme ple, ils se repoussent mutuellement (les
deux fontaines jectent de leau lune contre lautre, ce qui a pour effet de les
repousser).Etonlecomprendbienlorsquelonregardelesensduchampmagntique:

Deuxaimantspermanentsquiserepoussentmutuellementcarleurchampmagntique
estoppos
En revanche, deux aimants orients dans le mme sens se rapprocheront car leur
champmagntiqueiradanslesensoppos.Lapremirefontainevaaspirerceque
lautrejecte,etlautrevaaspirercequelapremirejecte.

333

Rsultatdelamiseensriededeuxaimantspermanentsidentiques
Par consquent, le champ magntique global sera plus intense. On peut alors
schmatiserlersultatsouslaformedunseulaimantpluspuissant.

Schmatisationdursultatprcdent
anousamneotouta?Jecomprendsmieuxcommentfonctionnelesaimants,
maispourunmoteurlectrique,cestpareil?
Ehoui,sansquoimesexplicationsnauraienteuaucunsenssijevousavaisditquun
moteurfonctionnaitcompltementdiffremment. Dcomposonsnotreexplicationen
deuxparties.

Lestator
Lestator,jelaiditaudbut,estunepartieimmobiledumoteur.Surlimage,ilsetrouve
sur les cts contre le chssis. Il forme un aimant avec ses ples Nord et Sud. Cet
ensembleaimant+chssisconstituedonclestator:

334

StatorduneMCC
Il ny a pas plus de choses dire, lessentiel du phnomne de rotation cr par un
moteurlectriquevasejouerdanslerotor.

Lerotoretlamiseenmouvement
Le rotor, je le rappelle, est situ au centre du stator. Pour faire trs simple, je vous
donnerai les explications ensuite, le rotor est la pice matresse qui va recevoir un
courant continu et va induire un champ magntique variable pour mettre en rotation
larbredurotor.Silonveut,oui,ilsautometenrotation.
Waaho!Avecducourantcontinuilarrivecrerunchampmagntiquevariable?
o_O
Surprenantnestcepas?Ehbien,pourcomprendrecequilsepasse,jevouspropose
deregardercommentestconstituunrotordeMCC(jabrge):

335

Ilsagitbiendunschmadeprincipe,normalementunmoteurcourantcontinuest
constitudetroisbobinessursonrotor.Autrementonpourraitobtenirunquilibre
quiempcheraitlarotationdelarbredumoteur,maissurtoutlemoteurtournerait
dansunsensalatoire.Cequinestpastrsadaptquandonveutfaireavancer
sonrobot.
Voildonclerotordenotremoteur.Bien,passonslaprati
Ehoh,attends!! Cestquoicesdeuxbobines,commentonlesalimente?o_O
Ha,joubliaispresque!Mercidemelavoirrappel.Ilyaeneffetunlmentdontnous
navons pas encore voqu lexistence, il sagit du collecteur. Comme son nom le
suggre, cest un lment du moteur qui se situe sur larbre de rotation (ou laxe du
moteursivousprfrez)etquiapourobjectifdercuprerlecourantafindelamener
jusquauxbobines.Onpeutfaireleschmacompletdumoteuraveclesbobinesetle
collecteur:

Ditesvousbienquilnesagitlquedunschmadeprincipesimplifi,carjele
disais,lesmoteursnayantquedeuxbobinesnexistentpas.
Lecollecteurestreprsenticisurlapartiedroitedelimage.Ilestsitusurlarbredu
moteur(sonaxe).Cecollecteurestconstitudedeuxpastillesmtalliquesauxquelles
sontrelieslesextrmitsdesbobines.Lecontactlectriqueentrelapilequialimente
lemoteuretlesbobinessefaitparlecollecteuretpardeslmentsspciauxquelon
appelle les charbons. Ces deux lments servent amener le courant dans les
bobines en faisant un simple contact lectrique de toucher. Cest dire que les
charbonsfrottentsurlespastillesmtalliqueslorsquelemoteurtourne.
Etytournecommentcemoteur,onlesauraunjour?
a vient, patience. Prenons la configuration du moteur tel quil est sur limage
prcdente.Faitesbienattentionausensdesbobines,carsiellessontbobinesdans
336

un sens oppos ou bien si le courant circule dans un sens oppos, le moteur ne


tournerapas.Jaidoncprislesoindemettreunpointbleuetrouge,pourindiquerle
sensdesbobines(vousallezcomprendre).Nousyvoil. Surleschmaprcdent,
leplepositifdelapileestreli,vialecollecteur,lentrebleuedesdeuxbobines.
Leursortie,enrouge,estdoncrelie,toujoursvialecollecteur,labornengativede
lapile.Vousadmettrezdonc,aveccequelonavuplushaut,quilyauncourantqui
parcourt chaque bobine et que cela gnre un champ magntique. Ce champ est
orientselonlesensducourantquicirculedanslabobine.Dansunpremiertemps,on
vaseretrouveravecunchampmagntiquetelqueceluici:

Cechampvatreopposauxdeuxaimantspermanentsdustatordumoteur,celava
donc mettre en mouvement laxe du rotor. Et ce mouvement est dfini par le fait que
deux aimants orients par leurs ples opposs (face nord de lun face au nord du
deuxime, idem pour le sud) se repoussent. Par consquent, laxe du moteur, je le
disais, va se mettre tourner jusqu ce que les aimants permanents du stator se
retrouvent face chacun de leur complment cr par le champ magntique des
bobines:

337

ATTENDEEEEZ ! Ce nest pas fini ! Non, car dans cette configuration, si rien ne se
passe,ehbienriennesepassera. Etoui,puisquelemoteurestarrivdansune
phase de stabilit. En effet, chaque aimant est face au champ magntique oppos,
donc ils sattirent mutuellement ce qui a pour effet de rgir cette situation dquilibre.
Llment qui va sopposer cet quilibre est le branchement des bobines du rotor.
Vous ne lavez peuttre pas remarqu, mais les bobines ne sont plus connectes
commelasituationprcdente.Lepointrougedesbobinesestmaintenantreliau
plepositifdelapileetlepointbleuauplengatif.Lechampmagntiquegnrpar
lesbobineschangealorsdorientationetlonseretrouveavecdeschampsopposs.Le
moteur est nouveau en situation de dsquilibre (car les champs magntiques se
repoussent)etcelaentraneunmouvementderotationdelaxedumoteur.Vouslaurez
compris,cessituationsserptentindfinimentcarlemoteurnestjamaisdansune
configurationquilibre. Cest cette situation de dsquilibre qui fait que le moteur
tourne.
Alorsattention,jelerpteunedernirefois,unmoteurnayantquedeuxbobines
commesurmesschmasnepeutpasfonctionner,carcestunmodlesimplifiqui
engendreraitimmdiatementunesituationquilibrelamisesoustension.
Pourvousprouverquecequejedisestvrai,voildesphotosdurotordunmoteur
courantcontinuquejavaisdmontilyabien,bieen,bieeeeeenlongtemps:

338

Vousvoyez?Troisbobinesettroispastillesrelieschacune,surlecollecteur.Bon,je
nevousrefaispaslesexplications,voustescapablesdecomprendrecommentcela
fonctionne.

Lamcaniquelieaumoteur
339

Aprsent,nousallonsdtaillerquelquesnotionsdemcaniqueliesauxmoteurs.

Lecouple
Lecoupleestunenotionunpeudurecomprendre,maisonvayarriver!Partonsde
sonunit.LunitducoupleestleNewtonMtre(Nm),attentionjaibienditNewton
Mtre et non pas Newton par mtre ! Cette unit nous informe de deux choses : le
couple est la fois li une distance (le mtre) mais aussi une force (le Newton).
Maintenant je rajoute une information : le couple sexprime par rapport un axe. On
peut en conclure que le couple est la capacit du moteur faire tourner quelque
chosesursonaxe.Pluslecoupleestlevetpluslemoteurseracapabledemettre
enmouvementquelquechosedelourd.Exemple:Vousavezpeuttredjessayde
dvisseruncrousurunerouedevoiture.Vousavezprobablementremarququeplus
vousavezuneclefavecunbraslong(uneffetdelevierimportant)etplusiltaitfacile
de faire bouger lcrou (pour le premier tour, quand il est bien viss/coinc). Ce
phnomne sexplique simplement par le fait que vous avez plus de couple avec un
levier long quavec un levier court. Et cest logique ! Si lon considre que le couple
sexprimeenNewtonmtre,leNewtonseseralaforcedevosmuscles(considrefixe
dansnotrecasdtude,saufsivousvousappelezHulk)etlemtreseralalongueurdu
levier. Plus votre levier est grand, plus la distance est leve, et plus le couple
augmente.Cequinouspermetdintroduirelaformulesuivante:

C =F r
Avec:

C :lecouple,enNewtonmtre
F :laforceexerce,enNewton
r :lerayondelaction(lalongueurduleviersivousprfrez),enmtre
Onpourragalementsesouvenirquepluslaforceexercesurlaxederotationdun
moteur est grande, plus il faudra un couple lev. Et plus le couple du moteur sera
lev,moinsvotrefuturrobotauradedifficultssupporterdelourdescharges.Cela
dit,toutnestpasparfaitcarpluslachargeestlourde,pluslaconsommationlectrique
dumoteurvaaugmenter.Onvavoirlarelationquirecoupecesdeuxinformations.
Dans le systme international, lexpression du couple se fait en N.m (Newton
mtre),maislecommundesmortelsarrivemieuxinterprterdeskilospluttque
des Newtons, donc les constructeurs prennent des raccourcis. Pour passer des
Newtons en kilos, il suffit simplement de les multiplier par la constante
gravitationnelleg(quivautenviron9.81).Soit9.81N 1kg .Ilenquivautalors
lammeformuleintroduisantlesmtres:9.81N . m = 1kg. m .

Lavitessederotation
Lavitessederotationestmesureparrapportlaxederotationdumoteur.Imaginons
quelemoteurentranesonaxe,lorsquilestalimentparuncourant,cederniervaavoir
unevitessederotation.Ilpeuttournerlentementourapidement.Onmesureunevitesse
derotationenmesurantlangleenradiansparcourusparcetaxependantuneseconde.
Cest dire que le moteur est en fonctionnement, que son axe tourne et que lon
mesurejusquovalaxederotation,partirdunpointdedpartfixe,enuneseconde.
340

Regardez plutt limage suivante pour mieux visualiser ce que je veux vous dire
(Comprenezqueletrucgrisetrondcestlemoteurquejaidessin. Onlevoitdefaceetlecercleaumilieucestsonaxe):

Marquagedelaxedumoteurparun
pointjaune(gauche).Auboutduneseconde(droite),mesuredelangle entrela
positiondedpartetdarrivedupointjaune.Onobtientalorslavitessederotationde
laxedumoteur.Cettemesureestexprimeenangleparseconde.
Savezvouspourquoilonmesureainsilavitessederotationdelaxedumoteur?Eh
bien car cette mesure est indpendante du diamtre de cet axe. Et oui, car un point
loignducentredelaxedumoteuraunedistancebeaucoupplusgrandeparcourir
que son homologue proche du centre de laxe. Du coup, pour aller parcourir une
distanceplusgrandeenuntempsdonnilestobligdallerplusvite:

341

Enprenantlamesurepartirdunpoint
dedpartfixe,ladistanceparcourueparlepointjauneetvertestnulle(gauche).En
faisanttournerlaxedumoteurpendantuneseconde,onsaperoitqueladistance
parcourueparchaquepointestdiffrente(droite).Ladistanceparcourueparlepoint
vertestquasiment20foisplusgrandequecelleparcourueparlepointjaune!Etcest
pourquoilepointvertauratplusrapidequelepointjaunecarladistancequil
parcourtenunmmetempsestbeaucoupplusgrande.
Enmcanique,commeonaimeleschosesmarrantesonexprimelavitessederotation
en radians par seconde rad/s et son symbole est le caractre grec , prononcez
omga.Pourrappel,360estauxdegrsceque2piestauxradians(autrementdit,
unevitessede2pi/secondesquivautdirelaxefaituntourparseconde).Celase
traduitpar 360 = 2 radian.Malheureusement,lavitessederotationangulairenest
pasdonneaveclescaractristiquesdumoteur.Enrevanche,ontrouveunevitesseen
tour/minutes(tr/mn ).Vousallezvoirquepourpasserdecetteunitauxrad/s,cest
assezfacile.Eneffet,onsaitquuntourcorrespondunerotationdelaxesur360.Soit
1
1tr=360.Etdansuneminuteilya60secondes.Donclaxetourne 60
detourpar
seconde,silfaituntourparminute.Onpeutalorstablirlarelationsuivante:

1tr/mn = 360

1
60

= 6/s

360 = 2rad

342

Hors,onsaitque360 = 2rad ,cequidonneunenouvellerelation:

1tr/mn = 2

1
60

30

rad/s

Onpeutfinalementdonnerlaformulequiconvertitunradianparsecondeentourspar
minutes:

1rad/s =

30

30

9, 55tr/mn

Etjefaiscommentsijeveuxsavoirquellevitesseiramonrobot?
Ehbiencommejevouslexpliquaisprcdemment,pourrpondrecettequestionil
faut connaitre le diamtre de la roue. Prenons lexemple dune roue ayant 5cm de
diamtre(soit0.05mtres)etunmoteurquitourne20rad/s.Leprimtredelaroue
vaut donc 15.7 cm (0.157 m) daprs la formule du primtre dun cercle qui est
P = 2 r ,avecr lerayonducercle.Celasignifiequenfaisanttournerlaroue
surunesurfaceplaneetenluifaisantfaireuntoursurellemme,laroueauraparcouru
0,157msurcettesurface.Onadmetquelemoteurtourne20rad/scequireprsente
donc 3.18 tours de laxe du moteur par seconde (daprs la dernire formule que je
vousaidonne).Onpeutdonccalculerladistanceparcourueenunesecondegrce
laformule:

V =

d
t

Avec:

V :lavitesseenmtreparseconde(m/s)
d :ladistanceenmtre(m)
t :letempsensecondes(s)
Onvadoncadaptercetteformuleavecladistancequaparcourularoueenfaisantun
toursurellemme(d roue )etlenombredetoursparsecondedelaxedumoteur(t tour ):
d
1
V = t roue On sait que d roue = 0.157m et que t tour = 3, 18tr/s = 3,18
tr. s
tour

V =

0,157
1
3,18

= 0, 157 3, 18 V = 0, 5m/s Le robot parcourt donc une distance de

50centimtresenuneseconde(cequiquivaut180mtresparheure).Vousavez
maintenanttouteslescartesenmainpourpouvoirfaireavancervotrerobotlavitesse
quevousvoulez!

Lesrducteurs
Unmoteurlectriqueestbiensouventtrsrapideenrotation.Horssivousavezbesoin
defaireunrobotquinevapastropvite,ilvafalloirfaireensortederduiresavitesse
derotation.Onpeuttrsbienmettreunfreinquivaempcherlemoteurdetournervite,
oubienlepiloter(onvavoiratoutelheure).Celadit,mmesionrduitsavitesse
derotation,lemoteurnevapaspouvoirsupporterdeschargeslourdes.Autrementdit,
votrerobotnepourrammepassesupporterluimme!Nousavonsdoncbesoinde
couple.Etpouravoirducouple,toutenrduisantlavitessederotation,onvautiliserce
343

quelonappelleunrducteur.Unrducteurestunensemblecomposdengrenages
quipermetderduirelavitessederotationdelaxedumoteurtoutenaugmentantle
coupledesortie.Surlimagesuivante,extraitedusitedelAcadmiedAixMarseille,on
peutobserverunensemblemoteur+rducteur+roue:

Larglequirgitsonfonctionnementindiquequentredeuxengrenageslapuissance
estconserve(auxpertesprsquisontduesaufrottementdesengrenagesentreeux).
Etcommelapuissancemcaniqueestdpendanteducoupleetdelavitesse(partie
suivante),onpeutfacilementpasserdelunlautre.Reprenonsnotrerouefaisant5cm
dediamtre.Mettezencontactcontreelleunegranderouede10cmdediamtre(deux
foisplusgrande).Lorsquelapetiterouefaituntour,ellevaentrainerladeuximeroue
plusgrandequivafaireundemitour.Ouicarleprimtredelagranderoueestdeux
foisplusgrandqueceluidelapetite.Lorsquelapetiteparcourt0,157menfaisantun
toursurellemme,lagrandeparcourtelleaussicettedistancemaisennefaisantquun
demitoursurellemme.

344

Deuxrouesencontact,lapetiteentrainelagrandedontlediamtreestdeuxfoisplus
grandquelapetite(gauche).Lepointvertetjaunesertreprerlarotationdechaque
roue.Lorsquelapetiterouefaitundemitour,lagranderouefaitunquartdetour(droite).
Siellefaituntourcomplet,lagranderoueneferaquundemitour.
Cequelonnevoitpassurmondessin,cestlecouple.Hors,cequevousnesavez
peuttrepas,cestquelaxedelagranderouebnficieenfaitdedeuxfoisplusde
345

couple que celui de la petite. Car les rducteurs ont pour proprit, je le disais, de
modifierlecoupledesortieetlavitesse.Etceselonlarelationsuivantequidonnele
rapportderduction:

R=

entree
sortie

Csortie
Centree

Avec:

R :lerapportderductiondurducteur
entree :lavitessederotationdelaxedumoteurenentredurducteur
sortie :lavitessederotationdelaxedumoteurensortiedurducteur
C sortie :coupleexercparlaxedesortiedurducteur
C entree :coupleexercparlaxedumoteur,enentredurducteur
Unrducteursapparentedoncunsystmequimodifiedeuxgrandeursquisontlies:
le couple et la vitesse. On peut schmatiser le fonctionnement dun rducteur de la
maniresuivante:

Cestquoia,lespertesmcaniques?
Justement,venonsenunautrepointquejevoudraisaborder.

Lapuissanceetlerendement
Dansunmoteur,ontrouvedeuxpuissancesdistinctes:
La premire est la puissancelectrique. Elle reprsente la quantit dnergie
lectriquedpensepourfairetournerlaxedumoteur.Ellereprsenteaussila
quantitdnergielectriqueinduitelorsquelemoteurtourneengnrateur,cest
dire que le moteur transforme une nergie mcanique de rotation en une
nergielectrique.Ellesecalculesimplementpartirdelaformulesuivante:
Puissance=TensionxCourant

P elec = U I
Selonlesconventions,latensionestexprimeenVoltetlecourantenAmpre.
Quantlapuissance,elleestexprimeenWatt(W).
346

Lasecondeestlapuissancemcanique.Ellecorrespondaucoupledumoteur
multipliparsavitesseangulaire:

P meca = C
Le couple doit tre exprim en NewtonMtre (Nm) et la vitesse en radians par
seconde(rad/s).Pourlapuissancemcanique,ilsagitencoredeWatt.
Une puissance (mcanique ou lectrique) sexprime habituellement en Watts
(symboleW). On retrouve cependant dautres units telle que le Cheval Vapeur
(CV),avec1CVquivaut(arrondi)735,5W.
Maiscommedanstoutsystme,laperfectionnexistepas,onvavoirladiffrencequily
a entre la puissance mcanique et lectrique, alors que priori elles devraient tre
quivalentes. Lorsque le moteur est en fonctionnement, il gnre des pertes. Ces
pertessontduesdiffrentsphnomneslectriquesouthermiques(chauffement)
ou tels que les frottementsmcaniques (air, pices en contact, magntique). Il y a
doncunediffrenceentrelapuissance(lectrique)enentredumoteuretlapuissance
(mcanique)ensasortie.Cettediffrencesexprimeaveclanotionderendement.Le
rendement est une caractristique intrinsque chaque moteur et permet de dfinir
lcart entre la puissance dentre du moteur et sa puissance de sortie. Il sexprime
sansunit.Ilpermetgalementdesavoirquelestlepourcentagedepertesprovoques
parlemoteur.Lerendementsenoteaveclalettregrecqueeta( )etsecalculegrce
laformulesuivante:

Psortie
Pentree

Danslecasdumoteur,onauraitalorslespuissanceslectriqueetmcaniquetelles
quelles:

Pmeca
Pelec

Etdanslecasolemoteurestutilisengnrateurlectrique(onfaittournerlaxela
mainparexemple),laformulerestelammemaislaplacedespuissanceslectriqueet
mcaniqueestinverse:

Pelec
Pmeca

Attention,lerendementestunevaleursansunit,onpeutenrevanchelexprimer
sousformedepourcentage.
Si lon prend un exemple : un moteur de puissance lectrique 100W, ayant une
P

puissancemcaniquede84Wauraunrendementde: = Pmeca = P 84 = 0, 84
elec
100
Cequicorrespond84%.Sacheztoutefoisquelerendementnepourradpasserles
100% (ou 1), car il nexiste pas de systmes capables de fournir plus dnergie
quilsnenreoivent.Celadit,siunjourvousparvenezentrouverun,vouspourrez
devenirleRoiduMonde!!:Pirate:

347

Lesmoteurslectriquesonthabituellementunbonrendement,entre80%(0.8)et
95% (0.95). Cela signifie que pour 100W lectriques injects en entre, on
obtiendra en sortie 80 95W de puissance mcanique. Tandis quun moteur
explosiondevoituredpassepeineles30%derendement!

Quelquesrelations
Unetoutedernirechoseavantdecommencerlasuite,ilyadeuxrelationsconnaitre
visvisdesmoteurs.

Lienentrevitesseettension
DansunmoteurCC,quelquesoitsatailleetsapuissance,ilfautsavoirquelatension
ses bornes et la vitesse de sortie sont lies. Plus la tension sera leve et plus la
vitesseseragrande.Nousverronscetaspectdanslaprochainepartie.Faitesattention
bienresterdanslesplagesdetensiondalimentationdevotremoteuretnepasles
dpasser.Ilpourraitgriller!Eneffet,vouspouvezdpasserdemaniretemporairela
tension maximale autorise pour donner un coup de fouet votre moteur, mais ne
restez jamais dans une plage trop leve ! Une deuxime consquence de cette
relationconcernelemomentdudmarragedumoteur.Eneffet,larelationentretension
etvitessenestpastoutfaitlinairepourlestensionsfaibles,elleestpluttcrase
cet endroit. Du coup, cela signifie que le moteur narrivera pas tourner pour une
tension trop basse. Cest un peu comme si vous aviez une tension de seuil de
dmarrage.Endessousdecettetension,lemoteurestlarrt,etaudessusiltourne
correctement avec une relation de type 100 trs/min/volts (autrement dit, le moteur
tournera100toursparminutespour1volt,puis200toursparminutespour2voltset
etcetcbienentendule100estpriscommeunexemplepurementarbitraire,chaque
moteurasacaractristiquepropre).

Lienentrecourantetcouple
Commenousvenonsdelevoir,lavitesseestunesortedimagedelatension.Passons
maintenantunepetiteobservation:Lorsquelonfreinelaxedumoteur,parexemple
avecledoigt,onsentquelemoteurinsisteetessayederepoussercetteforceexerce
sursonaxe.Celaestduaucourantquiletraverseetquiaugmentecarlemoteur,pour
continuerdetournerlammevitesse,doitfournirplusdecouple.Hors,lecoupleetle
courant sont lis : si lun des deux augmente alors lautre galement. Autrement dit,
pouravoirplusdecouplelemoteurconsommeplusdecourant.Sivotrealimentation
estenmesuredelefournir,ilpourraventuellementbouger,sinon,commeilnepeut
pas consommer plus que ce quon lui donne, il restera bloqu et consommera le
maximumdecourantfourni.
Si vous faites circuler trop de courant dans un moteur pour trop longtemps, il va
chauffer.Lesmoteurssontdescomposantssansprotection.Mmesilschauffent
ilsneferontrienpoursarrter,bienaucontraire.Celapeutmenerunesurchauffe
etunedestructiondumoteur(lesbobineslintrieursontdtruites).Attentiondonc
nepastroplefaireforcersurdelonguespriodescontinues.

348

Alimenterunmoteur
Bon,etsinousvoyionsunpeucommentcelasepassedanslapratique?Jevaisvous
montrercommentalimenterlesmoteurslectriquescourantcontinu.Vousallezvoir
quecenestpasaussisimplequeaenalair,dumoinslorsquelonveutfairequelque
chosedepropre.Vousallezcomprendredequoijeparle

Connecterunmoteursurunesourcednergie:lapile
Faisonslexpriencelaplussimplequisoit:celledeconnecterunmoteurauxbornes
dunepilede9V:

Cestbeau,atourne.
Cesttout?o_O
Ben oui, quoi de plus ? Le moteur est connect, son axe tourne, la pile dbite du
courantHa!Voilcequinousintressedanslimmdiat:lapiledbiteducourant.
Oui et pas des moindres car les moteurs lectriques sont bien gnralement de
vritablesgloutonsnergtiques.Sivousavezlachancedepossderunampremtre,
vouspouvezmesurerlecourantdeconsommationdevotremoteur.Engnral,pourun
petitmoteurdelecteurCDonavoisinelacentainedemilliampres.Pourunmoteurun
peu plus gros, tel quun moteur de modlisme, on trouve plusieurs centaines de
milliampres de consommation. Pour des moteurs encore plus gros, on peut se
retrouveravecdesvaleursdpassantlargementlamprevoireladizainedampres.
Revenonsnotremoteur.Luineconsommepasplusde100mAvide.Maispourune
simplepilecestbeaucoup.Etjevousgarantisquellenetiendrapaslongtempscomme
a!Deplus,lavitessenestpasrglable,lemoteurtournetoujourssonmaximum(si
cestunmoteurfaitpourtourner9V).Enfin,pourallumerouarrterlemoteur,vous
tesobligdeleconnecterouledconnecterdelapile.Ensomme,utiliserunmoteur
danscetteconfiguration,parexemplepourfaireavancervotrepetitrobotmobile,nest
paslasolutionlaplusadapte.

AveclacarteArduino
VousvousdoutezbienquelonvautiliserlacarteArduinopourfairecequejeviens
dnoncer,savoircommanderlemoteurlallumageetlextinctionetfairevariersa
vitesse.
349

Ne faites surtout pas le montage qui suit, je vous expliquerai


pourquoi!
AdmettonsquelonessaiedebrancherlemoteursurunesortiedelArduino:

Avecleprogrammeadquat,lemoteurvatournerlavitessequelonsouhaite,silon
veut,rglableparpotentiomtreetsarrteroudmarrerquandonleluidemande.Cest
mieux.CestlacarteArduinoquipilotelemoteur.Malheureux!Vousnecroyeztoutde
mme pas que lon va se contenter de faire a ?! Non, oulaaaa. Cest hyper ultra
dangereuxpourvotrecarteArduino!Ilesteneffetimpensablederalisercemontage
carlesmoteurscourantcontinusontdevritablessourcesdeparasitesquipourraient
endommager,aupointdevuematriel,votrecarteArduino!Oubliezdonctoutdesuite
cette ide de connecter directement le moteur sur une sortie de votre Arduino. Les
moteurs, quand ils tournent, gnrent tout un tas de parasites qui peuvent tre des
surtensionstrsgrandesparrapportleurtensiondalimentation.Deplus,lecourant
quils demandent est bien trop grand par rapport ce que peut fournir une sortie
numriquedunecarteArduino(environ40mA).Cesontdeuxbonnesraisonsdene
pasfairelemontageprcdent.
Mais alors, on fait comment si on peut pas piloter un moteur avec notre carte
Arduino?
JenaipasdisquelonnepouvaitpaspiloterunmoteuravecunecarteArduino.Jai
bienprcisdanscetteconfiguration.Autrementdit,ilfautfairequelquechosedeplus
pourpouvoirmenertermecetobjectif.

Unequestiondepuissance:letransistor
350

Souvenezvous, nous avons parl dun composant qui pourrait convenir dans ce
chapitre. Il sagit du transistor. Si vous vous souvenez de ce que je vous avais
expliqu, vous devriez comprendre pourquoi je vous en parle ici. Car, priori, on ne
veutpasallumerunafficheur7segments. Enfait,letransistor(bipolaire)estcomme
uninterrupteurqueloncommandeparuncourant.Toutcommeonavaitfaitavecles
afficheurs7segments,onpeutallumer,satureroubloqueruntransistorpourquillaisse
passerlecourantounon.Nousavionsalorscommandchaquetransistorpourallumer
ou teindre les afficheurs correspondants. Essayons de faire de mme avec notre
moteur:

Ici,letransistorestcommandparunesortiedelacarteArduinovialarsistancesurla
base.Lorsqueltatdelasortieestauniveau0,letransistorestbloquetlecourant
neletraversepas.Lemoteurnetournepas.Lorsquelasortievaut1,letransistorest
commandetdevientsatur,cestdirequillaissepasserlecourantetlemoteurse
mettourner.Leproblme,cestquetoutnestpasparfaitetcetransistorcumuledes
inconvnientsquilestbondeciterpourviterdavoirdemauvaisessurprises:
parcouruparungrandcourant,ilchauffeetpeuttreamengrillersilnestpas
refroidi
ilestenplussensibleauxparasitesetrisquedtreendommag
enfin,ilnaimepasleshautestensions
Pourrpondrecestroiscontraintes,troissolutions.Lapremireconsisteraitmettre
untransistorquiaccepteuncourantassezlevparrapportlaconsommationrelle
dumoteur,oubiendadjoindreundissipateursurletransistorpourquilrefroidisse.La
deuxime solution concernant les parasites serait de mettre un condensateur de
filtrage.Onenadjparlaveclesboutonspoussoirs.Pourledernierproblme,onva
voirquelonabesoindunediode.
351

Lebontransistor
Comme je viens de vous lexpliquer, il nous faut un transistor comme interface de
puissance.Cestluiquinoussertdinterrupteurpourlaisserpasserounonlecourant.
Pourlinstant,nousavonsbeaucoupparldestransistorsbipolaires.Ilssontsympas,
pas chers, mais il y a un problme : ils ne sont pas vraiment faits pour faire de la
commutation,maispluttpourfairedelamplificationdecourant.Lecourantquillaisse
passer est proportionnel au courant traversant sa base. Pour les petits montages
commeceluides7segmentscenestpasvraimentunproblme,carlescourantssont
faibles.Maispourdesmontagesavecunmoteur,olescourantssontbienpluslevs,
votretransistorbipolairevacommencerconsommer.Onretrouverajusquplusieurs
voltsdeperdusentresonmetteuretsoncollecteur,autantdevoltsquineprofiteront
pasnotremoteur.
Maisalorsonfaitcommentpourpasperdretouta?
Eh bien cest facile ! On change de transistor ! Llectronique de puissance a donn
naissance dautres transistors, bien plus optimaux pour les questions de
fonctionnement fort courant et en rgime satur/bloqu. Ce sont les transistors
MOSFET(appelsaussitransistoreffetdechamp).Leursymboleestlesuivant:

Il ressemble videmment un bipolaire, cela reste un transistor. Par contre il est fait
pourfairedelamplificationdetension.Autrementdit,sabrochedecommande(quelon
appelle Gate) doit recevoir une commande, une tension, donc plus besoin de
rsistanceentreArduinoetletransistor.Sonfonctionnementestsimple:unediffrence
de potentiel sur la gate et il commute (laisse passer le courant entre D (Drain) et S
(Source)) sinon il bloque le courant. Facile non ? Un inconvnient cependant : ils
cotentpluschersqueleurshomologuesbipolaires(deunplusieurseurosselonle
modle, le courant quil peut laisser passer et la tension quil peut bloquer). Mais en
contrepartie, ils nauront quune faible chute de tension lorsquils laissent passer le
courantpourlemoteur,etacenestpasngligeable.IlexistedeuxtypesdeMOSFET,
lecanalN et le canal P. Ils font la mme chose, mais le comportement est invers
(quandunestpassantlautreestbloquantetviceversa).Voiciunschmadexemplede
branchement(avecunersistancedepulldown,commeasilesignalnestpasdfini
surlabrocheArduino,letransistorserapardfautbloquetdonclemoteurnetournera
pas):

352

Protgeonslensemble:ladiodederouelibre
Unediode,questcequecest?Nousenavonsdjparlvraidire,ilsagissaitdes
diodeslectroluminescentes(LED)maisleprincipedefonctionnementrestelemme
sanslalumire.Unediode,dontvoicilesymbole:

estuncomposantlectroniquequinelaissepasserlecourantquedansunsens(cf.
ce chapitre). Vos souvenirs sontils nouveau en place ? Alors, on continue !
ReprenonsleschmaprcdentavecletransistorpilotparlArduinoetquicommande
sontourlemoteur.Saturonsletransistorenluiappliquantunetensionsursabase.Le
moteurcommencetournerpuisparvientsavitessederotationmaximale.Iltourne,il
tourne et l je dcide de couper lalimentation du moteur en bloquant le transistor.
Soit.Quevatilsepasser?
Lemoteurvacontinuerdetournercausedesoninertie!
Trsbien.Etquecelavatilengendrer?Unetensionauxbornesdumoteur.Eneffet,je
lai dit plus tt, un moteur est aussi un gnrateur lectrique car il est capable de
convertirdelnergiemcaniqueennergielectriquemmesisonrleprincipalest
353

defairelinverse.Etcettetensionesttrsdangereusepourletransistor,dautantplus
quelle est trs haute et peut atteindre plusieurs centaines de Volts (phnomne
physiqueliauxbobinesinternesdumoteurquivontsecharger).Enfait,lemoteurva
gnrer une tension ses bornes et un courant, mais comme le transistor bloque la
routeaucourant,cettetensionnepeutpasresterlammeetestobligedaugmenter
pour conserver la relation de la loi dOhm. Le moteur arrive un phnomne de
charge.Ilva,prcisment,sechargerentension.Jenemtendspasplussurlesujet,ilyabiendautres
informations plus compltes que vous pourrez trouver sur internet.Laquestion:commentfairepourquele
moteursedchargeetnatteignepasdestensionsdeplusieurscentainesdeVolts
ses bornes (ce qui forcerait alors le passage au travers du transistor et dtruirait ce
dernier)?Larponse:parlutilisationdunediode.Vousvousendoutiez,nestcepas
? Il est assez simple de comprendre comment on va utiliser cette diode, je vous
donneleschma.Lesexplicationslesuivent:

Reprenonsaumomentolemoteurtourne.Plusdecourantnecirculedansletransistor
et la seule raison pour laquelle le moteur continue de tourner est quil possde une
inertiemcanique.Ilgnredonccettefameusetensionquiestorienteverslentre
dutransistor.Commeletransistorestbloqu,lecourantensortiedumoteurvadonc
aller traverser la diode pour revenir dans le moteur. Cest bien, car la tension induite
(celle qui est gnre par le moteur) restera proche de la tension dalimentation du
moteuretnirapasvirevolterauvoisinagedescentainesdeVolts.Maisanesarrte
pasl.Pourceuxquilauraientremarqu,latensioninduiteparlemoteurestoppose
cellequefournitlalimentationdecedernier.Or,tantdonnquemaintenantonfait
unbouclagedelatensioninduitesursonentre(vousmesuiveztoujours?),ehbien
celaalimentelemoteur.Lesdeuxtensionssopposentetcelaapoureffetderalentirle
moteur. La diode de roue libre, cest comme a quon lappelle, sert donc deux
choses : dune part elle protge le transistor de la surtension induite par le moteur,
354

dautrepartellepermetaumoteurdesautofreiner.
Etonmetquoicommediode?o_O
Excellente question, jallais presque oublier ! La diode que nous mettrons sera une
diode Schottky. Ne vous laissez pas impressionner par ce nom barbare qui signifie
simplementqueladiodeestcapabledebasculer(passerdeltatbloquantpassant)
de manire trs rapide. Ds lors quil y a une surtension engendre par le moteur
lorsque lon le coupe de lalimentation, la diode va labsorber aussitt avant que le
transistoraitletempsdavoirdesdommages.Onpourragalementrajouterauxbornes
de la diode un condensateur de dparasitage pour protger le transistor et la diode
contrelesparasites.Aufinal,leschmaressemblea:

355

Savaleurdevratrecompriseentre1nFet100nFenviron.Lebuttantdesupprimer
les petits parasites (pics de tension). Bon, nous allons pouvoir attaquer les choses
srieuses!:Pirate:

Piloterunmoteur
Lesmontagesdecettepartiesontimportantsconnatre.Vousntespasoblig
delesmettreenuvre,maissivouslevoulez(etenavezlesmoyens),vousle
pouvez.Jedisacarlapartiesuivantevousmontreralexistencedeshieldsddis
auxmoteurscourantcontinu,vousvitantainsiquelquesmauxdettespourla
ralisationdesschmasdecettepage.

Fairevarierlavitesse:laPWM
Maintenant que nous avons les bases fondamentales pour faire tourner notre moteur
sans tout faire griller ( ), nous allons pouvoir acqurir dautres connaissances.
commencerparquelquechosedefacile:lerglagedelavitessederotationdumoteur.
Comme nous lexpliquions dans le premier morceau de ce chapitre, un moteur
courant continu possde une relation directe entre sa tension dalimentation et sa
vitesse de rotation. En effet, plus la tension ses bornes est leve et plus son axe
tournerarapidement(danslalimitedesescaractristiquesvidemment).Cependantle
microcontrleurdArduinonestcapabledeproduirequedestensionsde0ou5V.En
revanche,ilpeutsimulerdestensionsvariablescomprisesentre0et5V.Encoreun
petitrappeldecoursncessairesurlaPWMquenousavonsdjrencontreicipour
vous rafraichir la mmoire. Nous sommes en mesure de produire laide de notre
microcontrleur un signal carr dont le rapport cyclique est variable. Et grce cela,
356

nous obtenons une tension moyenne (comprise entre 0 et 5V) en sortie de la carte
Arduino.Ilfautjustebienpenserutiliserlessortiesadquates,savoir:3,5,6,9,10
ou11(suruneduemilanove/UNO).Jersume:enutilisantlaPWM,onvagnrerune
tensionparimpulsionsplusoumoinsgrandes.Cesignalvacommanderletransistor
qui va son tour commander le moteur. Le moteur va donc tre aliment par
intermittencescausedesimpulsionsdelaPWM.Cequiaurapoureffetdemodifierla
vitessederotationdumoteur.
Mais, si le moteur est coup par intermittences, il va tre en rotation, puis va
sarrter,puisvarecommencer,etc.Ceserapasbeauetanetournerapasmoins
vite.Jecomprendspastroptonhistoire.o_O
Non,puisquelemoteurgardeuneinertiederotationetcommelaPWMestunsignal
quivatropvitepourquelemoteuraitletempsdesarrterpuisderedmarrer,onvane
voir quun moteur qui tourne une vitesse rduite. Finalement, nous allons donc
pouvoirmodifierlavitessederotationdenotremoteurenmodifiantlerapportcyclique
delaPWM.Plusilestfaible(untatBASpluslongquuntatHAUT),pluslemoteurira
doucement.Inversement,pluslerapportcycliqueseralev(tatHAUTpluslongque
ltatBAS),pluslemoteuriravite.Toutcelacoupluntransistorpourfairepasserde
lapuissance(etutiliserlatensiondutilisationadapteaumoteur)etnouspouvonsfaire
tournerlemoteurlavitessequenousvoulons.Gnialnon?Pourlinstantjenevous
feraipasdedmo(vouspouvezfacilementimaginerlersultat),maiscelaarriveratrs
prochainement lors de lutilisation de lArduino dans la prochaine souspartie. Le
montage va tre le mme que tout lheure avec le nouveau transistor et sa
rsistancedebase:

357

Maintenantquelemoteurtourneunevitesserglable,ilpourratreintressantdele
faire tourner aussi dans lautre sens (si jamais on veut faire une marche arrire, par
exemple,survotrerobot),voiremmedtrecapabledefreinerlemoteur.Cestceque
nousallonstoutdesuitetudierdanslemorceausuivantenparlantduncomposant
trsfrquentdanslemondedelarobotique:lepontenH.

Tournerdanslesdeuxsens:lepontenH
Fairetournerunmoteurcestbien.Tournerlabonnevitessecestmieux.Allerdans
lesdeuxsenscestlidal.Cestdonccequenousallonsmaintenantchercherfaire!

DcouvertedupontenH
Toutdabordunequestiontrssimple:pourquoilemoteurtournedansunseulsens?
Rponsevidente:parcequelecourantnevaquedansunseulsens!Pourpouvoir
allerverslavantETverslarrireilnousfautdoncundispositifquiseraitcapablede
fairepasserlecourantdanslemoteurdansunsensoudanslautre.Vouspouvezfaire
lexprience en reprenant le premier montage de ce chapitre o il ny avait que le
moteurconnectsurunepilede9V.Essayezdinverserlesdeuxbornesdumoteur(a
ne risque rien ) pour observer ce quil se passe : le moteur change de sens de
rotation.Cestdauchampmagntiquecrparlesbobinesinternesdumoteurquiest
alors oppos. Reprenons notre dispositif de base avec un transistor (que nous
symboliseronsiciparuninterrupteur).Sicedernierestactivlemoteurtourne,sinonle
moteur est arrt. Jusque l rien de nouveau. Rajoutons un deuxime transistor de
lautre ct du moteur. Rien ne va changer, mais il va falloir commander les deux
transistors pour faire tourner le moteur. Ce nest pas bon. Essayons avec quatre
transistors,soyonsfou!

358

Ehbien,celachangetout!Carprsentnousallonspiloterlemoteurdanslesdeux
sensderotation.PourcomprendrelefonctionnementdecepontenH(appelainsipar
saforme),imaginonsquejefermelestransistors1et4enlaissantouvertsle2etle3.
Lecourantpassedelagaucheversladroite.

Sienrevanchejefaislecontraire(2et3fermset1et4ouverts),lecourantiradans
lautresens!Cestgnialnon?

359

Etcenestpastout!

AllonsplusloinaveclepontenH
Commevouslaurezsrementremarqu,lestransistorsfonctionnentdeuxpardeux.En
effet,sionenfermejusteunseuletlaisseouvertlestroisautreslecourantnanullepart
oalleretriennesepasse,lemoteurestenrouelibre.Maintenant,quesepassetil
lorsquondcidedefermer1&2enlaissant3et4ouverts?Cetteactionvacrerce
que lon appelle un frein magntique. Je vous ai expliqu plus tt comment cela
fonctionnait lorsque lon mettait une diode de roue libre aux bornes du moteur. Le
moteurseretrouvealorscourtcircuit.Entournantcausedesoninertie,lecourant
gnr va revenir dans le moteur et va le freiner. Attention cependant, cest diffrent
dunphnomnederouelibreolemoteurestlibredetourner.

360

Ne fermez jamais 1 & 3 et/ou 2 & 4 ensembles, cela ferait un courtcircuit de


lalimentation et vos transistors risqueraient de griller immdiatement si
lalimentationestcapabledefourniruncourantplusfortquecequilsnepeuvent
admettre.

Lesprotectionsncessaires
Lesdiodesderouelibre
Commenouslavonsvuplushaut,pourprotgeruntransistordesparasitesoulorsdu
freinage lectronique du moteur, nous plaons une diode. Dans le cas prsent, cette
diodedevratreenparallleauxbornesdutransistor(regardezleschmaquisuit).Ici
nousavonsquatretransistors,nousutiliseronsdoncquatrediodesquenousplacerons
sur chaque transistor. Ainsi, le courant trouvera toujours un moyen de passer sans
risquer de forcer le passage dans les transistors en les grillant. Comme vu
prcdemment, des diodes de type Shottky sont recommandes pour leurs
caractristiquesdetensiondeseuilfaibleetcommutationrapide.

Unpeudedcouplage
Lorsque nous utilisons le moteur avec une PWM, nous gnrons une frquence
361

parasite.Deplus,lemoteurquitournegnreluimmedesparasites.Pourcesdeux
raisons, il est souvent utile dajouter des condensateurs de filtrage aux bornes du
moteur. Comme sur le montage suivant, on peut en placer un en parallle des deux
broches du moteur, et deux autres plus petits entre une broche et la carcasse du
moteur.

Ensuite, lorsque le moteur dmarre il fera un appel de courant. Pour viter davoir
faire transiter ce courant depuis la source de tension principale (une batterie par
exemple),ilestdebonusagedemettreungroscondensateurpolarisauxbornesde
lalimentationdepuissancedupontenH.Ainsi,aumomentdudpartlnergieseraen
partiefournieparcecondensateurpluttquentotalitparlabatterie(cequiviteraun
chauffementabusifdesconducteursmaisaussiuneventuellebaissedelatension
duelappeldecourant).

Dessolutionsintgres:L293,L298
Afindviterdevoustortureraveclesbranchementsdestransistorsetleurlogiquede
contrle, des composants cls en main ont t dvelopps et produits. Nous allons
maintenant tudier deux dentre eux que nous retrouvons dans quasiment tous les
shieldsmoteursArduino:leL293(D)etsongrandfrre,pluscostaud,leL298.

LeL293(D)
Tout dabord, voici un lien vers la datasheet du composant. Les premires donnes
nous apprennent que ce composant est un quadruple demipont en H. Autrement
formul,cestundoublepontenH(caroui,4foisundemiafait2!).Cecomposantest
faitpourfonctionneravecdestensionsde4.5V36Vetseracapablededlivrer600
mAparcanaux(dansnotrecascelafera1,2Aparmoteurpuisquenousutiliseronsles
demiponts par paire pour tourner dans les deux sens). Un courant de pic peut tre
tolrallantjusqu1,2Aparcanaux(donc2,4Adansnotrecas).Enfin,cecomposant
existe en deux versions, le L293 et le L293D. La seule diffrence (non ngligeable)
entrelesdeuxestqueleL293Dintgredjlesdiodesenparallledestransistors.Un
soucidemoinsseproccuper!Enrevanche,celaimpliquedoncdesconcessionssur
lescaractristiques(lecourantmaxpasse1Aparcanauxet2Apicpourlaversion
sans les diodes). Le branchement de ce composant est assez simple (page 2 de la
datasheet),maisnousallonslevoirensemblemaintenant.Cecomposanta16broches
362

etfonctionneselonunsystmedesymtrieassezsimple.

Dechaquectlesbrochesdumilieu(4,5,12et13)serventrelierlamassemais
aussidissiperlachaleur.Ontrouvelesentresdactivationdesponts(enable)surles
broches1et9.UntatHAUTsurcesbrochesetlespontsserontactivs,lestransistors
pourrontsouvrirousefermer,alorsquuntatBASdsactivelesponts,lestransistors
restentouverts.Ensuite,ontrouvelesbrochespourpiloterlestransistors.Commeun
bontableauvautmieuxquunlongdiscours,voicilescaspossiblesetleursactions:
Input1(broche2et10) Input2(broche7et15)
Effet
0
1
Tournedanslesenshoraire
1
0
Tournedanslesensantihoraire
0
0
Frein
1
1
Frein
Ainsi,enutilisantunePWMsurlabrochedactivationdespontsonseraenmesurede
faire varier la vitesse. Il ne nous reste plus qu brancher le moteur sur les sorties
respectives(2et7ou11et14selonlepontutilis)pourlevoirtourner. Etvoil!
Voussavezpeuprstoutcequilfautsavoir(pourlinstant )surcecomposant.
Attends attends attends, pourquoi il y a deux broches Vcc qui ont des noms
diffrents,cestlouchea!
Ah oui, cest vrai et cest important ! Le composant possde deux sources
dalimentation.Unepourlapartielogique(contrlecorrectdestransistors),VCC1et
lautre pour la partie puissance (utile pour alimenter les moteurs la bonne tension),
VCC2.Bienquecesdeuxentresrespectentlesmmestensions(4.5V36V),nous
ne sommes pas obligs de mettre des tensions identiques. Par exemple, la tension
pourlalogiquepourraitvenirdu+5VdelacarteArduinotandisquelapartiepuissance
pourrait tre fournie par une pile 9V par exemple (noubliez pas de bien relier les
massesentreellespouravoirunrfrentielcommun).
NutilisezJAMAIS le +5V de la carte Arduino comme alimentation de puissance
(pour la logique cest OK). Son rgulateur ne peut fournir que 250mA ce qui est
faible.Sivouslutilisezpouralimenterdesmoteursvousrisquezdelegriller!
Commejesuissympa( )jevousdonneunexempledebranchementducomposant
avecunmoteuretunecarteArduino(jaiprislemodleL293Dpournepasmembter
devoirmettrelesdiodesdeprotectionsurleschma ):
363

Vous noterez la prsence du gros condensateur polaris (100 F / 25V ou plus


selon lalimentation) pour dcoupler lalimentation de puissance du L293D.
Comme je nutilise quun seul pont, jai reli la masse les entres de celui qui est
inutilis afin de ne pas avoir des entres qui grsillent et fassent consommer le
montagepourrien.Enfin,vousremarquezquejutilisetroisbrochesdelArduino,deux
pourlesens(2et4)etunePWMpourlavitesse(3).

LeL298
tudionsmaintenantlegrandfrreduL293:leL298.Sijeparledegrandfrrecenest
pasinnocent.Eneffet,sonfonctionnementesttrssimilaireceluiduL293,maisilest
capablededbiterdescourantsjusqu2Anominalparpontetjusqu3Apendantun
brefinstant.Ilproposeaussiunefonctionpouvanttreintressantequiestlamesuredu
courantpassantautraversdupont(pourvrifiersivotremoteurestrenduenbutepar
exemple). Que dire de plus ? On retrouve deux broches dalimentation, une pour la
logique et lautre pour la puissance. Celle pour la logique peut aller de 4.5 7V (l
364

encoreonpourrautilisercelledelArduino).Lentrpuissance,enrevanche,admetune
tension comprise entre 5 et 46V. Pour un fonctionnement optimal, la documentation
nous recommande de placer des condensateurs de 100nF sur chaque ligne
dalimentation.EtcommepourleL293,onpourraaussiplacerungroscondensateur
polarisde100F(tensionchoisirselonlalimentation)surlalignedalimentationde
puissance.CommelefonctionnementestlemmequeceluiduL293,jevaisjustevous
proposerunelistedesbrochesutiles(ouijesuisfainant!).

Pourlepremierpont:
Lessortiessontsituessurlesbroches2et3.
Lesentrespourlesensderotationsontla5et7etlaPWM(enable)irasurla
broche6.
Pourlesecondpont:
Lessortiessontsituessurlesbroches13et14.
Lesentrespourlesensderotationsontla5et7etlaPWM(enable)irasurla
broche6.
Pourlesdeuxponts:
Lamasse,quiestaumilieusurlabroche8.
Lalimentationdelalogiquedecommande(le5V)surlabrochesuivante,la9.
Etlalimentationdelapartiepuissancesurlabroche4.
Jenementionnepaslesbroches1et15quisontcellesservantmesurerlecourant
traversantlesponts.Jedoutequevousvousenserviezdansunpremiertempsetsi
vousarrivezjusqueljenaiaucundoutequevousarriverezlesmettreenoeuvre
(indice:ilfaudrautiliserunersistance )
LeL298nexistepasaveclesdiodesderouelibreintgres.Prenezdoncgarde
bienlesrajouterdansvotremontagesouspeinedevoirvotrecomposantgriller.
Comme prcdemment, voici un schma dillustration (limage reprsentant le L298
nestpasexacte,maisleboitiermultiwattnexistepasencoredansFritzingdoncjaid
365

feinter):

EtArduinodanstouta?
BrefrappelsurlesPWM
Si vous avez bien lu la partie prcdente, vous avez d apprendre que pour pouvoir
modifier la vitesse de rotation du moteur il faut utiliser un signal PWM. Mais vous
souvenezvouscommentonsensertavecArduino?Allez,zou,petitepiqrederappel
!CommenonsparredireosontsitueslesbrochesutilisablesaveclaPWM.Elles
sontaunombrede6etontlesnumros3,5,6,9,10et11.Pourlesutiliser,vousdevrez
lesconfigurerensortiedanslesetup()devotreprogramme:
1
2
3
4
5
6
7

constintbrochePWM=3

voidsetup()
{
//configurationensortiedelabroche3
pinMode(brochePWM,OUTPUT)
}

366

Ensuite,vouspourrezagirsurlerapportcycliquedusignalPWM(leratioentretemps
ltatHAUTettempsltatBAS)enutilisantlafonctionanalogWrite(broche, ratio).
Largumentbrochedsignelabrocheutiliseretlargumentratioindiquelaportion
detempsltathautdusignal.
1 /*lesignalPWMestgnrsurlabroche3delacarteArduino
2 avecunrapportcycliquede50%(tatHAUTgalentempsceluidel'tatBAS*/
3 analogWrite(brochePWM,127)

Lerapportcycliqueestdfiniparunnombreallantde0255.Celasignifiequ0,le
signal de sortie sera nul et 255, le signal de sortie sera ltat HAUT. Toutes les
valeurs comprises entre ces deux extrmes donneront un rapport cyclique plus ou
moins grand. Dans notre cas, le moteur tourne plus ou moins vite selon si le rapport
cycliqueestgrandoupetit.Poursavoirquelrapportcycliquecorrespondavecquelle
valeur,ilfautfaireunergledetrois:
Valeurargument Rapportcyclique(%)
0
0
127
50
255
100
Lecalculdonnantlavaleurpourchaqueportionestdfiniparcetterelation:

argument =

x100
255

Le rsultat de ce calcul donne la valeur de largument pour le rapport cyclique


recherch.xestlavaleurdurapportcycliquequevoussouhaitezdonnerausignal.

Utiliserunshieldmoteur
Comme nous lavons vu prcdemment, raliser un pont en H demande quelques
efforts(surtoutsivousdsireztoutfairevousmmes ).Afinderendrecesderniers
plusaccessiblesauxpersonnesayantmoinsdemoyenstechniques(toutlemondene
dispose pas du matriel pour raliser ses propres cartes lectroniques !), lquipe
Arduino a dvelopp et mis en productions un shield (une carte dextension) pour
pouvoirutiliserfacilementdesmoteurs.Cetteextensionpossdeainsitoutcequilfaut
pourmettreenuvrerapidementunoudesmoteurs.Laseulecontrepartieestqueles
brochesutilisersontimposes.Cependant,ilexisteunemultitudedeshieldsmoteurs
nonofficielspouvantfairelesmmeschosesoupresque.Lavantagedecesderniers
est indniablement leur prix souvent moins cher. En revanche, il nest pas toujours
faciledetrouverleurdocumentationetleformatdelacartenesesouciepasforcment
dustandardArduino(etnestdoncpasforcmentadaptableensajoutantpardessus
comme un shield officiel le ferait). Je vais donc maintenant vous prsenter le shield
officiel,sonfonctionnementetsonutilisation,puisensuiteunshieldnonofficiel(achet
pas cher sur le net) que je possde et avec lequel je ferai mes photos/vidos. Vous
devriez alors avoir assez de connaissances pour utiliser nimporte quel shield non
officielquevouspourreztrouver.Lesdeuxshieldsprsentsontunpointcommun:ils
utilisenttouslesdeuxleL298commecomposantpourlespontsenH.

LeshieldofficieldArduino
367

Tout dabord, voici ladresse de description de ce shield : le shield moteur. Comme


vous avez bien lu la partie prcdente propos du L298, vous connaissez dj la
majeurepartiedeschosessavoir.Parmielles,voussavezqueleL298ncessitetrois
brochesdepilotage(parpontintgr)etenvoielapuissancesurdeuxbroches(par
moteur). ventuellement nous disposons aussi des deux sondes de courant mais
nous y reviendrons plus tard. Voici un petit synoptique de rsum que je vous ai
concoctpourloccasion:

Voicicommentilfonctionneetlesquelquesprcautionsdutilisation.
Lalimentation de puissance sur les borniers visser gauche est relie
lArduinoetpeutdoncluiservirdesourcedalimentation.Sivousvoulezddier
cettealimentationlacartemoteur,ilfautdonneruncoupdecuttersurlestrap
marquVinendessousdelacarte
Lesentres/sortiesdushieldsontrelieslArduinodelamaniresuivante:
Fonction
Brochesmot.A Brochesmot.B
Direction
12
13
PWM
3
11
Frein
9
8
Mesuredecourant A0
A1
La mesure de courant se fait sur les broches A0 et A1. Si vous avez besoin de ces
broches pour dautre applications, vous pouvez l encore dsactiver la fonction en
coupantlestrapendessousdelacarte.Sinon,lamesureseferasimplementavecla
fonctionanalogRead(canal).Lecircuitatcalibrdefaoncequilyait3.3Vlorsque
lepontdlivre2A(lemaximum).Cetterelationestproportionnelle,onadoncunrapport
de1.65VparAmpre.CommelquipedArduinosaitpertinemmentquelenombrede
brochesestlimit,ilsontutilisunmontagelectroniquesupplmentaire,pourgagner
une broche par pont. En effet, grce un petit montage avec une porte logique OU
Exclusif,onpeutdactiverlafonctiondefreintoutengardantcelledusens.Grce
cela, on peut se limiter seulement deux broches pour commander chaque moteur :
celledusensetcelledelavitesse.Voicicommentilsontfait:Toutdabord,regardons
latabledevritduOUEXCLUSIF.Cettederniresinterprtecommesuit:Lasortie
est1siunedesdeuxentresuniquementest1.Sousformedetableauonobtient
368

a:
EntreA EntreB Sortie
0
0
0
1
0
1
0
1
1
1
1
0
Maintenant rappelezvous, les conditions de freinage taient justement reprsentes
lorsquelesdeuxentresduponttaientaummeniveau.Encouplantintelligemment
lersultatdecetteportelogiqueetlesentresdepilotage,onpeutdciderouiounon
davoir la fonction de frein. Afin de mieux comprendre, je vous invite consulter cet
extraitduschmatechniquedushield:

Grce ce montage, vous pouvez choisir ou non davoir un mode de frein sur vos
moteurs.Sivousprfrezavoirdeuxbrochesdisponiblesetnepasavoirdefrein(juste
unerouelibrelorsquelaPWMest0),alorsilvoussuffiraunefoisdeplusdecouper
lesstrapsendessousdelacarte.
Nayez pas peur davoir des regrets ! Si vous coupez un strap, vous pourrez
toujours le remettre en ajoutant un petit point de soudure pour relier les deux
pastillesprvuesceteffet. Lemieuxauraittdavoirlapossibilitdemettre
descavaliersquelonenlvelamain,maisbon,cestcommea.
Vous savez maintenant tout propos de ce shield. Je vais maintenant vous en
prsenterunnonofficieletensuitenouspasseronsunpetitmontage/codedexemple
pourfinircechapitre.

Monshieldnonofficiel
Maintenantquevousconnaissezlefonctionnementglobaldushieldofficiel,vousallez
369

pouvoirutilisersansproblmelaplupartdesshieldsmoteurs.Afindenepasfairede
publicitpourunsiteouunautre,jevaisvousprsentermonshieldquivautaussibien
quunautre(maispasforcmentmieux).Ilnyaaucunpartipris,jaiachetcedernier
afindeprofiterdetarifintressantlorsdunecommandeavecdautrescomposants.Si
javaistuniquementlarecherchedunshieldmoteur,jenauraispeuttreprisun
autre qui sait ! Bref, assez de ma vie, passons ltude du module ! Afin de bien
commencerleschoses,jevaisdabordvousmontrerunephotodidentitdecedernier.
Ensuite je vous expliquerai o sont les broches qui nous intressent et ferai un
parallle avec le shield officiel. Les deux tant bass sur un L298 lexplication sera
assezrapidecarjenaipasenviedemerpter.Jeferainanmoinsunpetitapartsur
lesdiffrences(avantagesetinconvnients)entrelesdeux.

Voiciunepetitelistedespointsimportants:
gaucheenjaune:lesentresdecommande.EnA,In1,In2pourlemoteurA
EnB,In3,In4 pour le moteur B. On trouve aussi une broche de masse et une
sortie5Vsurlaquellejereviendrai.
Enbasenvertdiffrentsjumpers(descavalierssivousprfrez )pouractiver
des rsistances de pulldown (force une entre/sortie ltat bas) et cbler la
mesuredecourantdesortiedesponts
droiteenbleu,lesbornespourbrancherlesmoteursAetB(respectivementen
hautetenbas)etaumilieulebornierpouramenerlalimentationdepuissance(et
uneentreousortie)de5V

370

AumilieuonretrouveleL298avecdechaquect(enhautetenbas)lesdiodesde
rouelibrepourchaquemoteur.Unepetiteprcisionsimposeparrapportceshield.La
carteembarqueunrgulateur5V(lepetitblocnoirenhautgauchemarqu78M05).
Cedernierpeuttreutilisounon(Activezleaveclejumpervertjustecot).Sivous
lelaissezactiv,cestluiquifourniralalimentationpourlalogiqueduL298.Sivousle
dsactivez,vousdevrezfournirvousmmele5Vpourlalogique.Danstouslescas,il
vousfautrelierlesmassespuissancesetlogiquesentreArduinoetleshieldafindavoir
unrfrentielcommun.Sivouslactivez,alorsvousobtiendrezunesortiede5Vsurle
bornierbleudroite(utilepouralimenterlArduinoparexemple).Sivousledsactivez,
alorsvousdevrezfournirle5V(etdonclebornierbleudevratreutiliscommeune
entre).CeshieldnestenfaitquunesimplecartelectroniquedisposantduL298et
facilitant laccs ses broches. Le fonctionnement se fait exactement comme nous
lavonsvudanslechapitreprcdent,lorsquejevousprsentaisleL293etL298pour
lapremirefois.Pasdefactieavecdesporteslogiquespourgagnerdesbroches.Ici,
toutestbrutdedcoffrage,oncommandedirectementlepontenH.Ilvousfaudradonc
troisbrochesparmoteur,deuxpourgrerladirectionetlefreinetune(PWM)pourla
vitesse.

Petitprogrammedetest
Nousallonsmaintenantpouvoirpasserauxchosessrieuses:lutilisationdumoteur
aveclArduino!

Llectronique
Pourcela,nousallonscommencerparcblerleshield.Enayantlapartieprcdente
concernant le vtre sous les yeux, vous devriez pouvoir vous en sortir sans trop de
difficult.(Dsol,pasdeschmacecoupcicarlelogicielquejutilisenepossdepasencoreleshieldmoteurdanssabasede
donnes, faites donc preuve dimagination
).Personnellement,jenutiliseraiquunseulmoteur(car
danslimmdiatjenaiquunsouslamain ).Jevaisdonclebranchersurlesbornes
bleuesMoteurA.Ensuite,jevaisrelierlesdiffrentesbrochesdecommandemon
Arduino.LabrocheEnAserarelieunesortiedePWM(dansmoncaslabroche3)et
les broches In1 et In2 seront relies nimporte quelles broches numriques (2 et 4
pourmoi).Ilnenousresteplusqunousoccuperdelalimentation.Toutdabord,je
mets un fil entre la masse du shield et celle de lArduino (pour avoir un rfrentiel
commun).Commemacartepossdesonproprergulateurdetension5V,pasbesoin
delamenerdepuisArduino.Enfin,jerelielesdeuxfilspourlapuissance.Dansmon
cas ce sera une alimentation 12V (400 mA max, wouhou) qui vient dun adaptateur
allumecigare(censfournirdu5V)quejaidmontpourobtenirunesourcede12V.
Jevousproposeaussiderajouterunpotentiomtresuruneentreanalogique.Decette
faon nous allons pouvoir faire varier la vitesse sans recharger le programme . Et
voil,pointdevuelectroniquetoutestprt.Voilcequeadonnechezmoi(unbeau
bazar ,maisjaioublilepotentiomtre):

371

Linformatique
Maintenant, nous allons devoir nous occuper du code et comme toujours, nous
commenonsparlisterlesvariablesconcernantlesbrochesutilises:
1
2
3
4
5
6
7
8

//laPWMpourlavitesse
constintenable=3
//lesbrochesdesignalpourlesensderotation
constintin1=2
constintin2=4

//uneentreanalogique(A0)pourrglerlavitessemanuellement
constintpotar=0

Cesdiffrentesbrochesserontbienentendudesbrochesdesortie(sauflanalogique),
doncnouslesdclaronscommetellesdanslesetup():
1
2
3
4
5
6
7
8
9
10
11
12
13

voidsetup()
{
pinMode(enable,OUTPUT)
pinMode(in1,OUTPUT)
pinMode(in2,OUTPUT)
//j'utiliselaliaisonsriepourvoirlavitessedfinieparlepotentiomtre
Serial.begin(115200)

//ondmarremoteurenavantetenrouelibre
analogWrite(enable,0)
digitalWrite(in1,LOW)
digitalWrite(in2,HIGH)
}

Etvoila,sivousexcutezlecodemaintenantvotremoteurseraarrt!Ehoui,jai
volontairement mis une vitesse nulle la fin du setup() pour viter que le moteur ne
semballeaudmarrageduprogramme.Maissivouschangezcettedernire(mettez50
pourvoir)vousverrezvotremoteursemettretourner.Nousallonsdoncrajouterun
peu dinteractivit, pour que vous puissiez vousmme augmenter/diminuer la vitesse
enfonctiondelavaleurluesurlepotentiomtre:
1
2
3
4
5

voidloop()
{
//onlitlavaleurdupotentiomtre
intvitesse=analogRead(potar)

372

6
7
8
9
10
11
12
13
14
15
16

//divisiondelavaleurluepar4
vitesse/=4

//envoielanouvellevitessesurlemoteur
analogWrite(enable,vitesse)

//onaffichelavitessesurlemoniteursrie
Serial.println(vitesse)

delay(50)
}

Maispourquoitudiviseslavitessepar4laligne5?Jeveuxallerfondmoi!
Cesttrssimple.Lalectureanalogiquenousrenvoieunevaleurentre0et1023(soit
1024valeurpossibles).OrlafonctionanalogWritenepeutallerquentre0et255(total
de 256 valeurs). Je divise donc par 4 pour rester dans le bon intervalle ! Car :
4 256 = 1024 .

Programmepluslabor
Maintenant,jevousfaiscadeauduncodevouspermettantdallerdanslesdeuxsens
etvitessevariable.Mais,jevousconseilledessayerdelefaireparvousmmeavant
de regarder ce quil y a dans la balise secret. Le potentiomtre est utilis comme
rgulateurdevitesse,maisonvavirtuellementdcalerlorigine.Autrementdit,entre0
et511nousironsdansunsens,etentre512et1023nousironsdanslautresens.Nous
feronsaussiensortequelavitessesoitdeplusenpluslevelorsquelonsloigne
du 0 virtuel (de la valeur 512 donc). Je vous donne le code tel quel (avec des
commentairesbiensr).Librevousdeletraitercommeunexercice.sasuite,une
petitevidodursultat.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

constintenable=3//laPWM
constintin1=2//lesbrochesdesignal
constintin2=4
constintpotar=0//labrochepourrglerlavitesse

voidsetup()
{
pinMode(enable,OUTPUT)
pinMode(in1,OUTPUT)
pinMode(in2,OUTPUT)
Serial.begin(115200)

//ondmarremoteurenavantetenrouelibre
analogWrite(enable,0)
digitalWrite(in1,LOW)
digitalWrite(in2,HIGH)
}

voidloop()
{
intvitesse=analogRead(potar)

//danslesenspositif
if(vitesse>512)
{
//ondcalel'originede512

373

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

vitesse=512
//lemoteurvadansunsens
digitalWrite(in1,LOW)
digitalWrite(in2,HIGH)
Serial.print("+")
}
else//dansl'autresens
{
//demmeondcalepourquelavitesseaugmenteens'loignantde512
vitesse=512vitesse
//lemoteurvadansl'autresens
digitalWrite(in1,HIGH)
digitalWrite(in2,LOW)
Serial.print("")
}

//pourresterdansl'intervalle[0255](sinononestdans[0512])
vitesse/=2
//envoielavitesse
analogWrite(enable,vitesse)

//etl'affiche
Serial.println(vitesse)
delay(50)
}

Bravoceuxquiontessaydefaireceprogramme,mmesilsnysontpasarriv!
Dans ce dernier cas, vous pouvez aller voir sur les forums et poser vos ventuelles
questionsaprsavoirvrifiquevousavezbientoutessaydecomprendre. Voilla
vidoquimontrelefonctionnementduprogramme:

Dsolpourlaqualitdelavido,ilfautvraimentquejechangedappareil

Voussavezdsormaiscommentfonctionneunmoteurcourantcontinuetquelssont
lesmoyensdelepiloter.Ilvadornavanttrepossibledevousmontrerlexistencede
moteurs un peu particuliers qui se basent sur le moteur courant continu pour
fonctionner.Etvousallezvoirquelonvapouvoirfairepleindechosesavec!

[Arduino 602] Un moteur qui a de la tte : le Servo


Moteur
Danscechapitre,nousallonsparlerdunmoteurquenosamismodlistesconnaissent
bien:leServomoteur(abrg:servo).Cestunmoteurunpeuparticulier,puisquil
confond un ensemble de mcanique et dlectronique, mais son principe de
fonctionnement reste assez simple. Les parties seront donc assez courtes dans
374

lensemblecarlesservomoteurscontiennentdansleurventredesmoteurscourant
continu que vous connaissez prsent. Cela mvitera des explications
supplmentaires.

Principeduservomoteur
Un servomoteur trange comme nom, nestce pas ? Cela dit, il semblerait quil le
portebienpuisquecesmoteurs,unpeuparticuliersjeledisais,emportentaveceuxune
lectronique de commande (faisant office de cerveau). Le nom vient en fait du latin
servus qui signifie esclave. Mais avant de satteler lexploration interne de ce cher
ami,faondeparler,nousallonsavanttoutvoirquoiilsert.

Vuegnrale
Leservo,undrledemoteur
Commenonsenimage,aveclaphotographiedunservomoteur:

Cest,enrglegnrale,quoiilsressemblent,variantselonleurtaille.
Pfiouuu,cestquoicemoteur,anyressemblemmepas!
Jvous lavais dit que ctait des moteurs particuliers ! En dtail, voyons quoi ils
servent. De manire semblable aux moteurs courant continu, les servomoteurs
disposentdunaxederotation.Surlaphoto,ilsetrouveaucentredelaroueblanche.
Cetaxederotationestenrevancheentravparunsystmedebridage.Celaneveut
pasdirequilnetournepas,maiscelasignifiequilnepeutpastourneraudeldune
certainelimite.Parexemple,certainsservomoteursnepeuventmmepasfairetourner
leur axe de rotation en leur faisant faire un tour complet ! Dautres en sont capables,
maispasplusduntour.Enfin,uncaspartquenousneferonsquvoquer,ceuxqui
tournentsansavoirdelimite(autantdetoursquilsleveulent).Etl,cestlemomento
jevousdis:dtrompezvous!enrpondantlaquestioncritiquequevousavezen
tte:Unmoteurquinepeutmmepasfaireuntouravecsonaxederotation,asert
rien?o_O En effet, sil ne peut pas faire avancer votre robot, il peut cependant le
375

guider.Prenonslexempledunepetitevoituredemodlismequatreroues.Lesroues
arrireserventfaireavancerlavoiture,ellessontmisesenrotationparunmoteur
courantcontinu,tandisquelesrouesavant,quiserventladirectiondelavoiturepour
nepasquelleseprennelesmurs,sontpilotesparunservomoteur.Comment?Eh
biennousallonsvouslexpliquer.

Lexempledelavoitureradiocommande
Regardons limage que je vous ai prpare pour comprendre quoi sert un
servomoteur:

VuededessusReprsentationschmatiquedusystmedeguidagedesrouesdune
voitureradiocommande
Chaqueroueestpositionnesurunaxederotation(partiebleue)luimmemontsur
unpivotsurlechssisdelavoiture(envert).Labaguette(rouge)permetdegarderla
paralllismeentrelesroues.Silunepivoteverslagauche,lautreenfaitdemme(ben
ouais, sinon la voiture devrait se couper en deux pour aller dans les deux directions
376

opposes ). Cette baguette est fixe, par un pivot encore, au bras de sortie du
servomoteur. Ce bras est son tour fix laxe de rotation du servomoteur. Ainsi,
lorsqueleservomoteurfaittournersonaxe,ilentrainelebrasquientrainelabaguetteet
faitpivoterlesrouespourpermettrelavoituredeprendreunedirectiondanssonlan
(tournergauche,droite,ouallertoutdroit).Ilnyariendebiencompliqu.Cequil
fautretenirestqueleservomoteurvaentrainerlabaguettepourorienterlesrouesdans
unsensoudanslautre.Ellesaurontdoncunangledorientationparrapportauchssis
delavoiture.Voyezplutt:

Alors,vousallezmedire:maispourquoionmetpasunmoteurcourantcontinuavec
unbrassursonaxe,ceseraitplussimple,non?Ehbiennoncarcelaneconviendrait
377

pas.Jevousexpliquepourquoi.Nouslavonsvu,unmoteurcourantcontinutourne
sans sarrter, sauf si on lui coupe lalimentation. Le problme cest que, dans notre
cas,sionlaisselemoteurtourner,ilpourraitfairepivoterlesrouesplusloinqueleur
angle maximal et casser le systme de guidage car il ne saura pas quand il faut
sarrter(savoir,quandlesrouessontarrivesleuranglemaximal).Bon,onpourrait
trs bien faire un systme qui coupe lalimentation quand les roues arrivent sur leur
bute. En plus, les moteurs courant continu sont de bien pitres athltes, il leur
faudraitncessairementunrducteurpourarriveravoirunevitessefaibleetuncouple
pluslev.Maispourquoisembteravecapluttquedutiliserquelquechosededj
toutprt?Cestleservomoteurquivafairetouta!Pourtreprcis,leservomoteurest
command de telle sorte quau lieu de donner une vitesse de rotation de son axe, il
donneunepositionangulairedelarbrerelisonaxe.Donc,onluidemandedefaire
tournersonaxede10verslagaucheetilsexcute!

Compositiondunservomoteur
Les servomoteurs ont donc lavantage dtre asservis en position angulaire. Cela
signifie, je vous lexpliquais, que laxe de sortie du servomoteur respectera une
consignedorientationquevousluienvoyezensonentre.Enplus,tenezvousbien,si
parmalheurlesrouesvenaientchangerdorientationenpassantsuruncailloupar
exemple,llectroniqueinterneduservomoteuressaieratantbienquemaldeconserver
cetteposition!Etquellequesoitlaforcequelonexercesurlebrasduservomoteur,il
essayera de toujours garder le mme angle (dans les limites du raisonnable
videmment).Enquelquesortevousnepilotezpasdirectementlemoteur,maisplutt
vousimposezlersultatquevousvoulezavoirensortie.

Apparence
Onentrouvedetouteslestaillesetdetouteslespuissances.Laplupartdutempsla
sortiepeutsepositionnerentre0et180.Celadit,ilenexistegalementdontlasortie
peutsedbattresurseulement90etdautres,ayantunplusgranddbattement,sur
360.Ceuxquiontlapossibilitdefaireplusieurstourssontsouventappelsservo
treuils.Enfin,lesderniers,quipeuventfairetournerleuraxesansjamaissebuter,sont
appelsservomoteursrotationcontinue.Lesservomoteurssonttrsfrquemment
employs dans les applications de modlisme pour piloter le safran dun bateau, le
gouvernaildunavionoubienmmelesrouesdunevoituretlguidedontonaparl
jusqu prsent. Maintenant que les prsentations sont faites, mettonsle nu ! Il est
composdeplusieurslmentsvisibles:
Lesfils,quisontaunombredetrois(nousyreviendrons)
Laxederotationsurlequelestmontunaccessoireenplastiqueouenmtal
Leboitierquileprotge
maisaussideplusieurslmentsquelonnevoitpas:
unmoteurcourantcontinu
desengrenagespourformerunrducteur(enplastiqueouenmtal)
un capteur de position de langle dorientation de laxe (un potentiomtre bien
souvent)
une carte lectronique pour le contrle de la position de laxe et le pilotage du
moteurcourantcontinu
378

Voil une image 3D (extraite du site internet suivant) de vue de lextrieur et de


lintrieurdunservomoteur:

Connectique
Leservomoteurabesoindetroisfilsdeconnexionpourfonctionner.Deuxfilsservent
sonalimentation,lederniertantceluiquireoitlesignaldecommande:
rouge:pourlalimentationpositive(4.5V6Vengnral)
noiroumarron:pourlamasse(0V)
orange,jaune,blanc,:entredusignaldecommande
Nousverronstoutlheurecequenousdevonsentrersurledernierfil.

Lamcanique
Commeonlevoitdanslimageprcdente,leservomoteurpossdeplusieurspignons
(engrenages) en sortie du petit moteur CC. Cet ensemble est ce qui constitue le
rducteur.Cerducteurfaitdeuxchoses:dunepartilrduitlavitessederotationen
sortiedelaxeduservomoteur(etnondumoteurCC),dautrepartilpermetdaugmenter
lecoupleensortieduservomoteur(lencorenonensortiedumoteurCC).Alors,quoi
a sert de rduire la vitesse et daugmenter le couple ? Eh bien les moteur CC se
dbrouillenttrsbienpourtournertrsvitemaislorsquilsfontunesipetitetailleilssont
bienmoinsbonspourfournirducouple.Onvadoncutilisercerducteurquivarduire
lavitesse,carnousnavonspasbesoindavoirunevitessetropleve,etaugmenterle
couple pour ainsi pouvoir dplacer une charge plus lourde. Ceci est prouv par la

C
formulequejevousaidonnedanslechapitreprcdent: R = entree
= C sortie . Le
sortie
entree
rapportderduction(R)durducteurdfinitlecoupleetlavitessedesortie(ensortie
379

du rducteur) selon la vitesse et le couple dentre (en sortie du moteur CC). Ces
donnessontsouventtransparenteslorsquelonachteunservomoteur.Danslaquasi
totalitdescas,nousnavonsquelavitesseangulaire(endegrparseconde/s),le
coupledesortieduservomoteuretledbattementmaximal(silsagitdunservomoteur
ayantundbattementde090,180,360ouautre).Etcestlargementsuffisanttant
donn que cest que ce qui nous intresse dans le choix dun servomoteur. Il y a
cependantuneunitquipourrapeuttrevousdonnerquelquesdoutesouunecertaine
incomprhension. Cette caractristique est celle du couple du servomoteur et a pour
unitlekg. cm (kilogrammecentimtre).Nousallonstoutdesuiterappelercequecela
signifie.Avanttout,rappelonslaformulesuivante: C = F r quidonnelarelation
entre le couple C du servomoteur (en kilogramme mtre), F la force exerce sur le
brasduservomoteur(enkilos)etr ladistance(enm)laquellesexercecetteforcepar
rapport laxe de rotation du servomoteur. Dissquons dans notre langage la
significationdecetteformule:lecouple(C)exercsurunaxeestgallaforce(F)
appliqueauboutdulevieraccrochcemmeaxe.forceidentique,pluslelevier
estlongetpluslecoupleexercsurcetaxeestimportant.Endautrestermes,sivotre
servomoteurdisposedunbrasdunmtredelong(ouicesttrslong)ehbienilaura
beaucoupplusdedifficultssouleverunechargede,disons10g,quesonhomologue
qui supporte la mme charge avec un bras nettement raccourci 10 centimtres.
Prenons lexemple dun servomoteur assez commun, le Futaba s3003. Sa
documentationnousindiquequelorsquilestalimentsous4.8V(onreviendradessus
plus tard), il peut fournir un couple (torque en anglais) de 3, 2kg. cm . Cest dire,
quauboutdesonbras,silfait1centimtre,ilpourrasouleverunechargede3,2kg.
Simple,nestcepas? Si le bras fait 10 centimtres, vous aurez compris que lon
perd10foislacapacitsouleverunemasse,onseretrouvealorsavecunpoidsde
320g au maximum (sans compter le poids du bras luimme, certes ngligeable ici,
maisparfoisnon).

Voil une image qui permet dillustrer un peu ce que je vous raconte depuis tout
lheure(acommenaittreennuyeux,non?).Bref.Ici,chaquepoidsreprsentest
celui maximum que peut soulever le servomoteur selon la distance laquelle il est
situ.Etnevousavisezpasdelesmettretouscarvotrepauvreservoseraitbiendans
380

lincapacitdelessouleverenmmetemps.Etoui,malgrlefaitquilnyaitque320g
auboutdubras,leservovoitcommesilyavaitunpoidsde3,2kg!Danscettesituation
onauraittroisfois3,2kg,cequiferaitunpoidstotalde9,6kg!Impossiblepourleservo
de ne bouger ne seraitce que dun millimtre (vous risqueriez fort de le dtruire
dailleurs).
Bon,daccord,jecomprends,maisetlezroilyestpassurtondessin.Commentje
saisquelpoidsjepeuxmettresurlaxedumoteur?o_O
Ehbientoutdpenddudiamtredecetaxe.Voilunequestionpertinente!Alors,oui,
rpondonslaquestion.Maisavant,vousdevriezavoiruneidedelarponsequeje
vaisvousdonner.Non?Bensi,voyons!Plusonloignelepoidslelaxeetpluscelui
cidiminue,etcelafonctionnedanslautresens:plusonlerapproche,plussavaleur
maximaleaugmente.Enthorie,sionsemet0cm,onpourraitmettreunpoidsinfini.
Admettons,plusrigoureusement,quelonmettelepoids1mmdelaxe(soitunaxede
diamtre2mm).Lepoidsqueleservopourraitsouleverseraitde10foisplus!Soit
32kg!!Enconclusion,onpeutadmettrelaformulesuivantequidfinitlepoidsmaximal
mettreladistancevoulue:

P max =

C
d

Avec:

P max :poidsmaximaldechargeenkilogramme(kg)
C :coupleduservomoteur,enkilogrammecentimtre(kg.cm)
d :distancelaquellelepoidsestplacencentimtre(cm)
Et si on se concentrait sur le pourquoi du servomoteur, car son objectif principal est
avanttoutdedonnerunepositionangulairesonbras.Allez,voyonsatoutdesuite!

Llectroniquedasservissement
Questce que lasservissement ?, vous demandezvous sans doute en ce moment.
Malgr la signification peu intuitive que ce terme porte, il se cache derrire quelque
chose de simple comprendre, mais parfois trs compliqu mettre en uvre.
Heureusement,cenestpaslecaspourleservomoteur.Toutefois,nousnentreronspas
dans le dtail et nous nous contenterons de prsenter le fonctionnement.
Lasservissement nest ni plus ni moins quun moyen de grer une consigne de
rgulation selon une commande dentre. Euuuh, vous me suivez ? Prenons
lexempleduservomoteur:onlalimenteetonluienvoieunsignaldecommandequi
permetdedfinirquelanglevasepositionnerlebrasduservomoteur.Cedernierva
sexcuter.Essayezdeforcersurlebrasduservomoteurvousavezvu?Quelleque
soit la force que vous exercez (dans les limites du raisonnable), le servo va faire en
sortedetoujoursgarderlapositiondesonbraslanglevoulu.Mmesilepoidsest
largementsuprieurcequilpeutsupporter,ilvaessayerderemettrelebrasdansla
positionlaquelleilsetrouvait(vitercependant).Ainsi,sivouschangezlangledu
brasenforantdessus,lorsquevousrelcherezlebras,ilvaimmdiatementreprendre
sapositioninitiale(celledfiniegrceausignaldecommande).Pourpouvoirraliserle
maintiendelapositiondubrasdemanirecorrecte,leservoutiliseunelectronique
decommande.Onpeutlanommerlectroniquedasservissement,carcestellequi
381

va grer la position du bras du servomoteur. Cette lectronique est constitue dune


zonedecomparaisonquicompare(tonnamment )lapositiondubrasduservoau
signal de commande. Le deuxime lment qui constitue cette lectronique, cest le
capteurdepositiondubras.Cecapteurnestautrequunpotentiomtrecoupllaxe
dumoteur.Lamesuredelatensionaupointmilieudecepotentiomtrepermetdobtenir
unetensionimagedelangledorientationdubras.Cettepositionestensuitecompare,
jeledisais,laconsigne(lesignaldecommande)quiesttransmiseauservomoteur.
Aprsunerapidecomparaisonentrelaconsigneetvaleurrelledepositiondubras,le
servomoteur(dumoinssonlectroniquedecommande)vaappliquerunecorrectionsi
lebrasnestpasorientlangleimposparlaconsigne.

Synoptiquedefonctionnementdelasservissementduservomoteur
Afindegarderlapositiondesonbrasstable,ilestdoncimportantdesavoirquelleestla
chargemaximaleapplicablesurlebrasduservomoteur.Ensomme,bienvrifierquele
poids de la charge que vous comptez mettre sur votre servomoteur ne dpasse pas
celui maximal quil peut supporter. Avant de passer la suite, je vous propose de
regarder cette superbe vido que jai trouve par hasard sur cesiteweb. Vous allez
pouvoircomprendreaumieuxlefonctionnementdelamcaniqueduservomoteur:

Maisaufait,commentesttransmiselaconsignedecommandedepositiondubras
?Onluiditparlaliaisonsrie?
Cestcequenousallonsvoirtoutdesuitedanslapartiesuivante.Enavant!

Lacommandedunservomoteur
382

Ce quil est intressant de dcouvrir prsent, cest de savoir comment piloter un


moteurdecetype.Etouicarcelanapasbeaucoupderessemblancesaveclemoteur
courantcontinu.IlnevapastrequestiondepontenHouautresbizarreriesdece
type,non,vousallezvoir,avatretrssimple.
Sacheztoutefoisquilexistedeuxtypesdeservomoteur:ceuxquipossdentune
lectronique de commande de type analogique, qui sont les plus courants et les
moins chers et ceux qui sont asservis par une lectronique de commande
numrique, trs fiables et trs performants, mais bien plus onreux que leur
homologuesanalogiques.Vouscomprendrezpourquoinotrechoixsorientesurle
premiertype. Deplus,leurcontrleestbienplussimplequelesservomoteurs
rgulationnumriquequiutilisentparfoisdesprotocolesbienparticuliers.

Lesignaldecommande
La consigne envoye au servomoteur nest autre quun signal lectronique de type
PWM.Ildisposecependantdedeuxcaractristiquesindispensablespourqueleservo
puissecomprendrecequonluidemande.savoir:unefrquencefixedevaleur50Hz
(commecelledurseaulectriqueEDF)etduneduredtatHAUTelleaussifixe
certaineslimites.Nousallonstudierlaffaire.
Certains sites de modlisme font tat dun nom pour ce signal : une PPM pour
Pulse Position Modulation. Jutiliserais galement ce terme de temps en temps,
nensoyezpassurpris!

Lafrquencefixe
Lesignalquenousallonsdevoirgnrerdoitavoirunefrquencede50Hz.Autrement
dit, le temps sparant deux fronts montants est de 20 ms. Je rappelle la formule qui
donnelarelationentrelafrquence(F)etletempsdelapriodedusignal(T):F = T1

Malheureusement,lafonctionanalogWrite()deArduinonepossdepasunefrquence
de50Hz,maisdixfoisplusleve,de500Hzenviron.Onnepourradoncpasutiliser
cettefonction.
Haaaaaaaaaa!Maiscommentonvafaire!!!:(
Ola,vousaffolezpas!Ilexisteunealternative,nevouspressezpas,onvavoiradans
unmoment.

LaduredeltatHAUT
Pourquoiestcesiimportant?QuavonsnoussavoirsurladuredeltatHAUTdu
signal PWM ? quoi cela sertil, finalement ? Eh bien ces questions trouvent leurs
383

rponsesdanscequivasuivre,alorstendezbienloreilleetneperdezpasunemiette
decequejevaisvousexpliquer.(Eh!Entrenous,cestpasmalcettepetiteintro,non?Ellecaptivevotreattention
tout en faisant durer le suspense. Perso jaime bien, pas vous ? Bon, je continue.
) Cette dure, chers petits
zros,estcequicomposelessentieldusignal.Carcestselonellequeleservomoteur
vasavoircommentpositionnersonbrasunangleprcis.Vousconnaissezcomment
fonctionneunsignalPWM,quisertgalementpiloterlavitessedunmoteurcourant
continu.Ehbien,pourleservomoteur,cestquelquepeusemblable.Enfait,unsignal
ayantuneduredtatHAUTtrsfaibledonneraunangle0,lemmesignalavec
une dure dtat HAUT plus grande donnera un angle au maximum de ce que peut
admettre le servomoteur. Mais, soyons rigoureux ! Prcisment, je vous parlais de
valeurs limites pour cet tat HAUT et ce nest pas pour rien, car ce dernier est limit
entre une valeur de 1ms au minimum et au maximum de 2ms (ce sont bien des
millisecondespuisquelonparlededureentemps)pourlesservosstandards.Comme
unschmavautmieuxquunlongdiscours:

Vous aurez devin, travers cette illustration, que la dure de ltat HAUT fixe la
positiondubrasduservomoteurunangledtermin.
Et comment je fais si je veux que mon servomoteur face un angle de 45 ? a
marchepas?o_O
Si,biensr.Enfait,ilvafalloirfairejouerletempsdeltatHAUT.Pourunanglede
45, il va tre compris entre 1ms et 1,5ms. 1,25ms prcisment. Aprs, cest un
rapport qui utilise une relation trs simple, le calcul ne vous posera donc aucun
problme. Tous les angles compris dans la limite de dbattement du bras du
servomoteursontpossiblesetconfigurablesgrcecefameuxtatHAUT.
Etsimonservomoteurnapaslangle0pourorigine,mais90,commentonfait?

384

Cestpareil!Disonsque90estlorigine,donconpeutdirequilestlangle0,cequi
luidonneundbattementde90+90:

Etdanslecasoleservopeutfaireuntourcomplet(donc360),cestaussilamme
chose.Enfaitcesttoujourspareil,quelquesoitledbattementdumoteur.Enrevanche,
cestlgrementdiffrentpourlesservomoteursrotationcontinue.Lesignalayantun
tat HAUT de 1ms donnera lordre vitesse maximale dans un sens, la mme ayant
2msseralordrepourvitessemaximaledanslautresenset1.5msseralaconsigne
pourmoteurarrt.Entrechaquetemps(parexempleentre1mset1,5ms)lemoteur
tournera une vitesse proportionnelle la dure de ltat HAUT. On peut donc
commanderlavitessederotationduservo.

Arduinoetlesservomoteurs
Bon,ehbienprsent,voyonsunpeucommentutilisercesmoteursdontjevousvente
les intrts depuis tout lheure. Vous allez le voir, et a ne vous surprendra mme
plus, la facilit dutilisation est encore amliore grce une bibliothque intgre
lenvironnementArduino.Ilsnousmchentvraimenttoutletravailcesdveloppeurs!

Cblage
Nouslavonsvuplushaut,laconnectiquedunservomoteursersumetroisfils:deux
pour lalimentation positive et la masse et le dernier pour le signal de commande.
Rappelons quun servomoteur accepte gnralement une plage dalimentation
compriseentre4.5Vet6V(6Vilauraplusdecoupleetseraunpeuplusrapidequ
4.5V). Si vous navez besoin dutiliser quun ou deux servomoteurs, vous pouvez les
branchersurlasortie5VdelacarteArduino.Sivousvoulezenutiliserplus,ilseraitbon
denvisagerunealimentationexternecarlergulateurdelArduinonestpasfaitpour
385

dlivrertropdecourant,vousrisqueriezdelecramer.Danscecas,noubliezpasde
relier la masse de lalimentation externe et celle de lArduino afin de garder un
rfrentiellectriquecommun.Lecblepermettantletransitdusignaldecommandedu
servo peuttre branch sur nimporte quelle broche de lArduino. Sachez cependant
quelorsquenousutiliseronscesderniers,lessorties9et10nepourrontplusfournirun
signalPWM(ellespourrontcependanttreutilisescommedesimplesentres/sorties
numriques).Cestunedescontraintesdelabibliothquequenousallonsutiliser.
Ces dernires contraintes sappliquent diffremment sur les cartes MEGA. Cette
pagevousdiratout!
VoicimaintenantunpetitexempledemontagedunservosurlArduino:

LalibrairieServo
Pour utiliser le servo avec Arduino, il va nous falloir gnrer le signal PPM vu
prcdemment.Cestdirecrerunsignaldunefrquencede50Hzetmodifierltat
hautdunedurecompriseentre1et2ms.Contraignantnestcepas?Surtoutsiona
plusieurs servos et tout un programme grer derrire Cest pourquoi lquipe
dArduino a t sympa en implmentant une classe trs bien nomme : Servo. Tout
commelobjetSerialvouspermettaitdefaireabstractionduprotocoledelavoiesrie,
lobjet Servo va vous permettre dutiliser les servomoteurs. Et comme elle est
dveloppe par une quipe de personnes comptentes, on peut leur faire totalement
confiancepourquellesoitoptimiseetsansbugs! Voyonsmaintenantcommesen
servir!

Prparerleterrain
Toutdabord,ilnousfautinclurelalibrairiedansnotresketch.Pourcelavouspouvez
auchoixcrirevousmmeaudbutducode #include <Servo.h>oualorscliquersur
386

library dans la barre de menu puis sur Servo pour que scrive automatiquement et
sansfautelaligneprcdente.Ensuite,ilvousfaudracrerunobjetdetypeServopour
chaqueservomoteurquevousallezutiliser.Nousallonsicinencrerquunseulque
jappellerai monServo de la manire suivante : Servo monServo;. Nous devons lui
indiquerlabrochesurlaquelleestconnectlefildecommandeduservoenutilisantla
fonctionattach()delobjetServocr.Cettefonctionprend3arguments:
Lenumrodelabrochesurlaquelleestrelilefildesignal
La valeur basse (angle 0) de la dure de ltat haut du signal de PPM en
microsecondes(optionnel,dfaut544s)
Lavaleurhaute(angle90,180,360,etc.)deladuredeltathautdusignal
dePPMenmicrosecondes(optionnel,dfaut2400s)
Parexemple,simonservopossdecommecaractristiquedesduresde1mspour0
et2mspour180etquejelaibranchsurlabroche2,jobtiendraislecodesuivant:
1
2
3
4
5
6
7
8

#include&ampltServo.h&ampgt

ServomonServo

voidsetup()
{
monServo.attach(2,1000,2000)
}

Utiliserleservo
Une fois ces quelques tapes termines, notre servo est fin prt tre mis en route.
Nous allons donc lui donner une consigne dangle laquelle il doit sexcuter. Pour
cela,nousallonsutiliserlafonctionprvueceteffet: write().Tiens,cestlamme
quelorsquelonutilisaitlaliaisonsrie!Ehoui. Commesonnomlindique,elleva
crire quelque chose au servo. Ce quelque chose est langle quil doit donner son
axe.Cettefonctionprendpourargumentunnombre,detypeint,quidonnelavaleuren
degrdelanglesuivre.Siparexemplejeveuxplacerlebrasduservomichemin
entre0et180,jcrirais:
1 monServo.write(90)

Pour terminer, voil le code complet qui vous permettra de mettre langle du bras de
votreservomoteur90:
1
2
3
4
5
6
7
8
9
10
11
12
13

#include&ampltServo.h&ampgt

ServomonServo

voidsetup()
{
monServo.attach(2,1000,2000)
monServo.write(90)
}

voidloop()
{
}

387

Jaimislordredelangledanslafonctionsetup()maisjauraistoutautantpulamettre
dans la loop(). En effet, lorsque vous utilisez write(), la valeur est enregistre par
Arduinoetestensuiteenvoye50foisparseconde(rappelezvousdu50Hzdusignal
)auservomoteurafinquilgardetoujourslapositiondemande.

Llectroniquedasservissement
Je le disais donc, on va voir un peu comment se profile le fonctionnement de
llectroniqueinternedesservomoteursanalogiques.Jeprcisebienanalogiquescar
jerappellequilyaaussidesservomoteursnumriques,beaucouppluscomplexesau
niveaudellectronique.

Principedefonctionnement
Commenonsparunsimplesynoptiquedefonctionnement.Rfrezvouslavidoet
aux explications que je vous ai donnes jusqu prsent pour comprendre ce
synoptique:

Principedefonctionnementdellectroniquedecommandedunservomoteur
Rapidement:laconsignedonneparlutilisateur(dansnotrecasilvasagirdusignal
envoyparlacarteArduino),estcompareparrapportlapositionrelledelaxedu
moteur.Ainsi,silyaunediffrencedangleentrelaconsigneetlanglemesurparle
capteur(lepotentiomtrequiestfixsurlaxeduservomoteur)ehbienlecomparateur
vacommanderlemoteuretlefairetournerjusqucequecettediffrencesannule.
Avant daller plus loin, il faut savoir que les servomoteurs analogiques du
commerce emploient en fait, dans leur lectronique de commande, un
microcontrleur.Jenevaisdoncpasvousexpliquercommentceuxlfonctionnent,
mais je vais prendre le montage le plus basique qui soit. Dailleurs, lissue de
mesexplications,vousserezcapabledemettreenuvrelemontagequejevais
donneretcrervotrepropreservomoteuravecunmoteurCCanodin.

lectroniqueconsignemanuelle
388

On va commencer par un montage dont la simplicit est extrme mais dont vous ne
connaissezpasencorelefonctionnementduncomposantessentiel:lecomparateur.
Allez,cestpartipourunbonpetitcoursdlectroniquepure! Alors,dj,pourquoi
manuelle ? Simplement parce que la consigne envoye llectronique de
commandeestunetensioncontinueetquelleserarglableparunpotentiomtre.En
grosvousaurezsimplementfairetournerlaxedunpotentiomtrepourrglerlangle
dubrasduservomoteur.

Synoptiquedellectroniqueinterne
Commenonsparunpetitsynoptiquequitablitlefonctionnementdellectroniquede
contrle:

Il y a donc en entre les deux paramtres : la consigne et langle rel de laxe du


moteur Et en sortie, la tension qui va commander le moteur. On la vu, un moteur
courant continu doit tre command par une tension continue, si cette tension est
positive,lemoteurtourneradansunsens,sielleestngative,lemoteurtourneradans
lautresens.Cestpourquoilecomparateurdlivreraunetensionpositiveoungative
selonlacorrectiondangleeffectuer.

Schmadeprincipe
prsentvoicileschmadeprincipequiapourfonctionnementceluiexpliquparle
synoptiqueprcdent:

389

Degauchedroiteona:lesalimentationsquifournissentlatensionpositiveet
ngativelespotentiomtresP1etP2lecomparateur(ouicestcegrostriangleavec
unplusetunmoins):enfinlemoteurcourantcontinu.

Fonctionnementducomparateur
Uncomparateurestuncomposantlectroniquedelafamilledescircuitsintgrscar,il
contientenvritdautrescomposants,essentiellementdessemiconducteurs(diodes,
transistors) et des rsistances. Ce composant a toujours besoin dune alimentation
externepourfonctionner,cestdirequonnepeutluimettredessignauxsonentre
quesilestaliment.Autrementilpourraittreendommag(cestpassouventlecas,
maismieuxvauttreprudent).Vousleconstatezparvousmme,lecomparateurestun
composantquipossdedeuxentresetunesortie.Et,delamanirelaplussimplequi
soit,enfaitilnyariendeplussimplequipuisseexister,sonfonctionnementrsidesur
leprincipesuivant:
Silatension(jemebaseparrapportauschma)V 1 quiarrivesurlentreE1 du
comparateur est suprieure la tension V 2 qui entre sur lentre E2 du
comparateur, alors la tension en sortie S du comparateur est gale +V cc
(lalimentationducomparateur).
Tandis que dans le cas oppos o la tension V 2 va tre suprieure V 1 ,la
sortieS ducomparateurauraunetensiongaleV cc .
Entransposantmesdiressousuneformemathmatique,celadonneraitceci:
SiV 1 > V 2 ,alorsV s = +V cc
SiV 1 > V 2 ,alorsV s = V cc
Commentsenrappeler?Ehbiengrceauxpetitssymboles+etprsentsdansle
triangle reprsentant le comparateur. La sortie du comparateur prendra +Vcc si la
390

tension sur lentr + du comparateur est suprieure celle sur lentre et


inversement.Voyez,jvouszavaisdisquectaitultrasimple. Ilyaencorequelque
chosesavoir:IlestimpossiblequelestensionsV1etV2soientgales!Oui,carle
comparateur ne peut pas fournir une tension positive ET une tension ngative en sa
sortie,cestpourquoi,mmesivousreliezE1etE2avecunfil,latensionensortiedu
comparateurseratoujoursOU+VccOUVcc.

lectroniqueconsignePWM
Synoptiquedeprincipe
PrenonslexempledunservomoteurquiutiliseunePWM,ouijaibienditeuhcrit
PWM.Jeprendscetexemplefictifcarcommejeledisaisilyaquelquesinstants,cest
bien souvent un microcontrleur qui gre lasservissement du servomoteur. Et puis,
avec lexemple que je vais vous donner, vous pourrez vousmme crer un
servomoteur. En fait, on ne peut pas utiliser directement ce signal PWM avec le
schmaprcdent.Ilvafalloirquelonfasseuneextractiondelacomposantecontinue
decesignalpourobteniruneconsignedontlatensionvarieetnonladuredeltat
HAUT du signal. Et ceci, nous lavons dj vu dans un chapitre ddi la PWM
justement. Le synoptique ne change gure, il y a simplement ajout de ce montage
intermdiairequivaextrairecettetensioncontinuedusignal:

Leschmalectriquenechangepasnonplusdebeaucoup,onretirelepotentiomtre
quipermettaitderglerlaconsignemanuellementenleremplaantparlemontagequi
faitlextractiondelacomposantecontinue:

391

la place du potentiomtre de commande manuelle on retrouve un couple


rsistance/condensateur avec R et C , qui permet dextraire la tension continue du
signalVPWM quiestdoncunsignaldetypePWMdontlerapportcycliquevariede0
100%.Etl,tenezvousbien,onenarriveaupointojevoulaisvousamener! Que
remarquezvous?Rien?Alorsjevousledis:quesepassetilsionarrtedenvoyerle
signal VPWM ? Le moteur garde son bras au mme angle ? Ou bien il reprend sa
position initiale ? Rponse : il reprend sa position initiale. Eh oui, car la tension
continue V 1 nexiste plus puisquelle est cre partir du signal VPWM .Quandily
avaitlepotentiomtre,latensionV 1 gardaitlammevaleurtantquevousnetourniez
paslaxedupotentiomtre,horsl,sionenlvelesignalVPWM ,ehbienlatensionV 1
perd sa valeur et retombe 0V. Par consquent, le moteur redonne son bras sa
positioninitiale.
Etsijeveuxquemonservomoteurcontinuedegarderlangledelaconsignequilui
attransmisesansquejecontinueluienvoyercetteconsigne,estcepossible?
Oui,cesttoutfaitpossible.Enfait,celavapeuttreparatreunpeubarbare,mais
cestlaseulesolutionenvisageableaveclesservomoteursanalogiques:ilsuffitdele
positionner langle voulu et de couper son alimentation. Langle du bras du
servomoteurseraalorsconserv.Maisattention,cetangleneseraconservquesilny
apasdecontraintemcaniqueexercesurlebrasduservo!Cestdirequilnyai
pas un poids accroch laxe du moteur, ou alors il faut quil soit bien infrieur la
forcedemaintiendelapositiondubrasduservolorsqueceluicinestplusaliment.
EtpourllectroniqueconsignePPMalors?o_O
Pourcetypedlectroniquedecommande(prsentdanstouslesservosducommerce),
392

jevouslaidit:ilyautilisationdunmicrocontrleur.Donctoutsefaitparunprogramme
qui scrute la position relle du bras du moteur par rapport la consigne PPM quil
reoit.Jenaidoncriendintressantvousraconter.

Unpeudexercice!
Bon allez, il est temps de faire un peu dentrainement ! Je vous laisse dcouvrir le
sujet

Consigne
Nousallonsutilisertroislmentsdanscetexercice:
unservomoteur(videmment)
unpotentiomtre(valeurdevotrechoix)
laliaisonsrie

Objectif
Leservodoitsuivrelepotentiomtre.Cestdirequelorsquevousfaitestournerlaxe
dupotentiomtre,lebrasduservomoteurdoittournersontouretdanslemmesens.
Pour ce qui est de lutilisation de la liaison srie, je veux simplement que lon ait un
retourdelavaleurdonneparlepotentiomtrepourfaireunesupervision.Jenevous
endispasplus,voussavezdjtoutfaire.Boncourageetplustard!

Correction
Jesprequevousavezrussi!Toutdaobrdleschma,mmesijesaisquevousavez
t capable de faire les branchements par vousmme. Cest toujours bon de lavoir
souslesyeux.

393

Pourmapart,jaibranchleservosurlabrochenumrique2etlepotentiomtresurla
brocheanalogique0.Jaidonclecodesuivantpourprparerlensemble:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#include&ampltServo.h&ampgt//Onoubliepasd'ajouterlabibliothque!

//notrepotentiomtre
constintpotar=0

//crationd'unnouveauservomoteur
ServomonServo

voidsetup()
{
//ondclarel'entreduservoconnectesurlabroche2
monServo.attach(2)
//onoubliepasdedmarrerlaliaisonsrie)
Serial.begin(9600)
}

Voilquiestfaitpourlesprparatifs,ilnyaplusqutravailleruntoutpetitpeupour
faire la logique du code. Commenons par la lecture analogique que nous allons
renvoyersurleservoensuite.Lepotentiomtredlivreunetensionvariablede05V
selon sa position. La carte Arduino, elle, lit une valeur comprise entre 0 et 1023. Ce
nombreeststockauformatint.Ilfautensuitequelondonnelafonctionquipermet
denvoyerlaconsigneauservounevaleurcompriseentre0et180.Onvadoncutiliser
394

unefonctionddiecela.Cettefonctionpermetdefairelerapportentredeuxgammes
devaleursayantchacunedesextremumsdiffrents.Ilsagitdelafonctionmap()(nous
enavionsparldanslechapitresurleslecturesanalogiques):
1 map(value,fromLow,fromHigh,toLow,toHigh)

Avecpourcorrespondance:
value:valeurconvertirpourlachangerdegamme
fromLow:valeurminimaledelagammeconvertir
fromHigh:valeurmaximaledelagammeconvertir
toLow:valeurminimaledelagammeverslaquelleestconvertielavaleurinitiale
toHigh : valeur maximale de la gamme vers laquelle est convertie la valeur
initiale
Nousutiliseronscettefonctiondelamaniresuivante:
1 map(valeur_potentiometre,0,1023,0,180)

Onauraitpufaireunsimpleproduitencroix,non?
Tout fait. Mais les programmeurs sont de vritables fainants et aiment utiliser des
outilsdjprt. Celadit,ilslesontcrs.Etpourcrerdenouveauxoutilsilestplus
facile de prendre des outils dj existants. Mais si vous voulez on peut recrer la
fonctionmap()parnousmmes:
1
2
3
4

intconversion(intmesure)
{
returnmesure*180/1023
}

Fonctionloop()
Dans la fonction loop() on a donc la rcupration et lenvoi de la consigne au
servomoteur:
1
2
3
4
5
6
7
8
9

voidloop()
{
//onlitlavaleurdupotentiomtre
intval=analogRead(potar)
//misel'chelledelavaleurlueverslaplage[0180]
intangle=map(val,0,1023,0,180)
//onmetjourl'anglesurleservo
monServo.write(angle)
}

Avezvousremarququecestroislignesdecodeauraientputrerduitesenuneseule
? Commececi:
1 monServo.write(map(analogRead(potar),0,1023,0,180))

Oubienlaversionutilisantleproduitencroix:
1 voidloop()

395

2
3
4
5
6
7
8
9
10
11

{
//onlitlavaleurdupotentiomtre
intval=analogRead(potar)
//onconvertitlavaleurlueenanglecomprisdanslintervalle[0180]
intangle=val/5.7
//5,7provientdeladivisionde1023/180pourlamisel'chelledelavaleurlue

//onmetjourl'anglesurleservo
monServo.write(angle)
}

Etnouveauunecondensationdecestroislignesenune:
1 monServo.write(analogRead(potar)/5.7)

Maiscommeilnousfautrenvoyerlavaleurconvertieverslordinateur,ilestmieux
destockercettevaleurdansunevariable.Autrementdit,prfrezgarderlecode
troislignes.

Etlaliaisonsrie
Pourrenvoyerlavaleur,riendebiensorcier:
1 Serial.println(angle)

Codefinal
Aufinal,onseretrouveavecuncodetelqueceluici:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

#include//Onoubliepasd'ajouterlabibliothque!

constintpotar=0//notrepotentiomtre
ServomonServo

voidsetup()
{
//ondclareleservosurlabroche2(ventuellementrglerlesbornes)
monServo.attach(2)
//onoubliepasdedmarrerlavoiesrie
Serial.begin(9600)
}

voidloop()
{
//onlitlavaleurdupotentiomtre
intval=analogRead(potar)
//onconvertitlavaleurlueenanglecomprisdanslintervalle[0180]
intangle=val/5.7
//onmetjourl'anglesurleservo
monServo.write(angle)
//onrenvoiel'angleparlavoiesriepoursuperviser
Serial.println(angle)
//unpetittempsdepause
delay(100)
}

Je vous laisse mixer avec les diffrents codes que lon vous a donn pour que vous
396

fassiezceluiquivousconvientlemieux(aveclafonctionmap(),oubienceluiquiest
tout condens, etc.). Dornavant, vous allez pouvoir vous amuser avec les
servomoteurs!

Testerunservomoteurnonstandard
Cestdjlafin?o_O
Ehoui,jenaiplusgrandchosevousdire,carcenestpastrscompliqupuisquil
suffitdutiliserunoutildjtoutprtquiestlabibliothqueServo.Jevaiscependant
vousmontrerdeuxautresfonctionsbienutiles.

writeMicroSeconds()
Enpremier,lafonctionwriteMicroSeconds().Cettefonctionpermetdedfiniruntemps
ltat HAUT du signal PPM autre que celui compris entre 1 et 2 ms. Elle est trs
pratiquepourtesterunservodontvousneconnaissezpaslescaractristiques(servo0
90ouautre).Deplus,ilarrivequecertainsconstructeursnesesoucientpastropdes
standards[1ms2ms]etdpassentunpeucesvaleurs.Deparcefait,sivousutilisezun
servoaveclesvaleursoriginalesvousnobtiendrezpaslecomportementescompt.En
utilisant cette fonction, vous pourrez ainsi tester le servo petit petit en envoyant
diffrentesvaleursuneune(parlavoiesrieparexemple).
Une valeur incorrecte se repre assez facilement. Si vous voyez votre servo
trembler aux alentours des 0 ou 180 ou bien encore sil fait des allersretours
trangessansquevousnayezchanglaconsignealorscestquelavaleurutilise
estprobablementfausse.

read()
Unedeuximefonctionpouvanttreutileestlafonction read().Toutlintrtdecette
fonction est perdu si elle est utilise pour le code que lon a vu dans lexercice
prcdent.Enrevanche,elleatrsbiensaplacedansunsystmeoleservomoteur
est gr automatiquement par le programme de la carte Arduino et o lutilisateur ne
peutyaccder.

Programmedetest
Enprparantcechapitre,jaipucommencerjoueravecunservomoteurissudemes
fondsdetiroirs.Nayantbienentenduaucunedocumentationsurplaceousurinternet,
jaicommencjoueravecenassumantquilutiliseraitdesvaleursstandards,donc
entre1000et2000spourltathautdelaPPM.Jaiainsipuconstaterquemonservo
fonctionnait,maisontaitloindeparcourirles180attendu.Jaidoncfaitunpetitcode
utilisant une des fonctions prcdentes pour tester le moteur en mode pas pas et
ainsitrouverlesvraistimingsdecesbornes.Pourcela,jaiutilislaliaisonsrie.Elle
maservipourenvoyerunecommandesimple(apouraugmenterlaconsigne,dpour
ladiminuer).Ainsi,enrecherchantttonsetenobservantlecomportementdumoteur,
jaipudterminerquiltaitbornentre560et2130s.Passuperprochedes1et2ms
397

attendues! Commejesuissympa( ),jevousdonnelecodequejairalispourle


tester. Les symptmes observer sont : aucun raction du servo (pour ma part en
dessous de 560 il ne se passe plus rien) ou au contraire, du mouvement sans
changementdelaconsigne(demoncot,sionaugmenteaudessusde2130leservo
vacontinuertournersanssarrter).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

#include

inttemps=1500//censtremicheminentre1000et2000,unbonpointdedpart

ServomonServo

voidsetup()
{
Serial.begin(115200)
Serial.println(&ampquotHelloWorld&ampquot)

monServo.attach(2)
//ondmarreunevaleurcenstrelamoitide
//l'excursiontotaledel'angleralisparleservomoteur
monServo.writeMicroseconds(temps)
}

voidloop()
{
//desdonnessurlaliaisonsrie?(lorsquel'onappuiesur'a'ou'd')
if(Serial.available())
{
charcommande=Serial.read()//onlit

//onmodifielaconsignesic'estuncaractrequinousintresse
if(commande=='a')
temps+=10//ajoutde10sautempsHAUT
elseif(commande=='d')
temps=10//retraitde10sautempsHAUT

//onmodifielaconsigneduservo
monServo.writeMicroseconds(temps)

//etonfaitunretoursurlaconsolepoursavoiroonestrendu
Serial.println(temps)
}
}

Ceprogrammeesttrssimpledutilisationetvouspouvezdailleurslemodifiercomme
bonvoussemblepourquilcorrespondecequevousvoulezfaireavec.Ilsuffitenfait
debrancherlacarteArduinounordinateuretouvrirunterminalsrie(parexemplele
moniteur intgr dans lenvironnement Arduino). Ensuite, appuyez sur a ou d pour
faire augmenter ou diminuer le temps de ltat HAUT du signal PPM. Vous pourrez
ainsiavoirunretourdestempsextrmesquutilisevotreservomoteur.
Onentermineaveclesservomoteurs.Vousavezsansdoutepleindenouvellesides
avec lesquelles vous emploierez les servomoteurs qui vous permettront de faire
beaucoupdechosestrsutiles,voirinutilesmaisindispensables.

[Arduino603]Apetitspas,lemoteurpaspas
398

Pourentermineraveclesdiffrentstypesdemoteursquiexistent,nousallonsparler
dunmoteurunpeuparticulier(encoreplusqueleservomoteur!)etquiestcependant
trs utilis dans le domaine de la robotique et tout ce qui touche la prcision dun
mouvement. Comme lhabitude, nous allons dabord voir le fonctionnement de ces
moteurs,pourensuiteapprendrelesutiliser.
Cemoteurutilisedeslmentsquenousavonsvusdansdeschapitresprcdents
(surlesmoteurscourantcontinu).SivousnevousrappelezpasduL298jevous
conseillederetournerprendrequelquesinformationscesujet

Lesdiffrentsmoteurspaspasetleur
fonctionnement
Les moteurs paspas encore un nouveau type de moteur. Une question vous
taraudesrementlesprit:
Pourquoiilexistetantdemoteurdiffrent!?
Et bien je vous rpondrais par une autre question : Pourquoi il existe autant de
langagesdeprogrammationdiffrent!?Larponseestpourtantsimple:Carilsonttous
leursavantagesetleursinconvnients.Parexemple,unservomoteurpourrafacilement
maintenirlapositiondesonaxe,tandisquelemoteurcourantcontinuseraplusfacile
faire tourner diffrentes vitesses. Eh bien le but du moteur paspas (que
jabrgeraismoteurpp)estunpeuuneruniondecesdeuxavantages.Vouspourrez
le faire tourner des vitesses variables et la position parcourue sera aussi facile
dterminer. En contrepartie ces moteurs ne peuvent pas tourner des vitesses
hallucinantesetsontplusdlicatmettreenuvrequelesmoteursCCparexemple
(maisriendinsurmontablejevousrassure).Enparlantdeprcision,savezvousdans
quel objet du quotidien on retrouve beaucoup de moteur pp ? Dans limprimante
(ventuellementscanneraussi)quitranesurvotrebureau!Eneffet,laspectprcision
dumoteurestutilisdanscettesituationsansavoirbesoindallervraimentvite.Vous
pourrezdoncentrouverunpourfaireavancerlesfeuillesetunautrepourdplacerle
chariot avec les cartouches dencre (et encore un autre pour dplacer le capteur du
scanner).Doncsivousavezunevieilleimprimantedestinelapoubelle,voussavez
cequilvousrestefaire !Lesmoteursquevouspourreztrouverpossderont4,5
voire6fils.Lepremier(4fils)estappelmoteurbipolaire, les deux autres sont des
moteurs unipolaires ou reluctance variable. Tout cela doittre encore un peu
confus.Voyonsdoncplusclairementcommentcelamarche!

Fonctionnementdesmoteurs
Commeprcdemmentavanc,cemoteurpossdeunecertainecomplexitpourtre
mis en uvre. Et ce, plus que les prcdents. Vous souvenezvous du moteur CC
(jesprebien! ).Iltaitcomposdunensembledaimantssurlextrieur(lestator)
etdunepartiebobineolechampmagntiquetaitcredynamiquementavecun
ensemble collecteur/balais qui transmettait llectricit aux bobines au centre (rotor).
399

Dans le cas du moteur pp, cest sur le rotor (au centre) que lon retrouve laimant
permanent,etlesbobinessontsurlestator(autourdurotor).Commepourlesmoteurs
courant continu, le but du jeu, en quelque sorte, est de faire tourner un champ
magntique(prendreavecdespincettes)pourfairetournerlaimantfixaurotor.Il
existe cependant diffrents types de moteurs pp dont le placement des bobinages
diffrelesunsdesautresetlafaondelesalimenternestpasnonplusidentique(do
une complexit supplmentaire lorsque lon veut changer le type de moteur pp
utiliser). Nous allons maintenant les tudier lun aprs lautre en commenant par
celuiquisembleavoirlefonctionnementleplussimpleassimiler.

Moteurppbipolaireaimantspermanents
Ce moteur possde quatre fils dalimentation pour piloter des bobines par paire.
Commeunschmavautmieuxquunlongdiscours,voicicommentilestconstitu:

Vouslaurezcompris,lesbobinessontreliesdeuxdeuxensrieetsontdoncpilots
ensemble.Ilnyadoncfinalementquedeuxenroulementcommanderpuisquedeux
bobinesmontesensrienenfontplusquune.Leurplacementdepartetdautrede
laimantpermanentdurotorpermetdepilotercedernier.Voyonscomment.
Lorsquilnyaaucuncouranttraversantlesbobines,lerotor(olaxedesortieest
li)estlibredetourner,riennechercheleretenirdanssacourse
Maintenant,sinousdcidonsdefairepasserducourantentrelespointsCetD
400

pouralimenterlabobinedegaucheetcellededroite.Uncourantvastabliret
deuxchampslectromagntiquesvontapparatredepartetdautresdurotor.Que
vatilalorssepasser?Laimantdurotorvatournersurluimmepourseplacer
defaoncequesontpleNordsoitenfacedupleSudduchampmagntique
crdanslapremirebobineetquesonpleSudsoitenfacedupleNordcr
dansladeuximebobine
SiensuiteonalimentenonpluslesbobinesentreCetDmaispluttcellesentreA
et B, le rotor va alors tourner pour saligner nouveau vers les ples qui
lintressent(Nord/Sud,Sud/Nord)
Etcestreparti,onvaalorsalimenterdenouveaulesbobinesentreDetC,donc
avecuncourantdesigneopposlafoisolonlesaalimenterentreCetD(par
exempleCtaitreliau+delalimentationtoutlheureetlonlefaitpasserau
,idempourDquelonfaitpasserduau+)etlemoteurvaencorefaireun
quartdetour
Onpeutcontinuerainsidesuitepourfairetournerlemoteurenfaisantattentionde
nepassetromperdanslesphasesdalimentation
Achaquephaseonvadoncfairetournerlemoteurdunquartdetour:

Ce quart de rotation sappelle un pas. Et comme il faut plusieurs pas pour faire
tournerlemoteursur360,onladoncappelainsi,lemoteurpaspas.
Danslecasillustrcidessus,onditquelemoteurfait4paspartour.Ilexistebiendes
moteurs qui font ce nombre de pas, mais il en existe qui ont un nombre de pas plus
consquent(24,48,etc.).Leurconstitutionmcaniqueestdiffrente,cequileurconfre
cepouvoir,bienquelefonctionnementresteidentique,puisqueloncherchetoujours
attirerunaimantgrcedeschampsmagntiquescrespardesbobinesparcourues
paruncourant.Pouravoirplusdepas,onmultiplielesaimantsaucentre.Surlimage
cidessous,onpeutbienvoirlesbobines(encuivrelextrieur)ettoutlesaimantsau
centre (les petites dents). Il existe aussi deux autres modes de fonctionnement que
nousverronsdanslapartiesuivante:lepilotageaveccouplemaximaletlepilotage
pardemipas.

401

(Pour

rappel,

voici

la

vue

dun

moteur

402

courant

continu

Lemoteurunipolaire
Lemomentestenfinvenudevousrvlerlavritablesignificationdesnomsdumoteur
vuprcdemmentetdeceluicimmenonilnefautpaslireasuruntontragique.
Le moteur bipolaire est nomm ainsi car il prsente la facult dtre command en
inversant simplement la polarit de ces bobinages. Quant au moteur unipolaire, pas
besoin de faire cette inversion, chaque bobinage est command sparment et ne
requiertquunealimentationprsenteouabsenteselonquelonveuilleounoncrerun
champmagntiqueensonsein.Lacommandeseradoncplussimplemettreenplace
quaveclemoteurbipolaire.Cependant,lenombredebobinetantplusimportant,la
quantitdecuivregalementetleprixsenressent!Eneffet,ilsagitbiende4bobine
bien distinctes, alors que le moteur bipolaire aimant permanent en possde
finalementquatremoitisdebobines,doncdeuxbobinecompltes.

403

On retrouve nos quatre fils A, B, C et D ainsi quun fil de masse commun (bon ben
imaginezlepuisquilnestpasdessincommetelsurleschma).Soit5fils(vlpas
quonsaitcomptermaintenant! ).Lefonctionnementestrigoureusementidentique
queleprcdentemoteur.Oncherchecrerunchampmagntiquerotatifpourfaire
passerlaimantalternativementdevantchacunedesbobines.Onvadoncalimenterla
bobineA,puislaC,puislaB,puislaDselonleschmacidessus.Etvoila,lemoteur
aura fait tout un tour assez simplement. Il suffit davoir quatre transistors (un par
enroulement)sansavoirbesoindelesdisposerenHetdelespiloterdeuxdeux.Iciil
suffitdelesalimenterunparun,chacunleurtour.Facile,non?

Lemoteurrluctancevariable
gn ?cestquoicenombarbare?
Cemoteurestunpeupluscompliqu,maiscestaussiledernierquenousverronsetle
plus fascinant ! Contrairement aux deux prcdent, ce moteur ne possde pas
daimantspermanent,nimmedaimanttouscourt!Non,ensoncentreontrouveun
simple morceau de ferdoux. Ce dernier la particularit de trs bien conduire les
champs magntiques. Du coup, si un champ magntique le traverse, il voudra
absolument saligner dans son sens. Cest cette proprit qui est exploite.
Commenonsparvoirtoutdesuiteleschmadecemoteur:

404

Commevouspouvezlevoir,ilpossde4enroulements(formant4paires)etlemorceau
deferdouxaumilieuuneformedtoile6branches.Etcenestpasunhasard!Le
ratio de 6 pour 8 a une raison trs prcise car cela introduit un lger dcalage (15)
entreunebrancheetunebobine.Eneffet,siona8bobines(4paires)onaundcalage

entrechaquebobinede: 360
= 45 Donctousles45lelongducylindrequestle
8
moteur,ontrouveunbobinage.Enrevancheilnyaque60entrechaqueextrmitde

ltoiledurotor: 360
= 60 Maispourquoiexactement?Ehbiencestsimpleavecun
6
peu dimagination (et quelques dessins). Si lon commence par alimenter le premier
enroulement, le A, le rotor va saligner avec. Maintenant que se passera til si lon
alimenteB?Lerotor,quitaitalorspositionnavecunedesesbranchesbienenface
deA,vabougerpoursalignercorrectementversB.EnsuitesilonalimenteCilvase
passer de mme, le rotor va encore tourner de 15 pour saligner. etc etc Si lon
effectuecetteopration24fois,onferauntourcompletcar:24 15 = 360
Vousremarquerezquedanscetexemplelerotortournedanslesenshorairealors
quelalimentationdesbobinesseferadanslesensantihoraire.

405

Cesmoteursontcertainsavantages.Parmicesderniers,ilnyapasbesoindepolariser
lesbobines(peuimportelesensduchampmagntique,lentreferntantpaspolaris
essaiera de saligner sans chipoter). Le fait que lon utilise un simple entrefer en fer
douxlerendaussimoinscherquunmodleavecdesaimantspermanents.Voussavez
maintenant tout sur les trois types de moteurs pas pas que lon peut trouver, place
maintenantlapratique!
Demaniregnrale,nessayezpasdouvrirvosmoteurpaspaspourregarder
commentcestfaitetesprerlesremonteraprs.Lesimpledmontagetendance
fairediminuerlaqualitdesaimantspermanentslintrieuretdoncvotremoteur
neseraplusaussibonaprsremontage.

Seservirdumoteur
Continuonsparlerdenotresupermoteur.Sivousavezsuivicequejaiditplustt,jai
expliququilyavaitdesbobinesquignraientunchampmagntique.Lorsquelles
sont aliments, ces bobines ont besoin de courant pour pouvoir gnrer un champ
magntiquesuffisant.Vousneserezdoncpassurprissijevousdisquilfaudrautiliser
un composant pour faire passer la puissance dans ces dernires. Et l, comme les
chosessontbienfaites,nousallonsretrouverlepontenHetleL298.
Afindelimiterlaredondancedinformations,jevaismecontenterdevousexpliquer
lepilotagedumoteurunipolaireetbipolaire.Sivouscomprenezcorrectementces
derniersvousnaurezaucunproblmeaveclemoteurrestant
Lesschmasquivontsuivreontpoursourcednergieunepile+9V.Cependantil
est dconseill de les faire avec car la consommation des moteurs est assez
importante et la pile risque de se fatiguer trs vite. Utilisez plutt une source
dalimentationprvueceteffet(unealimentationdelaboratoire).

Lemoteurunipolaire
Connecterunmoteurunipolaire
Pourrappel,voicilastructuredumoteurunipolaire:

406

Sivousavezbienlulapartieprcdente,vousdevezavoirretenuquecemoteurest
assezsimplepiloter.Eneffet,ilsuffitdalimenteruneunelesbobinespourquele
moteurtourne.Etcesttout!Ilnousfautjusteutiliserleboncomposantpouralimenter
lesbobinesetenavant!Apriori,leboncomposantseraitunbontransistorquipourrait
supporter50Vet500mApourdbuter.Acelailfaudraitensuiterajouterunediodede
rouelibrepournepaslabmerlorsdesphasesderouelibre(toutcelamultiplipar4
puisquon a 4 bobines). Plutt que de sembter cbler tout a, je vous propose
lintervention dun nouveau composant : le ULN2003A. Ce dernier regroupe les
transistorspourfairepasserlapuissanceetaussiladiode.Ilesttrssimplecbler
puisquil faut simplement amener lalimentation et les broches de commandes.
Chacunedecesdernirespossderespectivementunesortieolatensionseracelle
delalimentation.Voiciuneillustrationdececblage:

407

408

Utiliserunmoteurunipolaire
Jelaimaintenantditetrptplusieursfois,pourcemoteurilsuffitdepiloterchaque
bobineuneune,chacuneleurtour.Jevaisdoncvousrsumertoutcelademanire
plusschmatiqueetonserabonpourcemoteur. Alafin,sivousavezbiencompris
vousdevrieztrecapabledelefairetournertoutdoucementenplaantalternativement
lesfilsIn14(abrgIn1..4)au5Voulamasse.

409

Etape In1 In2 In3 In4


Pasn1 HIGH LOW LOW LOW
Pasn2 LOW HIGH LOW LOW
Pasn3 LOW LOW HIGH LOW
Pasn4 LOW LOW LOW HIGH

Si vous placez les fils de commande la masse ou au 5V convenablement, votre


moteurdevraittourner Vousnavezplusqucrerleprogrammequivabienpour
pilotertoutcebazarbenvousvousattendiezquoi?Unesolutionpeuttre?Non.
Bonbon,daccordvousvoussouvenezdevospremierspasaveclechenillard?
Toutestdit. (etsivousnevoulezpasvousfatiguer,attendezlasuitedututo )

Lemoteurbipolaire
Lecbler,lathorie
Nous avons vu dans le chapitre prcdent que le moteur bipolaire a besoin, un
moment, dune inversion de courant si lon veut pouvoir utiliser les bobines bon
escient. Vous vous souvenez probablement que nous avons vu prcdemment un
composant capable de faire cela : le pont en H. Lide va donc tre de cbler
correctementlesbobinespourpouvoirfairepasserlecourantdansunsens,oudans
lautre.JevousrappellelastructuredupontenH:
410

Problme,unpontenHnepeutpiloterquunepairedebobine(cellequisontdansle
mme axe et reli entre elles), hors nous en avons deux piloter. Heureusement le
L298estuncomposanttrsbienpensetnepossdenonpasunmaisbiendeuxponts
enH!Ducoup,nouspourronsenutiliserunparcoupledebobine .Pluttsympanon
?

LapratiqueavecleL298
Danslechapitreprcdent,nousavonsjustementvuuncomposantquipossdedeux
ponts en H : le L298. Le reste du travail semble presque trop simple ! Pour la partie
sortie/puissance,vousdevrezrelierlessortiesOut1(broche2)etOut2(broche3)la
premire bobine et ensuite Out3 et Out4 (13 et 14) la seconde. Noubliez pas les
diodes de roue libre (8 au total et qui supporte la puissance) ! Enfin, il ne reste qu
connecter les entres In1..4 4 entre/sortie numrique (pas besoin de PWM). Pour
linstant,pasbesoindelesrelierlArduino,contentezvousdelesmettrelamasse,
nousallonsfaireuntestensemble.Commenousvoulonsactiverlesdeuxponts,mettez
les deux entrs enable au +5V. Nous verrons dans la prochaine partie comment
lutiliseravecArduino .Voiciunpetitschmarcapitulatif:

Leschmademontageavecquelquescondensateursdefiltragequiviennentaider
lalimentationencasdefortedemandedecourantetdescondensateursquifiltresles
parasitesengendrsparlesbobinesdumoteurs.
411

Piloterlemoteurbipolaire
Unefoisquelemoteurestbranch,nousallonspouvoirlefairetourner.Commeson
nomlindique,ilsappellepaspasetdoncnousallonslefairepivotertapepartape
etnondemanirecontinuecommelemoteurcourantcontinu.Cependant,enrptant
lestapesderotationrapidementetsuccessivement,lemoteurdonneralimpressionde
tournersanssarrterentrechaquetape.Ilexistetroismthodesdistinctespourpiloter
lesmoteursbipolaires.Nousallonsmaintenantlesvoiruneparune.Danslescasqui
vont suivre, on va considrer un moteur de 4 pas par tour (ce qui est ridiculement
faible).Voicicequoiilvaressembler(commentsontplacssesbobines):

412

Rotationparpascomplet
Cemodedefonctionnementestleplussimple,cestpourquoinousallonscommencer
par lui. Grce ce dernier, vous aller pouvoir faire des rotations pas par pas. Pour
cela, nous allons alternativement alimenter les bobines de droites et de gauche et
inverser le sens du courant pour pouvoir faire une rotation complte du champ
magntique.VoicilillustrationWikipdiatrsbienfaitecesujet:

En rouge la bobine alimente ainsi que le sens du courant symbolis par une
flcheetennoirlabobinequinestpasalimente.
EnconsidrantquelabobineAestconnecteauxentresIN1etIN2etquelabobine
B est connecte aux commandes IN3 et IN4, on peut donc crire la squence de
commandesuivante:
Etape In1 In2 In3 In4
Pasn1 HIGH LOW

Pasn2

HIGH LOW
Pasn3 LOW HIGH

Pasn4

LOW HIGH
(untatsignifienonncessaire,placezle0Vpourquelabobinesoitbien
inactive).
Onpeuttraduirecetteactivitparlechronogrammesuivant:

413

Commevouspouvezlevoirtraverscesdiffrentsmoyendexplication,cestsomme
touteassezsimple.Onvachercherdplacerlaimantcentralenlefaisanttournerpetit
petit.Pourcelaonchercheralattirerdansdiffrentespositions.

Rotationcouplemaximal
Unautremodedefonctionnementestceluiditcouplemaximal.Cettemthodede
pilotage utilise toutes les bobines la fois pour pouvoir immobiliser au maximum
laimantcentral.Eneffet,enutilisantplusdechampsmagntiqueonobtientuneforce
supplmentaire. Par contre on consomme videmment davantage de courant. Pour
comprendrecefonctionnement,voyonslesdiffrentestapesparundessinpuisparun
chronogramme. Vous verrez, ce nest pas trs compliqu, le fonctionnement est trs
similaire,seulelesactivationsdebobineschangentunpeu:

Avezvousremarququelquechosedeparticulier?Danscetteutilisation,laimant
nefaitplusfaceauxbobinesmaisseplaceentrelesdeux.Parcontre,ileffectue
toujoursdespasentiers,cesderniersontjusteundcalageconstantparrapport
avant.
Voiciletableaucorrespondantaupilotagedesbobines:
Etape In1 In2 In3 In4
Pasn1 HIGH LOW HIGH LOW
414

Pasn2 HIGH LOW LOW HIGH


Pasn3 LOW HIGH LOW HIGH
Pasn4 LOW HIGH HIGH LOW
(untatsignifienonncessaire,placezle0Vpourquelabobinesoitbien
inactive).

Rotationpardemipas
Enfin,lederniermodedefonctionnementestceluiditdemipas.Cemodemlange
les deux prcdents puisquon va alterner les tapes du mode pas complet et les
tapes du mode couple maximal. En effet, comme nous avons pu le voir dans les
explications prcdentes, les deux modes placent laimant central de manire
diffrente. Lun est en face des bobines alors quavec lautre est plutt entre les
bobines.Ainsi,ensemettantalternativementenfacepuisentrelesbobinesonva
effectuer deux fois plus de pas que prcdemment puisquon intercalera des tapes
supplmentaires. Attention, lorsque je dit deux fois plus de pas je veux surtout dire
quelonauradestapesintermdiairesquiaugmententlaprcisiondudplacement.
Cemodedepilotageestunpeupluscompliququelesprcdentspuisquilestplus
long(8tapesaulieude4)maisriendinsurmontablevousallezvoir!

415

Etape
In1 In2 In3 In4
Pasn1 HIGH LOW

Pasn1 HIGH LOW HIGH LOW


Pasn2

HIGH LOW
Pasn2 LOW HIGH HIGH LOW
Pasn3 LOW HIGH

Pasn3 LOW HIGH LOW HIGH


Pasn4

LOW HIGH
Pasn4 HIGH LOW LOW HIGH
(untatsignifienonncessaire,placezle0Vpourquelabobinesoitbien
inactive).

416

Maintenantquevousconnaissezlesdiffrentsmodesdefonctionnement,vouspouvez
essayerdefairetournerlemoteurenbranchantlesentresIN1..4lamasseouau5V.
Sivouslefaitedanslebonordre,votremoteurdevraittournertoutdoucement,enallant
dunetapeverslautre .
Sivousavezunechargequidemandetropdecouple(parexempleunpoidsfaire
monter),ilpeutarrivequelemoteursauteun/despas.Cettedonneestprendre
encomptesivousvousservezdunombredepaseffectulogiciellementcomme
moyendecalculdedistance.

UtilisationavecArduino
Cblerlesmoteurs
Avec les chapitres prcdents vous avez vu comment on devait utiliser les moteurs
avec les composants grant la puissance. Cependant, nous navons pas vu quoi
relierlesbrochesdecommandeEtcesttrssimple!Eneffet,touslessignauxsont
tout ou rien et nont mme pas besoin dtre des PWM ! Ce qui veut dire que les 4
brochesdepilotageontjustebesoindtrerelies4brochesnumriquesdelacarte
Arduino (2, 3, 4, 5 par exemple). Voyons ce que cela donne en schma (qui sont
exactementlesmmesqueceuxdelapartieprcdente,maisavecunecarteArduino
enplus )

Lemoteurunipolaire

417

Lemoteurbipolaire

418

Jusquelriendevraimentcompliqu,onpasselasuite!

PiloterlesmoteursavecArduino
Leprincipe
Lideesttoutesimple,ilsuffitdegnrerlabonnesquencepourpiloterlesmoteurs
labonnevitesse,vousvousendoutezsurement.Laprincipaledifficultrsidedansla
gnrationdessignauxdanslebonordreafinquelemoteursedplacecorrectement.
Bienentendu,cestplusfaciledirequfaire.Eneffet,pourquelemouvementsoit
fluide,ilfautqueleschangementsdanslasquencesoientfaitdemanirergulireet
pour cela il faut une gestion du temps correcte. a peut sembler simple au premier
abord, mais quand il sagira de mixer le comportement du moteur avec celui du
programme principal (qui devra peuttre faire des traitements assez lourd) cela
deviendra probablement beaucoup moins trivial. Une bonne mthode consisterait
utiliseruntimersurlequelonrglerailapriodeavoirquireflteraisainsilavitesse
obtenir.MaisavecArduinovousallezvoirquetoutdevientplussimple

LobjetStepper
Sur Arduino les choses sont bien faite pour rester simples et accessibles, un objet a
djtcrpourvousaiderpiloterunmoteurpaspas.Attentioncependant,ilne
fonctionnequepourlesmoteursunipolaireetbipolaire.Iltirepartiedufaitquecesdeux
types de moteur peuvent fonctionner avec une squence commune. Ainsi, tout est
gnralisetutilisableleplussimplementpossible!Cenouveaucomposantsappelle
Stepper.Asacrationilprendenargumentlenombredepastotalquefaitlemoteur
pour faire un tour (information trouvable dans la documentation constructeur ou
empiriquement). Cette information sert dterminer la vitesse de rotation par minute
quevouspourrezensuiterglerloisirpourfairedesdplacementslentsourapides.Il
prend aussi en arguments les quatre broches servant contrler lengin. Son
constructeur est donc : Stepper(steps, pin1, pin2, pin3, pin4). Pour initialiser le
moteur,nouspouvonsdonccrirelalignesuivante:
1 //pourunmoteurde200paspartouretbranchersurlesbroches2,3,4,5
2 Steppermoteur(200,2,3,4,5)

Pour lutiliser, deux fonctions sont utilisables. La premire sert dfinir la vitesse de
rotation, exprime en tours par minute (trs/min). Pour cela, on utilise la fonction
step(steps) qui prend en paramtre le nombre de pas effectuer. Si ce nombre est
ngatif,lemoteurtourneraensensinversedunombredepasspcifi.Voiciunpetit
419

exemplequivafairefaireunallerretourde200pastouteles2secondesvotremoteur
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#include<Stepper.h>

//pourunmoteurde200paspartouretbranchersurlesbroches2,3,4,5
Steppermoteur(200,2,3,4,5)

voidsetup()
{
moteur.setSpeed(30)//30toursparminute
//(rappel:icilemoteurfait200paspartour,onferadonc6000pasparminute)
}

voidloop()
{
moteur.step(1000)
delay(100)
moteur.step(1000)
delay(2000)
}

La fonction step(x) est bloquante. Cela signifie quelle agit comme un dlai. Tant
que le moteur na pas fait les x pas demands, le reste du programme est en
attente.

Allerplusloin
Voustesdevenusincollablessurlesmoteurspaspas?Vousenvoulezencoreplus
?Suffitdedemander,voiladubonusdinformationsrienquepourtoichrelecteur!

2filsaulieude4!
On a toujours utilis 4 fils pour commander les moteurs. Cest bien, mais que diriez
vousdesauverdeuxbrochesetdepasserseulement2filsaulieude4?Pasmal
comme amlioration non ? Petite anecdote : un jour, un utilisateur des moteurs pp
sest rendu compte dun truc, dans une paire de fils pour piloter un moteur (dans la
squence utilise par Arduino), linformation est toujours antagoniste. Si un fil est
HIGH,sapaireseraLOWetviceversa.Ducoupilsuffitdunpeudlectroniquepour
pouvoirinverserundesdeuxsignauxetseretrouverainsiavecseulementdeuxfilsau
lieude4sortantdArduino.

420

(source des images : tigoe.net) Cette solution est plutt intressante du fait que les
entres/sortiessontparfoisunedenreraresurArduino!

LeL297
Lorsque vous utilisez votre Arduino, vous ne pouvez utiliser quune seule squence.
Par exemple pour un moteur bipolaire vous navez pas le choix entre le mode pas
entier, demipas ou couple max. Une des solutions serait de gnrer vousmme les
squences. Mais cest assez fastidieux. Une autre solution est lectronique et
compenseraledveloppementinformatiquefaire.Uncomposant,nommL297(dela
421

familleduL298vousvousendoutez)estjustementfaitpourgnrerlessquencesde
moteur pas pas. Il possde 4 broches de sorties pour gnrer la squence et
plusieurs en entre pour paramtrer le fonctionnement voulu. Parmi elles on en
retrouvetroisprincipales:
CW/CCW:(ClockWiseouCounterClockWise)quidcideradusensderotation
dumoteur(horaireouantihoraire).
Half/Full:Quidcidesionestenmodepasentieroudemipas.
Clk:(Clock)quiestlhorlogepourlavitesse.Achaquefrontdescendantlemoteur
feraunpas.
Jevouslaisseunpeucherchersurlenet,voustrouverezdeplusamplesinformations
cesujet.Avantmmederegardersurlenet,enfait,regardezpluttsadatasheet!!
UndesavantagesdedlesterletravaildessquencesauL297estquevousnaurez
plusbesoindelobjetStepperetdesafonctionstep()bloquante.Ilfaudracependant
toujours utilis un composant de puissance pour laisser passer les forts courants
ncessairesaumoteur(commeleL298parexemple).

422

[Arduino 7] Laffichage LCD, une autre manire


dinteragir
Vous souhaitez rendre votre projet un peu plus autonome, en le disloquant de son
attachementvotreordinateurparcequevousvoulezafficherdutexte?Ehbiengrce
aux afficheurs LCD, cela va devenir possible ! Vous allez apprendre utiliser ces
afficheursdunecertainecatgoriepourpouvoirraliservosprojetlesplusfous.Ilest
courant dutiliser ces crans permettant laffichage du texte en domotique, robotique,
voirmmepourdboguerunprogramme!Aveceux,vosprojetnauronspluslamme
allure!

[Arduino701]LescransLCD
Vous avez appris plus tt comment interagir avec lordinateur, lui envoyer de
linformation.Maismaintenant,vousvoudrezsrementpouvoirafficherdelinformation
sansavoirbesoindunordinateur.AveclescransLCD,nousallonspouvoirafficherdu
textesuruncranquinestpastrscoteuxetainsifairedesprojetssensationnels!

UncranLCDcestquoi?
Mettons tout de suite au clair les termes : LCD signifie Liquid Crystal Display et se
traduit,enfranais,parcranCristauxLiquides(maisonapasdacronymesclasse
enfranaisdonconparleratoujoursdeLCD).CescranssontPARTOUT!Vousen
trouverez dans plein dappareils lectroniques disposant dafficheur : les montres, le
tableaudeborddevotrevoiture,lescalculatrices,etc.Cetteutilisationintensiveestdue
leurfaibleconsommationetcot.Maiscenestpastout!Eneffet,lescransLCDsont
aussi sous des formes plus complexes telles que la plupart des crans dordinateur
ainsiquelestlviseurscranplat.Cettetechnologieestbienmaitriseetdoncle
cotdeproductionestassezbas.Danslesannesvenir,ilsvontavoirtendance
treremplacsparlescransaffichageLEDquisontpourlemomenttropchers.
JenprofitepourmettrelalertesurladiffrencedescransLED.Ilenexistedeux
types:
les crans rtroclairage LED : ceux sont des crans LCD tout fait
ordinairesquiontsimplementlaparticularitdavoirunrtroclairageLED
laplacedestubesnons.Leurprixestdummeordredegrandeurqueles
LCD normaux. En revanche, la qualit daffichage des couleurs semble
meilleurecomparsauxLCDnormaux.
lescransaffichageLED:ceuxsinedisposentpasdertroclairageetne
sont ni des crans LCD, ni des plasma. Ce sont des crans qui, en lieu et
placedespixels,setrouventdesLEDdetrstrspetitetaille.Leurcotest
prohibitifpourlemoment,maislaqualitdecontrasteetdecouleuringale
touslescransexistants!

423

Lesdeuxcatgoriesprcdentes(cranLCDdunemontreparexempleetceluidun
moniteur dordinateur) peuvent tre diffrencies assez rapidement par une
caractristiquesimple:lacouleur.Eneffet,lespremierssontmonochromes(uneseule
couleur) tandis que les seconds sont colors (rouge, vert et bleu). Dans cette partie,
nousutiliseronsuniquementlepremiertypepourdesraisonsdesimplicitetdecot.

Fonctionnementdelcran
Ntantpasunspcialistedeloptiquenidellectroniquebasniveau(jonctionettout
letralala)jenevaispasvousfaireuncoursdtaillsurlecommentcamarche?mais
pluttallerlessentiel,verslepourquoiasallume?.Commesonnomlindique,un
cran LCD possde des cristaux liquides. Mais ce nest pas tout ! En effet, pour
fonctionner il faut plusieurs choses. Si vous regardez de trs prs votre cran (teint
pourpasvousbousillerlesyeux)vouspouvezvoirunegrilledecarr.Cescarrssont
appelsdespixels(delanglaisPictureElement,soitlmentdimageenfranais,
encore une fois cest moins classe). Chaque pixel est un cristal liquide. Lorsque
aucuncourantneletraverse,sesmolculessontorientesdansunsens(admettons,
0).Enrevanchelorsquuncourantletraverse,sesmolculesvontsetournerdansla
mmedirection(90).Voilpourlabase.
Mais pourquoi il y a de la lumire dans un cas et
pasdanslautre?
Tout simplement parce que cette lumire est
polarise. Cela signifie que la lumire est oriente
dans une direction (cest un peu compliqu
dmontrer,jevousdemanderaisdoncdeladmettre).
En effet, entre les cristaux liquides et la source
lumineuse se trouve un filtre polariseur de lumire.
Ce filtre va orienter la lumire dans une direction
prcise. Entre vos yeux et les cristaux se trouve un
autre cran polariseur, qui est perpendiculaire au
premier.Ainsi,ilfautquelescristauxliquidessoient
danslabonnedirectionpourquelalumirepassede
boutenboutetreviennevosyeux.Unschmavaut
souvent mieux quun long discours, je vous conseille donc de regarder celui sur la
droitedelexplicationpourmieuxcomprendre(source:Wikipdia).Enfin,vientlertro
clairage (fait avec des LED) qui vous permettra de lire lcran mme en pleine nuit
(sinonilvousfaudraitlclairerpourvoirlecontraste).
SivousvoulezplusdinformationssurlescransLCD,jinvitevotrecuriositse
dirigerverscelienWikipdiaoudautressources.

CommandeduLCD
Normalement, pour pouvoir afficher des caractres sur lcran il nous faudrait activer
individuellement chaque pixel de lcran. Un caractre est reprsent par un bloc de
7*5 pixels. Ce qui fait quun cran de 16 colonnes et 2 lignes reprsente un total de
16*2*7*5=1120pixels! Heureusementpournous,desingnieurssontpasssparla
etnousontsimplifilatche.
424

Ledcodeurdecaractres
Toutcommeilexisteundrivervidopourvotrecartegraphiquedordinateur,ilexisteun
driverLCDpourvotreafficheur.Rassurezvous,aucuncomposantnesajoutevotre
listedachatpuisquilestintgrdansvotrecran.Cecomposantvaservirdcoder
un ensemble simple de bits pour afficher un caractre une position prcise ou
excuterdescommandescommedplacerlecurseurparexemple.Cecomposantest
fabriquprincipalementparHitachietsenommeleHC44780.Ilsertdedcodeurde
caractres. Ainsi, plutt que de devoir multiplier les signaux pour commander les
pixelsunun,ilnoussuffiradenvoyerdesoctetsdecommandespourluidirecris
moizrospartirdelacolonne3surlaligne1.Cecomposantpossde16broches
quejevaisbrivementdcrire:
N

Nom
Rle
1
VSS
Masse
2
Vdd
+5V
3
V0
Rglageducontraste
4
RS
Slectionduregistre(commandeoudonne)
5
R/W
Lectureoucriture
6
E
Entredevalidation
714 D0D7 Bitsdedonnes
15
A
Anodedurtroclairage(+5V)
16
K
Cathodedurtroclairage(masse)
Normalement, pour tous les crans LCD (non graphiques) ce brochage est le
mme.Doncpasdinquitudelorsdesbranchements,ilvoussuffiradevousrendre
surcettepagepourconsulterletableau.
Par la suite, les broches utiles quil faudra relier lArduino sont les broches 4, 5
(facultatives),6etlesdonnes(714pouvanttrerduite814)enoubliantpas
lalimentation et la broche de rglage du contraste. Ce composant possde tout le
systme de traitement pour afficher les caractres. Il contient dans sa mmoire le
schma dallumage des pixels pour afficher chacun dentre eux. Voici la table des
caractresaffichables:

425

Quelcranchoisir?
426

Lescaractristiques
TexteouGraphique?
DanslagrandefamilleafficheurLCD,ondistingueplusieurscatgories:
Lesafficheursalphanumriques
Lesafficheursgraphiquesmonochromes
Lesafficheursgraphiquescouleur
Lespremierssontlespluscourants.Ilspermettentdafficherdeslettres,deschiffreset
quelques caractres spciaux. Les caractres sont prdfinis (voir table juste au
dessus) et on a donc aucunement besoin de grer chaque pixel de lcran. Les
seconds sont dj plus avancs. On a accs chacun des pixels et on peut donc
produire des dessins beaucoup plus volus. Ils sont cependant lgrement plus
onreuxquelespremiers.Lesdernierssontlvolutiondesprcdents,lacouleuren
plus(soit3foisplusdepixelsgrer:unsouspixelpourlerouge,unautrepourle
bleuetundernierpourlevert,letoutformelacouleurdunseulpixel).PourleTPonse
servira dafficheur de la premire catgorie car ils suffisent faire de nombreux
montagesetrestentaccessiblespourdeszros.
Afficheur
alphanumrique

Afficheurgraphique
(monochrome)

Afficheurgraphique
(couleur)

Cenestpaslataillequicompte!
Lesafficheursexistentdansdenombreusestailles.Pourlesafficheursdetypetextes,
on retrouve le plus frquemment le format 2 lignes par 16 colonnes. Il en existe
cependantdenombreuxautresavecuneseuleligne,ou4(ouplus)et8colonnes,ou
16,ou20ouencoreplus!Librevousdechoisirlataillequivousplaitleplus,sachant
queleTPdevraitsadaptersanssoucitoutetailledcran(pourmapartceseraun2
lignes16colonnes)!

Lacouleur,cestimportant
Nanjeblague!Prenezlacouleurquivousplait!Vert,blanc,bleu,jaune,amusezvous
!(moicestcritureblanchesurfondbleu,maisjervedunafficheurlamatrix,noir
avecdescrituresvertes!)

Communicationaveclcran
Lacommunicationparallle
Demanireclassique,oncommuniqueaveclcrandemanireparallle.Celasignifie
que lon envoie des bits par blocs, en utilisant plusieurs broches en mme temps
(oppose une transmission srie o les bits sont envoys un par un sur une seule
427

broche). Comme expliqu plus tt dans ce chapitre, nous utilisons 10 broches


diffrentes, 8 pour les donnes (en parallle donc) et 2 pour de la commande (E :
EnableetRS:RegistreSelector).LaligneR/Wpeuttreconnectlamassesilon
souhaiteuniquementfairedelcriture.Pourenvoyerdesdonnessurlcran,cesten
faitassezsimple.Ilsuffitdesuivreunordrelogiqueetuncertaintimingpourquetoutse
passebien.Toutdabord,ilnousfautplacerlabrocheRS1ou0selonquelonveut
envoyerunecommande,commeparexempledplacerlecurseurlaposition(11)
ouquelonveutenvoyerunedonne:crislecaractrea.Ensuite,onplacesurles
8brochesdedonnes(D0D7)lavaleurdeladonneafficher.Enfin,ilsuffitdefaire
uneimpulsiondaumoins450nspourindiquerlcranquelesdonnessontprtes.
Cestaussisimplequea!Cependant,commelesingnieursdcranssontconscients
que la communication parallle prend beaucoup de broches, ils ont invent un autre
mode que jappellerai semiparallle. Ce dernier se contente de travailler avec
seulementlesbrochesdedonnesD4D7(enplusdeRSetE)etilfaudramettreles
quatreautres(D0D3)lamasse.Illibredoncquatrebroches.Danscemode,on
feradoncdeuxfoislecycleenvoidesdonnespuisimpulsionsurEpourenvoyerun
octetcomplet.
Ne vous inquitez pas lide de tout cela. Pour la suite du chapitre nous
utiliseronsunelibrairenommeLiquidCrystalquisechargeradegrerlestimings
etlensembleduprotocole.
Pour continuer ce chapitre, le mode semiparallle sera choisi. Il nous permettra de
garderplusdebrochesdisponiblespourdefutursmontagesetestsouventcblpar
dfautdansdenombreuxshields(dontlemien).Lapartiesuivantevousmontrerace
typedebranchement.Etpasdepanique,jevousindiqueraigalementlamodification
fairepourconnecteruncranenmodeparalllecomplet.

Lacommunicationsrie
LorsquelonnepossdequetrspeudebrochesdisponiblessurnotreArduino,ilpeut
tre intressant de faire appel un composant permettant de communiquer par voie
srie avec lcran. Un tel composant se chargera de faire la conversion entre les
donnesenvoyessurlavoiesrieetcequilfautaffichersurlcran.Legrosavantage
decettesolutionestquellencessiteseulementunseulfildedonne(avecunemasse
et le VCC) pour fonctionner l o les autres mthodes ont besoin de presque une
dizaine de broches. Toujours dans le cadre du prochain TP, nous resterons dans le
classique en utilisant une connexion parallle. En effet, elle nous permet de garder
lapproche standard de lcran et nous permet de garder la liaison srie pour autre
chose(encorequelonpourraitenmulerunesanstropdedifficult).Cecomposantde
conversion Srie > parrallle peuttre ralis simplement avec un 74h595 (je
vouslaissecoderledrivercommeexercicesivousvoulez )

EtparliaisonIC
Undernierpointvoir,cestlacommunicationdelacarteArduinoverslcranparla
liaison IC. Cette liaison est utilisable avec seulement 2 broches (une broche de
donneetunebrochedhorloge)etncessitelutilisationdedeuxbrochesanalogiques
delArduino(broche4et5).

428

Commentonsensert?
Comme expliqu prcdemment, je vous propose de travailler avec un cran dont
seulement quatre broches de donnes sont utilises. Pour le bien de tous je vais
prsentericilesdeuxmontages,maisnesoyezpassurprissidanslesautresmontages
oulesvidosvousvoyezseulementundesdeux.

Lebranchement
LafficheurLCDutilise610brochesdedonnes((D0D7)ou(D4D7)+RS+E)et
deuxdalimentations(+5Vetmasse).Laplupartdescranspossdentaussiuneentre
analogique pour rgler le contraste des caractres. Nous brancherons dessus un
potentiomtre de 10 kOhms. Les 10 broches de donnes peuvent tre places sur
nimporte quelles entres/sorties numriques de lArduino. En effet, nous indiquerons
ensuitelalibrairieLiquidCrystalquiestbrancho.

Lemontage8brochesdedonnes

429

Lemontage4brochesdedonnes

430

LedmarragedelcranavecArduino
Commecritplustt,nousallonsutiliserlalibrairieLiquidCrystal.Pourlintgrercest
trssimple,ilsuffitdecliquersurlemenuImportLibraryetdallerchercherlabonne.
Uneligne#includeLiquidCrystal.h doit apparaitre en haut de la page de code (les
prochainesfoisvouspourrezaussitapercettelignelamaindirectement,aaurale
mme effet). Ensuite, il ne nous reste plus qu dire notre carte Arduino o est
branch lcran (sur quelles broches) et quelle est la taille de ce dernier (nombre de
lignesetdecolonnes).Nousallonsdonccommencerpardclarerunobjet(cestenfait
une variable volue, plus de dtails dans la prochaine partie) lcd, de type
LiquidCrystaletquiseraglobalnotreprojet.Ladclarationdecettevariablepossde
plusieursformes(lienversladoc.):
LiquidCrystal(rs,enable,d0,d1,d2,d3,d4,d5,d6,d7)orsestlenumrodela
brocheoestbranchRS,enableestlabrocheEetainsidesuitepourles
donnes.
LiquidCrystal(rs,enable,d4,d5,d6,d7)(mmecommentairesqueprcdemment
Ensuite, dans le setup() il nous faut dmarrer lcran en spcifiant son nombre de
colonnes puis de lignes. Cela se fait grce la fonction begin(cols,rows). Voici un
exemple complet de code correspondant aux deux branchements prcdents
(commentezlalignequinevousconcernepas):
1
2
3
4
5
6
7
8
9
10
11
12
13

#include"LiquidCrystal.h"//ajoutdelalibrairie

//Vrifierlesbroches!
LiquidCrystallcd(11,10,9,8,7,6,5,4,3,2)//liaison8bitsdedonnes
LiquidCrystallcd(11,10,5,4,3,2)//liaison4bitsdedonnes

voidsetup()
{
lcd.begin(16,2)//utilisationd'uncran16colonneset2lignes
lcd.write("SalutlesZer0s!")//petittestpourvrifierquetoutmarche
}

voidloop(){}

Surtout ne mettez pas daccents ! Lafficheur ne les accepte pas par dfaut et
431

afficheradugrandnimportequoilaplace.
Vous remarquez que jai rajout une ligne dont je nai pas parl encore. Je lai juste
misepourvrifierquetoutfonctionnebienavecvotrecran,nousreviendronsdessus
plustard.Sitoutsepassebien,vousdevriezobtenirlcransuivant:

Sijamaisriennesaffiche,essayezdetournervotrepotentiomtredecontraste.Si
celanemarchetoujourspas,vrifierlesbonnesattributionsdesbroches(surtoutsi
vousutilisezunshield).
Maintenantquenousmatrisonslessubtilitsconcernantlcran,nousallonspouvoir
commencerjoueravecEnavant!

[Arduino702]VotrepremiertextesurleLCD!
ayest,onvapouvoircommencerapprendredestrucsavecnotrecranLCD!Alors,
au programme : afficher des variables, des tableaux, dplacer le curseur, etc. Aprs
toutes ces explications, vous serez devenu un pro du LCD, du moins du LCD
alphanumrique .Aller,enroute!AprsavousferezunpetitTPpluttintressant,
notamment au niveau de lutilisation pour laffichage des mesures sans avoir besoin
dunordinateur.Deplus,pensezaufaitquevouspouvezvousaiderdesafficheurspour
dboguervotreprogramme!
432

EcriredutextesurleLCD
Afficherdutexte
VousvousrappelezcommejevousdisaisilyalongtempsLesdveloppeursArduino
sont des gens sympas, ils font les choses clairement et logiquement ! ? Eh bien ce
constatcereproduit(encore)pourlabibliothqueLiquidCrystal!Eneffet,unefoisque
votrecranLCDestbienparamtr,ilnoussuffiradutiliserquuneseulefonctionpour
afficherdutexte!Allezjevouslaisse10secondespourdevinerlenomdelafonction
que nous allons utiliser. Un indice, a a un lien avec la voie srie Cest trouv ?
Flicitations tous ceux qui auraient dit print(). En effet, une fois de plus nous
retrouvonsunefonctionprint(),commepourlobjetSerial,pourenvoyerdutexte.Ainsi,
poursaluertousleszrosdelaterrenousauronsjustecrire:
1 lcd.print("SalutlesZer0s!")

etpourcodecompletaveclesdclarationsonobtient:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#include//oninclutlalibrairie

//initialisel'cranaveclesbonnesbroches

//ATTENTION,REMPLACERLESNOMBRESPARVOSBRANCHEMENTSVOUS!

LiquidCrystallcd(8,9,4,5,6,7)

voidsetup(){
lcd.begin(16,2)
lcd.print("SalutlesZer0s!")
}

voidloop(){

Maiscestnultontruconaffichetoujoursaummeendroit,enhautgauche!
Oui je sais, mais chaque chose en son temps, on soccupera du positionnement du
textebientt,promis!

Afficherunevariable
Afficher du texte cest bien, mais afficher du contenu dynamique cest mieux ! Nous
allons maintenant voir comment afficher une variable sur lcran. L encore, rien de
difficile. Je ne vais donc pas faire un long discours pour vous dire quil ny a quune
seulefonctionretenirlesuspensestterribleOUIvidemmentcettefonctioncest
print() ! Dcidment elle est vraiment toutterrain (et rdacteur du tutoriel Arduino
devientunvraiboulotdefeignant,jevaisfinirparmecopiercollerchaquefois!)Allez
zou,unpetitcode,unepetitephotoetenavantGuingamp!
1 intmavariable=42
2 lcd.print(mavariable)

433

Combo!AfficherdutexteETunevariable
Bon vous aurez remarqu que notre code possde une certaine faiblesse On
nafficheauchoixuntexteouunnombre,maispaslesdeuxenmmetemps!Nous
allonsdoncvoirmaintenantunemaniredyremdier.

Lafonctionsolution
LasolutionsetrouvedanslesbasesdulangageC,grceunefonctionquisappelle
sprintf() (aussi appel string printf). Les personnes qui ont fait du C doivent la
connaitre,ouconnaitresacousineprintf.Cettefonctionestunpeuparticulirecarelle
ne prend pas un nombre dargument fini. En effet, si vous voulez afficher 2 variables
vous ne lui donnerez pas autant darguments que pour en afficher 4 (ce qui parait
logique dune certaine manire). Pour utiliser cette dernire, il va falloir utiliser un
tableau de char qui nous servira de buffer. Ce tableau sera celui dans lequel nous
allonscrirenotrechainedecaractre.Unefoisquenousauronscritdedans,ilnous
suffiradelenvoyersurlcranenutilisantprint()!

Sonfonctionnement
Comme dit rapidement plus tt, sprintf() na pas un nombre darguments fini.
Cependant,elleenauraauminimumdeuxquisontletableaudelachainedecaractre
etunechainecrire.Unexemplesimpleseraitdcrire:
1 charmessage[16]=""
2 sprintf(message,"J'ai42ans")

Audbut,letableaumessagenecontientrien.Aprslafonctionsprintf(),ilpossderale
texteJai42ans.Simplenon?
Jutilise un tableau de 16 cases car mon cran fait 16 caractres de large au
maximum, et donc inutile de gaspiller de la mmoire en prenant un tableau plus
grandquencessaire.
Nous allons maintenant voir comment changer mon ge en le mettant en dynamique
danslachanegrceunevariable.Pourcela,nousallonsutiliserdesmarqueursde
format.Leplusconnuest%dpourindiquerunnombreentier(nousverronslesautres
ensuite). Dans le contenu crire (le deuxime argument), nous placerons ces
marqueurs chaque endroit o lon voudra mettre une variable. Nous pouvons en
placerautantquenousvoulons.Ensuite,ilnoussuffirademettredanslemmeordre
quelesmarqueurslesdiffrentesvariablesenargumentdesprintf().Toutvatreplus
clairavecunexemple!
1
2
3
4

charmessage[16]=""
intnbA=3
intnbB=5
sprintf(message,"%d+%d=%d",nbA,nbB,nbA+nbB)

Celaaffichera:
1 3+5=8

434

Lesmarqueurs
Commejevousledisais,ilexisteplusieursmarqueurs.Jevaisvousprsenterceuxqui
vousservirontleplus,etdiffrentesastucespourlesutiliserbonescient:
%dquiseraremplacparunint(sign)
%sseraremplacparunechane(untableaudechar)
%upourunentiernonsign(similaire%d)
%%pourafficherlesymbole%
Malheureusement, Arduino ne les supporte pas tous. En effet, le %f des float ne
fonctionnepas. Ilvousfaudradoncbricolersivousdsirerlafficherenentier(jevous
laissedevinercomment).Sijamaisvousdsirezforcerlaffichagedunmarqueursurun
certainnombredecaractres,vouspouvezutiliserunindicateurdetailledecenombre
entrele%etlalettredumarqueur.Parexemple,utiliser%3dforceralaffichagedu
nombreenparamtre(quelquilsoit)surtroiscaractresauminimum.Lavariablene
serapastronqusilestplusgrandequelemplacementprvu.Ceparamtreprendra
donctoujoursautantdeplaceauminimumsurlcran(utilepourmaitriserladisposition
descaractres).Exemple:
1
2
3
4
5
6

intage1=42
intage2=5
charprenom1[10]="Ben"
charprenom2[10]="Luc"
charmessage[16]=""
sprintf(message,"%s:%2d,%s:%2d",prenom1,age1,prenom2,age2)

lcran,onaurauntextetelque:
1 Ben:42,Luc:5

Onnotelespaceavantle5grceauforagedelcrituredelavariablesur2caractres
induitpar%2d.

Exercice,faireunehorloge
Consigne
Afindeconclurecettepartie,jevousproposeunpetitexercice.Commeletitrelindique,
jevousproposederaliserunepetitehorloge.Bienentenduelleneserapasfiabledu
toutcarnousnavonsaucunreprereldansletemps,maisaresteunbonexercice.
Lobjectifseradoncdafficherlemessagesuivant:Ilesthh:mm:ssavechhpourles
heures,mmpourlesminutesetsspourlessecondes.avousira?Ouais,enfinje
vois pas pourquoi je pose la question puisque de toute manire vous navez pas le
choix! Unedernirechoseavantdecommencer.Sivoustentezdefaireplusieurs
affichages successifs, le curseur ne se replacera pas et votre criture sera vite
chaotique.Jevousdonnedoncrapidementunefonctionquivouspermetderevenirla
positionenhautgauchedelcran:home().Ilvoussuffiradefaireunlcd.home()pour
replacerlecurseurenhautgauche.Nousreparleronsdelapositioncurseurdansle
chapitresuivant!

Solution
435

Jevaisdirectementvousparachuterlecode,sansvraimentdexplicationscarjepense
lavoirsuffisammentcomment(etentrenouslexerciceestsympaetpastropdur).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

#include//oninclutlalibrairie

//initialisel'cranaveclesbonnesbroches
//ATTENTION,REMPLACERLESNOMBRESPARVOSBRANCHEMENTSVOUS!
LiquidCrystallcd(8,9,4,5,6,7)

intheures,minutes,secondes
charmessage[16]=""

voidsetup()
{
lcd.begin(16,2)//rglelatailleduLCD:16colonneset2lignes

//changerlesvaleurspourdmarrerl'heuresouhaite!
heures=0
minutes=0
secondes=0
}

voidloop()
{
//oncommencepargrerletempsquipasse...
if(secondes==60)//uneminutesestatteinte?
{
secondes=0//onrecomptepartirde0
minutes++
}
if(minutes==60)//uneheureestatteinte?
{
minutes=0
heures++
}
if(heures==24)//unejourneestatteinte?
{
heures=0
}

//metlemessagedanslachainetransmettre
sprintf(message,"Ilest%2d:%2d:%2d",heures,minutes,secondes)

lcd.home()//metlecurseurenposition(00)surl'cran

lcd.write(message)//envoilemessagesurl'cran

delay(1000)//attenduneseconde
//unesecondes'coule...
secondes++
}

Sedplacersurlcran
Bon,autantvousprvenirdavance,cemorceaudechapitreneserapasdignedunom
detutoriel.Malheureusement,poursedplacersurlcran(quecesoitlecurseurou
du texte) il ny a pas 36 solutions, juste quelques appels relativement simples des
436

fonctions.Dsoldavancepourlepseudolistingdefonctionsquejevaisfairetouten
essayantdelegarderintressant

Grerlaffichage
Lespremiresfonctionsquenousallonsvoirconcernentlcrandanssonensemble.
Nous allons apprendre enlever le texte de lcran mais le garder dans la mmoire
pour le rafficher ensuite. En dautres termes, vous allez pouvoir faire un mode
invisibleoletexteestbienstockenmmoiremaispasaffichsurlcran.Lesdeux
fonctionspermettantcegenredactionsontlessuivantes:
noDisplay():faitdisparatreletexte
display():faitapparatreletexte(silyenavidemment)
Sivoustapezlecodesuivant,vousverrezletexteclignotertouteslessecondes:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#include//oninclutlalibrairie

//initialisel'cranaveclesbonnesbroches
//ATTENTION,REMPLACERLESNOMBRESPARVOSBRANCHEMENTSVOUS!
LiquidCrystallcd(8,9,4,5,6,7)

voidsetup(){
//rglelatailleduLCD
lcd.begin(16,2)
lcd.print("HelloWorld!")
}

voidloop(){
lcd.noDisplay()
delay(500)
lcd.display()
delay(500)
}

Utilesivousvoulezattirerlattentiondelutilisateur!Uneautrefonctionutileestcelle
vous permettant de nettoyer lcran. Contrairement la prcdente, cette fonction va
supprimer le texte de manire permanente. Pour le rafficher il faudra le renvoyer
lafficheur.Cettefonctionaunomvidentest:clear().Lecodesuivantvouspermettra
ainsidafficheruntextepuis,auboutde2secondes,ildisparaitra(pasdeloop(),pas
ncessaire):
1
2
3
4
5
6
7
8
9
10
11
12
13

#include//oninclutlalibrairie

//initialisel'cranaveclesbonnesbroches
//ATTENTION,REMPLACERLESNOMBRESPARVOSBRANCHEMENTSVOUS!
LiquidCrystallcd(8,9,4,5,6,7)

voidsetup(){
//rglelatailleduLCD
lcd.begin(16,2)
lcd.print("HelloWorld!")
delay(2000)
lcd.clear()
}

437

Cettefonctionesttrsutilelorsquelonfaitdesmenussurlcran,pourpouvoirchanger
depage.Sionnefaitpasunclear(),ilrisquedailleursdesubsisterdescaractresde
lapageprcdente.Cenestpastrsjoli.
Attentionnepasappelercettefonctionplusieursfoisdesuite,parexempleenla
mettant dans la fonction loop(), vous verrez le texte ne saffichera que trs
rapidementpuisdisparaitraetainsidesuite.

Grerlecurseur
Sedplacersurlcran
Voicimaintenantdautresfonctionsquevousattendezcertainement,cellespermettant
de dplacer le curseur sur lcran. En dplaant le curseur, vous pourrez crire
nimportequelendroitsurlcran(attentioncependantcequilyaitsuffisammentde
place pour votre texte). Nous allons commencer par quelque chose de facile que
nous avons vu trs rapidement dans le chapitre prcdent. Je parle bien sr de la
fonctionhome()!Souvenezvous,cettefonctionpermetdereplacerlecurseuraudbut
delcran.
Maisaufait,savezvouscommentestorganislerepredelcran?
Cestassezsimple,maisilfauttrevigilantquandmme.Toutdabord,sachezqueles
coordonnes sexpriment de la manire suivante (x, y) . x reprsente les abscisses,
donclespixelshorizontauxety lesordonnes,lespixelsverticaux.Loriginedurepre
seralogiquementlepixelleplusenhautgauche(commelalectureclassiquedun
livre,oncommenceenhautgauche)etpourcoordonnes(0,0)!Ehoui,onne
commence pas aux pixels (1,1) mais bien (0,0). Quand on y rflchit, cest assez
logique. Les caractres sont rangs dans des chaines de caractres, donc des
tableaux,quieuxsontadressspartirdelacase0.Ilparaitdoncaufinallogiqueque
les dveloppeurs aient gard une cohrence entre les deux. Puisque nous
commenons0,uncrande162caractrespourradoncavoircommecoordonnes
de015pour x et0ou1pour y .Cecitantdit,nouspouvonspasserlasuite.La
prochainefonctionquenousallonsvoirprenddirectementencomptecequejeviens
devousdire.CettefonctionnommesetCursor()vouspermetdepositionnerlecurseur
sur lcran. On pourra donc faire setCursor(0,0) pour se placer en haut gauche
(quivalentlafonctionhome())etenfaisantsetCursor(15,1)onseplaceratouten
basdroite(toujourspouruncrande162caractres).Unexemple:
1
2
3
4
5
6
7
8
9
10
11
12

#include

//initialisel'cranaveclesbonnesbroches
//ATTENTION,REMPLACERLESNOMBRESPARVOSBRANCHEMENTSVOUS!
LiquidCrystallcd(8,9,4,5,6,7)

voidsetup()
{
lcd.begin(16,2)
lcd.setCursor(2,1)//placelecurseurauxcoordonnes(2,1)
lcd.print("Textecentr")//textecentrsurlaligne2
}

438

Animerlecurseur
Tout comme nous pouvons faire disparatre le texte, nous pouvons aussi faire
disparatre le curseur (comportement par dfaut). La fonction noCursor() va donc
leffacer. La fonction antagoniste cursor() de son ct permettra de lafficher (vous
verrez alors un petit trait en bas du carr (5*8 pixels) o il est plac, comme lorsque
vousappuyezsurlatoucheInsr.devotreclavier).Unedernirechosesympafaire
aveclecurseurestdelefaireclignoter.Enanglaisclignoterseditblinketdonctout
logiquementlafonctionappelerpouractiverleclignotementestblink().Vousverrez
alors le curseur remplir le carr concern en blanc puis seffacer (juste le trait) et
revenir. Sil y a un caractre en dessous, vous verrez alternativement un carr tout
blanc puis le caractre. Pour dsactiver le clignotement il suffit de faire appel la
fonctionnoBlink().
1
2
3
4
5
6
7
8
9
10
11
12
13

#include

//ATTENTION,REMPLACERLESNOMBRESPARVOSBRANCHEMENTSVOUS!
LiquidCrystallcd(8,9,4,5,6,7)

voidsetup()
{
lcd.begin(16,2)
lcd.home()//placelecurseurauxcoordonnes(0,0)
lcd.setCursor()//affichelecurseur
lcd.blink()//etlefaitclignoter
lcd.print("Curseurclignotant")//textecentrsurlaligne2
}

Si vous faites appel blink() puis noCursor() le carr blanc continuera de


clignoter.Enrevanche,quandlecurseurestdanssaphaseteintevousneverrez
plusletraitdubas.

Joueravecletexte
Nousallonsmaintenantnousamuseravecletexte.Nevousattendezpasnonplus
desmiracles,ilsagirajustededplacerletexteautomatiquementounon.

Dplacerletextelamain
Pourcommencer,nousallonsdplacerletextemanuellement,versladroiteouversla
gauche.Nessayezpasdeproduirelexprienceavecvotremain,cenestpasuncran
tactile,hein! Lecomportementestsimplecomprendre.Aprsavoircritdutexte
surlcran,onpeutfaireappelauxfonctionsscrollDisplayRight()etscrollDisplayLeft()
vouspourrezdplacerletexteduncarrversladroiteouverslagauche.Silyadu
textesurchacunedeslignesavantdefaireappelauxfonctions,cestletextedechaque
ligne qui sera dplac par la fonction. Utilisez deux petits boutons poussoirs pour
utiliser le code suivant. Vous pourrez dplacer le texte en appuyant sur chacun des
poussoirs!
1
2
3
4

#include//oninclutlalibrairie

//lesbranchements
constintboutonGauche=2//leboutondegauche

439

5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

constintboutonDroite=3//leboutondedroite

//initialisel'cranaveclesbonnesbroches
//ATTENTION,REMPLACERLESNOMBRESPARVOSBRANCHEMENTSVOUS!
LiquidCrystallcd(8,9,4,5,6,7)

//

voidsetup(){
//rglagedesentres/sorties
pinMode(boutonGauche,INPUT)
pinMode(boutonDroite,INPUT)

//onattachedesfonctionsauxdeuxinterruptionsexternes(lesboutons)
attachInterrupt(0,aDroite,RISING)
attachInterrupt(1,aGauche,RISING)

//paramtrageduLCD
lcd.begin(16,2)//rglelatailleduLCD
lcd.print("HellolesZeros!")
}

voidloop(){
//pasbesoindelooppourlemoment
}

//fonctionappeleparl'interruptiondupremierbouton
voidaGauche(){
lcd.scrollDisplayLeft()//onvagauche!
}

//fonctionappelparl'interruptiondudeuximebouton
voidaDroite(){
lcd.scrollDisplayRight()//onvadroite!
}

Dplacerletexteautomatiquement
Detempsentemps,ilpeuttreutiledcriretoujourssurlemmepixeletdefaireen
sortequeletextesedcaletoutseul(pourfairedeseffetszolisparexemple). Un
couple de fonctions va nous aider dans cette tche. La premire sert dfinir la
directiondudfilement.EllesappelleleftToRight()pourallerdelagaucheversladroite
etrightToLeft()pourlautresens.Ensuite,ilsuffitdactiver(oupassivousvoulezarrter
leffet)aveclafonctionautoScroll()(etnoAutoScroll()pourlarrter).Pourmieuxvoircet
effet,jevousproposedessayerlecodequisuit.Vousverrezainsileschiffresde09
apparaitreetsepousserlesunsaprslesautres:
1 #include//oninclutlalibrairie
2

440

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

//ATTENTION,REMPLACERLESNOMBRESPARVOSBRANCHEMENTSVOUS!
LiquidCrystallcd(8,9,4,5,6,7)

voidsetup()
{
lcd.begin(16,2)
lcd.setCursor(14,0)
lcd.leftToRight()//indiquequeletextedoittredplacerverslagauche
lcd.autoscroll()//rendautomatiquecedplacement
lcd.print("{")
inti=0
for(i=0i&lt10i++)
{
lcd.print(i)
delay(1000)
}
lcd.print("}")
}

Creruncaractre
Dernire partie avant la pratique, on saccroche vous serez bientt incollable sur les
cransLCD!Enplusrjouissezvousjevousaigardunpetittrucsympapourlafin.
En effet, dans ce dernier morceau toute votre me cratrice va pouvoir sexprimer !
Nousallonscrerdescaractres!

Principedelacration
Crer un caractre nest pas trs difficile, il suffit davoir un peu dimagination. Sur
lcranlespixelssontenralitsdivissengrillede58(5enlargeuret8enhauteur).
Cestparcequelecontrleurdelcranconnaitlalphabetquilpeutdessinersurces
petitesgrilleslescaractresetleschiffres.Commejeviensdeledire,lescaractres
sontunegrillede58.Cettegrilleserasymboliseenmmoireparuntableaudehuit
octets(typebyte).Les5bitsdepoidsfaibledechaqueoctetreprsenterontunelignedu
nouveau caractre. Pour faire simple, prenons un exemple. Nous allons dessiner un
smiley,avecsesdeuxyeuxetsabouchepouravoirlerendusuivant:
00000
X000X
00000
00000
X000X
0XXX0
00000
00000
Cedessinsetraduiraenmmoireparuntableaudoctetquelonpourracoderdela
maniresuivante:
1
2
3
4
5

bytesmiley[8]={
B00000,
B10001,
B00000,
B00000,

441

6
7
8
9
10

B10001,
B01110,
B00000,
B00000
}

La lettre B avant lcriture des octets veut dire Jetcrislavaleurenbinaire. Cela


nouspermetdavoirunrenduplusfacileetrapide.

Lenvoyerlcranetlutiliser
Une fois que votre caractre est cr, il faut lenvoyer lcran, pour que ce dernier
puisseleconnaitre,avanttoutecommunicationaveclcran(ouiouiavantlebegin()).
LafonctionpourapprendrenotrecaractrelcransenommecreateChar()signifiant
crercaractre.Cettefonctionprenddeuxparamtres:ladresseducaractredans
lammoiredelcran(de07)etletableaudebytereprsentantlecaractre.Ensuite,
ltapededpartdecommunicationaveclcranpeuttrefaite(lebegin).Ensuite,si
vous voulez crire ce nouveau caractre sur votre bel cran, nous allons utiliser une
nouvelle (la dernire fonction) qui sappelle write(). En paramtre sera pass un int
reprsentantlenumro(adresse)ducaractrequelonveutafficher.Cependant,ilya
l une faille dans le code Arduino. En effet, la fonction write() existe aussi dans une
librairie standard dArduino et prend un pointeur sur un char. Le seul moyen de les
diffrencierpourlecompilateurseradoncderegarderleparamtredelafonctionpour
savoircequevousvoulezfaire.Dansnotrecas,ilfautpasserunint.Onvadoncforcer
(onditcaster)leparamtredansletypeuint8_tencrivantlafonctiondelamanire
suivante:write(uint8_tparam).Lecodecompletseraainsilesuivant:
1
2
3
4
5
6
7
8
9
10
11

#include//oninclutlalibrairie

//initialisel'cranaveclesbonnesbroches
//ATTENTION,REMPLACERLESNOMBRESPARVOSBRANCHEMENTSVOUS!
LiquidCrystallcd(8,9,4,5,6,7)

//notrenouveaucaractre
bytesmiley[8]={
B00000,
B10001,
B00000,

442

12
13
14
15
16
17
18
19
20
21
22
23

B00000,
B10001,
B01110,
B00000,
}

voidsetup()
{
lcd.createChar(0,smiley)//apprendlecaractrel'cranLCD
lcd.begin(16,2)
lcd.write((uint8_t)0)//affichelecaractredel'adresse0
}

Dsormais,voussavezlessentielsurlesLCDalphanumriques,voustesdoncaptes
pourpasserauTP.

[Arduino703][TP]SupervisionavecunLCD
Cher(e)s lecteur(e)s, savezvous quil est toujours aussi difficile de faire une
introductionetuneconclusionpourchaquechapitre?Cestpourquoijenaichoisiici
quededirececi:amusezvousbienaveclesLCD!

Consigne
DansceTP,onseproposedemettreenplaceunsystmedesupervision,commeon
pourrait en retrouver dans un milieu industriel (en plus simple ici bien sur) ou dans
dautres applications. Le but sera dafficher des informations sur lcran LCD en
fonctiondvnementsquisepassentdanslemilieuextrieur.Cemondeextrieursera
reprsentparlescomposantssuivants:
Deuxboutons,quipourraientreprsenterparexempledeuxbarriresinfrarouges
donclesignalpassede10lorsqueunobjetpassedevant.
Deux potentiomtres. Un sert de consigne et est rgl par lutilisateur. Lautre
reprsenterauncapteur(maiscommevousnavezpasforcmentlulapartiesur
lescapteurs(etquellenestpasrdigelheuredelavalidationdecettepartie),
cecapteurserareprsentparunautrepotentiomtre).Atitredexemple,surla
vidolasuitevousverrezunpotentiomtrerotatifquireprsenteralaconsigne
etunautresousformedeglissirequiseralecapteur.
Enfin, une LED rouge nous permettra de faire une alarme visuelle. Elle sera
normalement teinte mais si la valeur du capteur dpasse celle de la consigne
alorsellesallumera.

Comportementdelcran
Lcranquejutiliseneproposeque2ligneset16colonnes.Ilnestdoncpaspossible
daffichertoutelesinformationsdemanirelisibleenmmetemps.Onseproposedonc
defaireunaffichagealternentredeuxinterface.Chaqueinterfaceseraaffichpendant
cinqsecondestourderle.Lapremireafficheraltatdesboutons.Onpourrapar
exemplelire:
443

1 BoutonG:ON
2 BoutonD:OFF

Lasecondeinterfaceafficheralavaleurdelaconsigneetcelleducapteur.Onaurapar
exemple:
1 Consigne:287
2 Capteur:115
Enfin,bienque
linformationconsigne/capteurnesaffichequetoutesles5secondes,lalarme(laLED
rouge),elle,doittrevisibletoutmomentsilavaleurducapteurdpassecelledela
consigne.Eneffet,imaginezquecettealarmereprsenteraunepressiontropleve,ce
serait dommage que tout explose cause dun affichage 5 secondes sur 10 ! Je
penseavoirfaitletourdemesattentes!Jevoussouhaiteunboncourage,prenezvotre
temps,faitesunbeauschma/montage/codeetbienttpourlacorrection!
(Sur la vido vous verrez gauche / droite pour symboliser les deux potentiomtres, chacun fait comme il veut).

Correction!
Lemontage
Vousenavezlhabitudemaintenant,jevaisvousprsenterleschmapuisensuitele
code. Pour le schma, je nai pas des milliers de commentaires faire. Parmi les
chosessurlesquellesilfauttreattentifsetrouvent:
Des condensateurs de filtrage pour viter les rebonds parasites crs par les
boutons
Mettrelespotentiomtressurdesentresanalogiques
BrancherlaLEDdanslebonsensetnepasoubliersarsistancedelimitationde
courant
Etencasdedoute,voicileschma(quiestunpeufouillisparendroit,jensuisdsol)
!

444

445

Lecode
L encore, je vais reprendre le mme schma de fonctionnement que dhabitude en
vousprsentanttoutdabordlesvariablesglobalesutilises,puislesinitialisationspour
continueravecquelquesfonctionsutilesetlaboucleprincipale.

Lesvariablesutilises
DansceTP,beaucoupdevariablesvonttredclares.Eneffet,ilenfautdj5pour
les entres/sorties (2 boutons, 2 potentiomtres, 1 LED), jutilise aussi deux tableaux
pour contenir et prparer les messages afficher sur la premire et deuxime ligne.
Enfin,jenutilise4pourcontenirlesmesuresfaiteset4autresservantdemmoirepour
cesmesures.Ahetjoubliais,ilmefautaussiunevariablecontenantletempscoulet
uneservantsavoirsurquelinterfacenoussommesentraindcrire.Voiciunpetit
446

tableaursumanttoutcelaainsiqueletypedesvariables.
Nom
Type
Description
boutonGauche
constint
Brocheduboutondegauche
boutonDroite
constint
Brocheduboutondedroite
potentiometreGauche constint
Brochedupotarconsigne
potentiometreDroite constint
Brochedupotaralarme
ledAlarme
constint
BrochedelaLEDdalarme
messageHaut[16]
char
Tableaureprsentantlaligneduhaut
messageBas[16]
char
Tableaureprsentantlalignedubas
etatGauche
int
tatduboutondegauche
etatDroite
int
tatduboutondedroite
niveauGauche
int
Conversiondupotardegauche
niveauDroite
int
Conversiondupotardedroite
etatGauche_old
int
Mmoiredeltatduboutondegauche
etatDroite_old
int
Mmoiredeltatduboutondedroite
niveauGauche_old int
Mmoiredelaconversiondupotardegauche
niveauDroite_old
int
Mmoiredelaconversiondupotardedroite
temps
unsignedlong Pourmmoriserletempscoul
ecran
boolean
Poursavoirsurquelleinterfaceoncrit

Lesetup
Maintenant que les prsentations sont faites, nous allons passer toutes les
initialisations.Lesetupnauraquepeudechosesfairepuisquilsuffiraderglerles
brochesenentres/sortiesetdemettreenmarchelcranLCD.
1
2
3
4
5
6
7
8
9
10
11
12

voidsetup(){
//rglagedesentres/sorties
pinMode(boutonGauche,INPUT)
pinMode(boutonDroite,INPUT)
pinMode(ledAlarme,OUTPUT)

//paramtrageduLCD
lcd.begin(16,2)//rglelatailleduLCD
lcd.noBlink()//pasdeclignotement
lcd.noCursor()//pasdecurseur
lcd.noAutoscroll()//pasdedfilement
}

Quelquesfonctionsutiles
Afin de bien sparer notre code en morceaux logiques, nous allons crire plusieurs
fonctions,quionttoutesunrleparticulier.Lapremiredentretouteseracellecharge
defairelerelevdesvaleurs.Sonobjectifseradefairelesconversionsanalogiqueset
de regarder ltat des entres numriques. Elle stockera bien entendu chacune des
mesuresdanslavariableconcerne.
1 voidrecupererDonnees()
2 {
3 //effacelesanciensavecles"nouveauxanciens"

447

4
5
6
7
8
9
10
11
12
13
14
15
16

etatGauche_old=etatGauche
etatDroite_old=etatDroite
niveauGauche_old=niveauGauche
niveauDroite_old=niveauDroite

//effectuelesmesures
etatGauche=digitalRead(boutonGauche)
etatDroite=digitalRead(boutonDroite)
niveauGauche=analogRead(potentiometreGauche)
niveauDroite=analogRead(potentiometreDroite)

delay(2)//pours'assurerquelesconversionsanalogiquessontterminesavantdepasserla
}

Ensuite,deuxfonctionsvontnouspermettrededterminersiouiounonilfautmettre
jourlcran.Eneffet,afindviterunphnomnedescintillementquiseproduitsion
envoi des donnes sans arrt, on prfre crire sur lcran que si ncessaire. Pour
dcidersilondoitmettrejourlesphrasesconcernantlesboutons,ilsuffitdevrifier
ltat ancien et ltat courant de chaque bouton. Si ltat est diffrent, notre fonction
renvoietrue,sinonellerenvoiefalse.Unemmefonctionseracodepourlesvaleurs
analogiques. Cependant, comme les valeurs lues par le convertisseur de la carte
Arduino ne sont pas toujours trs stable (je rappel que le convertisseur offre plus ou
moins deux bits de prcision, soit 20mV de prcision otale), on va faire une petite
opration.Cetteoprationconsisteregardersilavaleurabsoluedeladiffrenceentre
lavaleurcouranteetlavaleurancienneestsuprieuredeuxunits.Sicestlecason
renvoitruesinonfalse.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

booleanboutonsChanged()
{
//siunboutonchangd'tat
if(etatGauche_old!=etatGauche||etatDroite_old!=etatDroite)
returntrue
else
returnfalse
}

booleanpotarChanged()
{
//siunpotentiomtreafficheunediffrenceentrecesdeuxvaleursdeplusde2units,alors
if(abs(niveauGauche_oldniveauGauche)&gt2||abs(niveauDroite_oldniveauDroite
returntrue
else
returnfalse
}

Unedernirefonctionnousservirafairelamisejourdelcran.Ellevaprparerles
deux chaines de caractres (celle du haut et celle du bas) et va ensuite les envoyer
successivement sur lcran. Pour crire dans les chaines, on vrifiera la valeur de la
variableecranpoursavoirsiondoitcrirelesvaleursdespotentiomtresoucellesdes
boutons.Lenvoilcransefaitsimplementavecprint()commevuantrieurement.On
noteraleclear()delcranavantdefairelesmisesjour.Eneffet,sanscelalesvaleurs
pourrait se chevaucher (essayer dcrire un OFF puis un ON, sans clear(), cela vous
feraunONFlafin).
1 voidupdateEcran()
2 {

448

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

if(ecran)
{
//prpareleschainesmettresurl'cran:boutons
if(etatGauche)
sprintf(messageHaut,"BoutonG:ON")
else
sprintf(messageHaut,"BoutonG:OFF")
if(etatDroite)
sprintf(messageBas,"BoutonD:ON")
else
sprintf(messageBas,"BoutonD:OFF")
}
else
{
//prpareleschainesmettresurl'cran:potentiomtres
sprintf(messageHaut,"gauche=%4d",niveauGauche)
sprintf(messageBas,"droite=%4d",niveauDroite)
}

//onenvoieletexte
lcd.clear()
lcd.setCursor(0,0)
lcd.print(messageHaut)
lcd.setCursor(0,1)
lcd.print(messageBas)
}

Laboucleprincipale
Nous voici enfin au cur du programme, la boucle principale. Cette dernire est
relativementlgre,grceauxfonctionspermettantderepartirlecodeenunitlogique.
Laboucleprincipalenaplusqulesutiliserbonescientetdanslebonordre( )
pourfairesontravail.Danslordreilnousfaudradonc:
Rcuprertouteslesdonnes(fairelesconversionsetc)
Selonlinterfacecourante,affichersoitlestatsdesboutonssoitlesvaleursdes
potentiomtressiils/ellesontchang(e)s
Testerlesvaleursdespotentiomtrespourdclencherlalarmeounon
Enfin,si5secondessesontcoules,changerdinterfaceetmettrejourlcran
Simplenon?Onneledirajamaisassez,uncodebiensparesttoujoursplusfacile
comprendre et retoucher si ncessaire ! Aller, comme vous tes sages, voici le
codedecetteboucle(quivadepaireaveclesfonctionsexpliquesprcdemment):
1
2
3
4
5
6
7
8
9
10
11
12
13
14

voidloop(){

recupererDonnees()//commenceparrcuprerlesdonnesdesboutonsetcapteurs

if(ecran)//quelcranaffichet'on?(boutonoupotentiomtre?)
{
if(boutonsChanged())//siunboutonachangd'tat
updateEcran()
}
else
{
if(potarChanged())//siunpotentiomtreachangd'tat
updateEcran()
}

449

15
16
17
18
19
20
21
22
23
24
25
26
27
28

if(niveauDroite&gtniveauGauche)
digitalWrite(ledAlarme,LOW)//RAPPEL:pilotl'tatbasdonconallume!
else
digitalWrite(ledAlarme,HIGH)

if(millis()temps&gt5000)//siafait5squ'onaffichelammedonne
{
ecran=~ecran
lcd.clear()
updateEcran()
temps=millis()
}
}

Programmecomplet
Voicienfinlecodecomplet.Vouspourrezlecopier/colleretlessayerpourcomparersi
vousvoulez.Attentioncependantdclarerlesbonnesbrochesenfonctiondevotre
montage(notammentpourleLCD).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

#include&ltLiquidCrystal.h&gt//oninclutlalibrairie

//lesbranchements
constintboutonGauche=11//leboutondegauche
constintboutonDroite=12//leboutondedroite
constintpotentiometreGauche=0//lepotentiomtredegauchesurl'entreanalogique0
constintpotentiometreDroite=1//lepotentiomtrededroitesurl'entreanalogique1
constintledAlarme=2//laLEDestbranchsurlasortie2

//initialisel'cranaveclesbonnebroche
//ATTENTION,REMPLACERLESNOMBRESPARVOSBRANCHEMENTSVOUS!
LiquidCrystallcd(8,9,4,5,6,7)

charmessageHaut[16]=""//Messagesurlalignedudessus
charmessageBas[16]=""//Messagesurlalignedudessous

unsignedlongtemps=0//pourgarderunetracedutempsquis'couleetgrerlessquences
booleanecran=LOW//poursavoirsionaffichelesboutonsoulesconversions

intetatGauche=LOW//tatduboutondegauche
intetatDroite=LOW//tatduboutondedroite
intniveauGauche=0//conversiondupotentiomtredegauche
intniveauDroite=0//conversiondupotentiomtrededroite

//lesmemesvariablesmais"old"servantdemmoirepourconstaterunchangement
intetatGauche_old=LOW//tatduboutondegauche
intetatDroite_old=LOW//tatduboutondedroite
intniveauGauche_old=0//conversiondupotentiomtredegauche
intniveauDroite_old=0//conversiondupotentiomtrededroite

//

voidsetup(){
//rglagedesentres/sorties
pinMode(boutonGauche,INPUT)
pinMode(boutonDroite,INPUT)
pinMode(ledAlarme,OUTPUT)

//paramtrageduLCD

450

40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

lcd.begin(16,2)//rglelatailleduLCD
lcd.noBlink()//pasdeclignotement
lcd.noCursor()//pasdecurseur
lcd.noAutoscroll()//pasdedfilement
}

voidloop(){

recupererDonnees()//commenceparrcuprerlesdonnesdesboutonsetcapteurs

if(ecran)//quelcranaffichet'on?(boutonoupotentiomtre?)
{
if(boutonsChanged())//siunboutonachangd'tat
updateEcran()
}
else
{
if(potarChanged())//siunpotentiomtreachangd'tat
updateEcran()
}

if(niveauDroite&gtniveauGauche)
digitalWrite(ledAlarme,LOW)//RAPPEL:pilotl'tatbasdonconallume!
else
digitalWrite(ledAlarme,HIGH)

if(millis()temps&gt5000)//sicafait5squ'onaffichelammedonne
{
ecran=~ecran
lcd.clear()
updateEcran()
temps=millis()
}
}

//

voidrecupererDonnees()
{
//effacelesanciensavecles"nouveauxanciens"
etatGauche_old=etatGauche
etatDroite_old=etatDroite
niveauGauche_old=niveauGauche
niveauDroite_old=niveauDroite

etatGauche=digitalRead(boutonGauche)
etatDroite=digitalRead(boutonDroite)
niveauGauche=analogRead(potentiometreGauche)
niveauDroite=analogRead(potentiometreDroite)

delay(1)//pours'assurerquelesconversionsanalogiquessontterminesavantdepasserla
}

booleanboutonsChanged()
{
if(etatGauche_old!=etatGauche||etatDroite_old!=etatDroite)
returntrue
else
returnfalse
}

451

101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137

booleanpotarChanged()
{
//siunpotentiomtreafficheunediffrenceentrecesdeuxvaleursdeplusde2units,alors
if(abs(niveauGauche_oldniveauGauche)&gt2||abs(niveauDroite_oldniveauDroite
returntrue
else
returnfalse
}

voidupdateEcran()
{
if(ecran)
{
//prpareleschainesmettresurl'cran
if(etatGauche)
sprintf(messageHaut,"BoutonG:ON")
else
sprintf(messageHaut,"BoutonG:OFF")
if(etatDroite)
sprintf(messageBas,"BoutonD:ON")
else
sprintf(messageBas,"BoutonD:OFF")
}
else
{
//prpareleschainesmettresurl'cran
sprintf(messageHaut,"gauche=%4d",niveauGauche)
sprintf(messageBas,"droite=%4d",niveauDroite)
}

//onenvoieletexte
lcd.clear()
lcd.setCursor(0,0)
lcd.print(messageHaut)
lcd.setCursor(0,1)
lcd.print(messageBas)
}

452

Rvisions
15/03/2014:Premireversionebook/pdf
16/03/2014:Ajoutdecettepagelistantlesrvisions
19/03/2014:Correctionsdefautesetsuppressiondesbalises[spoiler]
28/03/2014:Correctionsdequelquesfautes
15/04/2014:Correctionsdefautes(codeetgrammaire)
25/05/2014:Correctionmineuredanslapartie3
01/06/2014:Correctiond'unschma(p.129)
19/06/2014:Inversiondedeuxschmas(partieV)

453

You might also like