vendredi 29 mai 2020

Micro:Bit - Première exploration avec MakeCode

Depuis le temps que j'en entendais parler, voici enfin l'occasion de faire l'essai du célèbre Micro:Bit. Voyons un peu si cette carte mise au point au Royaume Uni dans le but de faciliter l'apprentissage de la programmation à l'école saura me séduire, même si je ne fais pas tout à fait partie du public cible.



Une première caractéristique qui saute aux yeux, c'est la grande quantité d'éléments utiles présents sur la carte, malgré sa petite taille:
  • Un très respectable microcontrôleur ARM-Cortex M0 32 bits.
  • Une matrice de 25 LEDs (mine de rien, c'est 24 LEDs de plus que la plupart des autres cartes)
  • 2 boutons programmables, en plus du bouton reset
  • Bluethooth (pour communiquer à distance avec un téléphone ou un ordinateur)
  • Accéléromètre
  • Magnétomètre
  • Capteur de température (intégré au microcontrôleur)
  • Capteur de luminosité (ce sont les LEDs, en fait)
Par conséquent, on peut faire beaucoup de choses avec un Micro:Bit sans même y brancher quoi que ce soit.



Bien entendu, le micro:bit comporte aussi des connecteurs qui permettent de lui ajouter des capteurs, moteurs, afficheurs, etc. Sauf que...qui a eu l'idée de ces connecteurs????

Les 5 principaux connecteurs prennent la forme d'un trou jumelé à une surface plane conductrice d'environ 5 mm de largeur. Les trous ont la taille idéale pour y insérer une fiche banane...


...alors que la surface plane a tout juste la bonne largeur pour y installer une pince crocodile...



Sauf que ça ne nous fait que 5 connecteurs: deux pour l'alimentation (3 V et GND) et 3 entrées/sorties programmables. Je veux bien admettre que ces 5 connecteurs offrent certaines possibilités intéressantes, mais ce serait bien utile d'en avoir un peu plus!

Et il y en a, en fait, beaucoup plus: une vingtaine de surfaces conductrices dont l'épaisseur est de l'ordre du millimètre, et séparées d'une distance inférieure à celle qui sépare les trous d'une breadboard. Sauf qu'à moins d'avoir pensé à se procurer un module d'extension (une fente dans laquelle on insère la carte) ou d'utiliser des modules spécialement conçus pour le micro:bit, ces connecteurs sont difficilement utilisables.

Vous désirez brancher au micro:bit un capteur I2C? Il faut utiliser les connecteurs P19 et P20...inaccessibles sans module d'extension. Un capteur SPI? Ce sont alors les connecteurs P13, P14 et P15, également inaccessibles sans module d'extension.

Vous l'aurez deviné: je n'ai pas pensé à me procurer un module d'extension en même temps que mon micro:bit. J'ai une carte qui comporte plus d'une vingtaine d'entrées/sorties, mais je ne peux pour l'instant en utiliser que 5!!! C'est extrêmement frustrant.

Je comprends la pertinence de ces connecteurs dans un contexte scolaire: l'école se procure des périphériques conçus pour le micro:bit et les élèves n'ont qu'à y insérer la carte: c'est rapide, pratique, et ça évite les erreurs de connexions. Mais ça rend le micro:bit moins compatible avec l'écosystème de modules conçus pour les autres microcontrôleurs.

Un peu de programmation avec MakeCode

MakeCode est un environnement de programmation graphique similaire à Scratch ou à MIT App Inventor: puisque nous créons un programme en faisant glisser des briques, il n'est pas nécessaire de mémoriser la syntaxe d'un langage de programmation traditionnel. Remarquez qu'il existe bien d'autres façons de programmer le micro:bit: cet article sur Arduiblog en recense une bonne dizaine.

Je me suis donc dirigé vers makecode.microbit.org et j'ai cliqué sur le bouton "Nouveau projet".



L'écran est essentiellement divisé en trois zones: 
  • La moitié droite est l'endroit où nous construisons le programme. Dès le départ, deux blocs s'y trouvent déjà: "au démarrage" et "toujours".  Nul besoin de consulter la documentation pour deviner que les instructions que nous insérerons dans "au démarrage" s'exécuteront une seule fois, au démarrage du programme, et que celles que nous insérerons dans "toujours" s'exécuteront à répétition pendant toute la durée du programme.

  • Dans la partie centrale: un réservoir de blocs que nous pourrons insérer dans notre programme, en les faisant glisser dans la zone de droite.

  • À gauche: un simulateur qui permet de vérifier le fonctionnement correct de notre programme avant même de le téléverser dans la carte micro:bit. Puisque le téléversement dans la carte prend certain temps, ce simulateur s'est avéré beaucoup plus utile que prévu.

Je me suis amusé à improviser des programmes en navigant au hasard dans la réserve de blocs.

Mon premier programme consistait évidemment à contrôler la matrice de LEDs. Au démarrage,allumer des LEDs de façon à afficher un visage souriant, attendre 2 secondes, puis faire défiler continuellement le message "Eureka!!!".

Après avoir constaté grâce à la simulation que mon programme avait le comportement désiré, j'ai branché mon micro:bit à l'ordinateur (il est apparu comme une clé usb) et j'y ai enregistré le fichier ".hex" généré par MakeCode. La carte a automatiquement exécuté le programme au bout de quelques secondes.

Je bascule en mode JavaScript et je découvre avec plaisir que j'ai produit sans effort un programme en JavaScript assez élégant, malgré mon absence totale de connaissances en JavaScript.


Dans mon deuxième programme, j'ai utilisé les deux boutons. La LED centrale s'allume au démarrage. Le bouton de gauche déplace la LED allumée vers la gauche, alors que celui de droite la déplace vers la droite.


Puis je me suis un peu amusé avec l'accéléromètre: en inclinant la carte, on change la position de la LED qui s'allume...



Conclusion

Ça fonctionne bien, c'est extrêmement facile à programmer sans avoir à installer le moindre logiciel sur l'ordinateur, et ces foutus connecteurs sont tout simplement ridicules!

À lire aussi

Mes commentaires sur les livres 40 activités avec la carte micro:bit par Dominique Nibart et  Python pour la carte micro:bit par Julien Launay

La carte micro:bit utilisée pour la rédaction de cet article a été fournie gratuitement par DigitSpace.

Yves Pelletier (TwitterFacebook)




mardi 26 mai 2020

Kit: petit robot suiveur de ligne D2-1

Pour la troisième fois en quelques semaines, je vous propose un projet de robot suiveur de ligne, ce grand classique de la robotique récréative qui consiste en un véhicule qui, grâce à des capteurs optiques, suit fidèlement une ligne sinueuse tracée sur le sol.


Après le robot suiveur de ligne à base de Raspberry Pi et le robot suiveur de ligne à base d'Arduino, voici un robot suiveur de ligne basé sur le classique comparateur LM393 (aucun microcontrôleur, donc) qu'on peut se procurer en kit sous l'appellation "Smart Track Vehicle DIY Kit D2-1".

Avant de poursuivre, je vous présente une vidéo du petit robot au travail.


Assemblage du robot

Il faut construire le robot soit même, à partir d'une quarantaine de composants. Il ne manque que les 2 piles AA et, bien sûr, les outils: fer à souder, tournevis, pinces à dénuder...



Un bref coup d'oeil sur le feuillet d'instructions m'a convaincu de ne pas utiliser le feuillet d'instructions.


Le circuit imprimé sert également de plate-forme pour le véhicule. Voici le dessus, où se trouveront la plupart des composants...


...et le dessous, côté soudures, où on retrouvera les moteurs et les capteurs (paires LED/photorésistance).


J'ai commencé par souder les résistances. Le PCB indique clairement la valeur qu'il faut placer à chaque endroit, mais j'étais bien content d'avoir un multimètre pour les identifier car les bandes de couleur sont difficile à distinguer.  Deux résistances de 10 Ω (R9 et R10), deux résistances de 3,3 kΩ (R3 et R4), deux résistances de 1 kΩ (R7 et R8), et quatre résistances d'exactement 51 Ω, ce qui me semble inhabituel (R5, R6, R11 et R12).


Ensuite, les deux transistors PNP S8550. Grâce au profil imprimé sur le PCB, impossible de les placer à l'envers, à moins d'être vraiment très distrait...


Les 8 broches du support à circuit intégré sont très flexibles: assurez-vous que chacune d'entre elles passe bien dans son trou avant de souder,  car c'est possible d'en plier une par inadvertance  (IC1, à l'arrière du véhicule).


