lundi 23 mars 2020

Arduino caméléon


Je me permets aujourd'hui de revisiter un mini-projet amorcé en 2014: l'utilisation d'une sonde RGB pour analyser, par réflexion, la couleur d'une surface. À l'époque, j'avais tenté (avec plus ou moins de succès) de nommer la couleur analysée. Dans cette nouvelle version, je tente (avec plus ou moins de succès) de reproduire la couleur analysée sur un écran couleur (ST7735) branché à l'Arduino.  L'écran affiche du rouge lorsque la sonde est placée sur une surface rouge, alors qu'il affiche du bleu lorsque la sonde est placée sur une surface bleue, etc.

La vidéo ci-dessous montre l'utilisation du dispositif: au démarrage du programme, on doit placer la sonde sur une surface blanche, puis sur une surface noire, afin de calibrer l'appareil. L'écran prend ensuite une couleur qui, sans être identique,  s'approche de celle de la surface sur laquelle on a placé la sonde.




La sonde RGB: principe de fonctionnement

La sonde RGB (red-green-blue) est constituée d'une LED RGB et d'une photorésistance (la LED RGB peut être remplacée par 3 LEDs: une rouge, une verte et une bleue).

Le dispositif fonctionne par réflexion: la LED émet d'abord une lumière rouge sur la surface à analyser. La lumière réfléchie est captée par la photorésistance.

La LED émet ensuite une lumière verte, et la photorésistance mesure la réflexion.  Finalement, la LED émet une lumière bleue, et la photorésistance mesure à nouveau la réflexion.

Une surface de couleur rouge va fortement réfléchir le rouge, alors que le vert et le bleu seront plutôt absorbés (donc faiblement réfléchis). Le vert réfléchit surtout la lumière verte, le bleu réfléchit surtout la lumière bleue, le blanc réfléchit toutes les couleurs alors que le noir les absorbe toutes, etc.

D'une certaine façon, on peut considérer notre sonde RGB comme une caméra numérique rudimentaire...à un seul pixel.

Fabrication de la sonde RGB

Parlons d'abord de la source de lumière: la LED RGB. Il s'agit en fait de 3 LEDs (une rouge, une verte et une bleue) réunies dans un même dispositif. J'ai utilisé un modèle à cathode commune (une broche "-" commune aux 3 LEDs pour la sortie du courant). La broche commune est celle qui est la plus longue.

Puisque notre analyse repose sur la lumière réfléchie par la surface colorée, il est important que notre LED émette une lumière assez intense. La tension de la LED rouge (environ 2 V) étant plus faible que la tension des deux autres LEDs (environ 3 V) j'ai associé la LED rouge à une résistance de 150 Ω, et les deux autres à une résistance de 100 Ω (il en résulte un courant d'environ 20 mA pour une tension de 5 V). La LED RGB a été branché aux sorties 2 (rouge), 3 (vert) et 4 (bleu) de l'Arduino.



Votre photorésistance sera associée à une résistance dont la valeur maximisera autant que possible l'écart entre les différentes valeurs mesurées. Pour trouver cette valeur, vous pouvez mesurer avec un multimètre la résistance de la photorésistance lorsque la LED éclaire une surface blanche (Rmin), et sa résistance lorsque la LED éclaire une surface noire (Rmax). La valeur optimale de la résistance à relier en série avec la photorésistance se calcule de cette façon:

      Rfixe = (Rmin * Rmax)1/2

Ceci étant dit, la valeur exacte de cette résistance n'est pas tellement importante, pourvu qu'elle soit du même ordre de grandeur que la résistance moyenne de votre photorésistance. La valeur de la photorésistance sera mesurée à l'entrée A0 de l'Arduino.

L'ensemble du circuit constitué de la LED et de la photorésistance est enfermé dans un petit récipient opaque, ouvert à une extrémité,  dont la surface intérieure est peinte en noir. Un obstacle opaque doit empêcher la lumière émise par la LED d'atteindre directement la photorésistance (on veut que la photorésistance capte uniquement la lumière réfléchie par la surface colorée).



Connexions de l'écran et installation de la bibliothèque

