Académique Documents
Professionnel Documents
Culture Documents
Microcontrôleurs Arduino
13/11/2023 2020-2021 32
33
1 Informatique embarquée
• Caractéristiques :
1.1
– Ressources limitées (mémoire, CPU, stockage)
– Energie limitée (pile, batterie, panneaux solaires …)
– Interaction avec l’environnement physique (capteurs, actionneurs)
• 1.2 Types :
– Mobile (smartphones, tablettes, liseuses, GPS, …)
• Accès à des ressources sur réseau (3G, wifi, Bluetooth)
• Accès à l’énergie facile (chargeur)
• Très orientée utilisateur (interface)
• Ressemble beaucoup à de l’informatique classique (sauf pour les interfaces)
– Industrielle (microcontrôleurs)
• Parfois énergie très limitée
• Rôle de l’utilisateur faible (écran LCD, boutons) ou inexistant
• Centrée sur des systèmes physiques ou sur la robotique
• Réseaux spécialisés (CAN)
Au lieu de :
On risque d’avoir :
CPU Contrôleurs
de
périphériques Microcontrôleur
• Système réel
– Caractéristiques (ce qu’il doit faire, ce qu’il peut faire)
– Temps de réaction
– Limites (sécurité)
• Contrôleurs de périphériques + CPU = microcontrôleur
– Capacités (ce qu’il peut faire)
– Vitesse (du CPU et des contrôleurs de périphériques)
– Limites (valeurs minimales et maximales, précision des mesures et des calculs)
CPU Contrôleurs
de
périphériques
3 Le câblage
Adaptation de niveau
capteurs
Contrôleurs
de
périphériques
actionneurs
Adaptation de puissance
• Adaptation de niveau : l’information produite par un capteur peut être transmise par un
signal électrique de valeur trop faible ou trop élevée pour le contrôleur de périphériques
(il existe des CI prévus pour ça)
• Microcontrôleur
– Modèle (puissance, vitesse, prix, disponibilité, consommation)
– Contrôleurs de périphériques (nombre, types, précision, limites)
• Capteurs
– Nombre et placement (image du système suffisante)
– Type (précision, sensibilité, fiabilité, limites, prix, type de connexion)
• Actionneurs
– Nombre et placement (modification du système possible)
– Type (précision, sensibilité, fiabilité, limites, prix, type de connexion)
4.2 le programme
• Défauts (des capteurs, des actionneurs, des contrôleurs de périphériques)
L’image du système réel n’est ni complète ni exacte ni actuelle
• Temps réel (le temps du système réel prime)
– Réagir à temps (ne pas laisser le système réel dériver)
– Ne pas réagir trop vite (laisser le temps au système réel pour réagir)
– Tenir compte :
• du temps de mesure des capteurs
• du temps de réaction des actionneurs et du système réel
• Logique
– Ordre des traitements (précédence)
– Durée des traitements (respect du temps réel)
– Priorités des traitements (urgence)
• Sécurité
– Cas d’utilisation liées à la sécurité
– Limites (du système réel et du système informatique)
– Pannes (du système réel, des capteurs, des actionneurs)
Informations produites :
• Commandes d’actionneurs
– Numérique (1 ou plusieurs bits, ex : marche/arrêt)
– Analogique (En pratique rarement utilisé, ex : vitesse)
– Temporelle (durée pendant laquelle un bit reste à 0 ou à 1 + période
ex : positionnement d’un servomoteur)
• Temps
– Délais
– Rythme de prélèvement des mesures
– Temps mesurés entre événements
7 Analyse du problème
• Modèle logique du système réel (ce qu’il doit faire)
– Automate
– Algorithme
• Auto contrôlé
– On agit sur un actionneur et on contrôle la réaction du système par un capteur.
– Exemple :
• Contrôle de vitesse d’un moteur :
– On met le moteur à 5000 tr/min
– On a un capteur de vitesse couplé au moteur et on vérifie qu’il soit bien à 5000 tr/min
– Si ce n’est pas le cas on ajuste sa commande de vitesse jusqu’à y arriver
– Cas d’utilisation :
• On a besoin de précision
• La commande est critique (sécurité, panne)
9 Auto contrôle
• Principe :
1. Donner une consigne à un actionneur
2. Vérifier par un capteur l’effet de cette consigne
3. Si la valeur mesurée n’est pas celle attendue ajuster la consigne
4. Recommencer au 2
• Problème :
– Comment ajuster la consigne ?
• Solutions :
– Ajuster très peu pour arriver petit à petit à la bonne valeur
• Marche bien mais risque de mettre beaucoup de temps si la valeur
mesurée est loin de la valeur voulue
– Ajuster au mieux rapidement
• Ajuster la consigne plus ou moins en fonction de l’éloignement entre la
valeur mesurée et la valeur voulue mais risque d’oscillations
– Formule :
e = écart entre la valeur mesurée et la valeur voulue
consigne = Kp * e + Ki * (somme des e) + Kd (e - eprec)
Kp, Ki et Kd sont des coefficients constants à déterminer
– Vision mathématique :
– L’écart est une fonction du temps : e(t)
– La consigne est aussi une fonction du temps : c(t)
– La formule est donc :
c(t) = Kp * e(t) + Ki * ∫ e(t).dt + Kd * de(t)/dt
• ATTENTION :
Il est important de faire les mesures à intervalles réguliers
sinon les sommes et les différences entre écarts ne veulent rien dire
• Méthodes de détermination
– On peut les déterminer par calcul mais cela suppose de connaître les équations régissant le
fonctionnement du système réel
• En général elles sont difficiles à trouver (pour une voiture ça dépend des temps
d’accélération du moteur selon son régime actuel, du poids de la voiture, des frottements
de l’air, du revêtement de la route, de l’état des pneus, de la pente …)
Rappels
historique
13/11/2023 2020-2021 51
Diagramme de flux de données
LCD main
LCD
display driver Fixed-point
0 to 2.000
Diagramme de flux des appels
main SysTick
ISR
Block 1
13/11/2023 2020-2021 54
Organigramme
Four pour pain tranché (Toast) :
main Cook
Output heat
Input from is on
switch Too cold
return
13/11/2023 2020-2021 55
Automates finis
13/11/2023 2020-2021 56
Machines à états finis
13/11/2023 2020-2021 57
Représentation d’une FSM
13/11/2023 2020-2021 58
Modélisaton des FSM
• Utilisation de registres d’états
• Explicite : énumération des états
• Implicite : dépend de la structure du modèle
• Introduction d’une méthode d’initialisation
• Reset synchrone Ou
• asynchrone
• Encodage des états
• La façon de coder les états à un impact direct sur la complexité de la fonction de
transition, donc sur les performances du circuit
• Choix Mealy / Moore
• Moore, plus de maîtrise sur le comportement
• Mealy, plus de flexibilité puisque les sorties peuvent changer au sein d’un même état
• Transitions
• La transition d’un état à l’autre est synchronisée sur signal d’horloge implicite qui n’est
représenté ni dans la table d’états ni dans les diagrammes d’états
13/11/2023 2020-2021 59
Types de machines
2020-2021 60
13/11/2023
FSM de Moore
Output Outputs
function
13/11/2023 2020-2021 61
FSM MEALY
• La sortie est une fonction de l’état présent et des
entrées
Inputs Next State
function
Next State Present State
clock Present State
reset register
Output Outputs
function
13/11/2023 2020-2021 62
Actions: Machines Moore vs Mealy
13/11/2023 2020-2021 63
Machines à états étendues
• Chaque transition a des conditions/actions
• Pour traverser un arc, la condition doit se réaliser
• Lors de la traversée d’un arc, une action est entreprise
• Il existe un ensemble fini de variables (bornées) associées à la machine
• Les conditions peuvent référencer ces variables
• La condition peut être
• un événement
• Un délai
• Expression sur les variables
• Combinaison des précédentes
13/11/2023 2020-2021 64
Machines à états étendues
• Actions
• Peut accéder et changer les variables
• Peut être {var: = expression; …}
• Déclencher une tache externe (appeler une fonction)
• Lorsqu’aucune condition n’est vraie
• Ne pas changer d’état
• Lorsque plusieurs conditions sont vraies
• Qu'est-ce qui devrait être fait
• Non déterminisme
• Autoriser la spécification de priorité
• Refuser
13/11/2023 2020-2021 65
Machines à états étendues
13/11/2023 2020-2021 66
Machines à états étendues
3
4
13/11/2023 2020-2021 67
Exercice d’application
❑ Exemple . Proposer un organigramme pour un système qui réalise deux tâches
indépendantes. La première tâche délivre un signal carré de 20 kHz sur le PORTA
en temps réel (période 50 ms). La seconde tâche lit une valeur sur le PORTB,
divise cette valeur par 4, ajoute 12 et délivre le résultat sur le PORTD. La
seconde tâche se répète indéfiniment.
main A
void SysTick_Handler(void){
Clock PORTA = PORTA^0x01; E
Input n from B < } >
PORTB
PORTA = E void main(void){ A
PORTA^1 unsigned long n;
n = (n/4)+12 C while(1){
> n = PORTB; B
n = (n/4)+12; C
PORTD = n; D
Output n to }
PORTD D
}
2020-2021
Exercice d’application
Exemple . Proposer un graphe d’états puis un programme en C pour un système qui
possède un bouton poussoir en entrée et trois LED en sortie. Le bouton permet à
chaque pression d’allumer une LED à la fois.
Les LEDs s’allument dans l’ordre Vert, Orange, Rouge.
Vert
BP Orange
Rouge
2020-2021
Graphe d’état
13/11/2023 2020-2021 70
#define GREEN_PIN 3
#define YELLOW_PIN 4 Code Arduino
#define RED_PIN 5 case orange2:*R=0;*V=0;*O=1;if (btn==1)
#define BTN_PIN 2 etat=rouge1;break;
case rouge1 : *R=1;*V=0;*O=0;if (btn==0)
typedef enum states {repos, etat=rouge2;break; case rouge2 :
vert1,vert2,orange1, orange2, *R=1;*V=0;*O=0;if (btn==1)
rouge1,rouge2,eteints} state_t; etat=eteints;break; case eteints :
state_t etat=repos; *R=0;*V=0;*O=0;if (btn==0)
etat=repos;break; default : etat=repos; } } void
void mae(int btn, int *V, int *O, int *R) sortie(int V, int O, int R)
{ switch(etat) { digitalWrite(GREEN_PIN,V);
{ case repos : *R=0;*V=0;*O=0; digitalWrite(YELLOW_PIN,O);
if(btn==1) etat=vert1;break; digitalWrite(RED_PIN,R);}
void setup(){ pinMode(GREEN_PIN,OUTPUT);
case vert1 : *R=0;*V=1;*O=0;if (btn==0) pinMode(YELLOW_PIN,OUTPUT);
etat=vert2;break; pinMode(RED_PIN,OUTPUT);
pinMode(BTN_PIN,INPUT); }
case vert2 : *R=0;*V=1;*O=0;if (btn==1)
etat=orange1;break; void loop(){ int btn; //valeur du bouton int
Rouge,Vert,Orange;
case orange1:*R=0;*V=0;*O=1;if (btn==0) btn=digitalRead(BTN_PIN);
etat=orange2;break; Serial.print("btn= " +btn);
mae(btn,&Vert, &Orange, &Rouge);
sortie(Vert,Orange, Rouge); }
13/11/2023 2020-2021 71
Automate temporisé
• Les automates temporisés constituent un des
modèle de systèmes réactifs à temps continu
proposé par Alur et Dill en 1991
• Automate fini + ensemble d’horloges à valeurs
réelles
• Qui avancent simultanément,
• Qui peuvent être réinitialisées indépendamment
• Chaque horloge mesure le temps écoulé depuis sa
dernière initialisation
• Mesure d’intervalles entre deux événements
• Dans le modèle de base, pas de dérive d’horloges
13/11/2023 2020-2021 72
Automates Temporisés
• Idée basique
• Machine à états finis étendue
• Ajouter la notion de variables de minuterie
• Les variables de minuterie peuvent être définies explicitement
• Toutes les variables de la minuterie sont périodiquement
incrémentées
• incrémentées chaque k millisecondes
• Ou incréementées en continu
• Les variables de minuterie peuvent être utilisées dans des conditions
• Aucune contrainte de temps ad-hoc
13/11/2023 2020-2021 73
Principe Automates temporisé (1)
• Chaque automate possède un nombre fini de places (états).
• Les transitions entre états sont instantanées.
• Dans chaque état, le temps peut s’écouler:
• à tout instant, la valeur d’une horloge x est le temps écoulé depuis la
dernière mise à 0 de x.
13/11/2023 2020-2021 74
Principe Automates temporisé (2)
• Les transitions entre états sont conditionnées par des contraintes sur
les horloges, appelés gardes, et peuvent remettre certaines horloges
à 0.
• A chaque place est associée une contrainte sur les horloges, appelée
invariant.
• Les transitions sont
1. soit des transitions de temps,
2. ou des transitions d’action.
13/11/2023 2020-2021 75
Modélisation d’un train / barrière
Train:
approach Near
Far
x := 0 x ≤5
Af ter In
x ≤5 out x ≤5
– p.1
Exemple 1: Train || barrière || contrôleur
Barrière:
lower t1
t0
y := 0 y≤1
y ≥ 1,up down
t3 y := 0
t2
y≤ 2 raise
– p.1
Contrôleur:
raise approach,
u2 z:=0 u1
z ≤1 u0 z ≤1
exit, z := 0 z = 1,lower
– p.1
Exemple 2
Exemple: une zone de traitement, avec deux robots
et des boites sur un tapis roulant.
Tapis convoyeur
point d’inspection
D−Robot G−Robot
station de traitement
x ≤6 x ≤6
D-Put
x := 0 d-turn-r
1 ≤x ≤2 5 ≤x ≤6
x ≤2
d-put x := 0
– p.2
G-robot g-picked
middle 3 ≤y ≤8
G-Pick G-Turn-R
y := 0 y := 0
G-Inspect
y ≤8 y ≤ 10
g-turned-l g-turned-r
8 ≤ y ≤ 10 6 ≤ y ≤ 10
y := 0 y := 0
G-Put
G-Turn=L
G-Wait
y := 0 s-empty
y ≤ 10 y ≤2
1 ≤y ≤2 y := 0
g-put
– p.2
Zone de traitement
g-put
z := 0 S-Busy
-empty S-Empty
z ≤ 10
z := 0 s-busy
d-pick 8 ≤ z ≤ 10
z := 0
s-ready S-Ready
– p.2
Boîte b-mov
133 ≤ b ≤ 134 20 ≤ b ≤ 21
B-Mov b := 0 B-Inspect b-fall
B-Fall
b ≤ 134 b ≤ 21
g-pick
d-put
b := 0 middle
– p.2
Autre exemple : bouton de souris
13/11/2023 2020-2021 84
Arduino
• Une plate-forme matérielle open-source
basée sur un microcontrôleur Atmel AVR 8
bits et un IDE basé sur C ++
•
Plus de 300 000 cartes ont été fabriquées
•
Arduino Due est basé sur un ARM Cortex
32 bits
Carte Arduino type
Langage Arduino
13/11/2023 2020-2021 87
Arduino le code minimal
• Le code minimal 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.
void setup() //fonction d'initialisation de la carte
{ //contenu de l'initialisation }
void loop() //fonction principale qui se répète (s’exécute) à l'infini
{ //contenu du programme }
13/11/2023 2020-2021 88
Exécution du code Arduino
• Langage proche du C.
• ➢ Programme structuré :
• ➢ Une section déclaration
• ➢ une section « setup » 1 seule exécution après RàZ ;
• ➢ une section « loop » exécutée indéfiniment en boucle
• Finalement similaire au code suivant sur PC
int main() Setup
{ setup();
while(true) loop();
}
Loop
13/11/2023 2020-2021 89
Arduino types de variables
13/11/2023 2020-2021 90
Arduino type enum
Declaration
enum ternary {
unknown,
true,
false
};
13/11/2023 2020-2021 91
Arduino utilisation de variables
• Déclaration
• int i;
• Boolean btn
• int y,x=5;
• float t=1.54f;
• Utilisation
• y= 4*x;
• btn=digitalRead(2);
13/11/2023 2020-2021 92
Arduino Listes et tableaux
13/11/2023 2020-2021 93
Instruction Conditionelle
if (someCondition) {
// do stuff if the condition is true
} else {
// do stuff if the condition is false
modelect.wordpress.com }
13/11/2023 2020-2021 94
Conditional Statement int printMessage = 1;
void setup()
{ Serial.begin(9600);
int printMessage = 1; }
void setup() void loop()
{ Serial.begin(9600); {
}
if (printMessage == 1) {
Serial.println("Message");
void loop()
printMessage= 0;
{
}
if (printMessage == 1) {
else {
Serial.println("Message");
Serial.println("NO Message");
printMessage= 0;
printMessage= 1;
}
}
} 13/11/2023
}
2020-2021 95
while Loop
while(expression){
statement(s);
}
Example
int var = 0;
while (var < 200) {
// do something repetitive 200 times
var = var + 1;
}
13/11/2023 2020-2021 96
while Loop
void setup()
{ Serial.begin(9600);
int count = 0;
while (count < 5) {
Serial.println("Hello world!");
count = count +1;
}
}
void loop()
{
}
13/11/2023 2020-2021 97
for loop
13/11/2023 2020-2021 98
for Loop
void setup()
{
Serial.begin(9600);
for (int count = 0; count < 5; count++) {
Serial.println("Hello world!");
}
}
void loop()
{
}
13/11/2023 2020-2021 99
switch - case
void setup() {
// initialize serial communication: switch (inByte) {
Serial.begin(9600); case 'a':
// initialize the LED pins: digitalWrite(2, HIGH);
for (int thisPin = 2; thisPin < 7; thisPin++) { break;
pinMode(thisPin, OUTPUT); case 'b': digitalWrite(3, HIGH);
} break;
} case 'c':
digitalWrite(4, HIGH);
void loop() { break;
// read the sensor: case 'd':
if (Serial.available() > 0) { digitalWrite(5, HIGH);
int inByte = Serial.read(); break;
// do something different depending on the case 'e':
character received. digitalWrite(6, HIGH);
// The switch statement expects single number break;
values for each case; in this default:
// turn all the LEDs off:
for (int thisPin = 2; thisPin < 7; thisPin++) {
digitalWrite(thisPin, LOW);
}
}
}
}
13/11/2023 2020-2021 100
Modèle Proteus Arduino +Terminal virtuel
+Bargraph
R8
330
void setup() {
}
void loop() {
}
Bouton poussoir
www.ladyada.net/
Create the circuit above and then run File -> Examples ->
Digital -> Button
10
L’interface matérielle du Microcontroleur : Arduino et AVR
11
L’interface matérielle du Microcontroleur : Arduino et AVR
11
Résumé des la connectique ATMEGA 328P-PU
todbot.com/blog/bionicarduino
13/11/2023 2020-2021 114
13/11/2023 2020-2021 115
todbot.com/blog/bionicarduino
Communication série
Serial.println(value);
•
– Affiche « value » sur le moniteur série et
insère un retour chariot
• pinMode(pin, mode);
– Configure une broche E/S en lecture (INPUT)
écriture (OUTPUT)
•
digitalRead(pin);
• digitalWrite(pin, value);
–
Principales fonctions Arduino
• ENTRÉES/SORTIES • ENTRÉES/SORTIES
NUMÉRIQUES AVANCÉES
• pinMode(broche, mode) • tone()
• digitalWrite(broche, valeur) • noTone()
• int digitalRead(broche)
• shiftOut(broche,
• ENTRÉES ANALOGIQUES BrocheHorloge, OrdreBit,
• int analogRead(broche) valeur)
• SORTIES "ANALOGIQUES" • unsigned long
(GÉNÉRATION pulseIn(broche, valeur)
D'IMPULSION)
• analogWrite(broche, valeur)
- PWM
13/11/2023 2020-2021 121
Principales fonctions Arduino
• TEMPS
• unsigned long millis()
• unsigned long micros() • NOMBRES RANDOMISÉS
• delay(ms) (HASARD)
• delayMicroseconds(us) • randomSeed(seed)
• long random(max)
• INTERRUPTIONS EXTERNES • long random(min, max)
• attachInterrupt(interruption,
fonction, mode) • COMMUNICATION
• detachInterrupt(interruption) • Serial
• INTERRUPTIONS
• interrupts()
• noInterrupts()
long randNumber;
void setup() { Serial.begin(9600);
// si la broche d'entrée analogique 0 n'est pas connectée,
//un bruit analogique aléatoire entraînera lors de l'appel à randomSeed ()
//pour générer des nombres de départ différents à chaque exécution de du
programme.
randomSeed(analogRead(0)); }
void loop() {
// print a random number from 0 to 299
randNumber = random(300);
Serial.println(randNumber); // print a random number from 10 to 19
randNumber = random(10, 20); Serial.println(randNumber);
delay(50); }
13/11/2023 2020-2021 132
Exercice
void check_serial()
if (serial.available()<>0)
sensorValue=serial.Read();
ledLevel=map(sensorValue,0,255,0,NoLEDs);
Ser_FLAG=1;
}}
}
}
Solution dans Proteus 8.6
11/13/2023 138
Les fonctions
void loop(){
Check_serial();
If (ser_FLAG!=1)
check_pot();
Update_bargraph();
delay(ATTENTE);
}
}
void
loop(){
int value = analogRead(inPin);
float millivolts = (value / 1024.0) * 5000; //5.0V analog input
float celsius = millivolts / 10; // sensor output Celsius is 10mV per degree
delay(1000);
Serial.println("Temperarure="+String(celsius)+ " Celcius");
}
Lecture des données à partir d’Arduino
void setup()
{
Serial.begin(9600);
}
void serialtest()
{
int i;
for(i=0; i<10; i++)
Serial.println(i);
}
Envoie des données du PC vers programme Arduino
int incomingByte = 0;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
if (Serial.available() > 0) {
incomingByte = Serial.read(); // read the incoming byte:
Serial.print(" I received:");
Serial.println(incomingByte);
}
}
Connecter un LCD
Utiliser LCDs
#include <LiquidCrystal.h> // include the library code
//constants for the number of rows and columns in the LCD
const int numRows = 2;
const int numCols = 16;
// initialize the library with the numbers of the interface
pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
lcd.begin(numCols, numRows);
lcd.print("hello, world!"); // Print a message to the LCD.
}
Utiliser le détecteur de mouvement PIR
Utiliser le détecteur de mouvement PIR
const int ledPin = 77; // pin for the LED
const int inputPin = 2; // input pin (for the PIR sensor)
void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
pinMode(inputPin, INPUT); // declare pushbutton as input
}
void loop(){
int val = digitalRead(inputPin); // read input value
if (val == HIGH) // check if the input is HIGH
{
digitalWrite(ledPin, HIGH); // turn LED on if motion
detected
delay(500);
digitalWrite(ledPin, LOW); // turn LED off
}
}
Utiliser le capteur à ultrason
• L'impulsion sonore «ping» est générée lorsque le niveau de trigPin
devient ÉLEVÉ pendant dix microsecondes.
• Le capteur générera alors une impulsion qui se termine lorsque le son
revient.
• La largeur de l'impulsion est proportionnelle à la distance parcourue par
le son
• La vitesse du son est de 340 mètres par seconde, soit 29 microsecondes
par centimètre. La formule pour la distance du trajet aller-retour est la
suivante: Aller-retour = microsecondes / 29
Schéma de câblage capteur ultra-son HC-SR04
• Version 4 broches
digitalWrite(ledPin, LOW);
delay( cm * 10);
}
Utiliser le capteur à ultrason
int ping(int trigP, int echoP)
{
long duration, cm;
digitalWrite(trigP,LOW);
delayMicroseconds(2);
digitalWrite(trigP,HIGH);
delayMicroseconds(10);
digitalWrite(trigP,LOW);
duration = pulseIn(echoP, HIGH);
// convert the time into a distance
cm = microsecondsToCentimeters(duration);
return cm ;
}
long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
Sortie Audio
tone(speakerPin, frequency, duration); // play the
tone
delay(duration); //wait for the tone to finish
Exemple
• Ecrivez un programme qui joue une note
A (440Hz) pendant 1 seconde lorsqu'un
capteur de mouvement détecte un
mouvement.
Les interruptions
• Introduction
• Définitions
• Vecteurs d’interruption
• principe
• Sources d’interruption
• Utilisation
• Traitant d’Interruption (ISR)
• Communication entre IT et programme principal
void setup() {
pinMode(LED, OUTPUT);
pinMode(SW, INPUT_PULLUP);
}
void handleSW() {
digitalWrite(LED, digitalRead(SW));
}
void loop() {
handleSW();
}
void setup() {
pinMode(LED,
13/11/2023
OUTPUT); 2020-2021 169
II-2 Traitant d’interruption (ISR)
• Si vous partagez une valeur multi-octets (par exemple, short int) entre un ISR
et votre code, vous devez prendre des précautions supplémentaires.
volatile short count;
if (count == 256) …
1fa: f8 94 cli
1fc: 80 91 10 01 lds r24, 0x0110
200: 90 91 11 01 lds r25, 0x0111
204: 78 94 sei
206: 80 50 subi r24, 0x00
208: 91 40 sbci r25, 0x01
20a: 69 f5 brne .+90
• Sur les cartes Arduino Uno, ces interruptions peuvent être activées
depuis n'importe quel broche, et même la totalité des 20 broches de
l'Arduino (A0 à A5 et D0 à D13). Elles sont regroupées sous trois
vecteurs d'interruption PCINT0, PCINT1 et PCINT2 pour l'intégralité
des 20 broches.
void sleepNow()
{
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
noInterrupts(); // stop interrupts
sleep_enable(); // enables sleep bit in MCUCR
attachPCINT(digitalPinToPCINT(SW), wake, LOW);
interrupts(); // allow interrupts
sleep_cpu(); // here the device is put to sleep
}
• Initialisation
• Mode select
– Character
– Graphic
– Drawing
Exemple
void setup()
{
IOShieldOled.begin();
}
void loop()
{
char toprint;
IOShieldOled.clearBuffer();
IOShieldOled.setCursor(0, 0);
toprint = ‘A’;
IOShield0led.putChar(toprint);
}
13/11/2023 2020-2021 196
Programme Exemple
#include <Wire.h> Serial.println(F("SSD1306
#include <Adafruit_GFX.h> allocation failed")); while
#include <Adafruit_SSD1306.h> (true); } delay(2000); // wait
#define SCREEN_WIDTH 128 // for initializing
OLED display width, in pixels oled.clearDisplay(); // clear
#define SCREEN_HEIGHT 64 // display oled.setTextSize(1); //
OLED display height, in pixels text size
// declare an SSD1306 display oled.setTextColor(WHITE); //
object connected to I2C text color oled.setCursor(0,
Adafruit_SSD1306 10); // position to display
oled(SCREEN_WIDTH, oled.println("Hello World!");
SCREEN_HEIGHT, &Wire, -1); // text to display
void setup() { oled.display(); // show on OLED
Serial.begin(9600); // }
initialize OLED display with
address 0x3C for 128x64 if
(!oled.begin(SSD1306_SWITCHCAPV
CC, 0x3C)) {
13/11/2023 2020-2021 197
Programme
void loop() { }
Exemple number
Fonctions utilisées pour afficher du texte •oled.println(number, HEX): print
sur ecran OLED: a number IN hex format
•oled.clearDisplay(): all pixels are •oled.display(): call this method for
off the changes to make effect
•oled.drawPixel(x,y, color): •oled.startscrollright(start,
plot a pixel in the x,y coordinates stop): scroll text from left to right
•oled.setTextSize(n): set the font •oled.startscrollleft(start, s
size, supports sizes from 1 to 8 top): scroll text from right to left
•oled.setCursor(x,y): set the •oled.startscrolldiagright(sta
coordinates to start writing text rt, stop): scroll text from left bottom
•oled.setTextColor(WHITE): set corner to right upper corner
the text color •oled.startscrolldiagleft(star
•oled.setTextColor(BLACK, t, stop): scroll text from right bottom
WHITE): set the text color, background corner to left upper corner
color •oled.stopscroll(): stop scrolling
•oled.println(“message”): print
Arduino Code - Drawing on OLED
the characters
•oled.println(number): print a
13/11/2023 2020-2021 198
EEPROM
• L'EEPROM est très limitée. Alors qu'un disque dur peut stocker jusqu'à plusieurs téraoctets
de données, vous ne pouvez stocker que quelques octets, parfois des kilo-octets sur
l'EEPROM.
• Toutes les cartes Arduino n'ont pas d'EEPROM. Sur Arduino Uno et Mega, vous avez 1024
octets, mais si vous avez un Arduino Zero, vous n'avez pas d'EEPROM disponible.
• Il y a une limite au nombre de fois où vous pouvez écrire à un seul emplacement de la
mémoire EEPROM. Après environ 100 000 opérations d'écriture, l'emplacement mémoire
peut être mort. C’est pourquoi vous devez manipuler cette mémoire avec précaution.
• Pour stocker des nombres sur plusieurs octets (int, long, double,…), vous devez savoir
combien d'octets chaque valeur prendra, afin de pouvoir loger les valeurs en conséquence
dans la mémoire.
Les capteurs
Les capteurs sont répartis en deux familles, les capteurs logiques et les
capteurs analogiques.
R0 = 500Ω et α= 0.0043.
R0 = 500Ω et α= 0.0043.
T= (𝑅 − 𝑅0)/α𝑅0 °C=T+273
11/13/2023 209
Sensor Characteristics (1/4)
• Range
– Full Scale Range
– Operating Voltage Range
• Accuracy
• Transfer Function
– S=F(x), where x is the measurand and S the
electrical signal (commonly Voltage)
• Sensitivity
– The change in input required to generate a
unit change in output
Sensor Characteristics (2/4)
• Accuracy
• Precision
Sensor Characteristics (3/4)
• Error: the difference between the
measured value and true value
• Systematic errors are reproducible
inaccuracies that can be corrected with
compensation methods
– Interference errors
– Operator errors etc.
• Random error
– Noise
Sensor Characteristics (4/4)
• Hysterysis: the difference in output
between the rising and falling output
values for a given input
Exemple Capteur de fumée (1/2)
• An MQ-2 smoke sensor reports smoke by
the voltage level it puts out.
• The more smoke there is, the higher the
voltage.
• built-in potentiometer for adjusting
sensitivity
• Three pins:
– Vdd input
– Ground input
– Analog output
Capteur de fumée (2/2)
const int smokePin = 54; //sensor input
void setup() {
pinMode(smokePin, INPUT);
Serial.begin(9600);
}
void loop() {
int smoke_level = analogRead(smokePin); //read sensor
Serial.println(smoke_level);
if(smoke_level > 120) { //calibrate accordingly
Serial.println("Smoke detected");
}
delay(100); // ms
}
Références
• M.J. McGrath, C. N. Scanaill and D. Nafus,
“Sensor Technologies Healthcare, Wellness and
Environmental Applications”, Apress, 2013
• C.W. de Silva, “Sensors and Actuators: Control
System Instrumentation”, 2nd Edition, CRC
Press, 2015
• T. Karvinen and K. Karvinen, ” Make: Sensors: A
Hands-On Primer for Monitoring the Real World
with Arduino and Raspberry Pi”, Maker Media,
Inc, 2014
Actionneurs
Actuators
• Device that turns energy (typically
electrical) to motion
• Features
– Force
– Speed
– Torque
– Power
– Efficiency
DC motor
• Force is produced
(F=ILB) due to the
electric current in a
wire inside a
magnetic field.
• Proportional to the
current, therefore
can be controlled by
potentiometer
• Hard to control
precisely
Servo motors
• A DC motor with a
control circuit
Servo motors are
• controlled by PWM
through the control pin
Il existe trois grandes
familles de servomoteurs :
positionnement angulaire,
rotation continue,
déplacement linéaire.
La librairie Servo.h
• Pour piloter vos servomoteurs, vous aurez besoin de la librairie servo.h qui fait
partie des librairies de base de l’environnement Arduino. Parmi les fonctions
proposées par la librairie servo.h, deux sont les plus utilisées :
• attach(pin) : permet d’attacher le servomoteur au Pin d’asservissement
• write(angle) : envoi le servo à l’angle spécifié
• Ces quatre autres fonctions pourront être utiles pour gérer plus finement les
servomoteurs
• writeMicroseconds(us) : permet d’ajuster les positions limites si votre
servomoteur n’est pas standard.
• read(pin) : permet de lire l’angle sur lequel est actuellement positionné le servo
• attached(pin) : permet de savoir sur un servomoteur est attaché au Pin spécifié
• detach(pin) : pour détacher votre servomoteur du Pin spécifié.
Description
Caractéristiques:
- Tension de fonctionnement: 3,0 - 7,2 V
- Angle de rotation: 180 degrés
- Vitesse: 0,12 sec / 60 degrés (4,8 V) sans charge
- Couple: 1,2 kg.cm (4,8 V) et 1,6 kg.cm (6,0 V)
- Température de fonctionnement: -30C ~ + 60C
- Type d'engrenage: Nylon
- Taille du câble: 245 mm
- Dimensions: 32 x 30 x 12 mm
13/11/2023 2020-2021 223
Servo connection
void setup() {
// set the speed at 60 rpm:
myStepper.setSpeed(60); //actually sets the delay between steps
}
void loop() {
// step one revolution in one direction:
myStepper.step(stepsPerRevolution);
delay(500);
}
INTERNET OF THINGS WITH
ARDUINO
Arduino with GPS (1/4)
• Three modes:
– Stand-alone: GPS obtains information such as position and
altitude with only the signal of the satellites
• slowest of the three modes
• AT+CGPSINFO command brings directly latitude, logtitude,
date, UTC time, altitude and speed
– S-GPS: module connects to a GPS server
• module calculates the position
– A-GPS: Three modes
• MS-Assisted: Server sends data and calculates position
• MS-based: Server sends aiding data, module calculates
position
• Stand-Alone: Module demodulates GPS data and calculates
position
Arduino with GPS (2/4)
• AT+CGPSINFO returns the GPS info in a string:
• [<latitude>],[<N/S>],[<longitude>],[<E/W>],[<date>],[<UT
C_time>],[<altitude>],[<speedOG>],[<course>]
Arduino with GPS (3/4)
int8_t answer;
int onModulePin= 2;
char gps_data[100]; //will perform 100 GPS data reads
int counter;
void setup(){
pinMode(onModulePin, OUTPUT);
Serial.begin(115200);
Serial.println("Starting...");
power_on();
delay(5000); // starts GPS session in stand alone mode
}
}
void power_on(){ //void power_on() should be placed AFTER void loop(), used here for lecture
digitalWrite(onModulePin,HIGH); //GPS module requires a 3 sec pulse on onModulePin
delay(3000);
digitalWrite(onModulePin,LOW);
}
Arduino with GPS (4/4)
void loop(){
answer = sendATcommand("AT+CGPSINFO","+CGPSINFO:",1000);
// request info from GPS
if (answer == 1) {
counter = 0;
do{
while(Serial.available() == 0); //reading GPS data
gps_data[counter] = Serial.read();
counter++;
}
}
Serial.print("GPS data:"); //printing GPS data
Serial.print(gps_data);
}
Connecting through 3G (1/2)
int8_t answer;
int onModulePin = 2, aux;
char aux_str[50];
void setup(){
pinMode(onModulePin, OUTPUT);
Serial.begin(115200);
Serial.println("Starting...");
power_on();
delay(3000); //sets the PIN code
sprintf(aux_str, "AT+CPIN=%s", pin_number);
sendATcommand(aux_str, "OK", 2000);
delay(3000);
Connecting through 3G (2/2)
while( (sendATcommand("AT+CREG?", "+CREG: 0,1",
500) || sendATcommand("AT+CREG?", "+CREG: 0,5",
500)) == 0 ); // sets APN, user name and password
sprintf(aux_str, "AT+CGSOCKCONT=1,\"IP\",\"%s\"", apn);
sendATcommand(aux_str, "OK", 2000);
sprintf(aux_str, "AT+CSOCKAUTH=1,1,\"%s\",\"%s\"",
user_name, password);
sendATcommand(aux_str, "OK", 2000);
}
Les Timers / compteurs avec Arduino et
ATMEGA 328P
• Les Timers / compteurs avec Arduino et ATMEGA 328P