Lorsqu'on insère le circuit intégré (un double comparateur LM393), on prend soin de l'orienter avec la petite coche semi-circulaire vers l'avant du véhicule.


Complètement à l'arrière du véhicule: les deux potentiomètres et l'interrupteur marche/arrêt.


C'est très important de placer les deux condensateurs électrolytiques de 100 µF (C1 et C2) dans le bon sens: la broche négative (la plus courte) dans le demi-cercle blanc, à l'avant du véhicule.


Les LEDs rouges doivent également être insérées dans le bon sens: la broche la plus courte est dans le trou le plus rapproché du bord du véhicule.


On fixe le support à piles à l'endroit prévu à cette fin, après avoir retiré le papier qui recouvre sa face adhésive.  On fait passer les fils par un petit trou...


... afin de les souder, de l'autre côté du PCB, là où c'est écrit "BT1 3V" (le fil rouge va là où il y a un signe +).


Les espaces réservés au photorésistances sont R13 et R14 GR. Il s'agit des capteurs qui recevront la lumière réfléchie par le plancher, donc on les place sous le véhicule...

Pour qu'elles soient proches du plancher lorsque le véhicule roulera, gardez une bonne longueur de broche: 2,5 cm environ.


Les LEDs transparentes qui servent à éclairer le plancher vont dans les espaces identifiés D4 et D5. L'orientation est importante: c'est la broche la plus courte qui est à l'avant du véhicule.


