Cours Arduino
Cours Arduino
I
3.3.1 Envoyer des données .............................................................................................. 28
3.3.2 Recevoir des données ............................................................................................. 30
3.4 Application .................................................................................................................... 31
Chapitre4 : Les grandeurs analogiques
4.1 Les entrées analogiques ................................................................................................. 37
4.1.1 Présentation ............................................................................................................ 37
4.1.2 Les convertisseurs analogiques -> numérique ou CAN ......................................... 37
4.2 Exercice d’application ................................................................................................... 38
Chapitre5 : L'affichage
5.1 Les ecrans LCD ............................................................................................................. 42
5.2 Exercice d’application ................................................................................................... 44
II
Chapitre 1 :
Découverte de l’Arduino
Vue d’ensemble
Cette leçon présente l’historique et l’utilisation des cartes Arduino.
Objectifs
Ce chapitre a pour objectifs de permettre aux étudiants d’acquérir les connaissances de
base de la carte arduino et de ses nombreux avantages.
Pré-requis
• Systèmes logiques
• Electronique numérique
• Programmation structurée
Durée
• 3H
Eléments de contenu
1. Présentation
2. Base élémentaires
3. Logiciel Arduino
4. Carte Arduino
5. Langage Arduino
6. Exercices d’application
Chapitre1 : Présentation
1.1 Présentation
1.1.1 Historique
Le projet Arduino est né en hiver 2005. Massimo Banzi enseigne dans une école de Design à
Ivrea en Italie, et souvent ses étudiants se plaignent de ne pas avoir accès à des solutions bas
prix pour accomplir leurs projets de robotique. Banzi en discute avec David Cuartielles, un
ingénieur Espagnol spécialisé sur les microcontrôleurs…
Ils décident de créer leur propre carte en embarquant dans leur histoire un des étudiants de
Banzi, David Mellis qui sera chargé de créer le langage de programmation allant avec la carte.
1
Chapitre1 : Présentation
• Le matériel : cartes électroniques dont les schémas sont en libre circulation sur
internet.
Cette liberté a une condition : le nom « Arduino » ne doit être employé que pour les cartes «
officielles ». En somme, les concepteurs ne pouvant pas fabriquer ses propres cartes sur le
modèle Arduino et lui assigner le nom « Arduino ».
• une BARRE DE MENUS comme pour tout logiciel une interface graphique (GUI),
• une BARRE DE BOUTONS qui donne un accès direct aux fonctions essentielles du
logiciel et fait toute sa simplicité d'utilisation,
• un EDITEUR (à coloration syntaxique) pour écrire le code de programme, avec
onglets de navigation,
• une ZONE DE MESSAGES qui affiche indique l'état des actions en cours,
• une CONSOLE TEXTE qui affiche les messages concernant le résultat de la
compilation du programme
2
Chapitre1 : Présentation
• un TERMINAL SERIE (fenêtre séparée) qui permet d'afficher des messages textes
reçus de la carte Arduino et d'envoyer des caractères vers la carte Arduino. Cette
fonctionnalité permet une mise au point facilitée des programmes, permettant
d'afficher sur l'ordinateur l'état de variables, de résultats de calculs ou de conversions
analogique-numérique : un élément essentiel pour améliorer, tester et corriger ses
programmes.
Le code écrit avec le logiciel Arduino est appelé un programme (ou une séquence - sketch en
anglais) :
• Ces programmes sont écrits dans l'éditeur de texte. Celui-ci a les fonctionnalités
usuelles de copier/coller et de rechercher/remplacer le texte.
• la zone de messages donne l'état de l'opération en cours lors des sauvegardes, des
exportation et affiche également les erreurs.
• La console texte affiche les messages produits par le logiciel Arduino incluant des
messages d'erreur détaillés et autres informations utiles.
• la barre des menus permet d'accéder à toutes les fonctionnalités du logiciel Arduino.
3
Chapitre1 : Présentation
4
Chapitre1 : Présentation
Appuyez alors sur le bouton Verify de la barre d'outils pour lancer la vérification du code :
Si tout va bien, aucun message d'erreur ne doit apparaître dans la console et la zone de
message doit afficher Done Compiling attestant que la vérification s'est bien déroulée.
Avant de transférer la programme vers la carte Arduino, l’utilisateur devez vérifier que il a
bien sélectionné la bonne carte Arduino depuis le menu Tools>Board (Outils>Carte).
5
Chapitre1 : Présentation
Une fois le transfert terminé, le logiciel Arduino doit afficher un message indiquant que le
transfert est bien réalisé.
1.2.5 Librairies
Les librairies fournissent des fonctions nouvelles à utiliser dans les programmes, par exemple
pour utiliser un matériel précis (un afficheur LCD...) ou manipuler des données. Pour utiliser
une librairie, la sélectionner depuis le menu Sketch > Import Library (Programme > Importer
Librairie). Cela insèrera une ou plusieurs instructions #include au début de le programme et
compilera la librairie avec le programme.
6
Chapitre1 : Présentation
Il existe deux modèles d’Arduino Uno: l’un avec un microcontrôleur de grande taille (DIP), et
un autre avec un microcontrôleur dit SMD (SMD: Surface Mounted Device, soit composants
montés en surface, en opposition aux composants qui traversent la carte électronique et qui
sont soudés du côté opposé). D’un point de vue utilisation, il n’y a pas de différence entre les
deux types de microcontrôleurs.
7
Chapitre1 : Présentation
• La LED jaune en haut: elle est connectée à une broche du microcontrôleur et va servir
pour tester le matériel.
• Les deux LED (orange): servent à visualiser l'activité sur la voie série (une pour
l'émission et l'autre pour la réception). Le téléchargement du programme dans le
microcontrôleur se faisant par cette voie, on peut les voir clignoter lors du chargement.
• 0 à 13 : Entrées/sorties numériques
• A0 à A5 : Entrées/sorties analogiques
• GND : Terre ou bien masse (0V)
• 5V : Alimentation +5V
• 3.3V : Alimentation +3.3V
• Vin : Alimentation non stabilisée (= le même voltage que celui à l’entrée de la carte)
Avec Arduino, nous devons utiliser un code minimal lorsque l'on crée un programme. Ce code
permet de diviser le programme que nous allons créer en deux grosses parties.
8
Chapitre1 : Présentation
{
//contenu de votre programme
}
1.4.1.2 La fonction
Dans ce code se trouvent deux fonctions. Les fonctions sont en fait des portions de code.
Cette fonction setup() est appelée une seule fois lorsque le programme commence. C'est
pourquoi c'est dans cette fonction que l'on va écrire le code qui n'a besoin d'être exécuté une
seule fois. On appelle cette fonction : "fonction d'initialisation". On y retrouvera la mise en
place des différentes sorties et quelques autres réglages. C'est un peu le check-up de
démarrage. Une fois que l'on a initialisé le programme il faut ensuite créer son "cœur",
autrement dit le programme en lui-même.
C'est donc dans cette fonction Loop() où l'on va écrire le contenu du programme. Il faut
savoir que cette fonction est appelée en permanence, c'est-à-dire qu'elle est exécutée une fois,
puis lorsque son exécution est terminée, on le ré-exécute et encore et encore. On parle de
boucle infinie.
Les variables booléennes sont des variables qui ne peuvent prendre que deux valeurs : VRAI
ou FAUX. Elles sont utilisées notamment dans les boucles et les conditions.
boolean variable = FALSE; //variable est fausse car elle vaut FALSE, du te
rme anglais "faux"
boolean variable = TRUE; //variable est vraie car elle vaut TRUE, du term
e anglais "vrai"
Quand une variable vaut "0", on peut considérer cette variable comme une variable
booléenne, elle est donc fausse. En revanche, lorsqu'elle vaut "1" ou n'importe quelle valeurs
différente de zéro, on peut aussi la considérer comme une variable booléenne, elle est donc
vraie. Voilà un exemple :
9
Chapitre1 : Présentation
int variable = 42; //variable est vraie car sa valeur est différente d
e 0
Le langage Arduino accepte aussi une troisième forme d'écriture (qui lui sert pour utiliser les
broches de sorties du microcontrôleur) :
Nous nous servirons de cette troisième écriture pour allumer et éteindre des lumières...
1.4.3 Reference :
Structure
Fonctions de base Structures de contrôle Syntaxe de base
Ces deux fonctions sont •if • ; (point virgule)
obligatoires dans tout
• if...else • {} (accolades)
programme en langage
Arduino: • for • / / (commentaire sur une
• void setup() • switch case ligne)
• void loop() • while • /* * / (commentaire sur
• do... while plusieurs lignes)
• break • #define
• continue • #include
• return
• goto
Opérateurs Opérateurs de Opérateurs
arithmétiques comparaison booléens
• = (égalité) • == (égal à) • && (ET booléen)
• + (addition) • != (différent de) • | | (OU booléen)
• - (soustraction) • < (inférieur à) • ! (NON booléen)
• * (multiplication) • > (supérieur à)
• / (division) • <= (inférieur ou égal à)
• % (modulo) • >= (supérieur ou égal à)
Pointeurs Opérateurs bit à bit Opérateurs composés
• * pointeur • & (ET bit à bit) • ++ (incrémentation)
• & pointeur • | (OU bit à bit) • -- (décrémentation) (à revoir)
Voir également : • ^(OU EXCLUSIF bit à bit) • += (addition composée)
• Manipulation des Ports • ˜ (NON bit à bit) • -= (soustraction composée)
• << (décalage à gauche) • *= (multiplication composée)
10
Chapitre1 : Présentation
Variables et constantes
Les variables sont des expressions que l’apprenant peut utiliser dans les programmes pour stocker
des valeurs, telles que la tension de sortie d'un capteur présente sur une broche analogique.
Constantes prédéfinies Types des données Conversion des types
Les constantes prédéfinies du Les variables peuvent être de de données
langage Arduino sont des type variés qui sont décrits ci-
• char()
valeurs particulières ayant une dessous.
signification spécifique. • byte()
• boolean
• int()
• char
• HIGH | LOW • long()
• byte
• INPUT | OUTPUT • float()
• in t
• true | false • word()
• unsigned in t
• long
• unsigned long
• float (nombres à
virgules)
• double (nombres à
virgules)
• Les chaînes de
caractères
• objet String NEW
• Les tableaux de
variables
• le mot-clé void
(fonctions)
Fonctions
Entrées/Sorties Numériques Temps Trigonométrie
• pinMode (broche, mode) • unsigned long millis() • sin (rad)
• digitalWrite (broche, valeur) • unsigned long micros() • cos (rad)
• int digitalRead(broche) • delay (ms) • tan (rad)
Entrées analogiques • delayMicroseconds (us) Bits et Octets
11
Chapitre1 : Présentation
12
Chapitre1 : Présentation
void setup() {
// Initialise la broche 10 comme sortie
pinMode(10, OUTPUT);
// Ouvre le port série à 9600 bauds
Serial.begin(9600);
}
void loop() {
digitalWrite(10, HIGH); // allume la LED
delay(500); // attend 500ms
digitalWrite(10, LOW); // éteint la LED
delay(500); // attend 500ms
}
Ce qui a changé par rapport au code précédent, c’est que la valeur de la broche est passée de
13 à 10. En effet, nous avons choisi (arbitrairement) de connecter la LED sur la broche 10.
- Modifie le code 2 pour faire clignoter les deux LEDs en même temps.
void setup()
13
Chapitre1 : Présentation
{
pinMode(10, OUTPUT);
pinMode(12, OUTPUT);
Serial.begin(9600);
}
void loop()
{
digitalWrite(10, LOW);
digitalWrite(12, HIGH);
delay(500);
digitalWrite(10, HIGH);
digitalWrite(12, HIGH);
delay(2000);
}
L’objectif est de faire clignoter une LED 10 fois. Le montage est toujours le même:
/*
Code 3 - Edurobot.ch, destiné au Arduino
Objectif: faire clignoter 10 fois la LED montée sur le port 10
*/
//***** EN-TETE DECLARATIVE *****
// On déclare les variables, les constantes,...
byte compteur; //On définit la variable "compteur"
//***** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et une seule fois, au
démarrage
du programme
void setup()
{
pinMode(10, OUTPUT); // Initialise la broche 10 comme sortie
Serial.begin(9600); // Ouvre le port série à 9600 bauds
// Exécute le programme entre accolades en partant de zéro et en
incrémentant à
chaque fois la valeur de +1: 0+1/2+1/3+1... jusqu’à ce que la variable
“compteur“ soit égale à 9 (plus petit que 10).
for(compteur=0 ; compteur<10 ; compteur++)
{ // début du programme exécuté 10 fois
digitalWrite(10, HIGH); // allume la LED
delay(500); // attend 500ms
digitalWrite(10, LOW); // éteint la LED
delay(500); // attend 500ms
14
Chapitre1 : Présentation
}
} // fin du programme exécuté 10 fois
void loop() { // vide, car programme déjà exécuté dans setup
}
- Modifier le code pour que les deux LED clignotent en même temps vingt fois.
- Modifier le programme pour que les LED clignotent en alternance vingt fois.
15
Chapitre 2 : Gestion des
Entrées/Sorties
Vue d’ensemble
Cette leçon présente la gestion des entrées/sorties.
Objectifs
Ce chapitre a pour objectifs de permettre aux étudiants d’acquérir les connaissances de
base se rapportant aux objectifs spécifiques suivants:
• Etre capable d’utiliser les capteurs et les actionneurs.
• Voir le résultat de programme en temps réel.
• Gérer un ensemble fini d’éléments dont le nombre varie au cours de l’exécution du
programme.
• Réalisation des prototypes.
Prérequis
• Systèmes logiques
• Electronique numérique
• Programmation
Durée
• 1,5 H
Eléments de contenu
1. Capteurs et Actionneurs
2. Electronique Interactive
3. Exercices d’applications
Chapitre2 : Gestion Entrées/Sorties
Les capteurs sont des composants matériels qui peuvent fournir des informations sur le
monde extérieur. Ceux-ci ont comme rôle de saisir une grandeur physique et de la convertir
en information numérique. Il est ainsi possible de capter la plupart des phénomènes physiques
comme le vent, la pression, la température, la lumière, la torsion, la distance, etc. On peut
classifier l'ensemble des capteurs en trois familles suivant le type d'informations qu'ils
renvoient.
Ce type de capteur renvoie une valeur proportionnelle à la grandeur physique mesurée. Par
exemple une photorésistance (capteur de lumière) est un capteur qui convertit la luminosité en
valeur électrique. Il existe des capteurs analogiques qui renvoient une information linéaire et
d'autres dont la réponse suit une courbe différente.
Pour un capteur, une courbe linéaire signifie que la progression de sa valeur suit une
progression constante et régulière. Une courbe non linéaire appartient à une fonction plus
complexe dont la valeur ne progresse pas également dans le temps.
Les actionneurs sont des composants matériels qui permettent d'agir sur le monde extérieur.
Ceux-ci ont comme rôle de convertir une valeur électrique en action physique. Il existe une
infinité de types d'actionneurs différents et certains sont plus ou moins faciles à utiliser avec
Arduino. Comme pour les capteurs, il existe une multitude de phénomènes physiques sur
17
Chapitre2 : Gestion Entrées/Sorties
lesquels il est possible d'agir par le biais d'actionneurs comme les moteurs électriques,
électroaimants, lumières, LEDs, éléments chauffants utilisés pour concevoir une multitude
d'objets et applications comme des hautparleurs, valves hydrauliques et pneumatiques,
ventilateurs, pompes, ….
Beaucoup de machines et objets qui nous entourent comportent à la fois des capteurs et des
actionneurs. Ils sont tous basés sur les principes de base de l'électronique que nous avons vus
dans le chapitre précédent.
2.1.3 Entrées/sorties
• 6 entrées analogiques.
• 14 entrées/sorties numériques dont 6 peuvent assurer une sortie PWM (voir
explication en bas dans la section « Les sorties numériques »).
Les entrées analogiques lui permettent de mesurer une tension variable (entre 0 et 5 V) qui
peut provenir de capteurs 6 ou d'interfaces divers (potentiomètres, etc.).
Lorsqu'on utilise une entrée numérique, il est important de s'assurer que le potentiel de l'entrée
« au repos » est bien celui auquel on s'attend. En effet, si on laisse l'entrée « libre », c'est-à-
dire non câblée, le potentiel qu'elle prendra ne sera pas nécessairement 0 V. On parle alors de
potentiel flottant car l'électricité statique ambiante ou les perturbations électromagnétiques
peuvent faire apparaitre des valeurs très fluctuantes. Pour s'assurer du bon fonctionnement,
l'on utilise une liaison protégée par une résistance qui va « tirer vers le haut » (5 V) ou « tirer
vers le bas » (0 V) le potentiel au repos, comme une sorte d'élastique. On utilise en général
une résistance de 10 kOhms.
dans un montage « tiré vers le haut » ou « dans un montage « tiré vers le bas » ou «
18
Chapitre2 : Gestion Entrées/Sorties
La puce AT MEGA n'est pas capable de sortir des tensions variables. Heureusement, 6 des
sorties numériques (N° 3, 5, 6, 9, 10, 11) peuvent produire un signal PWM. Ce sigle signifie «
Pulse Width modulation » en anglais ; en français l'on parle de MLI : "« Modulation de
largeur d'impulsion ». Il s'agit d'un artifice permettant de produire une tension variable à partir
d'une tension fixe.
19
Chapitre2 : Gestion Entrées/Sorties
• joystick ;
• etc.
20
Chapitre2 : Gestion Entrées/Sorties
21
Chapitre2 : Gestion Entrées/Sorties
Il faut mettre un délai de 3 secondes entre le feu vert et le feu orange. Un délai de 1 seconde
entre le feu orange et le feu rouge. Et un délai de 3 secondes entre le feu rouge et le feu vert.
1. Définir les broches du microcontrôleur à utiliser.
2. Définir si les broches sont des entrées, des sorties, ou E/S.
3. Faire le programme complet dans la fonction qui réalise une boucle.
Correction :
Organigramme
• DEBUT
• //première partie du programme, on s'occupe principalement du deuxième feu
• Allumer led_rouge_feux_1
• Allumer led_verte_feux_2
22
Chapitre2 : Gestion Entrées/Sorties
• Attendre 3 secondes
• Éteindre led_verte_feux_2
• Allumer led_jaune_feux_2
• Attendre 1 seconde
• Éteindre led_jaune_feux_2
• Allumer led_rouge_feux_2
• /*deuxième partie du programme, pour l'instant : led_rouge_feux_1 et
led_rouge_feux_2 sont allumées; on éteint donc la led_rouge_feux_1 pour allumer la
led_verte_feux_1*/
• Attendre 3 secondes
• Éteindre led_rouge_feux_1
• Allumer led_verte_feux_1
• Attendre 3 secondes
• Éteindre led_verte_feux_1
• Allumer led_jaune_feux_1
• Attendre 1 seconde
• Éteindre led_jaune_feux_1
• Allumer led_rouge_feux_1
• FIN
La fonction setup : on va nommer les broches, puis les placer en sortie et les mettre dans leur
état de départ.
//définition des broches
const int led_rouge_feux_1 = 2;
const int led_jaune_feux_1 = 3;
const int led_verte_feux_1 = 4;
const int led_rouge_feux_2 = 5;
const int led_jaune_feux_2 = 6;
const int led_verte_feux_2 = 7;
void setup()
{
//initialisation en sortie de toutes les broches
pinMode(led_rouge_feux_1, OUTPUT);
pinMode(led_jaune_feux_1, OUTPUT);
pinMode(led_verte_feux_1, OUTPUT);
pinMode(led_rouge_feux_2, OUTPUT);
pinMode(led_jaune_feux_2, OUTPUT);
pinMode(led_verte_feux_2, OUTPUT);
//on initialise toutes les LED éteintes au début du programme (sauf les
deux feux rouges)
digitalWrite(led_rouge_feux_1, LOW);
digitalWrite(led_jaune_feux_1, HIGH);
digitalWrite(led_verte_feux_1, HIGH);
digitalWrite(led_rouge_feux_2, LOW);
23
Chapitre2 : Gestion Entrées/Sorties
digitalWrite(led_jaune_feux_2, HIGH);
digitalWrite(led_verte_feux_2, HIGH);
}
Le code principal :
void loop()
{
// première séquence
digitalWrite(led_rouge_feux_1, HIGH);
digitalWrite(led_verte_feux_1, LOW);
delay(3000);
// deuxième séquence
digitalWrite(led_verte_feux_1, HIGH);
digitalWrite(led_jaune_feux_1, LOW);
delay(1000);
// troisième séquence
digitalWrite(led_jaune_feux_1, HIGH);
digitalWrite(led_rouge_feux_1, LOW);
delay(1000);
/* ---------- deuxième partie du programme, on s'occupe du feux numéro 2 --
-------- */
// première séquence
digitalWrite(led_rouge_feux_2, HIGH);
digitalWrite(led_verte_feux_2, LOW);
delay(3000);
// deuxième séquence
digitalWrite(led_verte_feux_2, HIGH);
digitalWrite(led_jaune_feux_2, LOW);
delay(1000);
// deuxième séquence
digitalWrite(led_jaune_feux_2, HIGH);
digitalWrite(led_rouge_feux_2, LOW);
delay(1000);
/* --------------- le programme va reboucler et revenir au début ----------
-------- */
}
24
Chapitre2 : Gestion Entrées/Sorties
Lorsqu’on appuie sur le bouton poussoir, La LED doit s’allumer. Et naturellement, lorsqu’on
relâche le bouton poussoir, la LED s’éteint.
Nous allons utiliser une nouvelle instruction: if ... else (si ... sinon). C’est donc une condition.
Voici ce qui va se passer:
Si le bouton poussoir est pressé (digitalRead(4) == 1), allumer la LED (digitalWrite(12,
HIGH)), sinon
éteindre la LED (digitalWrite(12, LOW)).
L’instruction == vérifie si deux expressions sont égales. Si elles le sont, alors le résultat sera
vrai (true) sinon le résultat sera faux (false).
Télécharger le code: http://www.sharedamine.ovh/code/code7.txt
25
Chapitre 3 : Communication
par la liaison série
Vue d’ensemble
Ce Chapitre présente la communication par la liaison série.
Objectifs
Dans ce chapitre, nous allons apprendre à utiliser la liaison série, a travers le câble USB.
Grâce à elle, l’utilisateur pourra faire communiquer entre eux, l’ ordinateur et la carte
Arduino.
Prérequis
• Systèmes logiques
• Electronique numérique
• Programmation
Durée
• 3H
Eléments de contenu
1. Introduction « communication série »
2. Fonctionnement
3. Programmation
4. Application
Chapitre3 : Communication série
La voie série permet de communiquer de manière directe et unique entre deux supports.
Ici, elle se fera entre un ordinateur et la platine Arduino, mais elle pourrait aussi se faire par
exemple entre deux cartes Arduino. Dans sa forme la plus simple, elle ne nécessite que 3 fils :
2 pour l'émission/réception et 1 pour la masse afin d'avoir un référentiel électrique commun.
• DCD : Détection d'un signal sur la ligne. Utilisée uniquement pour la connexion de
l'ordinateur à un modem ; détecte la porteuse
• RXD : Broche de réception des données
• TXD : Broche de transmission des données
• DTR : Le support qui veut recevoir des données se déclare prêt à "écouter" l'autre
• GND : Le référentiel électrique commun ; la masse
• DSR : Le support voulant transmettre déclare avoir des choses à dire
• RTS : Le support voulant transmettre des données indique qu'il voudrait
communiquer
• CTS : Invitation à émettre. Le support de réception attend des données
• RI : Très peu utilisé, indiquait la sonnerie dans le cas des modems RS232
Selon les cartes Arduino utilisé, l’utilisateur pourra utiliser une seule ou plusieurs liaisons
séries. Par exemple, la carte Arduino Mega propose 4 voies séries différentes. La carte
Arduino ADK (interfacer avec Android) propose elle aussi 4 voies séries. Lorsque l’étudiant
utilise les voies séries, l’utilisateur faites appel à un objet Serial (nous verrons ça plus loin
dans le cours). Ainsi, lorsqu'il n'y a qu'une seule voie série, l'objet utilisé est "Serial". Ensuite,
s'il y a d'autres voies séries on aura les objets "Serial1", "Serial2" puis "Serial3".
La voie série n'est pas le seul moyen de communication existant sur Arduino. En effet, il
existe une multitude de types de connexion, natives ou non et plus ou moins difficiles à mettre
en place. On citera par exemple l'I²C, qui est une communication de type "Maître/Esclave" et
est intégré nativement à Arduino grâce à la librairie "Wire".
27
Chapitre3 : Communication série
La liaison série est un moyen de communication utilisé pour faire communiquer entre eux
plusieurs dispositifs. On retrouve cette liaison sur les ordinateurs, par exemple, ou sur des
appareils électroniques (onduleurs, ...). Cette liaison est aussi utilisée dans le milieu industriel.
Cet objet rassemble des informations (vitesse, bits de données, etc.) et des fonctions (envoi,
lecture de réception,...) sur ce qu'est une voie série pour Arduino. Ainsi, pas besoin pour le
programmeur de recréer tous le protocole.
Pour commencer, nous allons donc initialiser l'objet Serial. Ce code sera à copier à chaque
fois que l’utilisateur doit créer un programme qui utilise la liaison série.
Le logiciel Arduino à prévu, dans sa bibliothèque Serial, tout un tas de fonctions qui vont
nous êtres très utiles, voir même indispensables afin de bien utiliser la liaison série.
void setup()
{
Serial.begin(9600); //on démarre la liaison en la réglant à une vitesse
de 9600 bits par seconde.
}
• Un caractère seul s'écrit entre guillemets simples : 'A', 'a', '2', '!', ...
• Une phrase est une suite de caractère et s'écrit entre guillemets doubles : "Salut tout
le monde", "Bonjour SEM31", "Vive la Tunisie !"
Les fonctions que l'on va utiliser pour débuter, s'agit de print() et println
• print() : cette fonction permet d'envoyer des données sur la liaison série. On peut par
exemple envoyer un caractère, une chaine de caractère ou d'autres données
• println() : c'est la même fonction que la précédente, elle permet simplement un
retour à la ligne à la fin du message envoyé.
28
Chapitre3 : Communication série
Bien sûr, au préalable, l’utilisateur devrez avoir "déclaré/créé" l’ objet Serial et définis une
valeur de vitesse de communication :
void setup()
{
Serial.begin(9600); //création de l'objet Serial (=établissement d'une n
ouvelle communication série)
Serial.print("Welcome ISETKKR !"); //envoie de la chaine "Welcome
ISETKR!" sur la liaison série
}
Objectif
Le but est d'envoyer l'ensemble des lettres de l'alphabet. La fonction setup restera la même
que celle vue précédemment. Un délai de 250 ms est attendu entre chaque envoi de lettre et un
delay de 5 secondes est attendu entre l'envoi de deux alphabets.
Correction
void loop()
{
char i = 0;
char lettre = 'a'; // ou 'A' pour envoyer en majuscule
Serial.println("------ Bonjour ISETKR ---"); //petit message d'accueil
29
Chapitre3 : Communication série
void loop()
{
int donneesALire = Serial.available(); //lecture du nombre de caractère
s disponibles dans le buffer
if(donneesALire > 0) //si le buffer n'est pas vide
{
//Il y a des données, on les lit et on fait du traitement
}
//on a fini de traiter la réception ou il n'y a rien à lire
}
Si l’utilisateur veut éviter de mettre le test de présence de données sur la voie série dans le
code, Arduino à rajouter une fonction qui s'exécute de manière régulière. Cette dernière se
lance régulièrement avant chaque redémarrage de la loop. Ainsi, si l’utilisateur n'avait pas
besoin de traiter les données de la communication série à un moment précis, il suffit de
rajouter cette fonction. Pour l'implémenter c'est très simple, il suffit de mettre du code dans
une fonction nommé "serialEvent()" qui sera a rajouté en dehors du setup et du loop. Le reste
du traitement de texte se fait normalement, avec Serial.read par exemple.
Voici un exemple de squelette possible :
const int maLed = 11; //on met une LED sur la broche 11
void setup()
{
pinMode(maLed, OUTPUT); //la LED est une sortie
digitalWrite(maLed, HIGH); //on éteint la LED
Serial.begin(9600); //on démarre la voie série
}
void loop()
30
Chapitre3 : Communication série
{
delay(500); //fait une tite pause
//on ne fait rien dans la loop
digitalWrite(maLed, HIGH); //on éteint la LED
}
void serialEvent() //déclaration de la fonction d'interruption sur la voie
série
{
while(Serial.read() != -
1); //lit toutes les données (vide le buffer de réception)
digitalWrite(maLed, LOW); //on allume la LED
}
3.4 Application
Pour ce montage, nous allons utiliser un afficheur numérique à LED.
31
Chapitre3 : Communication série
Dans le cas d’une anode commune, cette dernière est branchée sur le +5V. Les cathodes sont
branchées sur les broches. Au niveau du code, cela implique que les LEDs sont allumée en
position LOW et éteintes en position HIGH. Avec un composant à cathode commune, c’est le
contraire. Dans notre exemple, nous allons commencer par allumer toutes les diodes, puis
l’une après l’autre, pour les identifier. On peut ensuite écrire des chiffres.
Voici donc, dans notre cas, les LEDs qui doivent être allumées pour écrire les chiffres
suivants:
32
Chapitre3 : Communication série
1 X X
2 X X X X X
3 X X X X X
4 X X X X
5 X X X X X
6 X X X X X X
7 X X X
8 X X X X X X X
9 X X X X X X
0 X X X X X X
33
Chapitre3 : Communication série
L’utilisateur voit que chaque LED de l'afficheur va être commandée séparément les unes des
autres.
Solution :
34
Chapitre3 : Communication série
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, HIGH);
digitalWrite(F, LOW);
digitalWrite(G, LOW);
}
35
Chapitre 4 : Les grandeurs
Analogiques
Vue d’ensemble
Ce Chapitre présente l’utilisation des grandeurs analogiques.
Objectifs
Ce premier chapitre va faire découvrir chez l’apprenant comment gérer des tensions
analogiques avec la carte Arduino. L’apprenant doit tout d'abord prendre en main le
fonctionnement d'un certain composant essentiel à la mise en forme d'un signal
analogique, et d’expliquer comment l’etudiant doit en servir avec la Arduino.
Pré-requis
• Systèmes logiques
• Electronique numérique
• Programmation
Durée
• 3H
Eléments de contenu
1. Introduction
2. Les convertisseurs
3. Exercice d’application
Chapitre4 : Les grandeurs Analogiques
D'abord, jusqu'à présent nous n'avons fait qu'utiliser des grandeurs numériques binaires.
Autrement dit, nous n'avons utilisé que des états logiques HAUT et BAS. Ces deux niveaux
correspondent respectivement aux tensions de 5V et 0V.
Cependant, une valeur analogique ne se contentera pas d'être exprimée par 0 ou 1. Elle peut
prendre une infinité de valeurs dans un intervalle donné. Dans notre cas, par exemple, la
grandeur analogique pourra varier aisément de 0 à 5V en passant par 1.45V, 2V, 4.99V, etc.
Tout d'abord, nous allons devoir être capables de convertir cette valeur analogique en une
valeur numérique, que l'on pourra ensuite manipuler à l'intérieur de notre programme. Par
exemple, lorsque l'on mesurera une tension de 2,5V nous aurons dans notre programme une
variable nommée "tension" qui prendra la valeur 250 lorsque l'on fera la conversion.
37
Chapitre4 : Les grandeurs Analogiques
Convertisseur flash : ce type de convertisseur génère lui aussi des tensions analogiques.
Pour être précis, il en génère plusieurs, chacune ayant une valeur plus grande que la
précédente (par exemple 2V, 2.1V, 2.2V, 2.3V, etc.) et compare la grandeur d'entrée à chacun
de ces paliers de tension. Ainsi, il sait entre quelle et quelle valeur se trouve la tension
mesurée.
Le schéma n'est pas très difficile. Nous allons retrouver 10 LEDs et leurs résistances de
limitations de courant branchées sur 10 broches de l'Arduino (histoire d'être original nous
utiliserons 2 à 11). Ensuite, nous brancherons un potentiomètre entre le +5V et la masse. Sa
broche centrale, qui donne la tension variable sera connectée à l'entrée analogique 0 de
l'Arduino.
Voici le schéma obtenu :
38
Chapitre4 : Les grandeurs Analogiques
Dans cette application nous utilisons 10 LEDs, ce qui représente autant de sorties sur la carte
Arduino, nous allons déclarer un tableau de "const int. Ensuite, nous allons déclarer la broche
analogique sur laquelle sera branché le potentiomètre. Enfin, nous déclarons une variable pour
stocker la tension mesurée sur le potentiomètre.
Une fois que l'on à fait ces déclarations, il ne nous reste plus qu'à déclarer les broches en
sortie et à les mettre à l'état HAUT pour éteindre les LEDs. Pour faire cela de manière simple,
nous allons utiliser une boucle for pour effectuer l’opération 10 fois.
void setup()
{
int i = 0;
for(i=0; i<10; i++)
{
pinMode(leds[i], OUTPUT); //déclaration de la broche en sortie
digitalWrite(leds[i], HIGH); //mise à l'état haut
}
}
En effet, elle ne va effectuer que deux opérations : Mesurer la tension du potentiomètre, puis
appeler une fonction d'affichage pour faire le rendu visuel de cette tension.
Voici ces deux lignes de code :
39
Chapitre4 : Les grandeurs Analogiques
void loop()
{
tension = analogRead(potar); //on récupère la valeur de la tension du p
otentiomètre
afficher(tension); //et on affiche sur les LEDs cette tension
}
Alors certes la fonction principale est très légère, mais ce n'est pas une raison pour ne pas
avoir un peu de code autre part. En effet, le gros du traitement va se faire dans la fonction
d'affichage, qui, comme son nom et ses arguments l'indiquent, va servir à afficher sur les
LEDs la tension mesurée.
Le but de cette dernière sera d'allumer les LEDs de manière proportionnelle à la tension
mesuré. Par exemple, si la tension mesurée vaut 2,5V (sur 5V max) on allumera 5 LEDs (sur
10). Si la tension vaut 5V, on les allumera toutes les LEDs.
Tout d'abord, mettons-nous d'accord. Lorsque l'on fait une mesure analogique, la valeur
retournée est comprise entre 0 et 1023. donc d'allumer une LED par tranche de 100 unités. Par
exemple, si la valeur est comprise entre 0 et 100, une seule LED est allumée. Ensuite, entre
100 et 200, on allume une LED supplémentaire, etc
40
Chapitre 5 : L’affichage
Vue d’ensemble
Cette leçon présente la définition et l’utilité de la récursivité.
Objectifs
L’apprenant doit appris plus tôt comment interagir avec l'ordinateur, lui envoyer de
l'information. Mais maintenant, il faut pouvoir afficher de l'information sans avoir besoin d'un
ordinateur donc avec les écrans .
Pré-requis
• Electronique
• Programmation
• Système logique
Durée
• 3H
Eléments de contenu
1. Les Ecrans LCD
2. Exercice d’application
Chapitre5 : L’affichage
Normalement, pour pouvoir afficher des caractères sur l'écran il nous faudrait activer
individuellement chaque pixel de l'écran. Un caractère est représenté par un bloc de 7*5
pixels. Ce qui fait qu'un écran de 16 colonnes et 2 lignes représente un total de 16*2*7*5 =
1120 pixels.
Tout comme il existe un driver vidéo pour la carte graphique d'ordinateur, il existe un
driver "LCD" pour l’afficheur. Ce composant va servir à décoder un ensemble "simple" de
bits pour afficher un caractère à une position précise ou exécuter des commandes comme
déplacer le curseur par exemple. Ce composant est fabriqué principalement par Hitachi et se
nomme le HC44780. Il sert de décodeur de caractères. Ainsi, plutôt que de devoir multiplier
les signaux pour commander les pixels un à un, il nous suffira d'envoyer des octets de
commandes pour lui dire "écris moi 'welcome ISET' à partir de la colonne 3 sur la ligne 1".
Les afficheurs existent dans de nombreuses tailles. Pour les afficheurs de type textes, on
retrouve le plus fréquemment le format 2 lignes par 16 colonnes. Il en existe cependant de
42
Chapitre5 : L’affichage
nombreux autres avec une seule ligne, ou 4 (ou plus) et 8 colonnes, ou 16, ou 20 ou encore
plus.
43
Chapitre5 : L’affichage
Nous allons utiliser la librairie "LiquidCrystal". Nous allons donc commencer par déclarer un
objet (c'est en fait une variable évoluée, plus de détails dans la prochaine partie) lcd, de type
LiquidCrystal et qui sera global à notre projet. La déclaration de cette variable possède
plusieurs formes:
• LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) où rs est le
numéro de la broche où est branché "RS", "enable" est la broche "E" et ainsi de suite
pour les données.
• LiquidCrystal(rs, enable, d4, d5, d6, d7) (même commentaires que
précédemment
Ensuite, dans le setup() il nous faut démarrer l'écran en spécifiant son nombre de colonnes
puis de lignes. Cela se fait grâce à la fonction begin(cols,rows).
En effet, une fois de plus nous retrouvons une fonction print(), comme pour l'objet Serial,
pour envoyer du texte.
lcd.print("Welcome ISET");
44
Chapitre5 : L’affichage
Dans cet exercice, je vous propose de réaliser une petite horloge. L'objectif sera donc
d'afficher le message suivant :
"Il est hh:mm:ss" avec 'hh' pour les heures, 'mm' pour les minutes et 'ss' pour les secondes.
Solution :
45