mercredi 24 février 2021

ESP8266 et ESP32: Contrôle d'une matrice de LEDs RGB

J'avais déjà fait l'essai de ma matrice constituée de 16 rangées de 16 LEDs RGB (contrôleur WS2812B) avec un Arduino Uno. Cette fois-ci, c'est avec un module ESP32 ainsi qu'avec un module ESP8266 que j'ai pu contrôler (à distance) les LEDs de la matrice.


Alimentation et niveau logique

Il faudra choisir pour la matrice de LEDs une alimentation capable de fournir un courant de quelques ampères, particulièrement si vous prévoyez allumer ses 256 LEDs en même temps.

La fiche technique du WS2812B indique que son alimentation doit se situer entre 3,5 V et 5,3 V, et que son VIH (la plus petite tension considérée comme un niveau logique haut) est égal à 70% de la tension d'alimentation. 

Nous pouvons en conclure que:

  • Si nous alimentons le WS2812B avec une tension de 3,3 V, son fonctionnement correct n'est pas garanti, puisqu'il s'agit d'une tension plus faible que le minimum recommandé.
  • Si le WS2812B est alimenté à 5 V, un signal logique d'au moins 3,5 V est requis, en principe, pour garantir son fonctionnement; le signal de 3,3 V issu d'un ESP8266 ou d'un ESP32 pourrait donc être insuffisant.  Dans ce cas, un convertisseur de niveau logique pourrait être nécessaire pour élever à 5 V le signal généré par le microcontrôleur. 

Une autre solution consiste à diminuer un peu la tension d'alimentation de la matrice (si la tension d'alimentation du WS2812B est de 4,7 V ou moins, un niveau logique de 3,3 V se situe dans les normes recommandées par le fabricant).

Pour ma part, tout a fonctionné sans problème en utilisant directement le signal de 3,3 V généré par la broche GPIO 5 du module ESP, même quand la tension d'alimentation de la matrice était de 5 V.

Connexions

