Chap3 - Cours Arduino - 2023
Chap3 - Cours Arduino - 2023
Chap3 - Cours Arduino - 2023
3 Arduino
Avril 2O22
1
Plan
1) Arduino: A quoi ça sert ?
2) Diverses Cartes microcontrôleurs Arduino
3) Périphérique de La carte Arduino Uno
4) « Shields » Arduino
5) Matériels nécessaire
6) Programmation graphique (Scratch)
7) Programmation sur IDE
8) Structure d'un programme
9) Gérer les entrées/sorties
10) Types de variables
11) Déclaration d'une fonction
12) Les structures de contrôle 2
1) Arduino: A quoi ça sert ?
Capteurs Actionneurs
Températures Moteurs
Humidité Servos
Pression Electrovannes
Présence Pompes
Distance Verins
Luminosité Eclairages
Système
... Arduino ...
3
Exemple d’Architecture AVR
4
2) Diverses Cartes microcontrôleurs Arduino
Plus évoluée
Plus d’entrées et sorties (54 contre 14 ),
Plus de mémoire (programmes plus complexes)
Processeur, plus puissant.
Adaptée pour les projets collège
Mise à disposition de nombreux tutoriels
Limitée en nombre de périphériques externes
Arduino équivalent Mega mais
plus puissante pour des calculs
plus rapides.
Lilipad
Permet la miniaturisation,
Incrustation dans des espaces
caractéristiques l’Arduino Mega)
réduits (vêtement).
Interagir avec un smartphone Android grâce à
un port USB.
5
3) Périphérique de La carte Arduino Uno
6
4) Shields Arduino
Rajouter des fonctionnalités nouvelles à votre
carte Arduino
GSM
Ethernet WIFI
LCD
Relais Commande moteurs
➢ Shield + Uno
7
5) Matériels nécessaire
Interface :
Carte Arduino uno
Câbles USB
Outillage électronique
10
7) Programmation sur IDE
11
7) Programmation sur IDE
7.a) Charger un programme dans la carte
12
7.b) Selection du Port et du type de la carte
8) Structure d'un programme
Un programme Arduino comporte 3parties :
1. la partie déclaration des variables (optionnelle)
2. la partie initialisation et configuration des entrées/sorties : la
fonction setup ()
3. la partie principale qui s'exécute en boucle : la fonction loop ()
Dans chaque partie d'un programme sont utilisées différentes
instructions issues de la syntaxe du langage Arduino.
COLORATION SYNTAXIQUE
Lorsque du code est écrit dans l'interface de programmation,
certains mots apparaissent en différentes couleurs qui clarifient le
statut des différents éléments :
En orange, apparaissent les mots-clés reconnus par le langage
Arduino comme des fonctions existantes. Lorsqu'on sélectionne
un mot coloré en orange et qu'on effectue un clic avec le bouton
droit de la souris, l'on a la possibilité de choisir « Find in reference
» : cette commande ouvre directement la documentation de la
fonction sélectionnée.
En bleu, apparaissent les mots-clés reconnus par le langage
Arduino comme des constantes.
En gris, apparaissent les commentaires qui ne seront pas exécutés
dans le programme.
Les cartes Arduino sont faites pour nous donner des possibilités d’interaction avec
le monde réel.
Pour que ce soit possible il faut initialiser les ports d’entrée/sortie en utilisant la
fonction pinMode(pinNb, mode ).
15
9.b) Lecture et écriture sur les E/S
16
9.c) Sortie TOR
Exemple 1
//There is a LED connected to pin 13 on the //RedBoard
void setup(){
pinMode(13, OUTPUT); // sets pin 13 as output
}
void loop(){
digitalWrite(13, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(13, LOW); // sets the LED off
delay(1000); // waits for a second
}
17
9.d) E/S TOR
Exemple 2
int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // pushbutton connected to digital pin 7
boolean val = 0; // variable to store the read value
void setup(){
Digital input pins can be HIGH
pinMode(ledPin, OUTPUT); // sets pin 13 as output
(2.7V-5V) or LOW (1.2V-0V).
Before you use a digital input you pinMode (inPin, INPUT); // sets the pin 7 as input
need to set the “pinMode” }
void loop(){
val = digitalRead(inPin); // read the input pin
digitalWrite(ledPin, val); // sets the LED to the button's value}
18
9.e) Entrée analogique
Exemple 3
int analogPin = 3;
int val = 0;
void setup(){
Serial.begin(9600); // setup serial
}
void loop(){
val = analogRead(analogPin);
// read the input pin
Serial.println(val); // debug value
}
19
int analogPin = 3;
int val = 0;
int ledPin = 11;
void setup(){
pinMode(analogPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // setup serial
}
void loop(){
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, val/4);
Serial.println(val); // debug value
delay(1000);
}
20
9.f) Sortie MLI (analogWrite)
Exemple 4
21
9.f) Sortie MLI (PWM)
22
10) Types de variables
10.a) Déclaration d'un scalaire
boolean single bit FALSE/TRUE
(really uses a whole byte of memory)
Unsigned Integers
byte eight bits 0 to 255
word two bytes 0 to 65535
unsigned long 4 bytes 0 to 4,294,967,295
Signed Integers
char eight bits -128 to 127
Exp : char A;
A='B'; //'B' is encoded with ASCII and the resulting value of 66 is stored in A.
int (short) two bytes -32,768 to 32,767
long 4 bytes -2,147,483,648 to 2,147,483,647.
Real Numbers
Float Floating point number uses 4 bytes. Used for non-integers has 6-7 decimal point precision.
-3.4028235E+38 to 3.4028235E+38
23
Exercice : Testons nos connaissances
int hi; //global variables
int there=0; //all functions have access
void setup(){
int this=10; //only exists within “setup()”
hi=1; //changing value of “hi”
}
void loop(){
println(“hi”); //prints “….”
println(hi); //prints “….”
println(there); //prints “….”
println(this); // prints “….”
}
24
Exercice : Testons nos connaissances (Réponse)
void setup(){
int this=10; //only exists within “setup()”
hi=1; //changing value of “hi”
}
void loop(){
println(“hi”); //prints “hi”
println(hi); //prints “1”
println(there); //prints “0”
println(this); //variable not defined…error program
//won‟t compile (verify)
}
25
10.b) Declaration d'un tableau
A single variable can store an array of values.
The index is contained in square brackets. Arrays are zero indexed (start at zero).
26
11) Declaration d'une fonction
Une fonction (également désignée sous le nom de procédure ou de sous-routine) est un bloc d'instructions
que l'on peut appeler à tout endroit du programme.Le langage Arduino est constitué d'un certain nombre
de fonctions, par exemple analogRead(),digitalWrite() ou delay().Il est possible de déclarer ses propres
fonctions par exemple :
….
Void clignote(){
digitalWrite (brocheLED, HIGH) ;delay (1000) ;
digitalWrite (brocheLED, LOW) ;delay (1000) ;
}
…
Pour exécuter cette fonction, il suffit de taper la commande :clignote();
La fonction peut aussi retourner une valeur après leur exécution. Exemple :
27
12) Les structures de contrôle
Les structures de contrôle sont des blocs d'instructions qui s'exécutent en fonction du
respect d'un certain nombre de conditions.
1) Structure if...else:
exécute un code si certaines conditions sont remplies
et éventuellement exécutera un autre code avec sinon.
exemple :
//si la valeur du capteur depasse le seuil
if(valeurCapteur>seuil){
clignote();
}//appel de la fonction clignote
2) Structure while:
exécute un code tant que certaines conditions sont remplies.
exemple :
while(valeurCapteur>250) { //tant que la valeur du capteur est supérieure à 250
digitalWrite(5,HIGH); //allume la sortie 5
Serial.println(1); //envoi le message "0" au port serie en boucle tant que valeurCapteur est supérieue à 250
}
Serial.println(0);
digitalWrite(5,LOW);
28
12) Les structures de contrôle
3) Structure For :
exécute un code pour un certain nombre de fois.
exemple :
//pour i de 0 à 255, par pas de 1
for (inti=0; i<= 255; i++){
analogWrite(PWM pin, i);
delay(10);
}
4) Structure switch/case :
exemple :
// fait un choix parmi plusieurs messages reçus
switch (message) {
case 0: //si le message est "0"allume que la sortie 3
digitalWrite(3,HIG H);digitalWrite(4,LOW);digitalWrite(5,LOW);break;
case 1: //si le message est "1"//allume que la sortie 4
digitalWrite(3,HIG H);digitalWrite(4,LO W);digitalWrite(5,LOW);break;
case 2: //si le message est "2"//allume que la sortie 5
digitalWrite(3,LO W);digitalWrite(4,LO W);digitalWrite(5,HIGH);break;
} 29
:
12) Les structures de contrôle
int x=1;
void setup(){
x=10;
}
void loop(){
if (x<20){
for(int i=1;i<3;i++){
x=x+x;
}
}
}
30
12) Les structures de contrôle
Exemple 6 :
/*Dans ce programme, un signal analogique provenant d'un capteur (potentiomètre) fait varier la vitesse de clignotement d'une LED, à
partir d'un certain seuil
*/
////declaration des variables
Int brocheCapteur = 0; // sélection de la broche sur laquelle est connectée le capteur
Int brocheLED = 13; // sélection de la broche sur laquelle est connectée la LED
Int valeurCapteur = 0; // variable stockant la valeur du signal reçu du capteur
int seuil= 200; //seuil de déclenchement
///////////Initialisation
void setup () {
pinMode (brocheCapteur, OUTPUT) ; // broche du capteur configurée en sortie
pinMode (brocheLED, OUTPUT) ; // broche de la LED configurée en sortie
}
////////////boucle principale
Void loop () {
valeurCapteur = analogRead (brocheCapteur) ;// lecture du signal du capteur
if(valeurCapteur>seuil){ //condition de déclenchement
clignote(); //appel de la fonction clignote
}}
/////fonction personnalisée de clignotement
Void clignote(){
digitalWrite (brocheLED, HIGH) ; // allume la LED
delay (valeurCapteur) ; // délai de «valeurCapteur" millisecondes
digitalWrite (brocheLED, LO W) ; // éteint la LED
delay (valeurCapteur) ; // delai de «valeurCapteur" millisecondes 31
}
13) Interface série sur ATMega328P
Il est donc possible de recevoir des données depuis un module Arduino, mais
également de lui en envoyer pour, par exemple, modifier son comportement.
32
13) Interface série sur ATMega328P
35
13) Interface série sur ATMega328P
13-b) Bus Série – I2C
I2C : Inter Integrated Circuits
I2C, également connu sous le nom de bus TWI (Two Wire Interface) nécessite, comme
son nom l’indique presque, trois fils pour fonctionner :
1. signal de données : SDA ;
2. signal d’horloge : SCL ;
3. une référence (masse).
Chaque périphérique a une adresse (7 bits) sur le bus et c’est un fonctionnement en
maître/esclaves. La bibliothèque permettant de gérer ce bus est Wire Library. Elle
simplifie grandement la gestion des différents états sur les lignes.
36
14) Interruptions sur les ATMega328P
Il est très important que les ISR aient un temps d’exécution le plus court possible. On ne
fera donc aucun calcul compliqué et aucun appel à des fonctions longues comme un
affichage sur un écran LCD.
37
14) Interruptions sur les ATMega328P
5 interruptions externes
Il s’agit des 5 interruptions liées au changement de la tension présente sur une
broche numérique qui sont donc ce que l’on appelle des interruptions externes:
- 2 programmables via l’API Arduino, INT0 et INT1 (pins 2 et 3)
- 3 sur changement d’état des pins
18 interruptions internes
- RESET
- Timers
- ADC
- Watchdog
- Comparateur
- ...
38
14) Interruptions sur les ATMega328P
Source Rôle
INT0 : Interruption externe sur la broche 2
INT1 : Interruption externe sur la broche 3
PCINT0 : Interruption externe sur les broches 8 à 13
PCINT1 : Interruption externe sur les broches A0 à A5
PCINT3 : Interruption externe sur les broches 0 à 7
39
14) Interruptions sur les ATMega328P
14.a) Les interruptions externes INT0 et INT1
-Correspond en respectivement à la broche 2 et à la broche 3.
-On utilise la fonction attachInterrupt (numéro, ISR, mode);
- numéro est le numéro d’interruption concernée. Il s’agira de 0 ou 1 sur un
Arduino Uno (broches 2 et 3). Sur un Arduino Mega, les numéros 0 à 5
seront possibles (broches 21, 20, 19, 18, 2 et 3). //digitalPinToInterrupt(broche)
- ISR est la routine d’interruption qui sera appelée lorsque l’interruption
surviendra. Cette routine d’interruption est une fonction qui ne renvoi
rien et qui ne prend aucun argument, comme ceci : void maRoutine(){ ... }.
- Mode indique ce qui va provoquer l’interruption. Les valeurs possibles
pour mode sont :
*LOW l’interruption sera déclenchée tant que la broche est L.
Pendant ce temps, loop() ne sera pas exécuté.
* CHANGE : : L à H ou H à L(événement).
* RISING : L à H (événement).
* FALLING : H à L. (événement).
-On peut noter que les broches 2 et 3 sont donc partagées entre PCINT2 et INT0 et INT1.
- On ne peut donc à la fois bénéficier de INT0 et INT1 et des interruptions PCINT2 sur les
broches 2 et 3
-La richesse des modes de déclenchement de INT0 et INT1 n’existent pas pour les sources
PCINTx. Le seul mode est l’interruption sur changement d’état, L à H et H à L.
Il existe une bibliothèque qui masque la complexité du matériel :PinChangeInt. La
bibliothèque fournit les fonctions :
PCintPort::attachInterrupt(pin, ISR, mode);
PCintPort::detachInterrupt(pin);
NB: Le premier argument est le numéro NB : le 1er argument est le Num de la broche (au
lieu de N° de l’interruption). Les autres arguments sont identiques.
41
14) Interruptions sur les ATMega328P
14.c) Exemple 1
Lorsque vous utilisez une interruption, tout le programme se met en « pause » et la fonction
appelée dans l’interruption prend le relais. Ainsi, les fonctions de temps « delay() »,
« millis() » seront également stoppée. Veillez à bien faire attention dans vos programmes
pour ne pas avoir de mauvaise surprise !
42
14) Interruptions sur les ATMega328P
14.c) Exemple 2
- les ISR sont attachées à A1, A2, A3 et A4.
- L’objectif est la surveillance d’un grand nombre de pédales (entrées numériques externes).
- Les entrées A1 à A4 programmées en entrées numériques avec pull-up.
- Le programme installe 4 fonctions qui seront appelées par les ISR des vecteurs PCINTx, une
pour chaque entrée.
- Les pédales mettent l’entrée à 0V quand ils sont actionnées, le mode de déclenchement
choisi est FALLING. Chaque fonction incrémente une variable.
-Les péales engendrent des rebonds quand ils sont actionnés. C’est à dire que, au lieu de
géner un seul FALLING, ils vont en générer plusieurs. Un delay de 1ms permet d’éliminer
les rebonds tout en conservant une bonne réactivité.
- Afin de visualiser l’activation des ILS, un LCDKeypad shield est employé.
On demande d’afficher, toutes les 20 ms, la valeur des 4 variables mémorisant le nombre43
de déclenchements sur chaque pédale
14) Interruptions sur les ATMega328P
14.c) Exemple
#include <LiquidCrystal.h> void interruptI2(){ void setup(){
#include <LCDKeypad.h> static unsigned long dateDernCh = 0;
#include <PinChangeInt.h> lcd.begin(16, 2);
unsigned long date = millis(); lcd.clear();
LCDKeypad lcd; if ((date - dateDernCh) > dureeAntiRebd) lcd.print("Test PCINT");
const byte pinI1 = A1; comptageI2++;
const byte pinI2 = A2; dateDernCh= date; } pinMode(pinILS1, INPUT_PULLUP);
const byte pinI3 = A3; } pinMode(pinILS2, INPUT_PULLUP);
const byte pinI4 = A4; void interruptI3(){ pinMode(pinILS3, INPUT_PULLUP);
static unsigned long dateDernCh = 0; pinMode(pinILS4, INPUT_PULLUP);
byte comptageI1 = 0;
byte comptageI2 = 0; unsigned long date = millis(); PCintPort::attachInterrupt(pinI1, intI1, FALLING);
byte comptageI3 = 0; if ((date - dateDernCh) > dureeAntiRebd) PCintPort::attachInterrupt(pinI2, intI2, FALLING);
byte comptageI4 = 0; comptageI3++; PCintPort::attachInterrupt(pinI3, intI3, FALLING);
const unsigned long dureeAntiRebd = 1; dateDernCh= date; PCintPort::attachInterrupt(pinI4, intI4, FALLING);
} }
void interI1(){ }
static unsigned long dateDernCh = 0; void interruptI4(){ void loop(){
static unsigned long dateDernCh = 0; lcd.setCursor(0,1); lcd.print(comptageI1);
unsigned long date = millis(); lcd.setCursor(4,1); lcd.print(comptageI2);
if ((date - dateDernCh) > dureeAntiRebd) unsigned long date = millis(); lcd.setCursor(8,1); lcd.print(comptageI3);
{ if ((date - dateDernCh) > dureeAntiRebd) lcd.setCursor(12,1); lcd.print(comptageI4);
comptageI1++; { delay(20);
dateDernCh= date; comptageI4++; }
} dateDernCh= date;
} }
}
44
16) Les conditions et le opérateurs
Les conditions
Condition Dans le programme
Egale à ==
Supérieur >
Inférieur <
Non égal !=
16) Les conditions et le opérateurs
Opérateurs logiques
Dans le
Opérateur logique Exemple
programme
ET logique
Vraie si les deux
&& if(condition 1 && conditions 2)
conditions sont
remplies
OU logique
Vrai si l’une ou l’autre des !! if(condition 1 !! conditions 2)
conditions est remplie
NON logique
Vrai si la condition est ! if( ! condition)
fausse
Merci pour Votre Attention
47