48
ARDUINO et son utilisation I. À qui s'adresse ce tutoriel ? Il s'adresse aux débutants en programmation des microcontrôleurs voulant rejoindre les adeptes du mouvement Do It Yourself dans le domaine duPhysical Computing(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général ne vous effraie pas. Vous aimeriez juste profiter de votre métier, votre passion pour la programmation, pour interagir avec le monde physique, piloter des robots, automatiser la montée/descente de vos volets déroulants en fonction de l'ensoleillement, construire votre propre station météo et déclencher des alarmes selon des seuils de température, etc. Seulement vos connaissances en physique/électricité/électronique remontent à vos années lycée, une éternité… Quant à souder vous-même des composants électroniques, n'en parlons pas… Évidemment vous serez obligé de vous y mettre si votre projet doit prendre de l'ampleur, mais pas tout de suite. Vous avez déjà entendu parler de la plateforme Arduino, peut-être même acheté votre Arduino Uno (une vingtaine d'euros au moment de la rédaction de ces pages) avec quelques composants de base (plaque de câblage rapide avec quelques fils, LED, résistances…) et programmé votre premier « Hello World » (programme qui consiste à faire clignoter la LED intégrée à la carte via la broche n° 13). Vous avez peut-être même déjà commencé à combler vos lacunes en électronique de base , suivi quelques tutoriels pour allumer une, deux puis trois LED voire plus. Classique et indispensable pour débuter… Ce tutoriel va reprendre un peu tout cela notamment dans cette première partie, mais il propose également d'aller un peu plus loin avec l'utilisation de capteurs évolués, la découverte des cartes d'interface (ou shields) et de bibliothèques tierces. Le programme est vaste, mais les ressources proposées vous permettront de vous lancer dans des projets plus ambitieux en vous tenant le plus possible à l'écart du fer à souder. L'objectif reste le même que celui de la communauté Arduino, découvrir et s'amuser… II. Rôle de la carte Arduino dans l'objet pluritechnique Vous souhaitez créer votre premier robot à moindre coût ? De nombreux kits à base d'une carte Arduino sont disponibles sur le Net :

ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

ARDUINO et son utilisationI. À qui s'adresse ce tutoriel ?

Il s'adresse aux débutants en programmation des microcontrôleurs voulant rejoindre les adeptes du mouvement Do It Yourself dans le domaine duPhysical Computing(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général ne vous effraie pas. Vous aimeriez juste profiter de votre métier, votre passion pour la programmation, pour interagir avec le monde physique, piloter des robots, automatiser la montée/descente de vos volets déroulants en fonction de l'ensoleillement, construire votre propre station météo et déclencher des alarmes selon des seuils de température, etc.

Seulement vos connaissances en physique/électricité/électronique remontent à vos années lycée, une éternité… Quant à souder vous-même des composants électroniques, n'en parlons pas… Évidemment vous serez obligé de vous y mettre si votre projet doit prendre de l'ampleur, mais pas tout de suite.

