La fonction setup() sur Arduino : son rôle, son fonctionnement et comment l'écrire
La fonction setup() dans un programme Arduino est l'une des deux fonctions fondamentales de la structure de base d'un programme Arduino. Complémenté par la fonction loop(), ces deux fonctions constituent la structure de base de tous les sketches Arduino (appelés aussi programmes), quel que soit le modèle de la carte Arduino utilisée; Uno, Nano, MEGA, ... etc. Ainsi, toute structure minimale d'un programme Arduino possède au minimum les deux fonctions suivantes :
void setup() {
// placez ici votre code d'initialisation, à exécuter une seule fois.
}
void loop() {
// placez votre code principal ici, pour qu'il s'exécute en boucle indéfiniment.
}
Il est également à noter que même si ces deux fonctions sont vides, elles doivent être présentes dans la structure de notre code. Si l'une des deux est manquante, le programme ne sera pas compilé et une erreur vous sera notifiée dans la fenêtre "sortie" de la solution Arduino IDE. Comme nous le remarquez, si vous lancez l'éditeur pour écrire votre programme, un programme vide est créé automatiquement par défaut, contenant uniquement les deux fonctions setup() et loop() par défaut, dans l'éditeur; comme nous le présente la capture ci-dessous :

Pourquoi la fonction setup() ?
Comme tout programme, un bloc d'initialisation des éléments de notre programme est requis ainsi que l'activation des variables, la communication des broches de notre carte ou même avec le moniteur série. C'est dans cette utilité que la fonction setup() est conçue pour effectuer cette phase d'initialisation. Et elle sera exécutée une seule fois, quand le programme démarre.
Contrairement à un programme exécuté sous un système d'exploitation tel que Windows, Linux, etc, une carte Arduino démarre le code compilé depuis sa mémoire Flash dès qu'elle est alimentée électriquement. D'où l'importance de cette fonction pour déclarer et configurer les différents variables et paramètres nécessaires au bon fonctionnement du programme Arduino mis en place.
Ainsi, avant de piloter une diode LED, lire la valeur analogique ou numérique d'un capteur, de communiquer avec un ordinateur, etc. le microcontrôleur de notre carte Arduino doit préparer l'ensemble de son environnement de fonctionnement; la fonction setup() est précisément conçue pour effectuer cette phase d'initialisation.
Quand la fonction setup() est exécutée ?
La fonction setup() est exécutée automatiquement par le microcontrôleur de la carte Arduino dans certains cas précis et ce après chaque :
- la mise sous tension: vous alimentez votre carte Arduino électriquement; soit en la branchant sur un port USB 5V soit à partir d'une alimentation externe,
- La remise à zéro de la carte: vous resetez la carte manuellement en appuyant sur le bouton RESET, électriquement via la borche RESET ou même en programmant cette remise à zéro,
- le téléversement d'un nouveau programme: la mise en place d'un nouveau code efface l'ancien et reset la carte automatiquement, ce qui enclenche cette fonction.
Et une fois toutes les instructions du bloc setup() sont exécutées, le programme passe automatiquement à la deuxième partie du code; la fonction loop(), qui sera exécutée indéfiniment jusqu'à la mise à l'arrêt de la carte (ou jusqu'à la RESET du microcontrôleur).
Syntaxe de la fonction setup()
La syntaxe de cette fonction, qui ne s'exécute qu'une seule fois est comme suit :
void setup() {
// placez ici votre code d'initialisation, à exécuter une seule fois.
}
Cette fonction est composée de 3 composantes essentielles telles que :
La fonction void
Le mot-clé void est un mot-clé du langage C++ pour déclarer une fonction qui ne renvoie aucune valeur à la fin de son exécution. Contrairement à une fonction de type entier (int) ou de type décimal (float), ou tout autre type, la fonction setup() n'effectue que des actions et ne retourne aucune valeur ou aucune information au programme principal.
Le nom de la fonction
Le nom de cette fonction ne peut être que setup(), qui n'est qu'un mot-clé réservé par le framework Arduino et il ne doit jamais être modifié. Si vous le modifiez, la compilation de votre code échoue et un message d'erreur vous sera retourné dans la fenêtre appropriée "sortie" (ou Output si vous utilisez une version anglaise de l'éditeur Arduino IDE).
Par exemple, les fonctions ci-dessous sont incorrectes et elle ne seront pas interprété par le compilateur pour la même fonction setup() :
Exemple 1 erroné :
La mise en majiscule de la première lettre du mot setup retourne une erreur de compilation :
void Setup() {
// placez ici votre code d'initialisation, à exécuter une seule fois.
}
Si vous compilez le code avec cette écriture, Arduino IDE échoue à compiler le code et un message d'erreur s'affichera dans la fenêtre "Sortie" comme nous le montre la capture ci-dessous :

