samedi 25 avril 2020

Aficher sur un écran ST7735 les fichiers d'une carte SD (STM32)

Mon petit écran couleur ST7735 128*160 pixels est muni d'un lecteur pour carte SD, que je ne m'étais jamais donné la peine d'utiliser jusqu'à tout récemment.

Dans ce tuto, je branche l'écran ST7735 et son lecteur de carte SD à un module STM32F103C8T6 "Blue Pill" et, en le programmant avec l'IDE Arduino, j'affiche à l'écran du texte et des images qui avaient préalablement été enregistrés sur une carte SD.



Tout ceci pourrait être fait sans problème avec une carte Arduino Uno, mais ça m'a semblé intéressant d'utiliser la Blue Pill, puisqu'elle est plutôt rapide et son niveau logique de 3,3 V est parfaitement adapté à l'écran et au lecteur de cartes.

Connexions de l'écran au module Blue Pill

Le lecteur de cartes SD et l'écran communiquent tous les deux en SPI et, pour cette raison, ils partagent la même broche SCLK (A5) et la même broche MOSI (A7) (le lecteur de cartes est le seul des deux périphériques à utiliser la broche MISO).

Si votre écran ST7735 ne comporte pas de lecteur de carte SD intégré, vous pouvez obtenir les mêmes résultats avec un lecteur de carte SD distinct.
  • Broche 1 GND de l'écran - Broche G de la Blue Pill
  • Broche 2 VCC de l'écran - 5 V de la Blue Pill
  • Broches 3, 4, et 5 NC de l'écran - pas branchées
  • Broche 6 RESET de l'écran - Broche A3 de la Blue Pill
  • Broche 7 AO de l'écran - Broche A2 de la Blue Pill
  • Broche 8 SDA de l'écran - Broche A7 de la Blue Pill
  • Broche 9 SCL de l'écran - Broche A5 de la Blue Pill
  • Broche 10 CS de l'écran - Broche A8 de la Blue Pill
  • Broche 11 SCK de l'écran (SD) - Broche A5 de la Blue Pill
  • Broche 12 MISO de l'écran (SD) - Broche A6 de la Blue Pill
  • Broche 13 MOSI de l'écran (SD) - Broche A7 de la Blue Pill
  • Broche 14 SD_CS de l'écran (SD) - Broche A4 de la Blue Pill
  • Broche 15 LED+ de l'écran - Broche 3.3 de la Blue Pill
  • Broche 16 LED- de l'écran - Broche G de la Blue Pill


Préparation de l'IDE Arduino pour la programmation d'un STM32

Puisque nous allons programmer la Blue Pill avec l'IDE Arduino, c'est important que le logiciel ait été configuré pour la programmation des cartes STM32. Tout est expliqué dans cet article.

Installation des bibliothèques GFX et ST7735 d'Adafruit

La bibliothèque SD est déjà disponible, par défaut, dans l'IDE Arduino, mais nous avons également besoin de la bibliothèque GFX et de la bibliothèque ST7735, toutes deux mises au point par Adafruit. Elles peuvent toutes les deux s'installer par l'entremise du gestionnaire de bibliothèque.

Sketch #1: affichage de texte stocké sur la carte SD

Dans ce premier exemple, l'écran affiche successivement toutes les lignes d'un texte enregistré sous forme de fichier sur la carte SD.

Le fichier s'intitule "mots.txt" et doit avoir préalablement été enregistré sur la carte SD. Pour cette démonstration, j'ai écrit dans ce fichier quelques proverbes. La raison pour laquelle vous pouvez voir plusieurs espaces entre certains mots, c'est que l'écran affichera 13 caractères par ligne. Si le 13e caractère se trouve au milieu d'un mot, le mot sera séparé en deux parties lors de l'affichage à l'écran, ce qui ne fait pas très joli.


Lors de l'exécution du programme, l'écran affiche successivement chaque ligne du fichier txt pendant 5 secondes. Notre Blue Pill s'est transformée en philosophe un peu casse-pieds!


-
-


Sketch #2: Affichage à l'écran d'images .bmp stockées sur la carte SD

Dans ce deuxième exemple, des images se trouvant sur la carte SD sous la forme de fichiers .bmp sont affichées à l'écran, l'une après l'autre.  Dans ce cas, j'ai utilisé, avec assez peu de modifications, un sketch mis au point par Adafruit.


Les images doivent être enregistrées sur la carte SD sous la forme de fichiers bitmap (.bmp) ayant la même résolution que l'écran (donc 160 pixels de large par 128 pixels de haut, dans mon cas).

L'image ne sera pas redimensionnée: si elle est plus grande que l'écran, seule une portion de l'image sera affichée, en taille réelle!

-

-

À lire aussi

Yves Pelletier (TwitterFacebook)

