Shield ESP8266 Wang-Tongze

J'ai fait il y a quelque temps l’acquisition de shields ESP8266 de marque Wang-Tongze sur e- bay à 4,63 € pièce. La référence complète est : ESP8266 ESP-12E UART WIFI Wireless Shield Development Board Pour Arduino UNO R3

1

Mes objectifs étaient précis. Je voulais ajouter une liaison WiFi à des cartes Arduino sur lesquelles j'avais des applications déjà fonctionnelles (souvent pour remplacer un shield Ethenet). Il ne s'agissait en rien de réécrire les applications pour les faire tourner sur l'ESP pourtant plus performant et disposant de plus de mémoire. Le shield ne me sert qu'à transmettre à l'Arduino tel quel un message reçu par WiFi, une simple interface donc.

Un shield ESP8266 Wang-Tongze monté entre un Arduino Mega (application DCC++) et une carte moteur POLOLU Dual MC33926.

Mon choix c'est porté sur un shield car j'ai pensé qu'il suffirait de l'enficher sur mes Arduino pour que ça roule !!! En fait, ça a été un peu plus compliqué et je n'ai par ailleurs trouvé aucune documentation sur le net ni aucun tuto un tant soit peu exhaustif.

Je n'ai sans doute pas utilisé la seule méthode possible ni la meilleure. Chacun pourra donc abonder et apporter sa propre expérience.

Au final, la mise en service n'est pas trop compliquée et le fonctionnement intéressant. La carte est « propre » et semble de bonne qualité.

En terme de performance, c'est plutôt pas mal : Un ping sur la carte répond en 5 ms ce qui me convient pour l'essentiel des applications visées.

Pour la programmation, nous allons devoir flasher l'ESP8266 mais c'est assez simple puisque nous allons le faire directement à partir de l'IDE de l'Arduino qu'il faudra avoir configuré si ce n'est pas déjà fait. Voir ici :
https://www.fais-le-toi-meme.fr/fr/electronique/tutoriel/programmes-arduino-executes-sur-esp8266-arduino-ide

Je vais utiliser un FTDI FT232RL (4,25 € sur e-bay) pour téléverser le code entre l'IDE et l'ESP8266. Je n'utilise que la liaison série du FTDI (TX-RX). L'alimentation en 3,3V étant assurée dans ce cas par l'Arduino avec une puissance suffisante pour le flashage.
2

FTDI FT232RL

Côté matériel, mon shield est monté sur un MEGA. Cette précision est importante car nous allons utiliser le port Serial mais aussi Serial1. Or le Maga dispose d'un port Serial1 matériel (Serial2 et Serial3 aussi). Sur un Uno, il sera nécessaire d'utiliser la bibliothèque SoftwareSerial pour la création d'un port série supplémentaire.

Sur la photo ci-dessous, on voit que la sortie TX du FTDI va sur l'entrée RX0 (D3) de l'ESP12 (fil bleu) alors que l'entrée RX du FTDI est reliée à la sortie TX1 de l'ESP12 (D2 – fil mauve). La sortie TX0 de l'ESP12 (fil orange) est reliée à la broche 19 du MEGA (RX1).

1

 

Sur la photo, on voit un fil rouge et un fil noir reliés au FTDI mais ils ne servent pas puisque comme précisé ci-dessus, l'alimentation de l'ESP12 est réalisée par le MEGA.

Dernière précision concernant le matériel, j'ai été obligé de déconnecter les broches 0 et 1 du shield qui correspondent au RX0 et au TX0 du MEGA pour que cela puisse fonctionner. Voir photo ci-dessous.

1

Je ne doute pas qu'il y ait une solution plus « élégante », mais je ne l'ai pas trouvée.

Le MEGA est relié à mon MAC sur l'un de mes ports USB et le FTDI sur le second port USB.

Pour le programme :

Concernant le MEGA tout d'abord, le programme est très simple puisque ne figure ici que ce qui va servir à la réception des données qu'il vous appartiendra ensuite de faire ce que vous souhaiterez.

La dernière partie du code sert elle à l'envoi à l'envoi de messages depuis le MEGA, via l'ESP12 au client WiFi.

void setup() {
  // initialize both serial ports:
  Serial.begin(115200);
  Serial1.begin(115200);
  Serial.println("Serial1 ready");
}

void loop() {
  // read from port 1, send to port 0:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial.write(inByte);
  }

  // read from port 0, send to port 1:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial1.write(inByte);
  }
}

 

Pour téléverser le programme de l'IDE vers le MEGA, vous appliquerez les réglages « classiques » concernant le type de carte et le port auquel est relié la carte :

1

 

Si tout s'est bien passé, vous devez voir apparaître le message Serial1 ready dans le moniteur série.

Vous vous demandez peut-être pourquoi on utilise les ports série pour du MEGA pour communiquer en WiFi. Eh bien, comme nous allons le voir maintenant, le shield va en quelque sorte ré-éxpédier le message reçu en WiFi sur le port série. Ce n'est pas plus compliqué.

Bien sûr, ce code devra être intégré et éventuellement adapté à votre besoin spécifique.


 

Voici le code qu'il va maintenant falloir charger sur l'ESP12 à partir de l'IDE Arduino :

#include <ESP8266WiFi.h>

#define DEBUG

//how many clients should be able to telnet to this ESP8266
#define MAX_SRV_CLIENTS 1
const char* ssid = "***********"; // Your network
const char* password = "********"; // Your password

WiFiServer server(23);
WiFiClient serverClients[MAX_SRV_CLIENTS];