Vous avez déjà entendu parler de la plateforme Arduino, peut-être même acheté votre Arduino Uno (une vingtaine d'euros au moment de la rédaction de ces pages) avec quelques composants de base (plaque de câblage rapide avec quelques fils, LED, résistances…) et programmé votre premier « Hello World » (programme qui consiste à faire clignoter la LED intégrée à la carte via la broche n°  13). Vous avez peut-être même déjà commencé à combler vos lacunes en électronique de base, suivi quelques tutoriels pour allumer une, deux puis trois LED voire plus. Classique et indispensable pour débuter…

Ce tutoriel va reprendre un peu tout cela notamment dans cette première partie, mais il propose également d'aller un peu plus loin avec l'utilisation de capteurs évolués, la découverte des cartes d'interface (ou shields) et de bibliothèques tierces. Le programme est vaste, mais les ressources proposées vous permettront de vous lancer dans des projets plus ambitieux en vous tenant le plus possible à l'écart du fer à souder.

L'objectif reste le même que celui de la communauté Arduino, découvrir et s'amuser…

II. Rôle de la  carte Arduino dans l'objet pluritechnique

Vous souhaitez créer votre premier robot à moindre coût ? De nombreux kits à base d'une carte Arduino sont disponibles sur le Net :

Parallax BOEBot Robot for Arduino Kit

Ce petit robot roulant à vocation pédagogique possède deux roues indépendantes motorisées et peut être équipé de multiples capteurs pour détecter des obstacles, suivre une ligne au sol, etc.

La structure de cet objet ludique et pluritechnique est résumée dans le diagramme fonctionnel ci-dessous (merci à l'Éducation nationale à qui j'ai emprunté ces magnifiques diagrammes

Page 2: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Chaîne d'information - Chaîne d'énergie

La partie inférieure comporte la « chaîne d'énergie » dont le rôle est d'adapter/convertir le flux d'énergie rentrant (de nature électrique) en énergie mécanique utilisable au niveau des deux roues motrices.

La partie supérieure comporte la « chaîne d'information ». Les flèches en bleu constituent donc des flux d'information. Cette partie doit acquérir les informations renvoyées par les capteurs (luminosité pour suivre une ligne noire au sol, ultrason pour détecter les obstacles…), les traiter et communiquer les « ordres de commande » à la chaîne d'énergie, éventuellement informer l'utilisateur (signal sonore ou lumineux par exemple).

Il apparaît clairement que c'est dans la chaîne d'information dévolue principalement au traitement de l'information que notre carte Arduino joue son rôle.

Il apparaît également que la carte Arduino est incapable de transmettre directement « la puissance » aux moteurs électriques. Effectivement chacune de ses entrées/sorties numériques peut absorber ou délivrer un courant électrique maximum de 40 mA sous 5 Volts (sans dépasser les 200 mA pour l'ensemble des entrées/sorties) ce qui est insuffisant étant donné le courant typiquement absorbé par ce genre de moteur électrique.

C'est pour cela que vous devez passer par une « carte d'interface » (ici à base de relais) qui à partir des « ordres de commande » communiquée par l'Arduino (signaux véhiculant de l'information de faible puissance électrique) permet de « distribuer » une puissance adaptée à chaque moteur.

Si vous n'avez pas tout assimilé à cette description, retenez au moins ceci :

Page 3: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Le rôle de la carte Arduino est de véhiculer de l' « information » (signaux électriques de faible puissance), et non de transmettre directement de la puissance à un actionneur tel un moteur électrique.

Ceux qui ont essayé de transmettre de la puissance sans passer par ces composants d'interface ont seulement réussi à transmettre des signaux… de fumée

III. Description de la carte Arduino Uno

Il existe de nombreux modèles de cartes Arduino, la plus populaire étant probablement la Uno.

Le document ci-dessous(2) vous donne un aperçu de l'organisation de la carte (dimensions : 65 x 52 mm) dans sa version Uno.

III-A. Le microcontrôleur

Au moment de la rédaction de ces lignes, le cœur de la carte Arduino Uno est un microcontrôleur de la famille AVR, un Atmel Atmega 328P.

Ce microcontrôleur renferme dans un seul composant :

un processeur 8 bits à architecture RISC ; de la mémoire avec des espaces physiques séparés :

o mémoire Flash (32 Ko) pour les programmes,o mémoire vive SRAM (2 Ko) pour les données,o mémoire EEPROM (2 Ko) pour les données de sauvegarde ;

toute la logique d'horloge (16 MHz) ; des circuits d'interface et des périphériques d'entrée-sortie permettant au processeur

d'accéder au monde extérieur :o des Timers/Counters (T/C) 8 et 16 bits,

Page 4: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

o génération des signaux PWM,o des interfaces de communication série (UART, SPI, TWI compatible I2C…),o un convertisseur Analogique-Numérique (A/D Conv.),o etc.

Schéma bloc de description du microcontrôleur AVR

Un processeur à 16 MHz et 32 Ko de mémoire Flash pour stocker vos programmes, ces chiffres peuvent prêter à sourire en comparaison des GHz et des Go de votre ordinateur personnel. Mais avec son format carte de crédit et une consommation inférieure au Watt, la carte Arduino satisfera pourtant vos premières exigences en termes d'embarqué.

III-B. L'alimentation

Elle a lieu sous une tension de 5 Volts. Elle peut provenir soit de la prise USB lorsque la carte est reliée à l'ordinateur, soit d'un bloc secteur externe (tension entre 7 et 12 Volts, 1 Ampère) via la prise jack standard.

Comme la carte consomme très peu (0,5 W), elle peut également être alimentée par une simple pile 9 V.

Page 5: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Les régulateurs montés sur la carte permettent de fournir des tensions stabilisées à 3,3 ou 5 Volts pour alimenter des périphériques (capteurs,shields…).

Les tensions appliquées aux entrées ne doivent pas dépasser la tension d'alimentation sous peine de détruire le circuit.

III-C. Les entrées/sorties

Ce sont les deux rangées de connecteurs de part et d'autre de la carte qui permettent sa connexion au monde extérieur.

III-C-1. Les entrées/sorties numériques D0 à D13

Entrées/sorties numériques D0 à D13

Chacun des connecteurs D0 à D13 peut être configuré dynamiquement par programmation en entrée ou en sortie.

Les signaux véhiculés par ces connecteurs sont des signaux logiques compatibles TTL, c'est-à-dire qu'ils ne peuvent prendre que deux états HAUT (5 Volts) ou BAS (0 Volt).

En pratique, les connecteurs D0 et D1 réservés pour la liaison série asynchrone (port COM virtuel via le câble USB) ne sont pas exploités pour d'autres utilisations.

À noter que chacun des connecteurs ne peut fournir ou absorber un courant supérieur à 40 mA environ (200 mA pour l'ensemble des connecteurs).

Certains connecteurs peuvent être spécialisés comme sorties PWM (repérées par un ~) mais nous sortons ici du cadre de ce tutoriel.

III-C-2. Les entrées analogiques A0 à A5

Page 6: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Entrées analogiques A0 à A5

Par défaut et contrairement aux entrées/sorties numériques qui ne peuvent prendre que deux états HAUT et BAS, ces six entrées peuvent admettre toute tension analogique comprise entre 0 et 5 Volts.

Pour pouvoir être traitées par le microcontrôleur, ces entrées analogiques sont prises en charge par un CAN (Convertisseur Analogique Numérique ou ADC pour Analog Digital Converter) dont le rôle est de convertir l'échantillon de tension VE en une grandeur numérique binaire sur n bits.

Convertisseur Analogique Numérique

Le principe de la conversion Analogique-Numérique est représenté ci-dessous (avec n=3 bits et la tension de référence Vref=5 Volts) :

CAN 3 bits - Auteur : Philippe Avi

Le convertisseur de la carte Arduino Uno possède une résolution de 10 bits, soit 210 = 1024 possibilités de 0 à 1023.

Ainsi, pour n=10 bits et la tension de référence par défaut Vref=5 Volts, si la tension analogique d'entrée échantillonnée est VE=3,8 Volts , la grandeur numérique N (ici en entier décimal) en sortie du convertisseur peut être calculée grâce aux relations :

quantum q = Vref/2n = 5 / 210 = 5 / 1024

N = VE / q = 3,8 x 1024 / 5 soit N = 778

Page 7: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Il y aurait encore bien des choses à dire pour avoir une description plus complète de la carte et nous sommes resté sur l'essentiel.

La plateforme Arduino étant open source, une description plus complète et les schémas de la carte sont donc librement disponibles sur le site officiel.

IV. L'environnement de développement

IV-A. Installation

Pour l'installation (Windows, Mac OS X et Linux), référez-vous aux indications pas à pas du site officiel : Getting Started with Arduino.

Une version en français est également disponible : Téléchargement et installation du logiciel Arduino.

IV-B. Premier pas dans l'IDE

Voici à quoi ressemble l'IDE (Windows), ici avec le programme de démonstration Blink :

Ce premier programme se contentera de faire clignoter la LED jaune témoin qui se trouve près du connecteur D13 de la carte Arduino Uno.

Avant de télécharger le programme dans la carte, il faut relier l'ordinateur et la carte via le câble USB :

Page 8: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Une fois le port activé et reconnu sur l'ordinateur, il faut éventuellement désigner le bon dans l'interface :

Finalement, le processus de rédaction du programme jusqu'à son téléchargement dans la carte peut être résumé grâce au schéma suivant :

IV-C. Le langage de programmation

Sous Windows par exemple, lorsque vous lancez la compilation dans l'IDE, ce sont les outils de la suite WinAVR avec son compilateur GCC qui prennent le relais.

Page 9: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

En fait, vous programmez dans un langage propre à Arduino dont la structure s'apparente aux langages C/C++. Mais lorsque vous évoquez une fonction Arduino, non standard C/C++, et pourtant reconnue et coloriée comme un mot-clé dans l'éditeur, vous faites appel en toute transparence à une ou plusieurs bibliothèques rédigées en C ou C++ qui seront incluses à la compilation.

En enveloppant le langage C/C++ de cette manière, les concepteurs de l'IDE ont pu simplifier sa syntaxe et l'adapter aux possibilités de la carte. De nombreuses fonctionnalités de haut niveau sont ainsi proposées à l'utilisateur novice qui n'a plus à se soucier de la logique interne du microcontrôleur.

Dans les coulisses de l'IDE Arduino, un compilateur AVR GCC.

Revenons au programme de démonstration Blink :

Blink

Sélectionnez

/* Blink Turns on an LED on for one second, then off for one second, repeatedly. This example code is in the public domain. */ // Pin 13 has an LED connected on most Arduino boards.// give it a name:int led = 13;

// the setup routine runs once when you press reset:void setup() { // initialize the digital pin as an output. pinMode(led, OUTPUT); }

// the loop routine runs over and over again forever:

Page 10: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second}

La structure d'un programme Arduino, rédigé dans l'éditeur, ressemble à ceci et doit toujours comporter les fonctions setup() et loop() :

 

Sélectionnez

// Définition des constantes, variables globales// directives de compilation define, include, etc.

void setup() { // initialisation des ressources de la carte, // configuration des entrées/sorties, // définition de la vitesse de fonctionnement du port série, etc. // setup() n'est exécuté qu'une seule fois.}

void loop() { // les instructions contenues ici sont exécutées indéfiniment en boucle // Seule une coupure de l'alimentation de la carte ou un appui sur le bouton Reset // permet de quitter le programme.}

Nous n'allons pas ici décrire toutes les instructions du langage Arduino, vous trouverez les références et la syntaxe sur le site officiel :

Language Reference Référence étendue du langage Arduino

Nous insistons tout de même sur les fonctions implantées pour la gestion des entrées/sorties de la carte :

Fonction Description (partielle)

pinMode() Configuration des broches numériques en entrée ou en sortie.

digitalWrite() Pour une broche numérique configurée en sortie, cette instruction permet de mettre son niveau logique à HAUT ou BAS.

digitalRead() Lecture du niveau logique (HAUT ou BAS) d'une broche numérique configurée en entrée.

analogWrite()

La carte ne possède pas de Convertisseur Numérique Analogique. Il n'est donc théoriquement pas possible d'obtenir une tension continue qui soit l'image d'une valeur numérique (pas de sortie analogique). Il est par contre possible d'en reproduire le comportement en générant un signal rectangulaire (PWM ou MLI) de rapport cyclique réglable. Beaucoup de composants (LED, moteur électrique à courant continu) agissent comme des filtres passe-bas et fonctionnent comme s'ils étaient alimentés sous une tension continue égale à la valeur moyenne du signal.

analogRead() Lecture de la valeur de la tension présente sur une entrée analogique (A0

Page 11: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

à A5 sur la Uno).La fonction retourne la valeur issue de la Conversion Analogique Numérique, soit une valeur comprise entre 0 et 1023 (convertisseur 10 bits).

Ainsi, dans la boucle infinie loop() :

 

Sélectionnez

void loop() { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(led, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second}

La broche n° 13, reliée à la LED intégrée à la carte, passe alternativement du niveau logique HAUT (HIGH) au niveau logique BAS (LOW) après un délai d'une seconde, ce qui la fait clignoter.

Comme vous le voyez à travers cet exemple, les concepteurs du langage ont prévu d'interfacer facilement vos programmes avec le monde extérieur.

V. Les cartes d'interface ou Shield

Une carte Arduino seule, même si vous disposez de quelques LED, résistances, boutons poussoir, etc. n'est pas d'une grande utilité et reste dans ce cas limitée à des fins d'apprentissage. Si vous voulez aller plus loin et piloter les moteurs de votre robot, vous devrez passer par une interface dédiée (des composants sur une carte électronique).

Une fois de plus, sous la poussée de la communauté Arduino, de nombreux fabricants proposent une pléthore de cartes d'interface capables de couvrir la majorité des besoins (capteurs, relais de puissance, commande de moteurs, Internet, affichage sur matrice LED ou écran LCD, communication Wifi…).

V-A. Qu'est-ce qu'un shield ?

Un shield est une carte d'interface spécialement dédiée à l'Arduino. Ces cartes ont des dimensions sensiblement voisines de la carte Arduino et peuvent s'enficher directement sur les connecteurs de celle-ci.

Il est bien sûr impossible de recenser entièrement ici les centaines de shields existant sur le marché (dont quelques-uns référencés sur le site officiel). Vous trouverez une liste de fabricants et/ou distributeurs de shields pour Arduino dans la sitographie en fin de tutoriel.

On peut tout de même en signaler quelques-uns bien pratiques et donner une idée(3).

V-A-1. Pour le prototypage

Page 12: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Sparkfun ProtoShield

Une fois enfichée sur la carte Arduino, ce shield reprend tels quels les connecteurs de part et d'autre de la carte. On peut alors coller une plaque de câblage rapide (breadboard en anglais) dans la partie centrale (en plastique vert moulé sur la photo).

Cette plaque permet de câbler de nombreux composants sans faire de soudure et garder le montage entièrement démontable.

Le montage sur plaque d'essai ci-dessous, dessiné avec le logiciel gratuit Fritzing, montre une LED branchée sur la broche D10 de l'Arduino avec sa résistance en série.

Montage électronique sur plaque de câblage rapide

Il ne reste plus qu'à reprendre le programme de démonstration Blink au niveau de la ligne :

 

Sélectionnez

int led=10;

et le tour est joué pour faire clignoter la LED rouge.

V-A-2. Pour l'affichage

Page 13: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Sparkfun Button LCD Shield

Ce shield, en plus de son écran LCD (deux lignes de 16 caractères), comporte cinq boutons-poussoirs programmables.

La bibliothèque LiquidCrystal qui permet de piloter l'affichage est disponible par défaut dans l'IDE Arduino.

V-A-3. Pour la commande des moteurs

Sparkfun Motor Driver Shield

Ce shield permet de piloter jusqu'à deux moteurs électriques simultanément (idéal pour un petit robot roulant à deux roues motorisées indépendantes). Avec deux connecteurs numériques utilisés par moteur seulement, vous contrôlez le sens et la vitesse de rotation du moteur.

V-A-4. Pour communiquer

Page 14: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Sparkfun Ethernet Shield

Si vous souhaitez rendre disponible l'état d'un capteur de température sur un réseau local Ethernet ou sur Internet, ce shield évolué avec une bibliothèque très complète et de nombreux exemples de programmes saura transformer votre Arduino en véritable serveur web connecté sur l'extérieur.

V-B. Comment bien choisir son shield

Certains shields sont mieux pensés que d'autres et tout peut se compliquer si vous devez empiler les shields les uns sur les autres, car un seul ne suffit pas.

Empilement de shields

En voulant combiner les caractéristiques de plusieurs shields, vous risquez de faire rentrer certaines de leurs fonctionnalités en conflit matériel et/ou logiciel. Telle carte ne pourra pas s'empiler sur telle autre, car les broches de la carte du dessus sont trop courtes pour s'enficher correctement sur la carte du dessous à cause d'un composant trop épais. Telle bibliothèque logicielle dédiée à un shield rentre en conflit avec celle d'un autre shield. Ou encore plus rageant, les connecteurs des différents shields partagent le ou les mêmes connecteurs de la carte Arduino.

Et je passe sur les problèmes d'alimentation, d'interférences radio/électriques, etc.

Disons que tout se passe bien si vous n'utilisez qu'un seul shield. Dès que vous commencez à vouloir les empiler, vous devez potasser la documentation constructeur (les data sheets) afin de détecter les éventuels conflits.

Les fabricants proposent en principe sur leur site les documents nécessaires à la mise en œuvre : schéma électrique, data sheet, exemple d'utilisation, etc.

Page 15: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

d'après https://www.sparkfun.com

Le site Internet http://shieldlist.org vous propose un moteur de recherche intégré avec des centaines de références pour choisir vos shields.

Pour chaque shield référencé, vous trouverez les caractéristiques principales ainsi qu'un schéma d'allocation des broches bien utile.

Ce shield monopolise les broches D3 à D12

À noter que si l'allocation des broches du shield rend le nombre de connecteurs disponibles insuffisant pour d'autres utilisations, vous devrez probablement passer au modèle supérieur comme l'Arduino Mega qui dispose de connecteurs supplémentaires et qui peut parfaitement recevoir les shields conçus initialement pour la Uno.

VI. Processing

Processing est un environnement de développement et un langage de programmation basé sur le langage Java adapté à la création plastique et graphique interactive.

Pourquoi on vous parle de ça maintenant ?

Il nous suffit d'observer l'IDE Processing sur la copie d'écran ci-dessous. Cela ne vous rappelle rien ?

Page 16: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

IDE Arduino et Processing

La philosophie de Processing est aussi la facilité. Outre ses dispositions pour le graphisme et le multimédia, sa bibliothèque Serial permet la communication sérielle entre l'Arduino et l'ordinateur hôte. L'alliance parfaite…

Arduino et Processing, les deux font la paire… Si vous maîtrisez l'un, l'autre vous sera déjà familier.

VII. Conclusion

Comme vous avez pu le constater, ce qui prime dans Arduino, c'est sa simplicité qui permet de mettre en œuvre de nombreux objets numériques à moindre coût sans être un spécialiste du fer à souder ou de la programmation des microcontrôleurs. C'est cette qualité-là qui donne à Arduino le succès planétaire qu'on lui connaît.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Page 17: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Vous êtes maintenant paré à réaliser votre premier prototype dans la deuxième partie de ce tutoriel :

Partie II   : Réalisation d'un prototype à base d'Arduino

Véritable mini-ordinateur au succès planétaire, traitant les données provenant de composants et capteurs divers (capteur de température, 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 créer et prototyper de véritables objets numériques interagissant avec le milieu extérieur.

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 création d'objets numériques à moindre coût et accessibles à toutes personnes motivées ayant même des connaissances modestes dans les domaines de l'informatique et l'électronique.

I. À qui s'adresse ce tutoriel ?

Il s'adresse aux débutants en programmation des microcontrôleurs voulant rejoindre les adeptes du mouvement Do It Yourself dans le domaine duPhysical Computing(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général ne vous effraie pas. Vous aimeriez juste profiter de votre métier, votre passion pour la programmation, pour interagir avec le monde physique, piloter des robots, automatiser la montée/descente de vos volets déroulants en fonction de l'ensoleillement, construire votre propre station météo et déclencher des alarmes selon des seuils de température, etc.

Seulement vos connaissances en physique/électricité/électronique remontent à vos années lycée, une éternité…Quant à souder vous-même des composants électroniques, n'en parlons pas… Évidemment vous serez obligé de vous y mettre si votre projet doit prendre de l'ampleur, mais pas tout de suite.

Vous avez déjà entendu parler de la plateforme Arduino, peut-être même acheté votre Arduino Uno avec quelques composants de base (plaque de câblage rapide avec quelques fils, LED, résistances…) et programmé votre premier « Hello World » (programme qui consiste à faire clignoter la LED intégrée à la carte via la broche n°13). Vous avez peut-être même déjà commencé à combler vos lacunes en électronique de base, suivi quelques tutoriels pour allumer une, deux puis trois LED voire plus. Classique et indispensable pour débuter…

Ce tutoriel reprend un peu tout cela notamment dans la première partie, mais il propose également d'aller un peu plus loin avec l'utilisation de capteurs évolués, la découverte des cartes d'interface (ou shields) et de bibliothèques tierces. Le programme est vaste, mais les ressources proposées vous permettront de vous lancer dans des projets plus ambitieux en vous tenant le plus possible à l'écart du fer à souder.

L'objectif reste le même que celui de la communauté Arduino, découvrir et s'amuser…

II. Objectifs et matériels utilisés

Pour notre futur robot roulant, on souhaite détecter la proximité d'un obstacle devant celui-ci afin d'agir en conséquence (marche arrière, procédure de contournement d'obstacle, etc.).

Afin de mesurer la distance d'un obstacle, mon choix s'est porté vers le capteur à ultrasons de la société Robot Electronics, le SRF-05. Ce capteur (une vingtaine d'euros) est d'usage courant pour la petite robotique et s'interface facilement avec la carte Arduino.

Page 18: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Afin de faire quelques essais du dispositif « sur le terrain » et avoir un retour des mesures, notre première maquette à base d'Arduino sera équipée duLCD Keypad Shield. Ce shield, avec son écran LCD rétroéclairé bleu et blanc (deux lignes de 16 caractères) et ses cinq boutons-poussoirs vous fera débourser une quinzaine d'euros supplémentaires. 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'inquiétude, celui-là ou un autre, vous n'aurez pas ou peu d'adaptations à faire.

Pour compléter le dispositif, on investira dans une plaque de câblage rapide et quelques jumpers (mâle/mâle et femelle/femelle) :

III. La plaque de câblage rapide

Une plaque de câblage rapide (breadboard en anglais) permet de prototyper un montage électronique en connectant ses composants en un circuit démontable et sans soudure. La plaque est constituée de séries de trous où peuvent être enfichés fils de câblage et pattes de composants électroniques divers.

Sous la plaque, un réseau de bandes métalliques conductrices connecte ces trous selon un: schéma préétabli 

Page 19: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Les bandes horizontales en haut et en bas sont prévues pour amener l'alimentation et la masse dans tout le montage. Les composants câblés au centre de la plaque peuvent être ainsi reliés plus facilement au 5 V (ou toute autre tension prévue) et au 0 V. Certaines plaques ont des bandes rouges et bleues pour repérer 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 intégrés de chevaucher l'intervalle et d'avoir chacune de ses pattes, situées de part et d'autre, connectées à un jeu de trous différent.

Par exemple, avec les quatre montages suivants :

Le montage 1 n'est pas correct, la cathode (-) et l'anode (+) de la LED sont reliées entre elles.

Les montages 2 et 3 sont corrects. Dans les deux montages, une LED et une résistance sont montées en série 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 connectée à un jeu de trous différent.

Page 20: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

IV. Le capteur de distance à ultrasons SRF-05

IV-A. Présentation du capteur

Ce genre de capteur est muni d'une paire d' « yeux », un émetteur qui émet un son à une fréquence de 40 kHz (et donc dans le domaine des ultrasons) et un récepteur qui collecte le son répercuté par l'obstacle.

La distance à l'obstacle peut alors être calculée par le temps mis par le son pour faire l'aller-retour, la vitesse du son étant à peu près 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 caractéristiques du module et son fonctionnement détaillé dans les spécifications techniques.

En deux mots, la portée de ce module ultrason est de 3 cm à 4 m. La détection de l'obstacle se produit normalement dans un cône de 30°.

Le module ne peut faire des mesures que toutes les 50 ms (millisecondes), c'est-à-dire 20 fois par seconde.

Page 21: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

IV-B. Connectique et mode de fonctionnement

Dans cet article, nous utiliserons exclusivement le mode à Trigger et Echo séparés.

Voici donc les broches de connexion utilisées dans ce mode :

alimentation 5 volts ; broche de communication Echo (broche configurée en sortie) ; broche de communication Trigger (broche configurée en entrée) ; masse 0 volt.

IV-C. Principe de fonctionnement

Je reprends ici les explications de la documentation.

Pour utiliser le SRF-05, il faut lui envoyer une demande de mesure, que l'on appelle Trigger. C'est une impulsion de 5 volts dont la durée est de 10 µs (microsecondes) minimum. Par précaution, il est conseillé d'envoyer un signal Trigger dont la durée est entre 12 et 15 µs.

Dès qu'il reçoit ce signal, le SRF-05 envoie un train d'ultrasons de 40 kHz (huit signaux de courtes périodes). Dès l'envoi du dernier ultrason, le SRF-05 envoie un signal sur la broche Echo qu'il maintient à 5 volts jusqu'à ce qu'il reçoive un retour des ultrasons. À ce moment-là, il redescend le signal Echo à la masse (0 volt).

Nous avons donc un signal Echo dont la durée est proportionnelle à la distance entre le SRF-05 et l'objet.

Le signal Echo redescend à la masse au bout de 30 ms si aucun obstacle n'est détecté (time-out).

Afin d'éviter des résultats faussés par des mesures lancées quasi simultanément, il est recommandé d'attendre 50 ms entre deux demandes de mesure, ce qui permet de déclencher jusqu'à 20 mesures par seconde d'utilisation au maximum.

Le principe du fonctionnement est résumé sur le chronogramme constructeur ci-dessous :

Page 22: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

IV-D. Montage du capteur

Dans la suite de ce tutoriel, les broches Echo et Trigger seront connectées respectivement aux broches numériques D11 et D12 de la carte Arduino.

Voici un schéma et une photo de cette première maquette :

IV-E. La gestion du capteur par programmation

Une fois assimilé le principe de fonctionnement du capteur, il ne nous reste plus qu'à gérer la programmation des broches Echo et Trigger reliées à deux broches numériques de la carte Arduino.

Le jeu d'instructions de haut niveau proposé par les concepteurs du langage nous facilite la vie. La gestion s'opère en trois temps :

on configure deux broches de l'Arduino avec l'instruction pinMode : Sélectionnez

pinMode(ECHO_PIN, INPUT); // la broche ECHO de la carte est une entrée numériquepinMode(TRIGGER_PIN, OUTPUT); // la broche TRIGGER de la carte est une sortie numérique

pour déclencher la mesure, on envoie une impulsion sur la broche Trigger pendant une douzaine de microsecondes grâce à l'instructiondigitalWrite :

 Sélectionnez

digitalWrite(TRIGGER_PIN, HIGH); // signal TRIGGER à l'état HAUT (5V)delayMicroseconds(12); // durée de l'état haut = 12 microsecondes

Page 23: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

digitalWrite(TRIGGER_PIN, LOW); // signal TRIGGER à l'état BAS (0V)

on « attend » le retour du signal Echo à l'état BAS et on récupère la durée pendant laquelle le signal Echo était maintenu à l'état HAUT. Tout cela est rendu très facile avec l'instruction pulseIn.

 Sélectionnez

echoPulseTime = pulseIn(ECHO_PIN, HIGH); // attend le retour du signal ECHO au niveau BAS et retourne la durée du signal

Le programme complet avec l'affichage de la valeur brute de la durée du signal Echo dans le moniteur Série donnerait ceci :

 

Sélectionnez

/* 1er programme SRF-05*/

#define ECHO_PIN 11 // broche ECHO du SRF05 sur D11#define TRIGGER_PIN 12 // broche TRIGGER du SRF05 sur D12unsigned long echoPulseTime = 0; // durée du signal ECHO en microsecondes

void setup() {// configuration des E/S numériques de la carte Arduino pinMode(ECHO_PIN, INPUT); // la broche ECHO de la carte est une entrée numérique pinMode(TRIGGER_PIN, OUTPUT); // la broche TRIGGER de la carte est une sortie numérique

// initialisation du port série à 115200 bauds Serial.begin(115200);}

void loop() {// déclenchement de la mesure digitalWrite(TRIGGER_PIN, HIGH); // signal TRIGGER à l'état HAUT (5V) delayMicroseconds(12); // durée de l'état haut = 12 microsecondes digitalWrite(TRIGGER_PIN, LOW); // 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 durée du signal

Serial.println(echoPulseTime); // affichage du résultat brut dans le moniteur Série delay(50); // temporisation en ms avant de recommencer la prochaine mesure}

N'oubliez pas que le programme est « flashé » dans la mémoire du microcontrôleur. Grâce à l'objet Serial, vous établissez une connexion série entre la carte Arduino et l'ordinateur via le câble USB pendant le déroulement du programme. Les méthodes Serial.print et Serial.printlnpermettent de communiquer les mesures à l'ordinateur et les afficher dans le moniteur Série (ne pas oublier de régler la vitesse de transmission conformément à la déclaration Serial.begin(115200)).

Page 24: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Communication Série : Arduino vers PC

Voilà une méthode très pratique en phase de test et qui permet de rendre compte très facilement du fonctionnement du capteur (en plus de la petite LED rouge sur la façade arrière du capteur qui doit clignoter à la fréquence des déclenchements).

IV-F. Vers un fonctionnement multitâche - La bibliothèque NewPing

Ce premier programme, fonctionnel au premier abord, présenterait toutefois un inconvénient majeur si vous aviez à gérer un fonctionnement multitâche tel celui d'un robot dont on doit à la fois gérer le déplacement tout en détectant les obstacles alentour.

Page 25: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Le fonctionnement séquentiel du programme avec les instructions pulseIn et delay mettent en effet inutilement le microcontrôleur « en attente » rendant toute détection du monde extérieur inopérante pendant plusieurs fractions de seconde à chaque passage dans la boucle loop.

Par chance, tous les microcontrôleurs actuels, et celui d'Arduino ne fait pas exception, sont équipés de moyens matériel et logiciel pour gérer lesinterruptions. On rappelle qu'une interruption est un événement pouvant se produire n'importe quand pendant le déroulement d'un programme. Lors d'une interruption (déclenchée périodiquement grâce à un Timer ou sur un événement extérieur comme un front montant ou descendant d'un signal numérique capturé sur une broche, voir la fonction attachInterrupt()), le programme est interrompu et un sous-programme de gestion de l'interruption est appelé. Une fois le sous-programme terminé, le programme principal reprend son cours normalement.

Le jeu d'instructions par défaut proposé par Arduino pour la gestion des interruptions n'est pas très riche et n'autorise que les interruptions résultant d'un changement d'état (front montant ou descendant) d'une entrée numérique externe (et pas sans inconvénient en plus).

Fort heureusement, le jeu d'instructions standards peut être enrichi grâce aux nombreuses bibliothèques disponibles sur le Net comme celle qui permet de gérer des interruptions périodiques avec le Timer2 du microcontrôleur AVR Atmel de l'Arduino.

Afin de nous faciliter les développements et rendre la gestion des interruptions la plus transparente possible, je vous propose d'utiliser la bibliothèque NewPing que nous allons décrire ci-après.

IV-F-1. Installation de la bibliothèque

Vous pouvez télécharger cette bibliothèque en allant faire un tour dans l'aire de jeu Arduino .

L'installation d'une bibliothèque tierce et compatible avec l'environnement Arduino est très simple. Une fois l'archive décompressée, vous la déplacez dans le sous-répertoire libraries du dossier d'installation :

Sous Linux, il faut aller voir du côté du répertoire /usr/share/arduino/libraries.

C'est tout ! Lorsque vous démarrez l'IDE Arduino, des exemples d'utilisation sont proposés dans le menu Fichier>Exemples>Newping :

Page 26: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Ces exemples mettent en œuvre la bibliothèque NewPing en incluant la directive :

 

Sélectionnez

#include <NewPing.h>

IV-F-2. Gestion des interruptions

J'ai repris l'exemple NewPingEventTimer, ce qui donne le code suivant :

NewPingEventTimer

Sélectionnez

/* --------------------------------------------------------------------------- d'après l'exemple NewPing/NewPingEventTimer ---------------------------------------------------------------------------*/#include <NewPing.h>

#define ECHO_PIN 11 // broche Echo sur D11#define TRIGGER_PIN 12 // broche Trigger sur D12

#define MAX_DISTANCE 50 // distance maximale (en centimètres) que nous voulons "pinger". La portée maximale du SRF-05 est 400 cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // instanciation d'un nouvel objet NewPing.

unsigned int pingSpeed = 50; // période d'envoi du "ping". Une période de 50 millisecondes correspond à 20 "pings" par seconde.unsigned long pingTimer; // timer, pour le prochain "ping".

void setup() { Serial.begin(115200); // moniteur Série à 115200 bauds pour afficher les résultats. pingTimer = millis(); // contient le temps écoulé en millisecondes depuis le début de l'exécution du programme. pingTimer=maintenant.

Page 27: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

}

void loop() { if (millis() >= pingTimer) { // si temps écoulé depuis dernier "ping", on fait à nouveau un "ping". pingTimer += pingSpeed; // temps pour déclenchement du prochain "ping" sonar.ping_timer(echoCheck); // envoie un "ping". Interruption toutes les 24 microsecondes (interruption du Timer 2) et relève si le ping est complété dans la fonction echoCheck. } // // autres tâches ici, fonctionnement en multitâche //}

void echoCheck() { // sous-programme d'interruption if (sonar.check_timer()) { // "ping" complété dans les limites de distance souhaitées ? // ajouter votre code d'interruption ici Serial.print("Ping: "); // affichage dans le moniteur Série Serial.print(sonar.convert_cm(sonar.ping_result)); // "ping" complété, convertit les microsecondes de la durée de l'impulsion en centimètres. Serial.println("cm"); }}

Vous pouvez télécharger directement ce programme dans la carte et le tester. Pensez à connecter les broches Echo et Trigger du capteur respectivement aux broches numériques 11 et 12 de la carte Arduino. Dans le moniteur Série, réglez la vitesse de transmission à 115 200 bauds pour voir défiler les mesures du capteur.

L'objet NewPing est instancié à la ligne :

 

Sélectionnez

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // instanciation d'un nouvel objet NewPing.

Un « ping » est déclenché toutes les 50 ms, mais cette fois sans faire de pause dans le programme avec un delay(), grâce à la fonctionmillis().

On ordonne alors une interruption toutes les 24 μs(*) pour « checker » l'état de la broche Echo du capteur et incrémenter un compteur. Lorsqu'un retour à l'état LOW est détecté, le « ping » est complété et on peut convertir la durée du signal en distance.

(*) On peut faire remarquer par un petit calcul que si on éloigne ou rapproche un obstacle de 4  mm, la durée du signal Echo varie justement d'environ 24 μs. La précision de mesure est donc de 4 mm par

Page 28: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

défaut, mais celle-ci peut être modifiée en changeant la ligne du fichier d'entête libraries/NewPing/NewPing.h :

 

Sélectionnez

#define ECHO_TIMER_FREQ 24

Il n'y a plus d'attente ou de délai dans la boucle principale et la scrutation périodique de l'état du capteur en toute transparence par interruption autorise un fonctionnement multitâche.

Vous devriez d'ailleurs constater un affichage plus rapide et plus fluide des résultats dans le moniteur Série par rapport au premier programme.

V. Le « LCD Keypad Shield »

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 bibliothèqueLiquidCrystal proposée par défaut et dont les exemples d'utilisation sont disponibles dans l'IDE en suivant le menuFichier>Exemples>LiquidCrystal.

V-A. Mode de fonctionnement de l'afficheur

La syntaxe d'instanciation d'un objet LiquidCrystal diffère selon le mode de fonctionnement de l'afficheur :

 

Sélectionnez

LiquidCrystal lcd(rs, enable, d4, d5, d6, d7) // mode 4 bits - RW non connectée (le plus simple!)LiquidCrystal lcd(rs, rw, enable, d4, d5, d6, d7) // mode 4 bits - RW utiliséeLiquidCrystal lcd(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) // mode 8 bits - RW non connectéeLiquidCrystal lcd(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) //mode 8 bits - RW utilisée

Dans la documentation du shield, vous devriez retrouver le schéma électrique :

Page 29: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Dans notre cas, l'afficheur fonctionne avec quatre bits de données (D4, D5, D6 et D7). Les broches de commandes RS et E seront connectées 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 différent, ressemblera à :

 

Sélectionnez

#include <LiquidCrystal.h>

#define RS 8#define E 9#define DB4 4#define DB5 5#define DB6 6#define DB7 7

LiquidCrystal lcd(RS, E, DB4, DB5, DB6, DB7);

Vous pouvez maintenant enficher le shield sur la carte Arduino (débranchez les fils du capteur à ultrasons reliés à la carte pour le moment) afin de tester et découvrir cette bibliothèque en parcourant les codes des nombreux exemples fournis, dont le fameux « HelloWorld ».

Vous trouverez la référence de la bibliothèque sur le site officiel et en français sur le site www.mon-club-elec.fr.

V-B. Intégration du capteur à ultrasons SRF-05

V-B-1. Montage

D'après la documentation du shield, les connecteurs mâles repérés sur la photo ci-dessous reprennent les broches D11 et D12 de la carte Arduino ainsi que des broches 0 et 5 volts pour alimenter le capteur.

Page 30: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Nous pouvons maintenant câbler le capteur ultrason sur le shield lui-même enfiché sur la carte Arduino (« le fil rouge sur le bouton rouge, le fil vert sur le bouton vert… »).

V-B-2. Le code d'affichage de la distance de l'obstacle sur l'afficheur LCD

Pour afficher les informations du capteur sur l'afficheur LCD, il faut reprendre le code du paragraphe IV.F.2 en évoquant cette fois les commandes setCursor() et print() :

 

Sélectionnez

/* --------------------------------------------------------------------------- Affichage de la distance en centimètres ---------------------------------------------------------------------------*/#include <NewPing.h>#include <LiquidCrystal.h>

#define ECHO_PIN 11 // broche Echo sur D11#define TRIGGER_PIN 12 // broche Trigger sur D12

#define MAX_DISTANCE 200 // distance maximale (en centimètres) que nous voulons "pinger". La portée maximale du SRF-05 est 400 cm.

Page 31: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

#define RS 8#define E 9#define DB4 4#define DB5 5#define DB6 6#define DB7 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; // période d'envoi du "ping". Une période de 50 millisecondes correspond à 20 "pings" par seconde.unsigned long pingTimer; // timer, pour le prochain "ping".

void setup() { Serial.begin(115200); // moniteur série à 115200 bauds pour afficher les résultats. lcd.begin(16,2); // intialisation afficheur 16 x 2 caractères pingTimer = millis(); // contient le temps écoulé en millisecondes depuis le début de l'exécution du programme. pingTimer=maintenant.}

void loop() { if (millis() >= pingTimer) { // si temps écoulé depuis dernier "ping", on fait à nouveau un "ping". pingTimer += pingSpeed; // temps pour déclenchement 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 2) et relève si le ping est complété dans la fonction echoCheck. } // // autres tâches ici, fonctionnement en multitâche //}

void echoCheck() { // sous-programme d'interruption if (sonar.check_timer()) { // "ping" complété dans les limites de distance souhaitées ? // ajouter votre code d'interruption ici lcd.setCursor(13,0); lcd.print(" "); // efface l'étoile, le "ping" est complété printDistance(sonar.convert_cm(sonar.ping_result), " cm"); // affichage en centimètres sur LCD }}

void printDistance(unsigned int distance, String unit ){#ifdef DEBUG // si mode DEBUG Serial.print("Ping: "); // affichage dans le moniteur série 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

Page 32: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

lcd.print(distance); lcd.print(unit); }

Le mode DEBUG peut être réactivé à tout moment en phase de test avec affichage sur le moniteur Série.

De plus, si la mesure n'est pas complétée après un « ping » (parce que la distance est supérieure à MAX_DISTANCE), l'affichage est figé avec une étoile (*) dessinée sur l'écran LCD.

Petit raffinement de l'IDE Arduino, vous pouvez rédiger le code de la fonction printDistance() dans un onglet séparé, le premier onglet contenant le programme principal.

VI. Programmation d'un bouton

En plus de son afficheur LCD, le shield comporte sur sa façade cinq boutons programmables nommés SELECT, LEFT, RIGHT, UP, DOWN (ainsi qu'un bouton RST, pour faire un « Reset » de la carte, situé trop à proximité à mon goût).

Page 33: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

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 centimètres (cm) ou en pouces (in). Certes, la fonctionnalité est discutable , mais la programmation d'un bouton vous sera utile dans de nombreuses autres circonstances.

VI-A. Fonctionnement des boutons, un peu de physique/électricité

Voici l'extrait du schéma électrique fourni par le constructeur concernant les cinq boutons-poussoirs.

La tension appliquée à l'entrée analogique A0 de la carte dépend de la touche pressée. Par exemple si l'utilisateur presse le bouton SELECT (comportement d'un interrupteur fermant un circuit normalement ouvert), le schéma électrique équivalent est :

Page 34: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Un retour au principe du diviseur de tension permet de calculer la tension à l'entrée A0 :

Soit la valeur théorique en sortie du convertisseur Analogique-Numérique (10 bits) :

Vous pouvez faire de même pour les autres boutons.

Ce principe de clavier analogique est fort simple, ne nécessite aucune bibliothèque extérieure et ne consomme qu'une entrée de la carte Arduino.

Pour vérifier que le principe fonctionne, il vous suffit de reprendre le programme exemple AnalogReadSerial (dans le menuFichier>Exemples>01.Basics) qui se contente d'afficher en boucle la valeur lue sur l'entrée A0 dans le moniteur Série :

AnalogReadSerial

Sélectionnez

/* 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}

Téléchargez ce programme et testez-le en pressant le bouton SELECT (on oublie et on met de côté le capteur ultrason pour ce test) :

Page 35: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

N'oubliez pas de régler la vitesse de transmission à 9 600 bauds dans le moniteur Série conformément à la déclaration du programme.

Lorsque la touche SELECT est maintenue pressée, la valeur lue tourne autour de 744 dans mon cas. L'écart par rapport à la valeur théorique (741), très faible, mais qui peut fluctuer d'un LCD KeyPad Shield à l'autre, peut s'expliquer par la précision sur les valeurs des résistances électriques.

VI-B. Gestion du bouton

On revient à l'idée de basculer l'affichage de la distance en centimètres ou en pouces à chaque fois que l'utilisateur appuie sur le bouton SELECT.

Une solution simple consiste à relever périodiquement l'état du bouton (une fois à chaque passage dans la boucle loop() suffira dans notre cas), ici aux instants 0, t1, t2, t3…

Le changement d'unité doit intervenir seulement dans le cas où le bouton bascule de l'état « relâché » à l'état « appuyé » entre deux instants consécutifs, ici entre les instants t4 et t5.

Seulement, la réalité du terrain complique les choses puisque la séquence d'appui du bouton en situation réelle nous donnera un chronogramme qui ressemble plutôt à la figure ci-dessous :

Page 36: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Les boutons-poussoirs possèdent en effet un inconvénient de taille, ils sont sujets aux rebonds, c'est-à-dire qu'ils ont la désagréable habitude de ne pas passer directement d'un état à l'autre. Pendant une durée de l'ordre de quelques millisecondes, l'état du bouton va osciller. Chaque rebond, même ceux qui se produisent pendant le relâchement du bouton, risque alors d'être interprété comme une demande de changement d'unité par l'utilisateur.

À défaut de solution matérielle immédiate 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 après la détection 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 opérer le changement d'unité pour la distance (centimètres - pouces) :

C'est ce principe que nous retiendrons par la suite, au risque de sacrifier un peu sur la fréquence de déclenchement des mesures de distance à cause de la pause anti-rebonds supplémentaire.

VI-B-1. Une classe personnalisée Button

Pour la gestion des boutons, pourquoi ne pas écrire une classe personnalisée, au sens du langage C++, et réutilisable pour d'autres applications ?

Rappelez-vous que le langage Arduino dans l'IDE agit comme une enveloppe du langage C++ avec un compilateur AVR GCC sous-jacent.

Si vous n'êtes pas familier des classes C++, vous pouvez consulter la ressource : How to write libraries for the Arduino   ?  (ou plus généralement dans les tutoriels C++ pour débuter sur Developpez.net).

Le code de la classe Button proposé ci-dessous n'est qu'une ébauche qui ne demande qu'à être complétée.

Le fichier d'entête :

Button.h

Sélectionnez

#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();

Page 37: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

~Button(); };#endif

Le code de la classe :

ButtonClass

Sélectionnez

/********************************************************************Classe ButtonCette classe, très incomplète, permet de détecter l'appui d'un boutond'un clavier analogique sur l'entrée A0.http://www.developpez.net/forums/u283256/f-leb/ aout 2013Ce code est dans le domaine public.*********************************************************************/#include "Button.h"

Button::Button(int adcValue, int bounceDelay){ _adcValue=adcValue; // valeur issue de la conv. analogique-numérique _bounceDelay=bounceDelay; // pause anti-rebonds _buttonPrevious=false; _buttonHysteresis=10; // fourchette de détection: adcValue + ou - hysteresis}

boolean Button::pressed(){ // retourne true si basculement détecté int buttonValue = analogRead(A0); // lecture de l'entrée analogique A0 boolean buttonJustPressed = ( buttonValue >= _adcValue - _buttonHysteresis ) && ( buttonValue <= _adcValue + _buttonHysteresis ); boolean toggle = buttonJustPressed && !_buttonPrevious; // bascule si bouton pressé ET état précédent NON pressé _buttonPrevious = buttonJustPressed; // mémorise l'état du bouton if (toggle){ delay(_bounceDelay); // pause anti-rebonds buttonValue = analogRead(A0); // nouvelle lecture de l'entrée analogique A0 buttonJustPressed = ( buttonValue >= _adcValue - _buttonHysteresis ) && ( buttonValue <= _adcValue + _buttonHysteresis ); if (buttonJustPressed){ return (true); } } return (false); }

Button::~Button(){}

La méthode pressed() retournera true si le basculement de l'état « bouton non pressé » à « bouton pressé » est détecté compte tenu des rebonds qui seront ignorés grâce à la pause anti-rebonds.

L'état du bouton est mémorisé dans la donnée membre _buttonPrevious pour pouvoir être comparé à son état au prochain appel de la méthode.

La détection du changement d'état du bouton se fait au niveau de la ligne :

 

Page 38: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Sélectionnez

boolean toggle = buttonJustPressed && !_buttonPrevious; // bascule si bouton pressé ET état précédent NON pressé

Remarquez ensuite comment, en cas de changement d'état, une nouvelle lecture du port analogique A0 est effectuée après la pause anti-rebonds :

 

Sélectionnez

if (toggle){ delay(_bounceDelay); // pause anti-rebonds buttonValue = analogRead(A0); // nouvelle lecture de l'entrée analogique A0 buttonJustPressed = ( buttonValue >= _adcValue - _buttonHysteresis ) && ( buttonValue <= _adcValue + _buttonHysteresis ); if (buttonJustPressed){ return (true); } }

Voici le code d'un programme de démonstration mettant en œuvre la classe Button :

DemoButtonClass

Sélectionnez

/******************************************* test appui sur bouton SELECT *******************************************/#include "Button.h"#define SELECT 744 // valeur constatée pour la touche SELECT#define BOUNCE_DELAY 5 // pause anti-rebonds = 5 ms

Button myButton(SELECT, BOUNCE_DELAY); // instanciation du bouton SELECTint i=1;

void setup() { Serial.begin(115200);}

void loop() { if (myButton.pressed()){ // si la touche SELECT est pressée Serial.print("appui sur SELECT : "); Serial.println(i); i++; } }

Une fois de plus, le programme de démonstration, l'entête et la classe sont rédigés dans des onglets séparés de l'interface :

Page 39: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

Vous pouvez télécharger le code dans la carte et tester son fonctionnement dans le moniteur Série (115 200 bauds) :

Si vous souhaitez rendre la classe réutilisable et la rendre disponible dans l'IDE, comme pour la bibliothèque NewPing, il vous suffit de suivre les étapes de l'article : Writing a Library for Arduino.

VII. La maquette finale

Nous rassemblons les morceaux :

les distances mesurées entre 0 et MAX_DISTANCE sont retournées. Une petite étoile (*) s'affichera sur l'écran LCD si la mesure n'est pas complétée (distance > MAX_DISTANCE) ;

la distance est affichée en centimètres par défaut, mais l'appui sur le bouton SELECT permet de basculer d'une unité à l'autre (centimètres ou pouces) ;

Page 40: ekladata.comekladata.com/jLb-cM134RB-lTUH4NVt9bpNumg/ARDUINO-et-son-u…  · Web view(1). Évidemment, en grand écumeur des forums Developpez.net, la programmation en général

afin de visualiser plus facilement la proximité de l'obstacle, une animation graphique de type bargraphe a été rajoutée.

Une fois le programme téléchargé, le dispositif alimenté par une pile carrée 9 V est autonome.

L'archive du programme complet est disponible ici : SRF05_LCDKeypadShield.zip

Le code a été rédigé avec la version 1.0.1 de l'IDE Arduino (Windows). N'oubliez pas d'installer la bibliothèque NewPing.

VIII. Conclusion

Voilà une première maquette réalisée à base d'Arduino. Le dispositif affiche la distance mesurée par le capteur sur un écran LCD (20 mesures par seconde) selon l'unité choisie (centimètres ou pouces) grâce à un bouton-poussoir. La maquette a été réalisée pas à pas en affichant les résultats bruts dans le moniteur Série dans un premier temps.

L'IDE offre une interface sobre (coloration syntaxique, onglets, mais pas d'aide syntaxique, d'autocomplétion, de pliage de portion de code) avec de nombreux exemples de programmes de démonstration pour les premiers tests. Le langage, à base C/C++, offre un jeu d'instructions de haut niveau pour accéder aux entrées/sorties de la carte. Dans ce tutoriel, nous avons d'ailleurs exploité les entrées/sorties D11 et D12 pour la gestion du capteur et une entrée analogique A0 pour le bouton-poussoir. Les autres entrées/sorties numériques de la carte que nous avons déclarées sont exploitées en toute transparence par le LCD Keypad Shield grâce à la bibliothèque LiquidCrystal.

Un afficheur LCD est un objet normalement complexe à exploiter qui nécessite un circuit électronique spécialisé. Mais sous forme de shield avec la bibliothèque logicielle adaptée, le débutant peut rapidement exploiter ses fonctionnalités pour arriver à ses fins. La gestion pointue de l'électronique pourra être étudiée plus tard. On ne doit cependant pas ignorer les aspects physiques, comprendre les caractéristiques électriques, le principe de fonctionnement de ce capteur à ultrasons ou les phénomènes de rebond dans les commutateurs est essentiel. Il en sera de même lorsque vous interfacerez des moteurs électriques, des lampes ou tout autre dispositif complexe.

Dans la foulée de cet article, vous pouvez faire évoluer le dispositif en incluant un signal sonore modulé en fonction de la distance de l'obstacle à la façon d'un radar de recul équipant les véhicules automobiles. Rien de bien compliqué avec un buzzer piézo-électrique et la bibliothèque Tone pour l'exploiter.

Bref, Arduino et son écosystème sont sans doute le moyen le plus rapide pour développer une application ou mettre au point une prémaquette de système embarqué sans être un spécialiste pointu de la programmation des microcontrôleurs ou de l'électronique. Vous êtes finalement prêt à vous lancer et rejoindre la communauté.

D'aprés: www.developpez.com