Je vous réfère à ce précédent article "Écran couleur KMR-1.8 SPI (ST7735) et Arduino" pour les instructions sur les connexions de l'écran à l'Arduino, le téléchargement de la bibliothèque de Bodmer et la configuration de cette bibliothèque.

Un autre modèle d'écran couleur peut évidemment être utilisé, ce qui pourrait vous obliger à le brancher différemment et à apporter certaines modifications au sketch ci-dessous.

Sélection de la couleur à l'écran: le système RGB 565

Ces écrans utilisent un système de couleur à 16 bits appelé "RGB 565": les 5 premiers bits (de poids fort) sont utilisés pour le dosage de rouge, les 6 bits suivants décrivent le vert, et les 5 derniers bits (de poids faible) décrivent le bleu.

Ainsi, le nombre binaire 1111100000000000 représente du rouge pur, sans vert ni bleu.
Le nombre binaire 0000011111100000 représente du vert pur, sans rouge ni bleu.
Le nombre binaire 0000000000011111 représente du bleu pur, sans rouge ni vert.

Les 5 bits qui qualifient le rouge et le bleu permettent donc 32 niveaux d'intensité différents (0 à 31), alors que les 6 bits qui qualifient le vert permettent 64 niveaux différents (0 à 63).

Le sketch

Au démarrage du programme (setup), on lit la valeur de la photorésistance lorsqu'on éclaire une surface blanche (toutes les couleurs réfléchies au maximum), puis une surface noire (toutes les couleurs réfléchies au minimum).

Pendant le reste du programme (loop), la valeur de la photorésistance est lue périodiquement, et convertie (fonction "map") de façon à être étalée entre 0 et 31 (pour le rouge et le bleu) et entre 0 et 63 (pour le vert).

Les valeurs représentant le rouge, le vert et le bleu sont ensuite combinées en une seule variable de 16 bits (la variable "couleur").

-

-

Résultats

Je dois malheureusement admettre que les résultats sont mitigés. L'écran prend effectivement une teinte rougeâtre si la sonde se trouve sur une surface rouge, une teinte verdâtre lorsque la sonde se trouve sur une surface verte, et une teinte bleuâtre lorsque la sonde se trouve sur une surface bleue...à la condition que la surface soit mate et de couleur très vive.

Mais pour le reste, les choses se compliquent: une surface de couleur orangée ne donnera probablement pas un écran orange. Avec un peu de chance, le jaune peut sortir en jaune-vert, mais il peut aussi donner du vert, ou encore du blanc...

Notre sonde RGB semble trop rudimentaire; la relation entre l'intensité lumineuse et la tension mesurée à l'entrée A0 n'est probablement pas linéaire.

Je serais curieux de répéter l'expérience avec un capteur de couleur plus sophistiqué, comme le TCS3200 (j'en ai commandé un ... à suivre).

Yves Pelletier (TwitterFacebook)


dimanche 22 mars 2020

Dans un blog près de chez vous (9)




RitonDuino:

Framboise 314:

Les carnets de Byfeel:

Framboise au potager:

Arduiblog:

SLmédiation:

Yves Pelletier (TwitterFacebook)

dimanche 15 mars 2020

Time-lapse avec l'ESP32-CAM

La technique du time-lapse consiste à produire une vidéo ultra-accélérée au moyen de photographies prises sur une longue période de temps.

J'ai apporté quelques modifications à mes sketches précédents afin de produire des vidéos time-lapse au moyen de mon ESP32-CAM (programmée avec l'IDE Arduino, comme d'habitude).

Comme dans mes projets précédents, l'image captée par la caméra est présentée en temps réel sur une page web. Mais cette page comporte, en plus, un champ texte permettant à l'utilisateur d'écrire le nombre de secondes désiré entre deux images consécutives ainsi qu'un bouton permettant de démarrer et d'interrompre l'enregistrement des images.


Les images sont enregistrées en format jpeg sur une carte micro-SD insérée dans l'ESP32-CAM. On peut ensuite combiner ces images pour en faire une vidéo (pour réaliser la vidéo ci-dessous, j'ai utilisé Movie Maker).





Sketch

Mon point de départ à été mon sketch qui enregistre des photos sur une carte microSD.