Exemple 2 erroné :
L'utilisation d'un autre mot pour la fonction setup ne permet pas d'initialiser notre programme Arduino et nous retournera une erreur de compilation en vue l'absence de la fonction setup() :
void initialisation() {
// placez ici votre code d'initialisation, à exécuter une seule fois.
}
Lorsque vous compilez votre programme et vous remplacez par oublie la fonction setup() par la fonction initialisation, un message d'erreur bloquera la compilation de votre code et sera afficher dans la fenêtre "Sortie" comme nous le montre la capture ci-dessous :

Les parenthèses () et les accolades {}
Comme toute fonction void écrite dans la langue du C++, il est demandé d'ajouter deux parenthèses pour transmettre les paramètres vers cette fonction. Sauf que d'après le framework Arduino, la fonction setup() ne prend et ne transmet aucun paramètre donc elles sont toujours vides.
Et pour délimiter le début et la fin de la fonction setup(), comme toute fonction aussi écrite dans la syntaxe du C++, deux accolades sont nécessaires pour indiquer le début et la fin de la fonction. D'où l'importance de déclarer toutes nos variables et toutes nos commandes d'initialisation à l'intérieur de ces deux accolades.
Mon premier code Arduino
Pour allumer une diode LED avec une carte Arduino à la continue, il est nécessaire de définir le port de la carte à le quelle la diode LED sera connecté. Par exemple, si nous choisissons le port 12 comme sortie pour commander la LED, nous devons son mode de fonctionnement à l'intérieur de la fonction setup() comme étant une sortie et non pas une entrée logique à travers la fonction pinMode() comme nous le présente le code ci-dessous:
void setup() {
{
pinMode(12, OUTPUT);
}
void loop()
{
digitalWrite(12, HIGH);
}
Ainsi, lorsque le code est compilé et puis exécuté, nous aurons :
- la broche 12 est configurée une seule fois comme sortie via la fonction setup(), puis,
- la fonction principale loop(), appelée aussi la boucle principale, maintient la diode LED allumée indéfiniment à l'aide de la fonction digitalWrite().
Il est à noter que si vous avez placé par erreur la fonction pinMode() à l'intérieur de la fonction loop(), comme nous le montre le code ci-dessous, il fonctionnera mais il sera exécuté efficacement.
void setup() {
{
// placez ici votre code d'initialisation, à exécuter une seule fois.
}
void loop()
{
pinMode(12, OUTPUT);
digitalWrite(12, HIGH);
}
Reconfigurer une broche, appelée aussi pin, fera ralentir le programme en cours d'exécution puisqu'une broche doit être reconfigurée qu'en cas de besoin et non pas plusieurs milliers de fois par seconde puisque la fonction loop() est répétive.
Donc, la bonne pratique consiste à effectuer toutes les configurations permanentes à l'intérieur de la fonction setup().
Voir aussi
Dans la suite de ce cours, nous vous invitons à voir aussi :
Référence
Vous souhaitez obtenir plus de détails, nous vous invitons à consulter la page officielle fournie par Arduino ci-dessous :