samedi 12 février 2022

Alimenter un Arduino avec une lampe de poche à manivelle


Il y a quelques années, j'avais acheté chez Ikea une lampe de poche "Ljusa". Il s'agit d'une lampe qui fonctionne sans piles: vous tournez la manivelle pendant quelques secondes, et 3 LEDs blanches demeurent allumées pendant au moins une minute.


Cette lampe de poche était parfaite pour mes enfants, puisqu'elle n'était jamais à cours de piles. Mais les enfants sont devenus grands, et, bien qu'elle fonctionne encore parfaitement, la lampe n'est pas tout à fait assez lumineuse pour m'être utile lors de mes escapades nocturnes en forêt.

Je me suis donc demandé si la lampe de poche ne pourrait pas, par hasard, être légèrement modifiée afin de me servir à autre chose que produire de la lumière. Pourrait-elle, par exemple, alimenter une carte Arduino? 

Comment ça fonctionne?

La manivelle fait tourner un générateur qui produit un courant alternatif par induction électromagnétique.  Grâce à des engrenages, le rotor tourne plus rapidement que la manivelle. Le courant alternatif est transformé en courant continu par un pont de diodes, et sert à charger un supercondensateur de 1 F, qui alimente 3 LEDs branchées en parallèle. Un interrupteur est placé entre les LEDs et le condensateur.

(Je n'ai pas complètement démonté ma lampe, de peur de la rendre inutilisable, mais le youtubeur GrandadIsAnOldMan a démonté la sienne et a publié la vidéo intégrale de l'autopsie.)

1er test: on tourne la manivelle, ensuite on branche l'Arduino

Dans un premier temps, j'ai retiré l'extrémité de la lampe qui comporte les LEDs, ce qui m'a donné accès aux fils qui les alimentent. Au moyen d'un voltmètre, j'ai pu constater que, pendant que je tourne la manivelle rapidement, la tension peut s'élever à 7 ou 8 volts. Lorsque je cesse de tourner la manivelle, la tension peut atteindre, à la condition d'avoir tourné la manivelle rapidement pendant quelques dizaines de secondes, une valeur avoisinant 5,5 volts. 


Le graphique ci-dessous montre une tension initiale de 1,5 V. Pendant que je tourne la manivelle, la tension fluctue entre 3,5 V et 6,5 V,  puis elle se stabilise à 3 V lorsque la rotation cesse. On peut toutefois atteindre une tension plus élevée en tournant la manivelle plus longtemps.

Dans une première expérience, j'ai alimenté un Arduino Uno par son entrée USB. Puisque celle-ci n'est pas protégée par un régulateur de tension, il aurait été téméraire de tourner la manivelle pendant que l'Arduino est y branché! Ma procédure consistait donc à tourner la manivelle de façon à charger le condensateur, et ensuite brancher l'Arduino. Bien sûr, le condensateur se décharge progressivement, mais le dispositif a quand même fonctionné pendant environ une minute avant que la tension ne devienne trop faible.

2e test: ajout d'un régulateur de tension

Pour ce deuxième test, j'ai ajouté un régulateur de tension 7805 à la sortie de la lampe de poche, afin que la tension acheminée à l'entrée USB de l'Arduino ne dépasse jamais 5 V. Comme on peut le constater sur la vidéo ci-dessous, je peux faire fonctionner l'Arduino en tournant la manivelle. À cause de la baisse de tension provoquée par la présence du régulateur, toutefois, l'Arduino ne fonctionne que quelques secondes lorsque je cesse de tourner la manivelle.

3e test: utilisation du connecteur jack

Une troisième option consiste à alimenter l'Arduino par son jack d'alimentation, qui est protégé par le régulateur de tension de la carte. Les résultats sont similaires à ceux obtenus avec le régulateur 7805: l'Arduino fonctionne très bien pendant que je tourne la manivelle, mais cesse de fonctionner assez rapidement lorsque je cesse de la tourner.

Conclusion

Alimenter un projet Arduino au moyen d'une lampe de poche à manivelle n'est pas vraiment pratique, mais c'est possible!

Yves Pelletier (Facebook)

dimanche 6 février 2022

Raspberry Pi Pico et carte SD (MicroPython)

Dans un précédent article, nous avons vu comment écrire et lire un fichier dans la mémoire flash interne du Raspberry Pi Pico. Mais dans certains cas, il est préférable d'enregistrer les fichiers sur une carte SD afin de bénéficier d'un plus grand espace de stockage, pour partager les fichiers avec un autre appareil, etc.

Dans le présent article, nous enregistrerons des données sur une carte SD au moyen d'un Raspberry Pi Pico programmé en MicroPython.


Connexions 