Les principales modifications sont:
  • dans la routine web_handler(), aux lignes 127 à 134: ajout d'un champ de texte pour choisir le nombre de secondes entre 2 images successives.
  • dans la routine clic_handler(), aux lignes 189 à 225: récupération du délai entré par l'utilisateur, et activation (ou désactivation) de l'enregistrement des photos.
  • dans la routine loop(), aux lignes 360 à 365: vérification si c'est le moment de prendre une photo, compte tenu du délai choisi par l'utilisateur.
-
-

À lire également

Dans le passé, j'avais fait du time-lapse avec un vieil appareil photo numérique commandé par un Arduino (on peut aussi utiliser la camera du Raspberry Pi, mais je n'ai pas écrit d'article sur ce sujet spécifique).

De plus, j'ai publié plusieurs articles concernant l'ESP32-CAM: première utilisation,  un web server minimaliste , enregistrer des photos sur la carte microSDles LEDs de l'ESP32-CAM, mouvement panoramique de l'ESP32-CAM avec un servomoteur.

Yves Pelletier (TwitterFacebook)

mardi 3 mars 2020

On joue à "Pong" avec la STM32 Blue Pill

Aujourd'hui, on joue au tennis! Notre adversaire: une carte STM32 Blue Pill (STM32F103C8T6) programmée au moyen de l'IDE Arduino.

Pour recréer cette variante du classique jeu d'arcade "Pong", j'ai utilisé, en plus de la blue pill, un écran OLED I2C SH1106 et un potentiomètre. J'ai choisi la blue pill, mais il ne devrait pas être très difficile de modifier le sketch afin de l'utiliser sur une autre carte supportée par l'IDE Arduino. De plus, grâce à la bibliothèque u8g2, le sketch peut être modifié pour utilisation avec un autre modèle d'écran monochrome.

Déroulement du jeu

L'utilisateur contrôle la "raquette" de gauche au moyen du potentiomètre. La raquette de droite est contrôlée par notre programme.



Installation de la bibliothèque u8g2

Afin de programmer la carte blue pill avec l'IDE Arduino, les fichiers relatifs aux cartes STM32 doivent avoir préalablement été installés au moyen du gestionnaire de fichier (voir ce précédent billet pour des instructions détaillées).

De plus, notre sketch utilisera la bibliothèque u8g2 pour contrôler l'écran OLED. Cette bibliothèque peut être installée grâce au gestionnaire de bibliothèques de l'IDE.

Circuit

Puisque l'écran OLED SH1106 est un périphérique  I2C, il est branché à la carte blue pill de la façon suivante:

  • Broche GND de l'écran OLED: broche GND de la blue pill
  • Broche VCC de l'écran OLED: broche 3.3 de la blue pill
  • Broche SCL de l'écran OLED: broche B6 de la blue pill
  • Broche SDA de l'écran OLED: broche B7 de la blue pill

Le potentiomètre est branché à la broche B0 de la blue pill, de façon à faire varier la tension entre 0 et 3,3 V.



Sketch

La routine "hasard" (ligne 36) est appelée chaque fois que la balle est remise en jeu (au tout début, et chaque fois qu'un point a été compté). Elle génère, de façon aléatoire, la hauteur initiale de la balle sur l'écran, et la vitesse à laquelle la balle se déplace (2 ou 3 pixels par cycle vers la gauche ou vers la droite, 2 ou 3 pixels par cycle vers le haut ou vers le bas). La raquette de l'adversaire est initialement placée à une hauteur similaire à celle de la balle, mais avec une imprécision aléatoire (ligne 41).

J'ai réglé la résolution du convertisseur analogique-numérique de la blue pill à 6 bits (ligne 59): le potentiomètre génère ainsi une valeur pouvant varier entre 0 et 63, ce qui correspond parfaitement aux 64 pixels de l'écran.

La raquette de l'adversaire tente de se maintenir à la même hauteur que la balle, mais il y parvient avec un taux de succès de 90% (ligne 75): l'adversaire n'est donc pas infaillible et le joueur peut gagner s'il réussit plusieurs coups consécutifs.

Dans sa version actuelle, le jeu ne s'arrête jamais!

- -

Yves Pelletier (TwitterFacebook)