dimanche 19 avril 2020

Robot suiveur de ligne, version Arduino


Il y a quelques jours, je vous ai proposé la réalisation d'un robot suiveur de ligne basé sur un Raspberry Pi.

Le robot que je vous présente aujourd'hui se comporte de la même façon: grâce à une paire de photorésistances, il peut faire la différence entre une surface claire et une surface sombre, ce qui lui permet de se déplacer en suivant fidèlement une ligne sinueuse sur le plancher­.

La version que je vous présente aujourd'hui a pour cerveau une carte Arduino Uno.




Mise au point du capteur

Le principe de fonctionnement du capteur est le suivant: une LED éclaire la surface du plancher, et une photorésistance capte la lumière réfléchie par le plancher. Si la surface éclairée est blanche, la quantité de lumière réfléchie est plus grande que si la surface est noire. La résistance de la photorésistance ne sera donc pas la même si celle-ci se trouve au-dessus d'une surface blanche ou d'une surface blanche.

Le capteur est donc constitué de deux LEDs blanches, situées de part et d'autre de la ligne qui sera suivie par le robot, et de deux photorésistances, également situées de part et d'autre de la ligne.



Les LEDs seront alimentées par une sortie 5 V de la carte Arduino. Avec une résistance de protection de 120 Ω, on obtient une bonne intensité lumineuse sans risquer de dépasser le courant maximal.

Chaque photorésistance est branchée en série avec une résistance fixe de façon à former un diviseur de tension.  Pour déterminer la valeur optimale de la résistance fixe (celle qui provoquera le plus grand écart de tension entre la surface blanche et la surface noire), mesurez la résistance de la photorésistance lorsque la LED éclaire la surface blanche (Rmin) ainsi que sa résistance lorsque la LED éclaire la surface noire (Rmax).

La valeur optimale de la résistance fixe se calcule ensuite de cette façon:

Rfixe = (Rmin + Rmax )1/2

Chacun des deux diviseurs de tension constitués d'une photorésistance et d'une résistance fixe est alimentée par la sortie 5 V de l'Arduino.

Le signal du capteur de gauche est acheminé à l'entrée analogique A0 de l'Arduino, alors que celui du capteur de droite est branché à l'entrée A1.

Ce double capteur doit être installé à l'avant du véhicule robotisé de façon à éclairer le plancher. Vous obtiendrez de meilleurs résultats en plaçant un petit écran opaque entre la LED et la photorésistance, afin que cette dernière reçoive uniquement la lumière réfléchie par le plancher (et non celle qui provient directement de la LED).





Branchement des moteurs

Le véhicule robotisé est constitué de deux roues motrices, chacune d'entre elles étant actionnée par un moteur à courant continu.  Il est très important que ces moteurs comportent une boîte d'engrenage pour diminuer leur vitesse de rotation: un moteur à courant continu directement relié à la roue, sans boîte d'engrenage, produirait un bolide beaucoup trop nerveux pour suivre la ligne.



