Initiation à la programmation embarquée
La programmation embarquée consiste à programmer des microcontrôleurs, qui sont de petits circuits intégrés qui rassemblent les éléments essentiels d’un ordinateur. Les microcontrôleurs sont présents dans divers objets de notre quotidien (robots, ordinateurs, voitures…).
Dans cette initiation, vous apprendrez à prendre en main une carte Arduino et son logiciel associé, afin d’assimiler les bases de la programmation embarquée pour vos futurs projets personnels.
Pour toute remarque ou question, n’hésitez pas à m’envoyer un mail ().
Prérequis
Software
- Un ordinateur avec le logiciel Arduino IDE.
Hardware
Le microcontrôleur
Les composants
Les composants sont assez faciles à retrouver sur les sites de vente en ligne. Ce que je peux vous conseiller, c’est d’acheter des kits de composants qui réunissent déjà les composants de la liste ci-dessous, avec quelques composants supplémentaires que vous pourrez tester de votre côté.
- Trois LEDs de couleur
- Un bouton poussoir
- 3 résistances de 220 ohms
- 1 résistance de 10 kilo-ohms
- Un potentiomètre
- Un buzzer à impédance
- Une plaque de prototypage (breadboard)
- Quelques câbles de prototypages
Les missions
Pour chaque niveau, un montage sera proposé sous la forme ci-dessous :
Essayez de réaliser le branchement du montage. Une fois fait, vous pourrez brancher votre carte Arduino à votre ordinateur et ouvrir le logiciel Arduino IDE. Explorons rapidement l’interface avec un code permettant d’allumer la LED rouge :
- Le bouton de compilation ☑️ permet de vérifier le code pour détecter d’éventuelles erreurs avant de l’envoyer sur la carte.
- Le bouton de téléversement ➡️ envoie le code compilé sur la carte Arduino pour qu’il y soit exécuté.
On définit un entier qui correspond à la broche de la carte sur laquelle on a connecté la LED, ici 2 :
const int ledPin = 2;
La LED étant une sortie (c’est-à-dire qu’on envoie du courant depuis la carte Arduino vers la LED pour l’allumer), on configure la broche ledPin
en tant que telle avec la fonction pinMode()
:
pinMode(ledPin, OUTPUT);
Dans la fonction loop()
, on utilise digitalWrite()
pour mettre la LED à l’état haut (HIGH) et ainsi l’allumer :
digitalWrite(ledPin, HIGH);
Après compilation et téléversement du code sur la carte, tout le code compris dans la fonction setup
ne se lancera qu’une seule fois (ici la définition de ledPin
en sortie numérique). Quant au code compris dans la fonction loop
, il s’exécutera en boucle indéfiniment !
Astuce
Quelques conseils pour bien démarrer :
- Un aide-mémoire regroupant la syntaxe et les fonctions utiles est à votre disposition plus bas dans la page.
- N’oubliez pas les points virgules “;” à la fin de chaque instruction.
- Vérifiez si le programme est bon avec la coloration syntaxique et le bouton de compilation.
- Faites attention aux minuscules/MAJUSCULES (sensibilité à la casse) dans les noms des variables : violet ≠ Violet.
- Si jamais vous êtes coincés, une solution pour chacune des missions est également proposée.
- Ne frappez pas votre machine (ou qui que ce soit d’autre) si ça ne fonctionne pas !
Niveau 1 - Clignotant
Montage niveau 1
Mission
Faire clignoter la LED en changeant son état toutes les secondes.
Niveau 2 - Tricolore
Montage niveau 2
Mission
Changer de manière successive l’état des 3 LEDs.
Niveau 3 - Jour, Nuit, Jour…
Montage niveau 3
Mission
Commander l’allumage de la LED grâce à un bouton.
Astuce
- Le bouton doit-il être configuré comme une entrée ou une sortie ?
- Peut-être que pour connaître l’état du bouton, une fonction existe pour lire l’état d’une broche numérique… Peut-être même qu’elle est dans l’aide-mémoire. La vie est bien faite non ?
Niveau 4 - Jour, Nuit, version soft
Montage niveau 4
Mission
Faire varier l’intensité de la LED émise à l’aide d’un potentiomètre.
Astuce
La broche du potentiomètre est connectée à un port analogique. Hmm… Analogique, analogique, analog, analog
…
Niveau 5 - ♪ Joyeux anniversaire ♪
Montage niveau 5
Mission
Jouer « Joyeux anniversaire » lorsque le bouton est appuyé.
Fréquences des notes et partition (très) simplifiée de « Joyeux anniversaire » :
Note | Do | Do# | Ré | Ré# | Mi | Fa | Fa# |
---|---|---|---|---|---|---|---|
f(Hz) | 262 | 277 | 294 | 311 | 330 | 349 | 370 |
Note | Sol | Sol# | La | La# | Si | Do2 |
---|---|---|---|---|---|---|
f(Hz) | 391 | 415 | 440 | 466 | 493 | 523 |
Astuce
Il y’a 25 notes jouées dans « Joyeux anniversaire ». On pourrait utiliser la méthode bourrin qui serait d’écrire 25 fois les fonctions tone()
& noTone()
pour chaque note, mais je suis sûr qu’il y’a une solution plus astucieuse ! Dans la partition simplifiée, une couleur de note correspond à une durée différente, pensez à varier les délais entre celles-ci.
Pour aller plus loin
Félicitations si vous êtes arrivés au bout des niveaux ! Si c’était trop facile pour vous vous pouvez essayer de créer un projet à partir de tous les composants que vous possédez. Par exemple pourquoi pas un feu tricolore à luminosité variable qui alerte les piétons d’un son lorsque le feu passe au rouge ? N’hésitez pas à parcourir Internet pour trouver des tutoriels qui pourraient vous intéresser.
Arduino est une plateforme idéale pour pouvoir comprendre rapidement les bases de la programmation embarquée et réaliser de petits projets. Mais si vous voulez aller plus loin, il existe des plateformes plus puissantes comme les microcontrôleurs STM32. La prise en main est moins intuitive, mais cela permet de réaliser des projets plus complexes, c’est pourquoi il est utilisé au sein de beaucoup d’entreprises.
Aide-mémoire
Les variables
Type | Description | Codage |
---|---|---|
int | Entier naturel | 4 octets |
float | Nombre à virgule | 4 octets |
char | Caractère | 1 octet |
double | Nombre à virgule (double précision) | 8 octets |
Les opérateurs
Type | Opérateurs |
---|---|
Arithmétiques | + , - , * , / , % |
Affectation | = , += , -= , %= , |= , ^= , <<= , >>= |
Logiques | && , || < , > , <= , >= , == , != |
Condition
if (x < 3) {
printf("x est inférieur à 3");
} else {
printf("x est supérieur ou égal à 3");
}
Boucles
int x = 0;
while(x < 5){
printf("Je ne dois pas frapper mon ordinateur.\n");
x++;
}
int somme = 0;
for(int i = 0; i < 100; i++){
somme += i;
}
Directives de préprocesseur
// Inclusion d’une bibliothèque, ici servo
#include <servo.h>
// Définition de constantes
#define N 7
#define SIZE 3
#define SIZE2 6
Les tableaux
int tab[SIZE] = {1, 8, 0, 5};
char tabchar[SIZE2] = {'c', 'h', 'r', 'o', 'm', 'a'};
// Initialisation d'un tableau à 0
for (int i = 0; i < SIZE; i++) {
tab[i] = 0;
}
Fonctions Arduino
Fonction | Description |
---|---|
pinMode(int pin, INPUT) | Définir le type d’une broche (INPUT = entrée/ OUTPUT = sortie) |
digitalWrite(int pin, HIGH) | Définir l’état d’une broche numérique (HIGH = 1, LOW = 0) |
digitalRead(int pin) | Lire l’état d’une broche numérique |
delay(1000) | Attente de 1000 ms (1 seconde) |
analogWrite(int pin, int dutyCycle) | Création d’un signal PWM de rapport cyclique dutyCycle ∈ [0; 255] |
analogRead(int pin) | Lire la valeur d’une broche analogique |
Serial.begin(int baud) | Initialiser la liaison série (souvent baud = 9600) |
Serial.println("Chroma") | Afficher “Chroma” sur le port série |
map(val, Imin, Imax, Omin, Omax) | Changement d’échelle. Réajuste les valeurs de val ∈ [Imin ; Imax ] pour [Omin ; Omax ] |
tone(pin, frequency) | Jouer une fréquence sonore sur un buzzer de fréquence frequency |
noTone(pin) | Arrêter le son du buzzer |
Servo monServo | Créer un objet pour contrôler un servomoteur |
monServo.attach(pin) | Attacher la broche pin à l’objet monServo |
monServo.write(90) | Définir la position du servomoteur (ici 90°) |
Le saviez-vous ?
Le langage de programmation utilisé pour coder sur Arduino est le C++. Il est souvent utilisé pour coder des applications mobiles, des jeux vidéo, des logiciels de bureautique, en robotique…
Solutions des missions
Les codes qui sont écrits dans cette section sont des proposition de correction écrites par mes soins. Ne voyez pas ces solutions comme des dogmes : il existe pleins d’autres façons de coder et d’arriver à une solution.
À vous de trouver celle qui vous plaira !
Solution niveau 1 - Clignotant
1const int ledPin = 2;
2
3void setup() {
4 pinMode(ledPin, OUTPUT);
5}
6
7void loop() {
8 digitalWrite(ledPin, HIGH);
9 delay(1000);
10
11 digitalWrite(ledPin, LOW);
12 delay(1000);
13}
Solution niveau 2 - Tricolore
1const int redLed = 2;
2const int yellowLed = 3;
3const int greenLed = 4;
4
5void setup() {
6 pinMode(redLed, OUTPUT);
7 pinMode(yellowLed, OUTPUT);
8 pinMode(greenLed, OUTPUT);
9}
10
11void loop() {
12 digitalWrite(redLed, HIGH);
13 digitalWrite(yellowLed, LOW);
14 digitalWrite(greenLed, LOW);
15 delay(1000);
16
17 digitalWrite(redLed, LOW);
18 digitalWrite(yellowLed, HIGH);
19 digitalWrite(greenLed, LOW);
20 delay(1000);
21
22 digitalWrite(redLed, LOW);
23 digitalWrite(yellowLed, LOW);
24 digitalWrite(greenLed, HIGH);
25 delay(1000);
26}
Solution niveau 3 - Jour, Nuit, Jour…
1const int ledPin = 2;
2const int buttonPin = 4;
3
4void setup() {
5 pinMode(ledPin, OUTPUT);
6 pinMode(buttonPin, INPUT);
7}
8
9void loop() {
10 int buttonState = digitalRead(buttonPin);
11
12 if (buttonState == HIGH){
13 digitalWrite(ledPin, HIGH);
14 }
15 else{
16 digitalWrite(ledPin, LOW);
17 }
18}
Solution niveau 4 - Jour, Nuit, version soft
1const int ledPin = 3;
2const int potPin = A0;
3
4void setup() {
5 pinMode(ledPin, OUTPUT);
6}
7
8void loop() {
9 int potValue = analogRead(potPin);
10 int brightness = map(potValue, 0, 1023, 0, 255);
11
12 analogWrite(ledPin, brightness);
13}
Solution niveau 5 - ♪ Joyeux anniversaire ♪
1#define DO 262
2#define RE 294
3#define MI 330
4#define FA 349
5#define SOL 392
6#define LA 440
7#define LAd 466
8#define DO2 524
9
10#define SIZE 25
11
12const int buzzerPin = 2;
13const int buttonPin = 4;
14
15int frequences[SIZE] = {
16 DO, DO, RE, DO, FA, MI,
17 DO, DO, RE, DO, SOL, FA,
18 DO, DO, DO2, LA, FA, MI, RE,
19 LAd, LAd, LA, FA, SOL, FA
20
21};
22
23int durations[SIZE] = {
24 400, 200, 500, 500, 500, 900,
25 400, 200, 500, 500, 500, 900,
26 400, 200, 500, 500, 500, 500, 900,
27 400, 200, 500, 500, 500, 900
28};
29
30void setup() {
31 pinMode(buzzerPin, OUTPUT);
32 pinMode(buttonPin, INPUT);
33}
34
35void loop() {
36
37 int buttonState = digitalRead(buttonPin);
38 if (buttonState == HIGH){
39 happyBirthday();
40 }
41}
42
43
44void happyBirthday(){
45 for (int i = 0; i < SIZE; i++) {
46 tone(buzzerPin, frequences[i]);
47 delay(durations[i]);
48 noTone(buzzerPin);
49 }
50}
Crédits
- Rédacteur : Ousmane THIONGANE
- Dernière mise à jour : Mai 2025
- Relecteur : Loubna LATRECHE