Voici comment j'ai connecté mon module carte SD au Raspberry Pi Pico:

  • Broche GND du module carte SD: GND du Raspberry Pi Pico
  • Broche +3.3 du module carte SD: sortie 3,3 V du Raspberry Pi Pico
  • Broche CS du module carte SD: broche GP9 du Raspberry Pi Pico
  • Broche MOSI du module carte SD: broche GP11 du Raspberry Pi Pico
  • Broche SCK du module carte SD: broche GP10 du Raspberry Pi Pico
  • Broche MISO du module carte SD: broche GP8 du Raspberry Pi Pico


Installation du pilote sdcard.py

Nous utiliserons le pilote sdcard.py pour MicroPython, qui doit donc être copié dans la mémoire flash du Raspberry Pi Pico.


Script MicroPython

Après avoir affiché la liste des fichiers déjà présents sur la carte, ce court programme écrit un nombre aléatoire à l'intérieur d'un fichier texte intitulé "hasard.txt". Le fichier sera automatiquement créé s'il n'existait pas déjà. Puisque j'ai utilisé l'argument "a" (append), le nouveau nombre est ajouté à la fin du fichier, dont le contenu initial demeure intact.

Le fichier est ensuite lu (notez l'utilisation de l'argument "r": read) et son contenu est affiché.

-

-

Résultat

Voici ce qui s'affiche lors de la première exécution du script avec une carte SD qui contient déjà quelques fichiers:


Le programme a créé le fichier "hasard.txt" et y a écrit le nombre 61552.

Deuxième exécution du script:

On peut constater que le fichier "hasard.txt" s'est ajouté à la liste. Le nombre 11644 a été ajouté dans le fichier, et le nombre 61552 s'y trouve toujours.

Mais attention...

Sachez toutefois que le fonctionnement n'est pas garanti sur n'importe quelle carte SD. Sur les 6 cartes que j'ai essayées, 3 ont fonctionné correctement, alors que les 3 autres ont échoué le test en affichant 3 messages d'erreur différents: "No SD card", "Couldn't determine SD card version" et "[Errno 5] EIO". Si vous disposez déjà d'un certain nombre de cartes, vous devriez réussir à en identifier au moins une qui fera l'affaire. Mais si vous devez vous procurer une nouvelle carte spécialement pour ce projet, rien ne vous permet de savoir à l'avance si elle fonctionnera ou non!

À lire également:

D'autres projets impliquant le Raspberry Pi Pico:

D'autres utilisations du module carte SD:

Yves Pelletier (Facebook)


lundi 31 janvier 2022

Visualiser les données d'un microcontrôleur avec Serial Studio

Serial Studio est un logiciel conçu pour afficher en temps réel, à l'écran d'un ordinateur,  les données qui lui sont acheminées par un microcontrôleur via une communication série (UART).  Plusieurs données différentes peuvent être affichées simultanément sous la forme de graphiques cartésiens, de jauges, de diagrammes en bâtons, etc. De plus, toutes les données sont automatiquement archivées sous la forme d'un fichier CSV.

Développé par Alex Spataru, Serial Studio est gratuit, open source et multi-plateforme; je l'ai utilisé sous Linux (Ubuntu), mais il existe également une version pour Windows et pour MacOS. J'ai fait mes tests avec Arduino Uno, mais n'importe quel microcontrôleur fera l'affaire.

Installation et démarrage de Serial Studio

Rendons-nous d'abord sur la page web de Serial Studio.

Le bouton "Install" vous permet de télécharger la version qui correspond à votre système d'exploitation.