Comme intermédiaire entre la carte Arduino et les moteurs, j'ai utilisé un module L298N. D'autres options auraient fait l'affaire, surtout que je n'ai pas besoin de mettre les moteurs en marche arrière dans ce projet (mais c'était pratique d'utiliser le même matériel et les mêmes connexions que pour mon robot préprogrammé et mon robot éviteur d'obstacles).


Le module L298N est branché de la façon suivante:

  • Sorties OUT1 et OUT2 du L298N: premier moteur
  • Sorties OUT3 et OUT4 du L298N: deuxième moteur
  • Entrées +12 V et GND du L298N: alimentation des moteurs
  • Broche ENA du L298N: broche 9 de l'Arduino
  • Broche IN1 du L298N: broche 3 de l'Arduino
  • Broche IN2 du L298N: broche 4 de l'Arduino
  • Broche IN3 du L298N: broche 5 de l'Arduino
  • Broche IN4 de L298N: broche 6 de l'Arduino
  • Broche ENB du L298N: broche 10 de l'Arduino
L'alimentation des moteurs (adaptée aux caractéristiques de vos moteurs, donc pas nécessairement 12 V) n'est pas la même que l'alimentation de l'Arduino (qui était, dans mon cas, une alimentation USB portative de 5 V).


Sketch

Au démarrage du programme, le robot doit être correctement positionné, avec un capteur de chaque côté de la ligne. Deux secondes après le démarrage du programme, la valeur initiale de chaque capteur est mise en mémoire.

On fait ensuite avancer le robot en comparant périodiquement l'état de chaque capteur à sa valeur initiale. Si la valeur mesurée par un capteur est significativement différente de la valeur initiale, on suppose qu'il se trouve au-dessus de la ligne et on le fait tourner pour éviter qu'il ne la traverse.

Il sera peut-être nécessaire de modifier la valeur des variables globales  "sensibilite" et "vitesse".

-
-

À lire aussi



Yves Pelletier (TwitterFacebook)

mercredi 15 avril 2020

Robot éviteur d'obstacles, version Raspberry Pi

Grâce à un télémètre à ultrasons HC-SR04, un robot peut détecter la présence d'un obstacle situé devant lui, et modifier sa trajectoire de façon à éviter de frapper l'obstacle.


Dans cet article, je vous donne quelques informations qui vous permettront de fabriquer un tel robot, en utilisant un Raspberry Pi (si vous préférez utiliser une carte Arduino, vous pouvez consulter cet article).

Comportement du robot

Le robot se déplace normalement en ligne droite. Mais s'il détecte la présence d'un obstacle devant lui (à une distance de 20 cm ou moins), il tourne sur lui même, puis recommence à avancer lorsque la voie est libre.



Connexion des moteurs

La partie la plus complexe de l'assemblage du robot consiste à connecter les moteurs par l'entremise d'un L298N; tout ça a été couvert en détail dans cet article: Robot Raspberry Pi.



Connexion du capteur à ultrasons

Le télémètre HC-SR04 est plus simple à brancher, puisqu'il ne comporte que 4 connecteurs. Il faut toutefois éviter de brancher directement sa sortie "echo" à une broche GPIO du Raspberry Pi, car sa tension de 5 V risquerait d'endommager le Raspberry Pi. C'est pour cette raison que j'ai utilisé un diviseur de tension constitué d'une résistance de 1 kΩ et d'une résistance de 1,8 kΩ. De cette façon, la tenson appliquée à l'entrée du Raspberry Pi ne sera que de 3,3 V (une autre possibilité consiste à utiliser un circuit intégré 4050).

  • La broche Vcc du HC-SR04 est branchée à une sortie 5 V (broche numéro 2) du Raspberry Pi.
  • La broche Trig du HC-SR04 est branchée à la broche 8 (GPIO 14) du Raspberry Pi 
  • La broche Echo du HC-SR04 est branchée à la broche 10 (GPIO 15) du Raspberry Pi, par l'entremise du diviseur de tension schématisé ci-dessus.
  • La broche Gnd du HC-SR04 est branchée à une des broches Gnd du Raspberry Pi (la broche 25, par exemple).



Script

Le programme vérifie d'abord la distance retournée par le télémètre HC-SR04 (voir cet article sur l'utilisation d'un HC-SR04 avec un Raspberry Pi si vous désirez plus d'information sur le fonctionnement du capteur). Si le résultat est supérieur à 20 cm, le robot continue d'avancer en ligne droite. Si le résultat est inférieur à 20 cm, le robot cesse d'avancer et effectue une rotation.

- -

À lire aussi



Yves Pelletier (TwitterFacebook)

lundi 13 avril 2020

Robot suiveur de ligne, version Raspberry Pi (2): Assemblage et programmation

Le classique robot suiveur de ligne est souvent une des premières réalisations d'un roboticien amateur: vous tracez une trajectoire sombre sur fond clair (ou une trajectoire claire sur fond sombre), et un véhicule autonome suit docilement cette trajectoire grâce à des capteurs optiques.

Un robot de ce genre peut être réalisé avec un Arduino, ou avec un autre microcontrôleur, ou sans microcontrôleur du tout. Dans ce tutoriel, j'utilise un Raspberry Pi programmé en Python.

Voici tout d'abord une courte vidéo montrant le robot suiveur de ligne en pleine action.


Assemblage du châssis, connexion des moteurs

Nous réutilisons la plate-forme robotique mise au point dans l'article Robot Raspberry Pi; il s'agissait d'un robot contrôlable par Wi-Fi, et nous n'aurons qu'à lui ajouter des capteurs et à le programmer différemment.  Je vous invite donc à consulter cet article pour plus d'informations sur la façon de brancher les moteurs au Raspberry Pi.


Connexion des capteurs optiques

Dans mon précédent article (Robot suiveur de ligne, version Raspberry Pi (1): fabrication du capteur), j'ai conçu un capteur double qui produit un signal logique de 3,3 V lorsque la surface est blanche, et de 0 V lorsque la surface est noire. Notez qu'il est également possible de vous procurer un capteur prêt à l'emploi, spécialement conçu pour ce genre d'utilisation.



J'ai branché la sortie du capteur de gauche à la broche BCM 17 (BOARD 11) du Raspberry Pi et la sortie du capteur de droite à la broche BCM 27 (BOARD 13). Il faut bien sûr alimenter les capteurs (broches GND et 3,3 V). J'ai conçu mon capteur pour que les LEDs soient alimentées en 5 V, ce qui n'est pas nécessairement le cas si vous utilisez un autre modèle de capteur.


