IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Arduino à l'école

Cours pour l'apprentissage des bases de l'électronique et de la programmation sur Arduino
Image non disponible


précédentsommairesuivant

X. Projet 2 : faire clignoter une LED

Comme premier programme, nous allons faire clignoter une LED D1 , connectée sur la broche 13. Voici le schéma de câblage :

Circuit 2

Image non disponible

Image non disponible

Liste des composants

  • 1 LED ;
  • 1 résistance de 220 à 470 Ω ;
  • 2 câbles.

X-A. Le logiciel Arduino IDE

La programmation se fait dans le logiciel Arduino IDE :

Image non disponible

Le menu

Image non disponible
  • Bouton 1 : ce bouton permet de vérifier le programme, il actionne un module qui cherche les erreurs dans le programme ;
  • Bouton 2 : envoi du programme sur l'Arduino ;
  • Bouton 3 : créer un nouveau fichier ;
  • Bouton 4 : ouvrir un fichier existant ;
  • Bouton 5 : enregistrer un fichier.

Commençons tout de suite par un petit code. Nous l'analyserons ensuite.

Une fois le code écrit (ou collé) dans la fenêtre de programmation, il faut l'envoyer sur l'Arduino. Pour cela, après avoir connecté l'Arduino à l'ordinateur, il faut sélectionner le port (tty_usbmodemXXXXX) et le type de carte (Arduino Uno, dans notre cas). Ces deux réglages sont dans le menu Outils.

Image non disponible

Cliquer enfin sur le bouton téléverser (upload).

Code 1 : faire clignoter une LED sur la broche 13
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
/*
  Code 1 - Edurobot.ch, destiné à l'Arduino
  Objectif: faire clignoter la LED montée sur la broche 13
*/

//***** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et une seule fois, au démarrage du programme

void setup()    // début de la fonction setup()
{
    pinMode(13, OUTPUT);  // Initialise la broche 13 comme sortie
    Serial.begin(9600);   // Ouvre le port série à 9600 bauds
}               // fin de la fonction setup()

//***** FONCTION LOOP = Boucle sans fin = cœur du programme *****
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop()     // début de la fonction loop()
{
    digitalWrite(13, HIGH);  // Met la broche 13 au niveau haut = allume la LED
    delay(500);              // Pause de 500 ms
    digitalWrite(13, LOW);   // Met la broche 13 au niveau bas = éteint la LED
    delay(500);              // Pause 500 ms
}               // fin de la fonction loop()

Observations

Ce code permet de faire clignoter la LED D1 située sur la broche 13. Une LED, soudée sur l'Arduino et reliée à la broche 13 clignote elle aussi. La résistante R1 de 220 Ω sert à abaisser la tension et éviter que la LED ne grille.

Déboguer

Il y a de nombreuses erreurs possibles dans un programme Arduino. La lecture et la compréhension de ces erreurs dans Arduino IDE ne sont pas évidentes. Vous trouverez de précieux conseils ici :

Introduction au code

Le déroulement du programme

Le programme se déroule de la façon suivante :

  1. Prise en compte des instructions de la partie déclarative ;
  2. Exécution de la partie configuration (fonction setup()) ;
  3. Exécution de la boucle sans fin (fonction loop()) : le code compris dans la boucle sans fin est exécuté indéfiniment.
Image non disponible

Nous verrons petit à petit les divers éléments présents dans le schéma. L'important pour le moment est de savoir qu'un programme est divisé en trois parties : en-tête déclaratif, fonction setup et fonction loop.

La suite va nous permettre d'entrer dans le code minimal : les fonctions setup et .

Le code minimal

Avec Arduino, nous devons utiliser un code minimal lorsqu'on crée un programme. Ce code permet de diviser le programme en deux parties.

 
Sélectionnez
1.
2.
3.
4.
5.
6.
void setup()
{
}
void loop()
{
}

Nous avons donc devant nous le code minimal qu'il faut insérer dans notre programme. Mais que peut-il bien signifier pour quelqu'un qui n'a jamais programmé ?

La fonction

Dans le code 1 se trouvent deux fonctions. Les fonctions sont en fait des portions de code.

Première fonction :

 
Sélectionnez
1.
2.
3.
void setup()  
{
}

Cette fonction setup() est appelée une seule fois lorsque le programme commence. C'est pourquoi c'est dans cette fonction que l'on va écrire le code qui n'a besoin d'être exécuté qu'une seule fois. On appelle cette fonction : « fonction d'initialisation ». On y retrouvera la mise en place des différentes sorties et quelques autres réglages.