void setup() {
  Serial1.begin(115200); // Serial1 uses UART1, TX pin is GPIO2 => https://github.com/esp8266/Arduino/blob/master/doc/reference.rst#serial
  WiFi.begin(ssid, password);
  Serial1.print("\nConnecting to "); Serial1.println(ssid);
  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial1.println("Try to connect...");
  }
  //start UART and the server
  Serial.begin(115200);
  /*Serial uses UART0, which is mapped to pins GPIO1 (TX) and GPIO3 (RX)*/
  server.begin();
  server.setNoDelay(true);

#ifdef DEBUG
  Serial1.print("Ready! Use 'telnet ");
  Serial1.print(WiFi.localIP());
  Serial1.println(" 23' to connect");
#endif
}

void loop() {
  uint8_t i;
  //check if there are any new clients
  if (server.hasClient()) {
    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
      //find free/disconnected spot
      if (!serverClients[i] || !serverClients[i].connected()) {
        if (serverClients[i]) serverClients[i].stop();
        serverClients[i] = server.available();
        Serial1.print("New client: ");
        Serial1.println(i);
        continue;
      }
    }
    //no free/disconnected spot so reject
    WiFiClient serverClient = server.available();
    serverClient.stop();
  }
  //check clients for data
  for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    if (serverClients[i] && serverClients[i].connected()) {
      if (serverClients[i].available()) {
        //get data from the telnet client and push it to the UART
        while (serverClients[i].available()) {
          Serial.write(serverClients[i].read());
          delay(1);
        }
      }
    }
  }
  //check UART for data
  if (Serial.available()) {
    size_t len = Serial.available();
    uint8_t sbuf[len];
    Serial.readBytes(sbuf, len);
    //push UART data to all connected telnet clients
    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
      if (serverClients[i] && serverClients[i].connected()) {
        serverClients[i].write(sbuf, len);
        delay(1);
      }
    }
  }
}

 

Vous devrez bien sur lignes 7 et 8 renseigner avec les informations propres à votre réseau :

const char* ssid = "***********" // Your network
const char* password = "********" // Your password

 

Ce code autorise la connexion simultanée de plusieurs clients qui peut être paramétrée ligne 6 :

#define MAX_SRV_CLIENTS 1

 

Après avoir complété les informations ci-dessus, vous pouvez téléverser le code dans l'ESP12. Vous n'aurez plus jamais besoin de le modifier quel que soit le programme qui sera exécuté sur votre MEGA (ou autre).

Si vous avez bien téléchargé l'environnement spécifique à l'ESP, vous pouvez selectionner le type de carte (Generic ESP8266 Module) et le port auquel est relié l'le FTDI.

1

 

Avant de lancer le téléversement, vous aurez pris soin de commuter 3 et 4 sur UP comme sur la photo ci-dessous (cadre vert). De même, vous maintiendrez le bouton RESET (cadre rouge) enfoncé jusqu'à ce que le compilateur ait terminé son travail (les lignes ne défilent plus).

1

Vous relâchez alors le bouton  RST, le téléversement commence alors. Il est totalement terminé quand vous voyez ceci :

1

En mode d'exploitation, vous devrez repositionner les commutateurs 3 et 4 sur DOWN et placer alors les commutateurs 1 et 2 sur UP.

1

Pour relancer le programme sur l'ESP, vous n'aurez alors qu'à appuyer une seconde sur le bouton RST puis le relacher.

Pour tester le fonctionnement, j'ai branché comme précisé ci-dessus :


 

Pour pouvoir visualiser les deux moniteurs série simultanément, j'utilise (l'excellent) utilitaire Coolterm disponible en MAC et en PC. Attention, assurez-vous que le moniteur série de l'IDE Arduino est bien fermé !

Vous créez un premier moniteur pour le MEGA en choisissant son port et en séléctionnant sa vitesse à 115200 bauds.

 

1


 

Faites de même pour le moniteur série de l'ESP en sélectionnant le bon port et la bonne vitesse.

1

Appuyez sur le bouton Rest du MEGA et vous devez alors avoir le message : Serial1 ready

En appuyant maintenant sur le bouton Reset de l'ESP, vous devez voir dans la fenêtre de droite tout d'abord quelques lignes incompréhensibles, puis Try to connect pendant que l'ESP se connecte à votre box. Puis, si tout se passe bien, après 5 à 10 secondes, un message qui vous indique l'adresse IP de l'ESP délivrée automatiquement par le DHCP de la box, ici 192.168.1.48 puis le port d'écoute, 23 qui lui a été spécifié dans le code.

Pour tester le fonctionnement, nous allons utiliser un client TCP. Vous trouvez sur le web de nombreux exemples pour réaliser des applications clientes en TCP, en particulier sur Androïd. Vous pouvez aussi utiliser un serveur Node.js qui va envoyer des requêtes TCP comme dans les exemples que j'ai déjà publiés : Piloter son Arduino avec son navigateur web et Node.js (1) et les articles suivants.

Dans l'exemple ci-dessous, j'utilise un client TCP programmé avec le logiciel 4D. Le code est suffisamment commenté pour que vous puissiez suivre chaque étape. On voit ligne 9 le contenu du message qui va être envoyé. Il s'agit d'une commande de traction destinée à DCC++ base station.

 

1

Dans la fenêtre de droite de CoolTerm (ESP8266) on voit qu'un nouveau client s'est connecté tandis que sur la fenêtre de gauche, on voit le message qui a été reçu par le Mega. Heureusement, ce message est bien rigoureusement identique à celui envoyé par l'application TCP cliente.

1

1

En conclusion : Voilà un moyen assez simple et économique d'ajouter une communication WiFi à des applications sur Arduino communiquant en mode textuel. Vous trouverez aussi sur le web de nombreux exemples pour transformer votre ESP en serveur web qui rendra l'accès encore plus facile à partir d'un navigateur web en http.