Programmation
Avancée
Embarquée:(S2) Programmation en C/Arduino
DE L’ARCHITECTURE À L’ARDUINO
Slim Ben Othman Hedi Abdelkrim
1 | Microcontrôleur : De l’architecture à l’Arduino 58 | Microcontrôleur : De l’architecture à l’Arduino
Structure de base d'un programme Structure de base d'un programme
Arduino Arduino
Carte de
..
développement
..
..
13
12
11
59 | Microcontrôleur : De l’architecture à l’Arduino 60 | Microcontrôleur : De l’architecture à l’Arduino
Constantes et Variables Constantes et Variables
const int LED=13;
int attente=1000; //ceci est une variable globale
#define LEDON digitalWrite(LED,HIGH);
X Déclaration d’une constante #define LEDOFF digitalWrite(LED,LOW); type taille en byte (octet) valeurs stockées
X const type NOMDELACONSTANTE=valeur;
void setup() boolean 1 true ou false
{
char 1 un caractère ou un
X Déclaration d’une définition int i=0; //ceci est une variable locale
entier entre -128 et 127
X #define label definition // on l'utilise en écrivant juste son nom
pinMode(LED,OUTPUT); unsigned char 1 un entier entre 0 et 255
}
X Déclaration d’une variable byte 1 un entier entre 0 et 255
void loop()
X type nomVariable=valeur initiale { int 2 un entier entre -32768 et
// là encore. 32767
LEDOFF;
X Portée d’une variable unsigned int 2 un entier entre 0 et 65535
delay(Attente);
X Locale // et là encore. float 4 un décimal, précis à 7
X Globale LEDON; chiffres après la virgule
delay(Attente);
}
61 | Microcontrôleur : De l’architecture à l’Arduino 62 | Microcontrôleur : De l’architecture à l’Arduino
Moniteur série Condition
Code Condition testée
== égal
X Pour utiliser la possibilité de void setup() X if (condition) { code à excécuter }
communication entre { >= supérieur ou égal
// initialisation de la communication else { code à excécuter }
l'ordinateur et l'Arduino, on <= inférieur ou égal
[Link](9600);
procède en deux étapes :
// envoi d'un message > supérieur
[Link]("Communication initialisée");
< inférieur
}
X On initialise la communication
void loop() != différent (non égal)
(ça se fait dans le setup()).
{
X On communique (ça se fait //envoi d'un autre message pinMode (12, INPUT) ;
souvent dans la loop() mais [Link]("Je suis dans la boucle !"); booleen etatBouton = digitalRead (12) ;
possible dans le setup()). }
if (etatBouton ==LOW) if (! etatBouton )
X Afficher le message [Link]("Bouton appuié"); [Link]("Bouton appuié");
else else
[Link]("Bouton relaché"); [Link]("Bouton relaché");
63 | Microcontrôleur : De l’architecture à l’Arduino 64 | Microcontrôleur : De l’architecture à l’Arduino
Condition Condition
Exercice
void loop()
const int LED=13;
{booleen etatBouton = digitalRead (POUSS) ;
Const int POUSS=12; switch (expression) {
case (1) : Instruction1;
if (!etatBouton) {
void setup() break;
[Link]("Bouton appuié");
{ case (2) : Instruction2;
digitalWrite(LED,LOW);
[Link](9600); break;
}
pinMode(LED,OUTPUT); case (3) : Instruction3;
else {
pinMode(POUSS,INPUT); // break;
[Link]("Bouton relaché");
} }
digitalWrite(LED,HIGH);
}
}
65 | Microcontrôleur : De l’architecture à l’Arduino 66 | Microcontrôleur : De l’architecture à l’Arduino
Boucle void setup()
{
Boucle
}
[Link](9600);
Exercice
void loop()
X for (int t=0;t<10;t=t+1){ { X Inverser l’état de LED à chaque appuie sur POUSS
for (int compteur=0;compteur<=20;compteur=compteur+1)
code à exécuter { void loop () {
} [Link](compteur); // attendre un appuie
} while (! digitalRead (POUSS)) {
} delay (50);
}
void loop()
X while (condition){ { //Toggle
int compteur = 0; digitalWrite (LED,!digitalRead(LED))
faire tant que la While (compteur<=20){
condition est vraie [Link](compteur); // attendre relachement
compteur=compteur+1; while (digitalRead (POUSS) ) {
} } delay (50);
} }
}
67 | Microcontrôleur : De l’architecture à l’Arduino 68 | Microcontrôleur : De l’architecture à l’Arduino
Tableaux Fonction
X type nomTableau[nbr_éléments] X Déclaration
X Initialisation d’un tableau seulement à la déclaration X type nomDeLaFonction(type param1,type param2,type param3...){
X type nomTableau[nbr_éléments]={el1,el2,…} //code du programme de la fonction
}
X Exemple //On utilise des LEDs connectées sur les pins 2,4 et 6 booelen estVrai(int pin){
int pinLed[3] = {2, 4, 6}; X Appel return(!digitalRead(Pin));
void setup() }
{ X nomDeLaFonction(parametres); void setup()
//Boucle d'initialisation des modes et mise à 0V X X=nomDeLaFonction(parametres); {
for (int i = 0; i < 3; i++) { booleen etatBouton = estVrai(POUSS) ;
pinMode(pinLed[i], OUTPUT); // si type != Void …
digitalWrite(pinLed[i], LOW); }
}
}
69 | Microcontrôleur : De l’architecture à l’Arduino 70 | Microcontrôleur : De l’architecture à l’Arduino
Application Application
9DULHUO¶LQWHQVLWp
int dureeOn = 1; // 1 à 19 !
1RPEUHGHFOLJQRWHPHQWVVHORQGXUpHSRXVVRLU int cTime ; 5pGXLUHO¶LQWHQVLWp3:0 #define MaxNbRepet 10 // 10x20ms = 0.2s
void loop() {
void loop() {
cTime = 0;
for (int nbRepet = 0 ; nbRepet <= MaxNbRepet); nbRepet++) {
while (! digitalRead (POUSS)) {
digitalWrite (LED,HIGH));
cTime++ ;
delay (dureeOn) ;
delay (20);
digitalWrite (LED,LOW));
}
delay (20-dureeOn) ;
while (cTime >0) {
}
digitalWrite (LED,LOW)); int dureeOn = 2; // 1 à 19 !
dureeOn++;
delay (200); void loop() {
if (dureeOn == 19+1) { dureeOn = 1; }
digitalWrite (LED,HIGH)); digitalWrite (LED,HIGH));
}
delay (200); delay (dureeOn) ;
cTime -= 25; digitalWrite (LED,LOW));
} delay (20-dureeOn) ;
} }
71 | Microcontrôleur : De l’architecture à l’Arduino 72 | Microcontrôleur : De l’architecture à l’Arduino
Résistance de tirage void setup () {
Résistance de tirage
pinMode (LED, OUTPUT);
pinMode (POUSS, INPUT);
} X Beaucoup de fabricants intègrent des résistances de tirage dans
void loop () { leurs microcontrôleurs
int val = digitalRead (POUSS) ;
digitalWrite (RED_LED, val); X La valeur est généralement d'environ 50 kOhm
}
X Avec ce montage et ce
programme, que va-t-on voir sur
la LED si le bouton est relaché :
X Elle sera éteinte
X Elle va clignoter X Activer la résistance de tirage sur une entrée
X Son état va fluctuer X pinMode (POUSS, INPUT_PULLUP);
X Elle sera allumée
X Une entrée non connectée
capte toute sorte de parasites
73 | Microcontrôleur : De l’architecture à l’Arduino 74 | Microcontrôleur : De l’architecture à l’Arduino
Fonctions utiles Fonctions utiles
X Saturation X On travaille sur un thermomètre
X if x > a) res = a ; médical. Le capteur donne une valeur
de 240 pour 32° et 680 pour 35°.
if (x < b) res = b ;
Ecrire la fonction qui donne y selon x.
X res = constrain (x, a, b) ;
X y = map (x, 240, 680, 32, 35) ;
X Minimum/Maximum
if (a < b ) res = a ; map(value, fromLow, fromHigh, toLow, toHigh) ;
X res=min(a, b) ;
if (a < b ) res = b ;
X res= max(a, b) ;
75 | Microcontrôleur : De l’architecture à l’Arduino 76 | Microcontrôleur : De l’architecture à l’Arduino
Fonctions utiles Fonctions utiles
long temps;
If ((millis()-temps)>1000) {
digitalWrite(LED,!digitalRead(LED));
temps=millis();//on stocke la nouvelle heure
PLOOLV X nombres pseudo-aléatoires
X } int nbAlea;
random(max); // retourne un entier void setup() {
X
X /D FDUWH $UGXLQR GLVSRVH G¶XQH IRQFWLRQ TXL PHVXUH O¶pFRXOHPHQW GX WHPSV entre 0 et et la valeur max précisée [Link](9600);
(non comprise) randomSeed(analogRead(0));//initialise la séquence
GHSXLV OH ODQFHPHQW GH O¶DSSOLFDWLRQ
X random(min,max); //retourne un aléatoire
X 6D JUDQXODULWp OD SUpFLVLRQ GH VRQ WHPSV HVW OD PLOOLVHFRQGH /D IRQFWLRQ entier entre les valeurs min et max }
précisées (max non compris)
PLOOLV QRXV VHUW j VDYRLU TXHOOH HVW OD YDOHXU FRXUDQWH GH FH FRPSWHXU void loop() {
X Initialisation de la séquence nbAlea=random(100); //construit le nombre aléatoire
X &H FRPSWHXU HVW FDSDEOH GH PHVXUHU XQH GXUpH DOODQW MXVTX¶j MRXUV aléatoire [Link](nbAlea);//affichage du nombre
X randomSeed(unNombre); delay(500);//attente
X /D YDOHXU UHWRXUQpH GRLW rWUH VWRFNpH GDQV XQH YDULDEOH GH W\SH ³ORQJ´ }
77 | Microcontrôleur : De l’architecture à l’Arduino 78 | Microcontrôleur : De l’architecture à l’Arduino
Exercice Pratique Exercice Pratique
//boucle principale
//déclaration des variables void loop(){
//LEDs sur les pins 2 à 6 //test de l'état du bouton avec boolean etatBouton
//bouton sur le pin 7 if (le bouton est cliqué){
X Défiler sur les leds des valeurs aléatoires de 1 à 5 for... //boucle for qui temporise l'affichage de plus en plus lentement
avec la constellation du dé //initialisation {
void setup(){ //exctinction brève des LEDs (100ms)
X Ralentir peu à peu la fréquence de l’affichage //initialiser la séquence //tirage d'un nombre aléatoire avec la fonction random()
jusqu’à s’arrêter sur une valeur léatoire //appel de la fonction d'allumage des LEDs
//temporisation
X Redémarrer l’animation à l’appui d’un bouton //pin 2 à 6 en mode OUTPUT }
poussoir sur pin 7 }
//pin 7 en mode INPUT_PULLUP }
//appel de la fonction //déclaration de la fonction setZero()
//setZero() pour tout éteindre void setZero(){
} //code pour tout éteindre
}
//déclaration de la fonction d'allugmage
void allumage(int nombre){
//code pour l'affichage en fonction du nombre
}
79 | Microcontrôleur : De l’architecture à l’Arduino 80 | Microcontrôleur : De l’architecture à l’Arduino
Exercice Pratique
Solution
81 | Microcontrôleur : De l’architecture à l’Arduino