La version Linux est un fichier AppImage: après l'avoir téléchargé, il s'agit de rendre le fichier exécutable (clic droit sur l'icône, on choisit "Propriétés" puis on coche "autoriser l'exécution du fichier comme un programme") et votre application est immédiatement fonctionnelle.

Lors du lancement de l'application, on voit très brièvement cet écran de démarrage...
 


...  puis une fenêtre comportant une console série, à gauche, et des réglages (settings) à droite.


À partir d'ici, les choses se compliquent un peu: une configuration est nécessaire avant de pouvoir utiliser Serial Studio.

Création d'un premier projet

Serial Studio a été conçu pour interpréter des données qui lui sont soumises en format JSON (JavaScript Object Notation). Deux options s'offrent à vous: vous pouvez programmer le microcontrôleur pour qu'il envoie les données en format JSON, ou vous pouvez fournir à Serial Studio un fichier JSON qui servira de modèle pour interpréter les données brutes transmises par le microcontrôleur. C'est cette deuxième option que je vous propose ("Parse via JSON project file").

Vous ne connaissez pas très bien le format JSON? Moi non plus!  Et ça n'a aucune importance: Serial Studio comporte un outil qui nous permettra de générer ce fichier d'une façon très conviviale.

Créons un premier projet simple dans lequel le microcontrôleur envoie de façon répétitive une donnée numérique qui devra être affichée en temps réel sous la forme d'un graphique cartésien.

Nous cliquons d'abord sur le bouton "JSON Editor", en haut à droite.

On choisit un tire pour notre premier projet (j'ai choisi "Projet1").

On clique ensuite sur le bouton "Add group". Un groupe peut contenir plusieurs données qu'on désire classer ensemble. Un même projet peut contenir plusieurs groupes, mais un seul groupe sera suffisant pour ce premier projet.

On peut donner un nom à ce groupe (j'ai choisi "Groupe 1"), puis on clique sur le bouton "Add dataset".

On donne un nom à cette donnée. Ici, je l'ai baptisée "Donnée 1" mais dans une application plus concrète, ce serait certainement plus pertinent de l'appeler "température", "luminosité", "vitesse", etc. On peut aussi définir les unités de mesure qui correspondent à cette donnée ("Units").

J'ai ensuite sélectionné "Generate plot" pour que le résultat soit affiché sur un graphique cartésien...

 ... j'ai également choisi le widget "Gauge" pour que le résultat s'affiche également sur une jauge...

 

... j'ai défini la valeur maximale et la valeur minimale que pourront prendre les valeurs (c'est optionnel pour le graphique cartésien, mais nécessaire pour que la jauge fonctionne correctement)...

...et j'ai cliqué sur le bouton "Save" en bas à droite.

On vous propose alors d'enregistrer le fichier JSON comportant ces paramètres à l'intérieur d'un dossier intitulé "Serial Studio", dans le répertoire "Documents". Les fichiers CSV dans lesquelles les données seront archivées seront générés au même endroit.

Si vous le désirez, vous pouvez ouvrir ce fichier JSON au moyen d'un éditeur de texte, afin de voir son contenu.

 

Programmation du microcontrôleur

Programmons maintenant notre microcontrôleur afin qu'il achemine périodiquement une valeur numérique par communication série.

Chaque envoi de donnée doit débuter par l'expression "/*" et se terminer par l'expression "*/" .

Voici un sketch Arduino qui calcule la valeur d'une fonction sinusoïdale variant entre -10 et +10, et qui envoie un résultat deux fois par seconde.

 -

 -

 Voici un échantillon des données générées par ce sketch:

 


Communication entre le microcontrôleur et Serial Studio

Pour établir la communication, il s'agit de sélectionner, dans le volet Setup de Serial Studio, le nom du port série correspondant au microcontrôleur ("COM port").

On choisit le même baud rate que celui qui a été utilisé dans programme du microcontrôleur, puis on clique sur le bouton  "Connect" en haut à droite.

Si les données reçues du microcontrôleur correspondent à la structure enregistrée dans le fichier json, le logiciel bascule en mode "Dashboard" et on peut voir les données s'afficher dans trois zones d'affichage: la valeur numérique, un graphique cartésien et une jauge. On peut rendre invisible n'importe laquelle des 3 zones au moyen des contrôles situés du côté gauche de l'écran. On peut aussi régler l'échelle de l'abscisse du graphique ("Points", soit le nombre de mesures conservées dans le graphique cartésien).

Envoi simultané de plusieurs données différentes

Essayons maintenant un projet un tout petit peu plus ambitieux: l'envoi simultané de 5 données différentes: deux valeurs numériques qui seront représentées sur un même graphique cartésien, une variable booléenne qui sera représentée à l'écran par une LED virtuelle (éteinte ou allumée), une valeur numérique représentée par une jauge et, finalement, une valeur numérique représentée par un diagramme en bâton.

Nous retournons donc à l'éditeur de JSON et créons un nouveau projet (bouton "Create new project".

Celui-là, je l'ai baptisé "Projet 2". J'ai créé un premier groupe ("Groupe 1") qui contiendra deux données qui seront affichées sur un même graphique cartésien. Pour cette raison, j'ai sélectionné, à droite du nom du groupe, l'item "Multiple data plot".

À l'intérieur du groupe 1, j'ai ajouté une première donnée ("Mesure 1")...

 ...puis une deuxième mesure ("Mesure 2"):


Je ne désire pas que les 3 données restantes apparaissent aussi sur le même graphique cartésien. Pour cette raison, je dois les placer dans un groupe distinct. Je créé donc un deuxième groupe ("Groupe 2"), que je laisse cette fois à l'option "Dataset widgets", et je crée, à l'intérieur du groupe 2, la mesure 3. Pour cette mesure, je coche l'option "Display LED" (cette donnée sera un booléen).

Toujours à l'intérieur du groupe 2, j'ajoute la mesure 4: une jauge pouvant varier de 0 à 10...


...puis la mesure 5, un diagramme en bâton pouvant varier de 0 à 20, mais qui sera affiché en rouge si la valeur dépasse 15.

 

Du côté Arduino, notre programme doit générer 5 valeurs séparées par des virgules, et encadrées par les expression "/*" et "*/".

Voici le sketch que j'ai utilisé:

 -

 -

...et voici un échantillon des messages générés:

Finalement, voici ce que ça donne lorsque j'établis la connexion entre Serial Studio et l'Arduino (j'ai masqué l'affichage "Groupe 2", qui était redondant et empêchait que tous les widgets soient visibles en même temps):

 

Conclusion

Pas mal du tout, ce logiciel!


Yves Pelletier (Facebook)