Bibliothèque, comment l’explorer ?
Explorer une bibliothèque.
La bibliothèque est incontournable dans l'univers Arduino pour l'exploitation de multiple composants ou la gestion de communication entre composants et l'Arduino. Vous avez sûrement déjà utilisé <<LiquidCrystal.h>> pour un afficheur LCD ou <<Servo.h>> pour des servomoteurs et <<SPI.h>> pour le traitement de la communication SPI. Mais, il y en a bien d'autres.
Avant toute chose , il faut préalablement installer puis inclure la bibliothèque dans notre programme.
Tout comme vous, à mes débuts, je me suis fié aux divers exemples trouvés dans l'IDE ou sur le net sans me demander pourquoi et comment on utilisait les bibliothèques. Puis avec l'expérience, je me suis documenté et me suis aperçu que je n'exploitais qu'à moitié certaines bibliothèques alors qu'elles me proposaient d'autres possibilités intéressantes.
C'est pour cela donc, que dans ce tutoriel, nous allons apprendre à "lire" une bibliothèque et identifier ce dont il nous faut pour son exploitation optimale.
Nous explorerons la bibliothèque <<Servo.h>> pour nos exemples.
De quoi est composé une bibliothèque ?
En fait, c'est un dossier. Il contient des dossiers et fichiers de code programme. Il y a principalement trois fichiers et un dossier à explorer.
- Le fichier d'entête. Repérable par ".h"
- Le fichier sources. Repérable par ".cpp"
- Le dossier "exemple". Qui contient des codes sources en exemple d'utilisation.
- Le fichier de syntaxe des couleurs. Qui contient les consignes de couleurs à appliquer pour chaque type de mots-clés.
Ici, nous nous concentrerons particulièrement sur le fichier d'entête, Puis nous verrons le fichier "exemple" et "syntaxe".
Comment explorer une bibliothèque ?
Tout d'abord, commencez par rechercher et trouver le fichier d'entête de la bibliothèque qui est en l’occurrence pour nos exemples "Servo.h".
Deux solutions pour trouver ce fichier.
Première solution.
Exécutez une recherche de fichiers depuis le menu "DÉMARRER" en tapant "Servo.h". Ensuite, ouvrez-le et suivez les étapes 5 et 6 de la solution suivante.
Deuxième solution.
- Premièrement, si vous n'avez pas modifié son emplacement par défaut à l'installation, allez sur vôtre disque local "C:" dans le dossier "programme files".
- Ensuite, ouvrez le dossier "Arduino"
- Puis, le dossier "libraries".
- Après, le dossier "Servo".
- Ouvrir le dossier "src".
- Finalement, le fichier "Servo.h" apparaît.
Explorons le fichier.
Une fois que vous avez trouvé l'emplacement du fichier "Servo.h", ouvrez-le.
A première vue, on a pas l'impression que ce fichier est un code programme car il est présenté sous format" texte". De ce fait, il est exploitable par un éditeur de texte comme "NotePad", "WordPad" ou le "Bloc-notes".
De toute évidence, vous constaterez qu'il est en anglais. Donc pour cette étape, un travail de traduction des commentaires sera très utile à la compréhension du programme. Je vous invite donc à le faire avec un traducteur de votre choix.
Ne surtout pas apporter de modifications à ce document! Surtout si vous n'avez pas d'idée précise de ce que vous faite. Alors dans ce cas, ne JAMAIS accepter d'enregistrer des modifications car cela entraînerait le dysfonctionnement de la bibliothèque et provoquerait des erreurs lors du téléversement.
Mais quel est son rôle ?
le rôle du fichier d'entête.
Le rôle du fichier d'en-tête est de mettre en place la structure principale de la bibliothèque. Il informe le compilateur de tout ce qu'il lui faut pour exécuter la bibliothèque et va en quelque sorte s'occuper de "déclarer". Il n'y a pas d'exécution de fonctions, ces dernières se font dans le fichier source ".cpp".
On dit qu'il contient le prototype de la bibliothèque.
Clairement, nous avons découpé le fichier en plusieurs parties.
- La présentation.
- L'inclusion.
- La déclaration.
- La classe.
Les grandes parties du fichier d'entête ".h"
1) La présentation.
En somme, après traduction, elle vous indique la version, le ou les auteurs, ainsi que les conditions générales d'utilisation (GNU). C'est obligatoire et recommandé pour la distribution.
Il faut aussi souligner que ce texte est un commentaire balisé par ceci "/* */" ce qui vous permet d'identifier la première partie de la présentation générale.
Ensuite, vous avez une seconde partie. L’aspect le plus important de cette partie, c'est qu'elle décrit le fonctionnement globale de la bibliothèque.
Cependant, toutes les bibliothèques ne le font pas. Dans celle-ci sont citées et mentionnées avec un descriptif, toutes les méthodes, dont vous avez besoin pour exploiter vos programmes. Nous y viendrons en détail par la suite.
Après la présentation, poursuivons à présent, vers le code programme qui s'en suit.
2) L'inclusion.
Voyons tout d'abord, les lignes du code ci-dessous.
Les deux premières lignes permettent au compilateur l'inclusion de la bibliothèque dans votre projet. La troisième ligne quand à elle inclue au sein même de la bibliothèque une autre bibliothèque.
Par contre, "ifndef" signifie en anglais "if not defined" soit en français "si n'est pas défini". Nous avons donc là une condition "if". Cette condition permet lors de la compilation d'un programme de ne pas systématiquement la compiler. On trouve ici un exemple important, à savoir, que l'on a une compilation conditionnelle des bibliothèques.
Par conséquent, suite à notre condition d’exécution, il faut bien-sûr indiquer au compilateur quoi exécuter !!
Cela ce fait avec l'instruction #endif. "endif" qui signifie en français "fin de si". On comprend que la condition d'exécution s’arrête là. On trouve cette instruction à la fin du fichier d'entête.
J'attire votre attention sur le fait que tout le programme du fichier d'entête est contenu dans ces instructions. Vous le constaterez en explorant le fichier.
Poursuivons vers la partie suivante.
Celle-ci fait appel aux versions d'Arduino utilisées AVR SAM ou SAMD. Effectivement, il existe plusieurs versions possibles de compilations. De ce fait, le compilateur doit donc être capable de s'adapter aux divers environnements d'exploitation proposés. Mais là aussi, nous n’approfondirons pas. Sachez juste que cette partie définie votre environnement de travail pour adapter le travail du compilateur.
Vous avez sans doute remarqué les instructions suivantes. #if defined pour si définis, #elif defined pour si non définis, #else pour sinon et finalement #endif pour fin de if. Vous l'avez compris, c'est un ensemble d’instructions conditionnelles en fonction des versions possibles.
3) Les déclarations.
A ce niveau du programme, nous avons deux parties distinctes. Les variables et la classe. Nous décomposerons donc cette partie en deux et nous ignorerons celle encadrée en noir qui nous est étrangère. Les commentaires ont été traduit pour une approche plus compréhensible.
3.1) Les variables.
En premier lieu, nous avons les déclarations de variables utiles au traitement de tout programme. A cette étape de notre exemple, on intègre une donnée à chaque variable.
3.2) La classe.
Finalement, nous voici dans la "déclaration" de ce que l'on appelle une classe.
L'instruction "class" et son bloc d'instructions "{ }" permet de nommer et de créer une classe. Dans notre exemple ci-dessous elle est nommée Servo.
class Servo { Bloc d'instructions à exécuter }; // Déclaration d'une classe.
Une fois nommée, la classe permettra d'initialiser un objet auquel elle sera rattachée pour que ce dernier puisse faire appel au constructeur et aux méthodes qu'elle contient.
Cela étant dit une classe peut être aussi utilisée sans objet.
Examinez l'illustration ci-dessous.
Notamment, il y a deux parties très importantes de la "classe". La partie "public:" et "private:". En français public et privé. Mais en fait leur véritable nom est modificateurs d'accès. Comme le nom l'indique, ils conditionnent l'accès ou non à certaines instructions utilisées à l’intérieur de la classe.
Public permet aux utilisateurs au travers de l'IDE d’accéder aux instructions qui lui sont confiées. Par contre private interdit l'accès aux instructions qui lui sont confiées.
Observons ensuite la partie public. Nous avons, le constructeur.
3.2.1) Le Constructeur.
Vous le reconnaîtrez par le fait qu'il porte le nom de la classe suivi de parenthèses (comme pour un appel de fonction) et qu'il est placé juste après l'instruction "public:". Notez que, dans notre exemple ci-dessus, il ne possède aucun paramètre.
Contrairement à notre exemple "servo", il est possible que dans d'autres librairies, vous trouviez plusieurs constructeurs qui portent le même nom. Si vous observez (entre parenthèses) vous constaterez que ces librairies n'ont pas toutes les mêmes types ou nombres de paramètres. Néanmoins, le compilateur est capable de faire la différence et de ce fait, il laisse aux utilisateurs la possibilité de configurer le projet de différentes manières en fonction du type ou du nombre de données renseigné.
Prenons pour exemple la bibliothèque <<LiquidCrystal.h>> et observez ci-dessous les différences.
Nous avons quatre méthodes paramétrables toutes différentes l'une de l'autre. Ces dernières nous indiquent le type et le nombre de données à utiliser pour chaque paramètre. Les paramètres ont également été nommés? ce qui n'est pas toujours le cas.
Mais à quoi sert le constructeur ?
Le constructeur permet aux utilisateurs de renseigner et configurer un objet qui lui est rattaché avec des données externes. Voyez l'exemple ci-dessous.
Ci-dessus LiquidCrystal est notre classe puis nous avons créé un objet "lcd" et indiqué en paramètre le numéro des broches utilisées pour exploiter note afficheur LCD.
Voici ce que cela donne à l'IDE avec la bibliothèque Servo.
On retrouve notre classe "Servo" et notre objet "mon_servo". Notamment, il n'y a pas de paramètres à renseigner car il n'a pas été déclaré pour cela.
En déclarant notre objet, nous pouvons à présent depuis l'IDE faire appel à ce qui suit, c'est-à-dire les méthodes.
3.2.2) Les méthodes.
Les méthodes sont en réalité des fonctions nommées méthodes pour les identifier comme appartenant à une bibliothèque et les différencier des fonctions classiques que l'on peut créer dans nos programmes. Elles aussi peuvent être paramétrées ou non. A cette étape du programme, nous avons la déclaration des méthodes. Un type et un nom symbolique sont attribués à la méthode et à ses paramètres. Exactement comme on le ferait pour une fonction.
type nomSymbolique (type nomSymbolique ) ;
uint8_t attach (int pin); // attache la broche donnée au canal libre suivant, définit pinMode, renvoie le numéro de canal ou 0 si défaut.
Notez l'absence des accolades et des instructions aux méthodes. En effet, comme nous l'avons dit plus haut le fichier ".h" s'occupe principalement de la déclaration. La partie "exécutive" étant exécutée dans le fichier source ".cpp". Dans notre exemple (ci-dessus encadré en bleu), nous avons là toutes les méthodes utiles pour exploiter un servomoteur.
Finalement, pour toutes bibliothèques si vous cherchez les méthodes, dont vous avez besoin, c'est à cet endroit que vous les trouverez. Certes, il ne vous est pas nécessaire de connaître leur programmation mais seulement leur utilité.
Les exemples.
Dans la plupart des bibliothèques les méthodes sont expliquées avec des commentaires. Mais dans certain cas, cela n'est pas fait. Heureusement dans ces cas là, les éditeurs intègrent toujours des exemples d'exploitation à leurs bibliothèques. A travers les exemples, vous trouverez les commentaires sur l'utilisation de chaque méthode.
C'est pourquoi vous trouverez dans le dossier de chaque bibliothèque, un dossier nommé "examples". Toutefois, il n'est pas utile de passer par le dossier mais de simplement lancer l'exemple depuis l'IDE en cliquant sur "Fichier" ensuite sélectionnez "Exemple" puis le nom de la bibliothèque que l'on souhaite exploiter.
Les mises en forme
Cela à titre d'information. Quand vous utilisez une bibliothèque, la classe et les méthodes s'affichent à l'IDE en orange. C'est fait pour signaler leur utilisation dans un fichier de bibliothèque et vous assurer que vous l'avez bien orthographié. Aussi de cette façon, si vous déclarez, par hasard, une variable qui porte le même nom qu'une méthode utilisée dans l'une des bibliothèque incluse à votre programme; cette variable changera de couleur vous indiquant par conséquent qu'elle ne peut pas être utilisée comme telle.
Ce jeu de couleur est appliqué dans un fichier nommé "Keywords.txt".
Voici ce qu'il contient:
En fait, ici sont regroupés des mots-clés en deux catégories de format de couleurs. Le premier "KEYWORD1" et le second "KEYWORD2". Évidemment, les mots-clés choisis sont ceux utilisés pour les méthodes de la classe Servo.
- KEYWORD1 applique un caractère gras et la couleur orange aux mots-clés.
- KEYWORD2 applique seulement la couleur orange aux mots-clés.
Il vous sera utile de connaître ce fichier le jour où vous créerez vous-même vos bibliothèques. Ce qui sera un sujet bientôt abordé.
Vous savez à présent comment explorer le fichier "H" et comment identifier les méthodes utiles pour l'exploitation d'une bibliothèque. Amusez-vous à explorer les autres bibliothèques pour en comprendre le fonctionnement.
MERCI.
PlaisirArduino/tutoriel.
FIN.
Recevez gratuitement les codes sources de PlaisirArduino
Amusez-vous tout de suite avec les entrées/sorties de votre carte Arduino Uno
Vous y retrouverez : des scketchs, des schémas et des PDF