Développement et codage
Au commencement était le verbe : généralités sur les langages informatiques
Pour ceux qui l’ont essayée, la programmation « à l’ancienne » d’un module Wi-Fi compagnon de l’Arduino, tel que le module ESP8266, qui peut d’ailleurs faire bien plus que du Wi-Fi en se substituant à l’Arduino, repose sur un ensemble de commandes « AT » entrées directement par un programmeur à la console de son portable. Un retour de plusieurs dizaines d’années en arrière, lorsque la programmation d’un ordinateur se faisait en chargeant « à la clé » un code dit mnémonique proche du « langage machine ». Car c’est un fait que l’ordinateur classique, celui qui n’est pas quantique », ne connaît que deux valeurs élémentaires, que sont le zéro et l’unité, et qu’il faut patiemment agencer, organiser et gérer une suite parfois très longue de ces bits pour que l’ordinateur exécute une seule instruction en manipulant une seule donnée à la fois.
Le PDP-11 de Digital, compagnon des pionniers de la programmation en langage évolué
Ce temps est révolu et la programmation a évolué selon les niveaux d’abstraction des langages informatiques qui sont d’une...
L’art de programmer un ordinateur (Donald E. Knuth)
Le premier tome de ce qui allait devenir une référence pour les programmeurs du monde entier a été écrit par Donald Ervin Knuth (prononcer « K-nouss ») sous le titre Fundamental algorithms et ouvre une série d’ouvrages dénommée The Art of Computer Programming appelée à tenir inévitablement une bonne place dans la bibliographie de tout support de cours d’un cursus universitaire.
Donald Knuth : « La programmation d’un ordinateur est un art, parce qu’elle applique une connaissance assimilée au monde, parce qu’elle nécessite de l’adresse et de l’ingéniosité, et tout particulièrement parce qu’elle produit des objets de beauté. Un programmeur qui dans son subconscient se voit comme un artiste aimera ce qu’il fait et le fera encore mieux. »
Une somme, un monument et une source d’inspiration inépuisable pour tout apprenti programmeur. Dès la première page, le ton est donné par la dédicace :
« This book is affectionately dedicated to the type 650 computer once installed at Case Institute of Technology, with whom I have spent many pleasant evenings. »
(« Ce livre est affectueusement dédié à l’ordinateur de type 650, installé naguère au CIT, et avec qui j’ai passé de nombreuses et agréables soirées ».)
Cette dédicace figure au moins dans la première édition de 1969 et n’apparaît plus dans la troisième, qui date de 1996. Elle est remplacée par une citation de Bill Gates : « Things have changed in the past two decades » (« Les choses ont changé pendant les deux dernières décennies »). L’ordinateur de type 650 était un IBM, appelé « le cerveau géant », qui utilisait des cartes perforées, chacune comprenant 8 instructions...
1. En ce temps-là…
L’art de programmer un ordinateur consistait à cette époque (en 1958) à dépasser la contingence et les limites de la technique du moment pour se consacrer à l’algorithmique, qui permettait non seulement de trouver...
La programmation textuelle : un frein à l’apprentissage ?
La programmation textuelle est-elle un frein à l’apprentissage du code ? La question se pose lorsque l’on compare le temps nécessaire pour arriver à produire un programme fonctionnel et capable de piloter un robot selon que l’on utilise le langage de l’Arduino ou un assemblage de blocs. Il faut compter six heures dans le premier cas et une petite heure dans le second, avec comme prérequis une capacité à décrire le fonctionnement attendu par un algorithme.
La réponse est liée au résultat attendu de l’apprentissage. Un développeur devant faire face à des situations particulières, comme un calcul ou une réaction du processeur dans un temps très limité, tirera profit des possibilités offertes par le langage en utilisant des instructions spécifiques ou en incluant du code proche du langage machine. Cette pratique est courante dans la gestion des interruptions des microcontrôleurs et pour accéder à ses registres. La connaissance approfondie du langage et sa pratique seront alors indispensables.
De même, le besoin d’utiliser une structure de code plus complexe que les structures courantes, en autorisant des débranchements ou des sauts selon certaines conditions rencontrées au cours de l’exécution...
La programmation visuelle et les blocs
La programmation visuelle n’est en fait pas nouvelle et a été facilitée dès la fin des années 90 par l’arrivée d’outils de conception graphique intégrés dans des ateliers de génie logiciel et qui permettaient de générer du code dans un ou plusieurs langages. Très efficaces en termes de rapidité de développement, ces outils reposent cependant sur un principe de report de l’effort de création du code vers celui de la création ou de l’implémentation de l’algorithme.
Ainsi, c’est en agençant des blocs correspondant à une action telle que lire un fichier, trier ou filtrer ses enregistrements ou enregistrer des données dans une nouvelle structure, que les programmeurs ont pu concevoir des programmes de plus en plus importants en se délestant des servitudes de la programmation de plus bas niveau (ouverture/fermeture d’un fichier, tri binaire ou plus évolué).
Pour peu qu’on ne prête pas attention à la structure du code généré, qui n’était pas vraiment lisible ni compréhensible au premier abord par un programmeur humain, la chaîne de développement d’application s’en est trouvée facilitée. Pour la plupart des programmeurs, il s’agissait d’une progression vers un niveau d’abstraction supplémentaire en remontant du code vers le concept, de la même façon que le passage d’un langage « machine » à un langage évolué tel que le C a permis de simplifier la programmation et de réduire les délais de codage avec une meilleure qualité si l’on prend comme métrique le nombre d’erreurs par millier de lignes de code....
Aller plus vite et plus loin avec la programmation visuelle et la génération de code
Dans un contexte d’apprentissage, le programmeur sera amené de manière assez inévitable à écrire un premier programme affichant le traditionnel « Hello World ! » ou son équivalent robotique, faire clignoter une LED. Après ce premier exploit, l’apprentissage le conduira à modifier la fréquence de clignotement de la LED, à mettre dans une seule variable la valeur de l’instruction (delay() pour l’Arduino) ou dans deux variables si l’on souhaite contrôler à la fois la durée d’affichage et la durée d’extinction. Faire varier ces variables en utilisant la valeur d’un capteur, de distance ou de température par exemple, serait une étape suivante avant de piloter la rotation d’un servomoteur ou la vitesse d’un petit ventilateur.
À partir de cet instant, le code écrit tiendra probablement sur une ou deux pages, plus s’il est correctement documenté et bien aéré. Les ajouts et les modifications seront de moins en moins faciles à repérer ou à placer et le style des commentaires tendra naturellement à délimiter des blocs d’instructions homogènes.
Enfin, les principales erreurs détectées lors de la compilation seront...
Utiliser l’atelier mBlock pour développer des programmes pour l’Arduino
Le choix de mBlock comme atelier de développement peut surprendre, mais est avant tout pédagogique et pragmatique. Si l’on se place dans une logique d’apprentissage allant de l’algorithmique à la réalisation de projets robotiques, domotiques, ludiques ou artistiques, cet environnement permet de faire un pont entre celui de la programmation visuelle pour tous, initiée par Scratch, et les compilateurs nécessaires à la programmation de microcontrôleurs grand public comme l’Arduino.
La jeunesse de mBlock et le fait qu’il soit déployé gratuitement par son éditeur, Makerblock, afin de programmer les robots de sa gamme ne sont pas des freins suffisants à leur utilisation.
1. De Scratch à mBlock
Les structures de contrôle, les opérateurs et la définition de variables et de blocs présents dans l’environnement de Scratch le sont également dans celui de mBlock.
L’environnement de mBlock3
Excepté le lutin, Scratch le chat est remplacé par un panda, il n’y a pas de différence entre les deux environnements.
L’algorithme de calcul de la date de Pâques pourra s’écrire assez facilement en programmation visuelle avec mBlock et exactement de la même manière qu’avec Scratch.
On remarque également les corrections apportées à E, (l’épacte), selon la valeur calculée. Ces corrections vont se poursuivre pour N dont la première valeur est égale à 44 - E.
Arrivé à ce stade, il est difficile de savoir si la programmation est correcte du fait de l’imbrication des opérations dont on constate qu’elle n’est pas toujours très lisible comme l’illustre la dernière instruction du script qui ne fait au final...
Les autres ateliers et outils de programmation visuelle
1. Ardublock
La philosophie et la présentation d’Ardublock sont proches de celles de mBlock. Il s’agit d’utiliser le même principe d’assemblage de blocs prédéfinis ou développés en tant qu’extension pour réaliser un algorithme dont le code sera généré dans un module Arduino.
Distinct de Scratch, il ne permet pas un passage fluide de l’environnement d’apprentissage de l’algorithmique sur écran à celui de manipulation des objets physiques.
En revanche, il se positionne comme un atelier de développement visuel d’applications robotiques et intègre des blocs personnalisés dédiés aux principaux modules et extensions (shields) du marché.
2. Blockly
Comme Scratch 2.0 et mBlock, Blockly utilise une programmation visuelle avec la possibilité de générer du code dans plusieurs langages dont JavaScript qui est une cible naturelle. Les autres langages sont Python, PHP, Dart et Lua. Le but est de favoriser un apprentissage progressif de la programmation en partant d’une construction d’algorithmes facilement et de façon ludique.
Disponible sur le site http://developers.google.com/blockly, il dispose également d’une base d’utilisateurs et de développeurs bien implantée dans la communauté...
Conserver ses données et choisir une solution de stockage local ou en « cloud »
Deux possibilités s’offrent au programmeur pour stocker ses données : sous la forme de fichiers plats, la forme la plus « rustique », ou de manière structurée en les intégrant à une base de données.
Dans le cas d’un projet réalisé avec Arduino, ces deux possibilités peuvent être exploitées.
Le fichier plat est moins facile à exploiter qu’une base de données permettant une indexation et le requêtage au sein d’un ensemble de données qui peuvent être liées de façon complexe. En revanche, sa génération est triviale et son exploitation immédiate si des standards de présentation comme le texte délimité sont utilisés. Un fichier plat est économe en espace de stockage, car il ne contient que des caractères avec un gain de place encore plus important s’il est compressé.
La base de données offre un confort d’utilisation par un module d’interrogation ou de requêtage en langage « quasi naturel ». Les manipulations de fichiers laissent la place aux requêtes rédigées dans une logique ensembliste assez facile à comprendre. Mais il est nécessaire de concevoir cette base de données, de la définir, de l’alimenter et de la tenir à jour, ce qui demande un effort régulier et parfois important si les possibilités d’automatisation des tâches ne sont pas très développées.
Les deux sont complémentaires et dans un monde où les données, matière première des programmes informatiques, sont abondamment disponibles, les utilitaires de chargement de masse permettent d’intégrer des données « brutes » collectées et stockées dans des fichiers plats. Grâce à la puissance de traitements massivement parallèles, les algorithmes de data science peuvent ensuite leur être appliqués et détecter rapidement si une connaissance peut en être extraite.
1. Des fichiers locaux
Dans le cas d’un projet réalisé avec l’Arduino, ces données...
La loi du moindre effort : réutiliser et partager le code, utiliser des bibliothèques
Le domaine de l’électronique de loisir a évolué vers celui de l’informatique de loisir et de la création de programmes « embarqués ». Cette tendance permet de réutiliser des raisonnements qui sont nés des concepts de l’automatisme, de les vulgariser pour les ouvrir au grand public qui s’en saisit pour laisser exprimer sa créativité et générer des inventions qui ne sortent pas d’un bureau d’études.
La technique évolue donc constamment et de façon inexorable et parallèle, le marketing et les modèles de marché (business models) s’emparent des nouveautés et des trouvailles pour en faire des succès commerciaux. Le modèle ouvert et communautaire se referme alors sur une offre packagée, calibrée et tarifée. Ce qui ne signifie pas qu’il faille chercher à tout prix à tout construire depuis le début. Les premières parties de code simplifiant la programmation d’un servomoteur ou l’utilisation d’un protocole au prix d’un effort supplémentaire pour les rendre génériques et facilement réutilisables ont été les premières pierres d’un édifice dont l’importance...
Communiquer avec le reste du monde : les interfaces et protocoles
1. Multiplexage et protocoles courants (SPI, I2C)
Dès les premiers montages électroniques déployés à l’échelle industrielle, la question du protocole de communication entre composants ou entre un composant et l’ordinateur en charge de son pilotage s’est posée.
Comme toujours, bien des essais, des développements créatifs et une lente évolution guidée par un triple objectif de simplicité, d’efficacité et de performance ont permis d’aboutir à des protocoles de communication standardisés.
Deux standards sont dominants et très couramment utilisés dans les montages à base d’Arduino :
-
Inter-Integrated Circuit, I2C (prononcé « I square C » ou « I two C »), est un protocole série mis au point par l’industriel Philips au début des années 80 et qui est dédié à la communication entre un microcontrôleur (le « maître ») et un ou plusieurs périphériques (ses « esclaves ») sur une courte distance. Sa particularité, qui est également un avantage, est de n’utiliser que deux fils pour communiquer, ce qui le place dans la catégorie des Two Wires Interfaces (TWI).
-
Serial Peripheral Interface, SPI, est un standard de communication série et synchrone mis au point par l’industriel Motorola, à la fin des années 1980 dans un mode « full duplex » où un module « maître » pilote plusieurs modules « esclaves » via un bus.
Ils sont très largement documentés dans la littérature sur Arduino et les lignes qui suivent ne restituent que l’essentiel pour une mise en œuvre efficace.
2. Le protocole I2C
Le bus bidirectionnel I2C a été conçu dans un souci de simplifier le contrôle de modules électroniques équipés de composants Philips. Plusieurs évolutions ont permis d’accroître sa fiabilité et sa vitesse de transmission.
Dans son principe, un composant maître transmet des données aux composants esclaves identifiés par leur adresse...