Par f-leb
Date de publication : 25 septembre 2013 Dernire mise jour : 25 septembre 2013
Vritable mini-ordinateur au succs plantaire, traitant les donnes provenant de composants et capteurs divers (capteur de temprature, luminosit, mouvement ou boutons-poussoirs, etc.) et communiquant des ordres pour allumer des lampes ou actionner des moteurs lectriques, la carte lectronique Arduino permet de crer et prototyper de vritables objets numriques interagissant avec le milieu extrieur. L'environnement de programmation qui l'accompagne propose un IDE et un langage bas sur les langages C / C++. La communaut libre du monde Arduino contribue largement diffuser les ressources permettant la cration d'objets numriques moindre cot et accessibles toutes personnes motives ayant mme des connaissances modestes dans les domaines de l'informatique et l'lectronique.
I - qui s'adresse ce tutoriel ?................................................................................................................................... 3 II - Objectifs et matriels utiliss................................................................................................................................. 3 III - La plaque de cblage rapide................................................................................................................................ 5 IV - Le capteur de distance ultrasons SRF-05........................................................................................................ 7 IV-A - Prsentation du capteur.............................................................................................................................. 7 IV-B - Connectique et mode de fonctionnement................................................................................................... 8 IV-C - Principe de fonctionnement.........................................................................................................................8 IV-D - Montage du capteur.................................................................................................................................... 9 IV-E - La gestion du capteur par programmation.................................................................................................. 9 IV-F - Vers un fonctionnement multitche - La bibliothque NewPing................................................................ 12 IV-F-1 - Installation de la bibliothque............................................................................................................12 IV-F-2 - Gestion des interruptions.................................................................................................................. 14 V - Le LCD Keypad Shield ..................................................................................................................................16 V-A - Mode de fonctionnement de l'afficheur...................................................................................................... 16 V-B - Intgration du capteur ultrasons SRF-05................................................................................................ 17 V-B-1 - Montage..............................................................................................................................................17 V-B-2 - Le code d'affichage de la distance de l'obstacle sur l'afficheur LCD................................................. 18 VI - Programmation d'un bouton............................................................................................................................... 21 VI-A - Fonctionnement des boutons, un peu de physique/lectricit.................................................................. 21 VI-B - Gestion du bouton..................................................................................................................................... 24 VI-B-1 - Une classe personnalise Button..................................................................................................... 26 VII - La maquette finale............................................................................................................................................. 29 VIII - Conclusion........................................................................................................................................................ 30 IX - Remerciements................................................................................................................................................... 31
-2-
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
(1) En gros et au sens large, une discipline qui marie l'informatique, la physique et l'lectronique, s'intressant aux systmes physiques interactifs qui utilisent des logiciels et des matriels s'interfaant avec des capteurs, des actionneurs lectriques, etc.
-3-
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Afin de faire quelques essais du dispositif sur le terrain et avoir un retour des mesures, notre premire maquette base d'Arduino sera quipe du LCD Keypad Shield. Ce shield, avec son cran LCD rtroclair bleu et blanc (deux lignes de 16 caractres) et ses cinq boutons-poussoirs vous fera dbourser une quinzaine d'euros supplmentaires. Vous pouvez bien entendu choisir un shield analogue d'un autre fabricant. J'ai choisi celui-l parce que c'est celui dont je dispose actuellement, mais pas d'inquitude, celui-l ou un autre, vous n'aurez pas ou peu d'adaptations faire. Pour complter le dispositif, on investira dans une plaque de cblage rapide et quelques jumpers (mle/mle et femelle/femelle) :
-4-
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
-5-
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Les bandes horizontales en haut et en bas sont prvues pour amener l'alimentation et la masse dans tout le montage. Les composants cbls au centre de la plaque peuvent tre ainsi relis plus facilement au 5 V (ou toute autre tension prvue) et au 0 V. Certaines plaques ont des bandes rouges et bleues pour reprer les trous relier l'alimentation (rouges) et ceux relier la masse (bleues). Les bandes verticales au centre de la plaque sont plus courtes avec un intervalle au milieu. Cela permet un composant de circuits intgrs de chevaucher l'intervalle et d'avoir chacune de ses pattes, situes de part et d'autre, connectes un jeu de trous diffrent. Par exemple, avec les quatre montages suivants :
Le montage 1 n'est pas correct, la cathode (-) et l'anode (+) de la LED sont relies entre elles.
-6-
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Les montages 2 et 3 sont corrects. Dans les deux montages, une LED et une rsistance sont montes en srie entre une ligne de masse et une ligne d'alimentation (la patte la plus courte de la LED tant la cathode relier la masse). Le montage 4 est aussi correct. Chacune des huit pattes du LM358 est connecte un jeu de trous diffrent.
La distance l'obstacle peut alors tre calcule par le temps mis par le son pour faire l'aller-retour, la vitesse du son tant peu prs stable.
car pendant l'intervalle de temps t, le son parcourt deux fois la distance d. vitesse du son = 340 m/s dans l'air. Vous trouverez les caractristiques du module et son fonctionnement dtaill dans les spcifications techniques.
En deux mots, la porte de ce module ultrason est de 3 cm 4 m. La dtection de l'obstacle se produit normalement dans un cne de 30.
-7-
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Le module ne peut faire des mesures que toutes les 50 ms (millisecondes), c'est--dire 20 fois par seconde.
-8-
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Afin d'viter des rsultats fausss par des mesures lances quasi simultanment, il est recommand d'attendre 50 ms entre deux demandes de mesure, ce qui permet de dclencher jusqu' 20 mesures par seconde d'utilisation au maximum. Le principe du fonctionnement est rsum sur le chronogramme constructeur ci-dessous :
-9-
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
pinMode(ECHO_PIN, INPUT); // la broche ECHO de la carte est une entre numrique pinMode(TRIGGER_PIN, OUTPUT); // la broche TRIGGER de la carte est une sortie numrique
pour dclencher la mesure, on envoie une impulsion sur la broche Trigger pendant une douzaine de microsecondes grce l'instruction digitalWrite :
digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(12); digitalWrite(TRIGGER_PIN, LOW); // signal TRIGGER l'tat HAUT (5V) // dure de l'tat haut = 12 microsecondes // signal TRIGGER l'tat BAS (0V)
on attend le retour du signal Echo l'tat BAS et on rcupre la dure pendant laquelle le signal Echo tait maintenu l'tat HAUT. Tout cela est rendu trs facile avec l'instruction pulseIn.
echoPulseTime = pulseIn(ECHO_PIN, HIGH); // attend le retour du signal ECHO au niveau BAS et retourne la dure du signal
Le programme complet avec l'affichage de la valeur brute de la dure du signal Echo dans le moniteur Srie donnerait ceci :
/* */ 1er programme SRF-05
#define ECHO_PIN 11 // broche ECHO du SRF05 sur D11 #define TRIGGER_PIN 12 // broche TRIGGER du SRF05 sur D12 unsigned long echoPulseTime = 0; // dure du signal ECHO en microsecondes void setup() { // configuration des E/S numriques de la carte Arduino pinMode(ECHO_PIN, INPUT); // la broche ECHO de la carte est une entre numrique pinMode(TRIGGER_PIN, OUTPUT); // la broche TRIGGER de la carte est une sortie numrique // initialisation du port srie 115200 bauds Serial.begin(115200); } void loop() { // dclenchement de la mesure digitalWrite(TRIGGER_PIN, HIGH); delayMicroseconds(12); digitalWrite(TRIGGER_PIN, LOW);
// signal TRIGGER l'tat HAUT (5V) // dure de l'tat haut = 12 microsecondes // signal TRIGGER l'tat BAS (0V)
// lecture de la broche ECHO echoPulseTime = pulseIn(ECHO_PIN, HIGH); // attend le retour du signal ECHO au niveau BAS et retourne la dure du signal Serial.println(echoPulseTime); } delay(50); // affichage du rsultat brut dans le moniteur Srie
N'oubliez pas que le programme est flash dans la mmoire du microcontrleur. Grce l'objet Serial, vous tablissez une connexion srie entre la carte Arduino et l'ordinateur via le cble USB pendant le droulement du programme. Les mthodes Serial.print et Serial.println permettent de communiquer les mesures l'ordinateur et les afficher dans le moniteur Srie (ne pas oublier de rgler la vitesse de transmission conformment la dclaration Serial.begin(115200)).
- 10 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Communication Srie : Arduino vers PC Voil une mthode trs pratique en phase de test et qui permet de rendre compte trs facilement du fonctionnement du capteur (en plus de la petite LED rouge sur la faade arrire du capteur qui doit clignoter la frquence des dclenchements).
- 11 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
- 12 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
L'installation d'une bibliothque tierce et compatible avec l'environnement Arduino est trs simple. Une fois l'archive dcompresse, vous la dplacez dans le sous-rpertoire libraries du dossier d'installation :
Sous Linux, il faut aller voir du ct du rpertoire /usr/share/arduino/libraries. C'est tout ! Lorsque vous dmarrez l'IDE Arduino, des exemples d'utilisation sont proposs dans le menu Fichier>Exemples>Newping :
- 13 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
#define MAX_DISTANCE 50 // distance maximale (en centimtres) que nous voulons "pinger". La porte maximale du SRF NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // instanciation d'un nouvel objet NewPing.
unsigned int pingSpeed = 50; // priode d'envoi du "ping". Une priode de 50 millisecondes correspond 20 "pings" par seconde unsigned long pingTimer; // timer, pour le prochain "ping". void setup() { Serial.begin(115200); // moniteur Srie 115200 bauds pour afficher les rsultats.
- 14 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
NewPingEventTimer
}
pingTimer = millis(); // contient le temps coul en millisecondes depuis le dbut de l'excution du programme. p
// si temps coul depuis dernier "ping", on fait nouveau un "ping". // temps pour dclenchement du prochain "ping"
sonar.ping_timer(echoCheck); // envoie un "ping". Interruption toutes les 24 microsecondes (interruption du Timer } // // autres tches ici, fonctionnement en multitche //
void echoCheck() { // sous-programme d'interruption if (sonar.check_timer()) { // "ping" complt dans les limites de distance souhaites ? // ajouter votre code d'interruption ici Serial.print("Ping: "); // affichage dans le moniteur Srie
Vous pouvez tlcharger directement ce programme dans la carte et le tester. Pensez connecter les broches Echo et Trigger du capteur respectivement aux broches numriques 11 et 12 de la carte Arduino. Dans le moniteur Srie, rglez la vitesse de transmission 115 200 bauds pour voir dfiler les mesures du capteur. L'objet NewPing est instanci la ligne :
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // instanciation d'un nouvel objet NewPing.
Un ping est dclench toutes les 50 ms, mais cette fois sans faire de pause dans le programme avec un delay(), grce la fonction millis(). On ordonne alors une interruption toutes les 24 s(*) pour checker l'tat de la broche Echo du capteur et incrmenter un compteur. Lorsqu'un retour l'tat LOW est dtect, le ping est complt et on peut convertir la dure du signal en distance.
(*) On peut faire remarquer par un petit calcul que si on loigne ou rapproche un obstacle de 4 mm, la dure du signal Echo varie justement d'environ 24 s. La prcision de mesure est
- 15 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
donc de 4 mm par dfaut, mais celle-ci peut tre modifie en changeant la ligne du fichier d'entte libraries/NewPing/NewPing.h :
#define ECHO_TIMER_FREQ 24
Il n'y a plus d'attente ou de dlai dans la boucle principale et la scrutation priodique de l'tat du capteur en toute transparence par interruption autorise un fonctionnement multitche. Vous devriez d'ailleurs constater un affichage plus rapide et plus fluide des rsultats dans le moniteur Srie par rapport au premier programme.
Pour piloter l'affichage sur l'cran LCD du shield, dont le driver de l'afficheur est compatible avec le standard Hitachi, vous avez besoin de la bibliothque LiquidCrystal propose par dfaut et dont les exemples d'utilisation sont disponibles dans l'IDE en suivant le menu Fichier>Exemples>LiquidCrystal.
- 16 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Dans notre cas, l'afficheur fonctionne avec quatre bits de donnes (D4, D5, D6 et D7). Les broches de commandes RS et E seront connectes respectivement aux connecteurs D8 et D9 de l'Arduino. C'est le mode de fonctionnement le plus simple et, surtout, celui qui utilise le moins grand nombre de connecteurs sur la carte Arduino. Ainsi, le code d'instanciation, adapter si vous prenez un shield au brochage diffrent, ressemblera :
#include <LiquidCrystal.h> #define #define #define #define #define #define RS E DB4 DB5 DB6 DB7 8 9 4 5 6 7
Vous pouvez maintenant enficher le shield sur la carte Arduino (dbranchez les fils du capteur ultrasons relis la carte pour le moment) afin de tester et dcouvrir cette bibliothque en parcourant les codes des nombreux exemples fournis, dont le fameux HelloWorld . Vous trouverez la rfrence de la bibliothque sur le site officiel et en franais sur le site www.mon-club-elec.fr.
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Nous pouvons maintenant cbler le capteur ultrason sur le shield lui-mme enfich sur la carte Arduino ( le fil rouge sur le bouton rouge, le fil vert sur le bouton vert ).
- 18 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
#include <NewPing.h> #include <LiquidCrystal.h> #define ECHO_PIN #define TRIGGER_PIN 11 12 // broche Echo sur D11 // broche Trigger sur D12
#define MAX_DISTANCE 200 // distance maximale (en centimtres) que nous voulons "pinger". La porte maximale du SR #define #define #define #define #define #define RS E DB4 DB5 DB6 DB7 8 9 4 5 6 7
//#define DEBUG #undef DEBUG LiquidCrystal lcd(RS, E, DB4, DB5, DB6, DB7); NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // instanciation d'un nouvel objet NewPing.
unsigned int pingSpeed = 50; // priode d'envoi du "ping". Une priode de 50 millisecondes correspond 20 "pings" par seconde unsigned long pingTimer; // timer, pour le prochain "ping". void setup() { Serial.begin(115200); // moniteur srie 115200 bauds pour afficher les rsultats. lcd.begin(16,2); // intialisation afficheur 16 x 2 caractres }
pingTimer = millis(); // contient le temps coul en millisecondes depuis le dbut de l'excution du programme. p
void loop() { if (millis() >= pingTimer) { // si temps coul depuis dernier "ping", on fait nouveau un "ping". pingTimer += pingSpeed; // temps pour dclenchement du prochain "ping" lcd.setCursor(13,0); lcd.print("(*)"); // pas de "ping" valide initialement
sonar.ping_timer(echoCheck); // envoie un "ping". Interruption toutes les 24 microsecondes (interruption du Timer } // // autres tches ici, fonctionnement en multitche //
void echoCheck() { // sous-programme d'interruption if (sonar.check_timer()) { // "ping" complt dans les limites de distance souhaites ? // ajouter votre code d'interruption ici lcd.setCursor(13,0); lcd.print(" "); // efface l'toile, le "ping" est complt printDistance(sonar.convert_cm(sonar.ping_result), " cm"); // affichage en centimtres sur LCD } } void printDistance(unsigned int distance, String unit ){ #ifdef DEBUG // si mode DEBUG Serial.print("Ping: "); // affichage dans le moniteur srie Serial.print(distance); Serial.println(unit); #endif lcd.setCursor(5,0); // sur la 1re ligne, au milieu de l'afficheur if (distance<10) lcd.print(" "); // efface les centaines et dizaines else if (distance<100) lcd.print(" "); // efface les centaines lcd.print(distance); lcd.print(unit);
- 19 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Le mode DEBUG peut tre ractiv tout moment en phase de test avec affichage sur le moniteur Srie. De plus, si la mesure n'est pas complte aprs un ping (parce que la distance est suprieure MAX_DISTANCE), l'affichage est fig avec une toile (*) dessine sur l'cran LCD. Petit raffinement de l'IDE Arduino, vous pouvez rdiger le code de la fonction printDistance() dans un onglet spar, le premier onglet contenant le programme principal.
- 20 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Par la suite nous aimerions profiter d'un de ces boutons pour ajouter une petite fonctionnalit : l'appui sur la touche SELECT permet de faire basculer l'affichage de la distance de l'obstacle en centimtres (cm) ou en pouces (in). Certes, la fonctionnalit est discutable autres circonstances. , mais la programmation d'un bouton vous sera utile dans de nombreuses
- 21 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
La tension applique l'entre analogique A0 de la carte dpend de la touche presse. Par exemple si l'utilisateur presse le bouton SELECT (comportement d'un interrupteur fermant un circuit normalement ouvert), le schma lectrique quivalent est :
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Vous pouvez faire de mme pour les autres boutons. Ce principe de clavier analogique est fort simple, ne ncessite aucune bibliothque extrieure et ne consomme qu'une entre de la carte Arduino. Pour vrifier que le principe fonctionne, il vous suffit de reprendre le programme exemple AnalogReadSerial (dans le menu Fichier>Exemples>01.Basics) qui se contente d'afficher en boucle la valeur lue sur l'entre A0 dans le moniteur Srie : AnalogReadSerial
/* AnalogReadSerial Reads an analog input on pin 0, prints the result to the serial monitor. Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
This example code is in the public domain. */ // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); } // the loop routine runs over and over again forever: void loop() { // read the input on analog pin 0: int sensorValue = analogRead(A0); // print out the value you read: Serial.println(sensorValue); delay(1); // delay in between reads for stability }
Tlchargez ce programme et testez-le en pressant le bouton SELECT (on oublie et on met de ct le capteur ultrason pour ce test) :
- 23 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
N'oubliez pas de rgler la vitesse de transmission 9 600 bauds dans le moniteur Srie conformment la dclaration du programme. Lorsque la touche SELECT est maintenue presse, la valeur lue tourne autour de 744 dans mon cas. L'cart par rapport la valeur thorique (741), trs faible, mais qui peut fluctuer d'un LCD KeyPad Shield l'autre, peut s'expliquer par la prcision sur les valeurs des rsistances lectriques.
- 24 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Le changement d'unit doit intervenir seulement dans le cas o le bouton bascule de l'tat relch l'tat appuy entre deux instants conscutifs, ici entre les instants t4 et t5. Seulement, la ralit du terrain complique les choses puisque la squence d'appui du bouton en situation relle nous donnera un chronogramme qui ressemble plutt la figure ci-dessous :
Les boutons-poussoirs possdent en effet un inconvnient de taille, ils sont sujets aux rebonds, c'est--dire qu'ils ont la dsagrable habitude de ne pas passer directement d'un tat l'autre. Pendant une dure de l'ordre de quelques millisecondes, l'tat du bouton va osciller. Chaque rebond, mme ceux qui se produisent pendant le relchement du bouton, risque alors d'tre interprt comme une demande de changement d'unit par l'utilisateur. dfaut de solution matrielle immdiate sous la main pour filtrer ces rebonds (filtre analogique base de circuit RC par exemple), on se tourne vers une solution logicielle. Une solution simple mettre en uvre consiste faire une pause (un delay() rajouter) pour passer les rebonds, juste aprs la dtection du premier changement d'tat entre t4 et t5. Si, l'instant t6, la fin des rebonds, le bouton est toujours l'tat appuy on peut oprer le changement d'unit pour la distance (centimtres - pouces) :
C'est ce principe que nous retiendrons par la suite, au risque de sacrifier un peu sur la frquence de dclenchement des mesures de distance cause de la pause anti-rebonds supplmentaire.
- 25 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
#ifndef BUTTON_H #define BUTTON_H #include <Arduino.h> // indispensable ici, le type boolean n'est pas implant class Button{ private: int _adcValue; boolean _buttonPrevious; int _buttonHysteresis; int _bounceDelay; public: Button(int,int); boolean pressed(); ~Button(); }; #endif
/******************************************************************** Classe Button Cette classe, trs incomplte, permet de dtecter l'appui d'un bouton d'un clavier analogique sur l'entre A0. http://www.developpez.net/forums/u283256/f-leb/ aout 2013 Ce code est dans le domaine public. *********************************************************************/ #include "Button.h" Button::Button(int adcValue, int bounceDelay){ _adcValue=adcValue; // valeur issue de la conv. analogique-numrique _bounceDelay=bounceDelay; // pause anti-rebonds _buttonPrevious=false; _buttonHysteresis=10; // fourchette de dtection: adcValue + ou - hysteresis } boolean Button::pressed(){ // retourne true si basculement dtect int buttonValue = analogRead(A0); // lecture de l'entre analogique A0 boolean buttonJustPressed = ( buttonValue >= _adcValue - _buttonHysteresis ) && ( buttonValue <= _adcValue + _buttonHysteresis ); boolean toggle = buttonJustPressed && !_buttonPrevious; // bascule si bouton press ET tat prcdent NON press _buttonPrevious = buttonJustPressed; // mmorise l'tat du bouton if (toggle){ delay(_bounceDelay); // pause anti-rebonds buttonValue = analogRead(A0); // nouvelle lecture de l'entre analogique A0 buttonJustPressed = ( buttonValue >= _adcValue - _buttonHysteresis ) && ( buttonValue <= _adcValue + _buttonHysteresis );
- 26 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
ButtonClass
Button::~Button(){ }
La mthode pressed() retournera true si le basculement de l'tat bouton non press bouton press est dtect compte tenu des rebonds qui seront ignors grce la pause anti-rebonds. L'tat du bouton est mmoris dans la donne membre _buttonPrevious pour pouvoir tre compar son tat au prochain appel de la mthode. La dtection du changement d'tat du bouton se fait au niveau de la ligne :
boolean toggle = buttonJustPressed && !_buttonPrevious; // bascule si bouton press ET tat prcdent NON press
Remarquez ensuite comment, en cas de changement d'tat, une nouvelle lecture du port analogique A0 est effectue aprs la pause anti-rebonds :
if (toggle){ delay(_bounceDelay); // pause anti-rebonds buttonValue = analogRead(A0); // nouvelle lecture de l'entre analogique A0 buttonJustPressed = ( buttonValue >= _adcValue - _buttonHysteresis ) && ( buttonValue <= _adcValue + _buttonHysteresis ); if (buttonJustPressed){ return (true); } }
Voici le code d'un programme de dmonstration mettant en uvre la classe Button : DemoButtonClass
/******************************************* test appui sur bouton SELECT *******************************************/ #include "Button.h" #define SELECT 744 // valeur constate pour la touche SELECT #define BOUNCE_DELAY 5 // pause anti-rebonds = 5 ms Button myButton(SELECT, BOUNCE_DELAY); // instanciation du bouton SELECT int i=1; void setup() { Serial.begin(115200); } void loop() { if (myButton.pressed()){ // si la touche SELECT est presse Serial.print("appui sur SELECT : "); Serial.println(i); i++; } }
Une fois de plus, le programme de dmonstration, l'entte et la classe sont rdigs dans des onglets spars de l'interface :
- 27 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Vous pouvez tlcharger le code dans la carte et tester son fonctionnement dans le moniteur Srie (115 200 bauds) :
- 28 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Si vous souhaitez rendre la classe rutilisable et la rendre disponible dans l'IDE, comme pour la bibliothque NewPing, il vous suffit de suivre les tapes de l'article : Writing a Library for Arduino.
- 29 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Une fois le programme tlcharg, le dispositif aliment par une pile carre 9 V est autonome. L'archive du programme complet est disponible ici : SRF05_LCDKeypadShield.zip
Le code a t rdig avec la version 1.0.1 de l'IDE Arduino (Windows). N'oubliez pas d'installer la bibliothque NewPing.
VIII - Conclusion
Voil une premire maquette ralise base d'Arduino. Le dispositif affiche la distance mesure par le capteur sur un cran LCD (20 mesures par seconde) selon l'unit choisie (centimtres ou pouces) grce un bouton-poussoir. La maquette a t ralise pas pas en affichant les rsultats bruts dans le moniteur Srie dans un premier temps. L'IDE offre une interface sobre (coloration syntaxique, onglets, mais pas d'aide syntaxique, d'autocompltion, de pliage de portion de code) avec de nombreux exemples de programmes de dmonstration pour les premiers tests. Le langage, base C/C++, offre un jeu d'instructions de haut niveau pour accder aux entres/sorties de la carte. Dans ce tutoriel, nous avons d'ailleurs exploit les entres/sorties D11 et D12 pour la gestion du capteur et une entre analogique A0 pour le bouton-poussoir. Les autres entres/sorties numriques de la carte que nous avons dclares sont exploites en toute transparence par le LCD Keypad Shield grce la bibliothque LiquidCrystal. Un afficheur LCD est un objet normalement complexe exploiter qui ncessite un circuit lectronique spcialis. Mais sous forme de shield avec la bibliothque logicielle adapte, le dbutant peut rapidement exploiter ses fonctionnalits pour arriver ses fins. La gestion pointue de l'lectronique pourra tre tudie plus tard. On ne doit cependant pas ignorer les aspects physiques, comprendre les caractristiques lectriques, le principe de fonctionnement de ce capteur ultrasons ou les phnomnes de rebond dans les commutateurs est essentiel. Il en sera de mme lorsque vous interfacerez des moteurs lectriques, des lampes ou tout autre dispositif complexe.
- 30 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/
Dans la foule de cet article, vous pouvez faire voluer le dispositif en incluant un signal sonore modul en fonction de la distance de l'obstacle la faon d'un radar de recul quipant les vhicules automobiles. Rien de bien compliqu avec un buzzer pizo-lectrique et la bibliothque Tone pour l'exploiter. Bref, Arduino et son cosystme sont sans doute le moyen le plus rapide pour dvelopper une application ou mettre au point une prmaquette de systme embarqu sans tre un spcialiste pointu de la programmation des microcontrleurs ou de l'lectronique. Vous tes finalement prt vous lancer et rejoindre la communaut. Do It Yourself
IX - Remerciements
Je remercie deletme, al1_24 et Bktero pour leur relecture attentive de cet article et leurs conseils. Je remercie galement l'ami ClaudeLELOUP pour sa relecture orthographique.
- 31 -
Le contenu de cet article est rdig par f-leb et est mis disposition selon les termes de la Licence Creative Commons Attribution 3.0 non transpos. Les logos Developpez.com, en-tte, pied de page, css, et look & feel de l'article sont Copyright 2013 Developpez.com. http://f-leb.developpez.com/tutoriels/arduino/univers_arduino/part2/