Initiation à la programmation embarquée

IDE

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

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é.

Les missions

Pour chaque niveau, un montage sera proposé sous la forme ci-dessous :

Exemple de montage

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 :

IDE

  • 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

Niveau 1

Mission

Faire clignoter la LED en changeant son état toutes les secondes.

Solution


Niveau 2 - Tricolore

Montage niveau 2

Niveau 2

Mission

Changer de manière successive l’état des 3 LEDs.

Solution


Niveau 3 - Jour, Nuit, Jour…

Montage niveau 3

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 ?

Solution


Niveau 4 - Jour, Nuit, version soft

Montage niveau 4

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


Solution

Niveau 5 - ♪ Joyeux anniversaire ♪

Montage niveau 5

Niveau 5

Mission

Jouer « Joyeux anniversaire » lorsque le bouton est appuyé.

Fréquences des notes et partition (très) simplifiée de « Joyeux anniversaire » :

NoteDoDo#Ré#MiFaFa#
f(Hz)262277294311330349370
NoteSolSol#LaLa#SiDo2
f(Hz)391415440466493523

Happy Birthday

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.

Solution


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.

Niveau 6

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

TypeDescriptionCodage
intEntier naturel4 octets
floatNombre à virgule4 octets
charCaractère1 octet
doubleNombre à virgule (double précision)8 octets

Les opérateurs

TypeOpé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

FonctionDescription
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 monServoCré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}

Retour à la mission


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}

Retour à la mission


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}

Retour à la mission


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}

Retour à la mission


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}

Retour à la mission


Crédits

  • Rédacteur : Ousmane THIONGANE
  • Dernière mise à jour : Mai 2025
  • Relecteur : Loubna LATRECHE