Le monde des objets (1)

L’arduino est-il un objet ?

. Par : Thierry. URL : https://www.locoduino.org/spip.php?article85

Des objets dans l’Arduino ?

L’environnement de programmation de l’Arduino, l’IDE, permet de créer des programmes pour les processeurs Atmel qui équipent presque toute la famille Arduino [1]. Ces programmes sont écrits en C, mais peuvent aussi l’être en C++ que l’IDE accepte également. Et s’il l’accepte, c’est parce que ce n’est pas l’IDE qui compile, c’est à dire qui transforme le texte que vous avez tapé dans l’IDE, simple éditeur de texte, en programme exécutable pour un Arduino. Le vrai compilateur est caché derrière : il s’appelle Gcc. C’est un compilateur C++ bien connu, Open Source comme l’Arduino, c’est à dire conçu et maintenu par une communauté libre et indépendante.

Un peu d’histoire

Le C est un vieux langage des années 1970 qui a évolué lentement dans sa syntaxe et ses possibilités. Au départ, proche du matériel qu’il est chargé de faire fonctionner, son adaptabilité le propage très vite au delà de son rôle initial d’écriture de systèmes d’exploitation comme Unix. Dans les années 80, les bases du C++ sont créées. La première règle : vous ne payez pas pour ce que vous n’utilisez pas. C’est à dire que les programmes C créés jusqu’alors doivent fonctionner sans changement ni pénalité de temps d’exécution. C’est pourquoi le C++ est juste un sur-ensemble du C. Quelques mot-clés supplémentaires, de nouveaux concepts, mais rien (ou presque, hein...) qui rentre en conflit avec les milliers d’anciens programmes. Le C, et plus encore le C++ sont encore largement utilisés aujourd’hui, bien que leur rôle ait diminué avec l’apparition de nouveaux langages qui ont gommé leurs plus criants défauts : Java et surtout C#, le successeur officiel de la famille (si on regarde plus attentivement le #, on voit bien que ce sont deux ’++’ superposés !).

Comme Mr Jourdain...

L’essentiel des programmes et bibliothèques Arduino que l’on trouve partout utilisent principalement le C. Mais par moment, un œil averti décèle des bizarreries dans la syntaxe :

Serial.begin(9600);
Serial.print("Bonjour, je suis un Arduino");

Typiquement, la syntaxe nom.fonction() n’existe pas en C pur. C’est du C++. Serial est un objet, et pour lequel le source montré ici appelle deux fonctions membres [2] : begin et print.
Un autre exemple très connu :

Servo monservo;
monservo.attach(10);
monservo.write(90);

La bibliothèque servo utilise un code C++ pour fonctionner. Servo monservo; crée un objet nommé monservo de type Servo, comme on écrirait int i; . Puis on demande à cet objet de se relier à la pin 10 de l’Arduino avec attach(), et ensuite de se déplacer avec write() à 90 degrés. Notez qu’on le demande à monservo, et pas à un autre...

En fait, le monde Arduino se sert du C++ sans le savoir !

Mais qu’apporte le C++ ?

Comme on vient de le voir, la nouveauté du C++, c’est le modèle objet. Le monde réel est constitué d’objets et d’éléments que l’on pourrait considérer comme tels. Le C++ tente de mimer la réalité en créant des modèles de ces objets : les classes. Chaque objet transporte les données dont il a besoin pour exister et les comportements pour les gérer. Le programme principal n’a plus à s’occuper de la tripaille, mais seulement des grandes lignes : lorsque le bouton bout1 est pressé, cela bouge le servo monservo ! Et c’est monservo qui sait comment provoquer le mouvement, et ne pas bouger s’il est déjà en place...

On peut voir un objet comme une boite, qui contient les données qui le caractérise (le numéro de pin ou la position courante pour le servo) : monservo a un numéro de pin mais monautreservo a un autre numéro de pin ! C’est ce que l’on appelle l’encapsulation (premier mot compliqué du jargon objet !). Par contre, tous les deux savent s’initialiser grâce à attach() et se déplacer avec write(). Ce sont les méthodes de la classe, qui peuvent s’exécuter indifféremment sur tous les objets de type Servo.

PNG - 3.3 kio

Je vous laisse digérer ces concepts. La suite dans le prochain article.

Et merci à Jean-Luc et Guillaume pour l’aide apportée par la relecture et les propositions de structuration de l’article et de ses suivants !

[1Mais c’est également vrai pour les microcontrôleurs ARM qui équipent l’Arduino Due ou le Zero, et aussi les autres : STM32, ESP, Pico PI...

[2Membre parce que faisant partie de l’objet.