Les capteurs sont placés à l'avant du robot, et orientés vers le sol.



Script en langage Python

Au démarrage du script, le robot doit être positionné de façon à ce qu'aucun des deux capteurs ne soit sur la ligne: l'état initial de chaque capteur est alors déterminé (lignes 41 et 42).

Ensuite, le sketch vérifie continuellement l'état des capteurs (lignes 46 et 47).
  • Si les deux capteurs sont dans leur état initial, le robot continue tout droit.
  • Si le capteur de gauche n'est plus dans son état initial (il est donc au-dessus de la ligne), le robot tourne à gauche.
  • Si le capteur de droite n'est plus dans son état initial (il est donc au-dessus de la ligne), le robot tourne à droite.
  • Si les deux capteurs ne sont pas dans leur était initial (ils sont tous les deux sur la ligne), le robot s'arrête (on peut mettre une ligne perpendiculaire pour indiquer la fin du parcours).
-

-

À lire aussi:



Yves Pelletier (TwitterFacebook)

samedi 11 avril 2020

Robot suiveur de ligne, version Raspberry Pi (1): fabrication du capteur

Le robot suiveur de ligne est un grand classique de la robotique: vous tracez un trajet foncé sur fond pâle (ou un trajet pâle sur fond foncé) et un véhicule autonome suit docilement le parcours, sans jamais traverser la ligne.

Pour obtenir ce résultat, deux photorésistances sont placées à l'avant du véhicule de façon à capter la lumière réfléchie par le plancher: les surfaces pâles réfléchissent plus de lumière que les surfaces foncées, ce qui modifie la valeur de la photorésistance.



Tout ça est relativement simple si le cerveau de votre robot suiveur de ligne est un Arduino: chaque photorésistance produit une tension variable qu'il s'agit de mesurer sur une entrée analogique de l'Arduino. Mais si vous utilisez un Raspberry Pi, les choses se compliquent un peu: le Raspberry Pi ne comporte pas d'entrée analogique.

Une solution possible consiste à ajouter un convertisseur analogique-numérique à votre Raspberry Pi (comme par exemple  le MCP3008 ou le PCF8591). J'ai plutôt choisi de fabriquer un capteur qui retourne un signal numérique: 3,3 V si la surface est pâle, 0 V si la surface est foncée.



La source d'éclairage

Mon capteur est muni de deux LEDs qui produisent de la lumière blanche (une LED de chaque côté de la ligne qui sera suivie par le robot). Chaque LED est alimentée par une tension de 5 V et protégée par une résistance de 120 Ω. La lumière produite par ces LEDs est réfléchie par le plancher.



Le capteur de lumière

Chaque photorésistance est placée juste à côté de la LED, et orienté de façon à capter la lumière réfléchie par le plancher plutôt que celle qui provient directement de la LED.  La photorésistance est associée à une résistance fixe de façon à former un diviseur de tension.

La valeur optimale de la résistance fixe est obtenue en effectuant ce calcul:

Rfixe = (Rmin + Rmax )1/2

...où Rmin est la valeur de la photorésistance quand la lumière de la LED est réfléchie par une surface noire, et Rmax est la valeur de la photorésistance quand la lumière de la LED est réfléchie par une surface blanche.

Le signal de sortie de dispositif (une tension qui varie en fonction de l'intensité lumineuse captée) est acheminé à l'entrée "V+" d'un comparateur LM393.

Résistances de référence (potentiomètres)

Deux potentiomètres seront réglés à une résistance se situant entre Rmin et Rmax , de façon à produire une tension de référence plus grande que la tension de la photorésistance quand la lumière est réfléchie par une surface noire, et plus petite que la tension de la photorésistance quand la lumière est réfléchie par une surface blanche.

La tension de sortie de chaque potentiomètre est acheminée à l'entrée "V-" du comparateur LM393.

Comparateur LM393

Finalement, un circuit intégré LM393 compare la tension de la photorésistance avec la tension du potentiomètre. La tension de sortie du LM393 est de 3,3 V si la tension de la photorésistance est supérieure à celle du potentiomètre, alors qu'elle est nulle si la tension de la photorésistance est inférieure à celle du potentiomètre.

C'est important d'alimenter le LM393 avec une tension de 3,3 V (et non 5 V) afin que son signal de sortie soit 3,3 V, le niveau logique approprié pour les broches du Raspberry Pi. Une résistance de tirage est nécessaire à chacune des deux sorties du LM393. Les tensions de sorties seront acheminées à des broches GPIO du Raspberry Pi.

Notre capteur est maintenant prêt à être installé sur notre robot (ce sera le sujet du prochain article).

Yves Pelletier (TwitterFacebook)