Le verso de la matrice comporte 8 fils, mais ils ne sont pas tous nécessaires (ils servent entre autre à brancher plusieurs matrices ensemble, afin d'obtenir un panneau géant).

  • Un des fils rouges marqués "5 V" est branché à la borne positive de l'alimentation de la matrice de LEDs (cette alimentation doit être capable de générer quelques ampères).
  • Le fil noir (marqué GND) est branché à la borne négative de l'alimentation de la matrice de LEDs.
  • Un des fils blancs (marqués GND) est branché à la masse (sortie GND) du module ESP32 ou ESP8266.
  • Le fil vert marqué DIN est branché à la broche GPIO 5 du module ESP32 ou ESP8266 (ça peut aussi être une autre broche, si vous modifiez le sketch ci-dessous en conséquence).


Installation des bibliothèques

J'ai conservé les deux mêmes bibliothèques que j'avais utilisées lors de l'utilisation avec l'Arduino Uno: la bibliothèque FastLED de Daniel Garcia (disponible par le gestionnaire de bibliothèques de l'IDE Arduino) et la bibliothèque LED Matrix par Jorgen - Viking God.

Sketch

Les deux sketches que j'avais rédigés lors de l'essai de la matrice de LEDs avec l'Arduino Uno fonctionnent très bien avec les modules ESP, à la condition de modifier le numéro de la broche GPIO utilisée (5 plutôt que 3).

Dans le sketch ci-dessous, j'ai choisi d'utiliser les fonctionnalités WiFi des modules ESP8266 / ESP32: une page web générée par le module ESP permet d'allumer n'importe quelle LED de la matrice avec la couleur désirée (on choisit "Noir" pour éteindre la LED).

Pour atteindre cette page web, on utilise l'adresse IP affichée sur le moniteur série de l'IDE Arduino lors du démarrage du programme.

-

/**********************************************************************
ESP_matrice_RGB
Contrôle par une page web d'une matrice RGB 16 X 16.
ESP8266 ou ESP32
Pour plus d'infos:
https://electroniqueamateur.blogspot.com/2021/02/esp8266-et-esp32-controle-dune-matrice.html
***********************************************************************/
// inclusion des bibliothèques utiles
// pour la communication WiFi:
#if defined ARDUINO_ARCH_ESP8266 // s'il s'agit d'un ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#elif defined ARDUINO_ARCH_ESP32 // s'il s'agit d'un ESP32
#include "WiFi.h"
#include <WebServer.h>
#endif
#include <WiFiClient.h>
// pour le contrôle de la matrice RGB:
#include <FastLED.h> //https://github.com/FastLED/FastLED
#include <LEDMatrix.h> //https://github.com/Jorgen-VikingGod/LEDMatrix
// modifiez ces deux constantes pour qu'elles contiennent les caractéristiques de
// votre réseau Wifi
#define ssid "**********" // le nom (SSID) de votre réseau WiFi
#define password "**********" // votre mot de passe WiFi
#if defined ARDUINO_ARCH_ESP8266 // s'il s'agit d'un ESP8266
ESP8266WebServer server(80);
#elif defined ARDUINO_ARCH_ESP32 // s'il s'agit d'un ESP32
WebServer server(80);
#endif
// numéro de la ligne, numéro de la colonne et couleur
String ligneStr = "0";
String colonneStr = "0";
String couleurStr = "Noir";
// informations concernant la matrice de LEDs
#define DATA_PIN 5 // GPIO 5 contrôlera la matrice
#define COLOR_ORDER GRB
#define CHIPSET WS2812B
#define MATRIX_WIDTH 16
#define MATRIX_HEIGHT 16
#define MATRIX_TYPE HORIZONTAL_ZIGZAG_MATRIX
#define MATRIX_SIZE (MATRIX_WIDTH*MATRIX_HEIGHT)
#define NUMPIXELS MATRIX_SIZE
cLEDMatrix<MATRIX_WIDTH, MATRIX_HEIGHT, MATRIX_TYPE> leds;
/* La fonction construitPage retourne un string qui contient toute notre page web */
String construitPage() {
String page = "<html lang=fr-FR><head>";
page += "<title>Matrice de LEDs RGB</title>";
page += "<style> body { background-color: #fffff; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }</style>";
page += "</head><body><h1>Matrice de LEDs RGB</h1>";
page += "<form action='/' method='POST'>";
page += "<p> Num&eacute;ro de la ligne: <SELECT name='ligne'> <OPTION>" + ligneStr + " <OPTION>0 <OPTION>1 <OPTION>2 <OPTION>3 <OPTION>4 ";
page += "<OPTION>5 <OPTION>6 <OPTION>7 <OPTION>8 <OPTION>9 <OPTION>10 <OPTION>11 ";
page += "<OPTION>12 <OPTION>13 <OPTION>14 <OPTION>15</SELECT></p>";
page += "<p> Num&eacute;ro de la colonne: <SELECT name='colonne'> <OPTION>" + colonneStr + " <OPTION>0 <OPTION>1 <OPTION>2 <OPTION>3 <OPTION>4 ";
page += "<OPTION>5 <OPTION>6 <OPTION>7 <OPTION>8 <OPTION>9 <OPTION>10 <OPTION>11 ";
page += "<OPTION>12 <OPTION>13 <OPTION>14 <OPTION>15</SELECT></p>";
page += "<p> Couleur: <SELECT name='couleur'> <OPTION>" + couleurStr + "<OPTION> Noir <OPTION>Blanc <OPTION>Bleu <OPTION>Jaune ";
page += "<OPTION>Rose <OPTION>Rouge <OPTION>Vert </SELECT></p>";
page += "<INPUT type='submit' value='Appliquer'><br><br>";
page += "</body></html>";
return page;
}
/* Interaction avec la page web (réception des données du formulaire) */
void gestionPage() {
if (server.hasArg("ligne")) {
// lecture des paramètres choisis dans le formulaire
ligneStr = server.arg(0);
colonneStr = server.arg(1);
couleurStr = server.arg(2);
// pour le débogage, affichage dans le moniteur série:
Serial.print("Commande recue. Ligne: ");
Serial.print(ligneStr);
Serial.print(" Colonne: ");
Serial.print(colonneStr);
Serial.print(" Couleur: ");
Serial.println(couleurStr);
gestionLEDs();
}
server.send ( 200, "text/html", construitPage() );
}
/* Contrôle des LEDS par les broches GPIO2, GPIO4 et GPIO5 */
void gestionLEDs() {
CRGB laCouleur = CRGB::Black;
// Traduction de la couleur choisie, pour qu'elle soit compréhensible par FastLED
if (couleurStr.equals("Noir")) {
laCouleur = CRGB::Black;
}
if (couleurStr.equals("Blanc")) {
laCouleur = CRGB::White;
}
if (couleurStr.equals("Bleu")) {
laCouleur = CRGB::Blue;
}
if (couleurStr.equals("Jaune")) {
laCouleur = CRGB::Yellow;
}
if (couleurStr.equals("Rose")) {
laCouleur = CRGB::Pink;
}
if (couleurStr.equals("Rouge")) {
laCouleur = CRGB::Red;
}
if (couleurStr.equals("Vert")) {
laCouleur = CRGB::Green;
}
// réglage de la LED en question:
leds.DrawPixel(ligneStr.toInt(), colonneStr.toInt(), laCouleur);
FastLED.show();
}
void setup() {
// initialisation de la matrice de LEDs
FastLED.addLeds<CHIPSET, DATA_PIN, COLOR_ORDER>(leds[0], leds.Size()).setCorrection(TypicalSMD5050);
FastLED.setCorrection(TypicalLEDStrip);
FastLED.setBrightness(50);
FastLED.clear(true); // on éteint toutes les LEDs
// pour affichage dans le moniteur série
Serial.begin ( 115200 );
Serial.println("");
WiFi.mode(WIFI_STA);
// initialisation de la communication WiFi
WiFi.begin ( ssid, password );
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 ); Serial.print ( "." );
}
Serial.println ( "" );
Serial.print ( "Maintenant connecte a " );
Serial.println ( ssid );
Serial.print ( "Adresse IP: " );
Serial.println ( WiFi.localIP() );
// On indique le nom de la fonction qui gère l'interraction avec la page web
server.on ( "/", gestionPage );
server.begin();
Serial.println ( "Serveur HTTP en fonction" );
}
void loop() {
server.handleClient();
}

-

À lire également:


Yves Pelletier (TwitterFacebook)

1 commentaire:

  1. Comment faire défiler un long texte sur une matrice flexible RGB 8*32 avec l'ESP32

    RépondreSupprimer