Une fois que l'on a initialisé le programme, il faut ensuite créer son « cœur », autrement dit le programme en lui-même.

Deuxième fonction :

 
Sélectionnez
1.
2.
3.
void loop()
{
}

C'est donc dans cette fonction loop() que l'on va écrire le contenu du programme. Il faut savoir que cette fonction est appelée en permanence, c'est-à-dire qu'elle est exécutée une fois, puis lorsque son exécution est terminée, elle est exécutée à nouveau, encore et encore. On parle de boucle infinie.

Les instructions

Maintenant que nous avons vu la structure des fonctions, regardons ce qu'elles peuvent contenir.

Les instructions sont des lignes de code qui disent au programme : « fais ceci, fais cela… » Ce sont donc les ordres qui seront exécutés par l'Arduino. Il est très important de respecter exactement la syntaxe ; faute de quoi, le code ne pourra pas être exécuté.

Les points-virgules ;

Les points-virgules terminent les instructions. Si par exemple on dit dans notre programme : « appelle la fonction mangerLeChat », on doit mettre un point-virgule après l'appel de cette fonction.

Lorsque le code ne fonctionne pas, c'est souvent parce qu'il manque un point-virgule. Il faut donc être très attentif à ne pas les oublier !

Les accolades { }

Les accolades sont les « conteneurs » du code du programme. Elles sont propres aux fonctions, aux conditions et aux boucles. Les instructions du programme sont écrites à l'intérieur de ces accolades.

Pour ouvrir une accolade sur Mac, taper alt-8 et alt-9 pour la fermer.

Les commentaires

Les commentaires sont des lignes de code qui seront ignorées par le programme. Elles ne servent à rien lors de l'exécution du programme. Ils permettent d'annoter et de commenter le programme.

Ligne unique de commentaire :

 
Sélectionnez
1.
//cette ligne est un commentaire sur UNE SEULE ligne

Ligne ou paragraphe sur plusieurs lignes :

 
Sélectionnez
1.
2.
/*cette ligne est un commentaire, sur PLUSIEURS lignes
qui sera ignoré par le programme, mais pas par celui qui lit le code ;) */

Les accents

Il est formellement interdit de mettre des accents en programmation ! Sauf dans les commentaires…

Analyse du code 1

Revenons maintenant à notre code.