Le trou à l'avant du véhicule sert à insérer la grosse vis qui fera office de "roue" avant.


Chaque roue motrice est insérée dans l'axe d'un moteur à engrenages. Une petite vis est fournie pour que la roue demeure bien en place.


Les 4 bouts de fil conducteur fournis servent à la connexion des moteurs.


Les moteurs se branchent sur le PCB là où c'est écrit "M". C'est important de faire la connexion dans le bon sens, sinon le moteur tentera de faire reculer le véhicule.  Chaque moteur a un côté adhésif: le fil conducteur le plus éloigné du côté adhésif est celui qui se branche le plus près de l'avant du véhicule.



On fixe les moteurs à la plate-forme grâce à l'adhésif fourni...



... et notre robot suiveur de ligne est terminé!



Après avoir inséré des piles et appuyé sur le bouton poussoir à l'arrière du véhicule, les LEDs situées sous le véhicule devraient immédiatement s'allumer. Le verso du feuillet d'instruction peut être utilisée comme parcours, ou vous pouvez en faire un vous même avec du ruban gommé noir sur fond blanc.



Vous devrez probablement tourner les potentiomètres (au moyen d'un petit tournevis) afin de trouver un ajustement qui permet à votre robot de suivre fidèlement la ligne noire, comme il le fait sur la vidéo présentée en début d'article.

Principe de fonctionnement

Les photorésistances captent la lumière réfléchie par le sol. Lorsqu'une photorésistance est au-dessus d'une surface blanche (beaucoup de lumière réfléchie), sa résistance est plus faible que lorsqu'elle se trouve au-dessus d'une surface noire (peu de lumière réfléchie).

Chaque photorésistance est associée à un potentiomètre de façon à former un diviseur de tension: la tension entre les deux résistances ne sera pas la même, selon que la surface est blanche ou noire.

Les deux comparateurs du LM393 comparent entre elles les deux tensions associées aux photorésistances. Un des comparateurs émet un signal de sortie si la photorésistance de gauche produit une tension plus grande que la photorésistance de droite. L'autre comparateur fait le contraire: il produit une tension de sortie à la condition que la tension de la photorésistance de droite soit supérieure à celle de la photorésistance de gauche. Le signal de sortie de chaque comparateur commute un transistor relié à un moteur.

Ainsi, lorsqu'une photorésistance se trouve au-dessus de la ligne noire, un des moteurs s'arrête afin de provoquer une légère rotation du véhicule.



En conclusion

Le robot est facile assembler, même par un soudeur débutant. La partie la plus délicate est probablement l'ajustement des potentiomètres afin que le robot se comporte de la façon désirée. Si désiré, la plate-forme, les moteurs et les roues pourraient probablement être réutilisés, plus tard, pour concevoir un robot plus sophistiqué.

Le kit dont il est question dans cet article a été fourni gratuitement par Digitspace.

Yves Pelletier (TwitterFacebook)

samedi 23 mai 2020

Module GPS NEO 6MV2

Aujourd'hui, je vous invite à explorer avec moi le module GPS NEO 6MV2, qui permet, grâce au géo-positionnement par satellite, de connaître sa position n'importe où sur la planète.

Ce petit module est accompagné d'une antenne amovible (vous pourriez, au besoin, la remplacer par une antenne plus performante). Vous devrez probablement souder vous-même les quatre connecteurs (VCC, GND, RX et TX).


Puisqu'il comporte un régulateur de tension, on peut l'alimenter aussi bien avec 5 V qu'avec 3,3 V. Cependant, il est conçu pour fonctionner à un niveau logique de 3,3 V (soumettre sa broche RX à un signal de 5 V n'est pas recommandé).

J'ai été surpris de l'autonomie de ce dispositif: dès qu'il est alimenté, il se met à capter les signaux émis par les satellites GPS et émet des informations par communication série (UART) sans même qu'on ait à le lui demander.

Une LED bleue se met à clignoter une fois la position déterminée avec certitude (ce qui peut parfois nécessiter environ une minute, lorsque le module GPS vient tout juste d'être branché).

Test avec un convertisseur USB/TTL

Cette autonomie fait en sorte qu'on peut tester son fonctionnement du module GPS sans le moindre microcontrôleur, en le branchant directement à un simple convertisseur USB/TTL fonctionnant à un niveau logique de 3,3 V.



Les connexions sont les suivantes:

  • VCC du module GPS - broche 3V3 de du convertisseur USB/TTL
  • RX du module GPS - broche TXD du convertisseur USB/TTL
  • TX du module GPS - broche RXD du convertisseur USB/TTL
  • GND du module GPS - broche GND du convertisseur USB/TTL


Il s'agit ensuite d'utiliser un logiciel de communication série (comme, par exemple, le moniteur série de l'IDE Arduino) et d'ajuster sa vitesse de transmission à 9600 bauds (qui est généralement la vitesse par défaut du module GPS lors de l'achat).


Si tout va bien, de nombreuses lignes de données, commençant toutes par le symbole "$" devraient s'afficher à l'écran. Cette information respecte la norme NMEA 0183 de la National Marine Electronics Association.

Installation de la bibliothèque TinyGPS++

Là où un microcontrôleur devient utile, c'est pour le traitement et l'affichage de ces données, de préférence sous une forme plus facile à interpréter par le commun des mortels. Il existe un certain nombre de bibliothèques Arduino spécialement conçues pour cette tâche. J'ai choisi d'installer une des plus connues: TinyGPS++ par Mikal Hart. Comme vous le constaterez dans la suite de cet article, je l'ai testée sans problèmes avec tous mes microcontrôleurs préférés:  Arduino Uno, STM32F103C8 "Blue Pill" ,  ESP8266 et ESP32.

Tests avec un Arduino Uno


L'inconvénient de l'Arduino Uno, c'est que son niveau logique de 5 V n'est pas idéal pour le module GPS, qui est conçu pour communiquer à un niveau de 3,3 V.

Pour éviter de réduire la durée de vie de votre module GPS, il est conseillé d'abaisser à 3,3 V le signal que vous acheminez à son entrée "RX". Puisque la communication n'est pas très rapide, un simple diviseur de tension devrait faire l'affaire.

Personnellement, je ne me suis même pas donné cette peine: pour une utilisation de base, il n'est aucunement utile d'envoyer des informations vers le GPS. Je me suis simplement abstenu de brancher sa broche "RX" à l'Arduino.

Les connexions sont donc:
  • VCC du module GPS - sortie 5 V de l'Arduino
  • RX du module GPS - pas branché
  • TX du module GPS - broche 4 de l'Arduino
  • GND du module GPS - broche GND de l'Arduino


Puisque l'Arduino Uno ne comporte qu'un seul canal de communication série UART (déjà utilisé pour la communication avec l'ordinateur), on utilise la bibliothèque "software serial" pour communiquer en UART avec une broche conventionnelle.  Puisque la vitesse de transmission du module GPS est réglée par défaut à 9600 bauds, il ne s'agit pas d'un inconvénient très sérieux.

Le sketch ci-dessous permet d'afficher dans le moniteur série les données brutes émises par le GPS (il faut cette fois régler la vitesse de transmission du moniteur série à 115200).

-
-

Pour obtenir des données un peu plus facilement interprétables, vous pouvez exécuter l'exemple "DeviceExample" fourni avec la bibliothèque TinyGPS++. La seule modification que vous aurez à faire, c'est régler la constante "GPSBaud" à 9600.


Cette fois, la longitude, la latitude et le temps universel sont clairement affichés. Vous pouvez vérifier que les coordonnées sont correctes en utilisant, par exemple, Google Maps.


Tests avec ESP8266

Tout comme l'Arduino Uno, l'ESP8266 n'a qu'un seul canal de communication UART, déjà utilisé pour la communication avec l'ordinateur. Toutefois, son niveau logique de 3,3 V étant parfaitement adapté à celui du module GPS,  j'ai branché sans craintes la broche RX.



J'ai branché le module GPS à l'ESP8266 de cette façon:
  • VCC du module GPS - broche 3V3 de l'ESP8266
  • RX du module GPS - broche GPIO 5 de l'ESP8266
  • TX du module GPS - broche GPIO 4 de l'ESP8266
  • GND du module GPS - broche GND de l'ESP8266



Le sketch montré plus haut pour l'Arduino fonctionnera avec l'ESP8266 à la condition de remplacer par  5 la valeur de la constante "BrocheTX". La même modification devront être apportés aux exemples accompagnant la bibliothèque TinyGPS++.


Tests du module GPS avec un ESP32


Avec l'ESP32, c'est possible d'utiliser un deuxième canal de communication UART. Nul besoin, donc, de la bibliothèque "software serial".



  • VCC du module GPS - broche 3V3 de l'ESP32
  • RX du module GPS - broche TX2 de l'ESP32
  • TX du module GPS - broche RX2 de l'ESP32
  • GND du module GPS - broche GND de l'ESP32



Voici un sketch qui affiche dans le moniteur série les données brutes reçue du GPS. Avec quelques modifications mineures, les exemples qui accompagnent la bibliothèque TinyGPS++ fonctionnent très bien également.

-
-

Tests de module GPS avec un STM32F103C8  (blue pill)

J'ai finalement fait l'esssai du module GPS avec un module STM32 Blue Pill programmé au moyen d'un convertisseur USB/TTL. Tout comme pour l'ESP32, j'ai pu profiter de la présence d'un deuxième canal UART distinct.


J'ai utilisé ces connexions:


  • GND du convertisseur USB/TTL - G de la Blue Pill
  • RXD du  convertisseur USB/TTL - broche A9 de la Blue Pill
  • TXD du  convertisseur USB/TTL - broche A10 de la Blue Pill
  • 3V3  du  convertisseur USB/TTL - broche 3.3 de la Blue Pil


  • VCC du module GPS - broche 3.3 du la Blue Pill
  • RX du module GPS - broche A2 de la Blue Pill
  • TX du module GPS - broche A3 de la Blue Pill
  • GND du module GPS - broche G de la Blue Pill



Voici le sketch que j'ai utilisé pour reproduire dans le moniteur série les données brutes générées par le module GPS. De la même façon, on peut facilement faire fonctionner la bibliothèque TinyGPS++ avec une carte STM32.

-
-

Le module GPS NEO 6MV2 utilisé dans ce projet a été fourni gratuitement par DigitSpace.

Yves Pelletier (TwitterFacebook)