Image non disponible
  • La ligne pinMode(13, OUTPUT); initialise la broche 13 du microcontrôleur comme sortie, c'est-à-dire que des données seront envoyées depuis le microcontrôleur vers cette broche (on va « envoyer » de l'électricité).
  • La ligne Serial.begin(9600); initialise le port série qui permet à l'Arduino d'envoyer et de recevoir des informations à l'ordinateur. C'est recommandé, mais cela fonctionne aussi sans.
  • Avec l'instruction digitalWrite(13, HIGH);, le microcontrôleur connecte la broche D13 au +5 V ce qui a pour effet d'allumer la LED (de l'électricité « sort » de la broche D13).
  • L'instruction delay(500); indique au microcontrôleur de ne rien faire pendant 500 millisecondes, soit ½ seconde.
  • Avec l'instruction digitalWrite(13, LOW);, le microcontrôleur connecte la broche D13 à la masse (Gnd) ce qui a pour effet d'éteindre la LED (on coupe l'alimentation en électricité).
  • L'instruction delay(500); indique au microcontrôleur à nouveau de ne rien faire pendant 500 ms soit ½ seconde.
  • Le résultat est donc que la LED s'allume pendant ½ seconde, puis s'éteint pendant une ½ seconde puis s'allume pendant ½ seconde… Elle clignote donc.

Profitons maintenant pour voir ce que signifie le terme Output. Il s'agit de préciser si la broche est une entrée ou une sortie. En effet, le microcontrôleur a la capacité d'utiliser certaines de ses broches en entrée (INPUT) ou en sortie (OUTPUT). Il suffit d'interchanger une ligne de code pour dire qu'il faut utiliser une broche en entrée (NDLR. Broche en « lecture ») ou en sortie (NDLR. Broche en « écriture »).

Cette ligne de code doit se trouver dans la fonction setup(). La fonction est pinMode(), comme dans l'exemple ci-dessous :

 
Sélectionnez
1.
2.
3.
4.
5.
void setup()
{
    pinMode(13, OUTPUT);
    Serial.begin(9600);
}

Modifions le code

Faisons varier les valeurs de l'instruction delay() et modifions le code selon les exemples ci-dessous.

Essai 1 :
Sélectionnez
1.
2.
3.
4.
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
delay(50);
Essai 2 :
Sélectionnez
1.
2.
3.
4.
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(2000);
Essai 3 :
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
digitalWrite(13, HIGH);
delay(50);
digitalWrite(13, LOW);
delay(50);
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000);

X-A-1. Exercice : lancer un SOS

Image non disponible
En code morse, les lettres sont codées à l'aide d'une succession d'impulsions courtes et longues. On utilise le code morse pour transmettre un SOS, par exemple sous forme de signaux lumineux avec une lampe de poche.
L'exercice consiste à coder l'Arduino et sa LED pour qu'il transmette un signal de SOS lumineux. Voici à quoi ressemble un SOS en morse :
Attention : il n'y a pas d'espace entre les lettres d'un SOS.
Une vidéo avec le résultat est visible ici :
https://www.scolcast.ch/episode/arduino-sos

Image non disponible

Code de l’exercice SOS
Sélectionnez
/*
  Exercice Code SOS - Edurobot.ch, destiné à l'Arduino
  Objectif: faire clignoter la LED montée sur la broche 13 pour lancer un SOS
*/

//***** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et une seule fois, au démarrage du programme

void setup()  // début de la fonction setup()
{
    pinMode(13, OUTPUT);  // Initialise la broche 13 comme sortie
    Serial.begin(9600);   // Ouvre le port série à 9600 bauds
}  // fin de la fonction setup()

//***** FONCTION LOOP = Boucle sans fin = cœur du programme *****
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop() // début de la fonction loop()
{
    digitalWrite(13, HIGH); // Met la broche 13 au niveau haut = allume la LED
    delay(200);             // Pause de 200 ms
    digitalWrite(13, LOW);  // Met la broche 13 au niveau bas = éteint la LED
    delay(200);             // Pause 200 ms

    digitalWrite(13, HIGH); // Met la broche 13 au niveau haut = allume la LED
    delay(200);             // Pause de 200 ms
    digitalWrite(13, LOW);  // Met la broche 13 au niveau bas = éteint la LED
    delay(200);             //Pause 200 ms

    digitalWrite(13, HIGH); // Met la broche 13 au niveau haut = allume la LED
    delay(200);             // Pause de 200 ms
    digitalWrite(13, LOW);  // Met la broche 13 au niveau bas = éteint la LED
    delay(200);             // Pause 200 ms

    digitalWrite(13, HIGH); // Met la broche 13 au niveau haut = allume la LED
    delay(600);             // Pause de 600ms
    digitalWrite(13, LOW);  // Met la broche 13 au niveau bas = éteint la LED
    delay(200);             // Pause 200 ms

    digitalWrite(13, HIGH); // Met la broche 13 au niveau haut = allume la LED
    delay(600);             // Pause de 600 ms
    digitalWrite(13, LOW);  // Met la broche 13 au niveau bas = éteint la LED
    delay(200);             // Pause 200 ms

    digitalWrite(13, HIGH); // Met la broche 13 au niveau haut = allume la LED
    delay(600);             // Pause de 600 ms
    digitalWrite(13, LOW);  // Met la broche 13 au niveau bas = éteint la LED
    delay(200);             // Pause 200 ms

    digitalWrite(13, HIGH); // Met la broche 13 au niveau haut = allume la LED
    delay(200);             // Pause de 200 ms
    digitalWrite(13, LOW);  // Met la broche 13 au niveau bas = éteint la LED
    delay(200);             // Pause 200 ms

    digitalWrite(13, HIGH); // Met la broche 13 au niveau haut = allume la LED
    delay(200);             // Pause de 200 ms
    digitalWrite(13, LOW);  // Met la broche 13 au niveau bas = éteint la LED
    delay(200);             // Pause 200ms

    digitalWrite(13, HIGH); // Met la broche 13 au niveau haut = allume la LED
    delay(200);             // Pause de 200 ms
    digitalWrite(13, LOW);  // Met la broche 13 au niveau bas = éteint la LED
    delay(200);             // Pause 200 ms

} // fin de la fonction loop()

précédentsommairesuivant

Ce cours est publié pour la communauté Arduino d'Edurobot.ch via son site https://arduino.education/. Il s'agit d'une ressource éducative libre, sous licence CC BY-NC-SA. L'utilisation gratuite de ce cours dans le cadre d'une formation payante est tolérée. Un avis à l'auteur est néanmoins bienvenu. Les écoles publiques, lycées, gymnases, universités, les associations et les FabLab peuvent demander gratuitement une version Word de ce document, afin de l'adapter plus aisément à leurs besoins ou celui d’élèves dys.