jeudi 6 août 2015

Module WiFi ESP8266: test et configuration avec Arduino Uno

L'ESP8266 est un circuit intégré qui vous permet, à très faible coût, de sauter à pieds joints dans le domaine de l'internet des objets en créant  vos propres dispositifs capables de se brancher à l'internet par WiFi.

L'ESP8266 peut répondre aux commandes qui lui sont envoyées par un microcontrôleur auquel on l'a branché, ou on peut programmer directement l'ESP8266 pour qu'il agisse ensuite de façon  autonome.

Dans cet article, je vous explique comment j'ai procédé pour tester mon module ESP8266 et faire en sorte qu'il se branche sur mon réseau WiFi domestique.  Pour ce faire, nous lui enverrons des commandes AT que nous taperons manuellement au claver d'un ordinateur.

Il existe un grand nombre de modèles de breakouts comportant l'ESP8266; j'ai utilisé celui qui semble le plus répandu et le plus facile à trouver sur internet:  l'ESP-01.  Ce module n'est malheureusement pas muni d'un connecteur USB qui nous permettrait de le brancher facilement à un ordinateur.  Pour permettre à l'ordinateur de communiquer avec l'ESP8266, nous devons utiliser un intermédiaire comme, par exemple, un convertisseur série/USB.  Pour ma part, j'ai choisi d'utiliser un Arduino Uno, dont le principal avantage est...que j'en possède un!

La fonction de l'Arduino Uno sera donc de transmettre à l'ESP8266 les commandes que nous taperons dans le moniteur série de l'IDE Arduino, et d'afficher dans le moniteur série les réponses qui seront émises par l'ESP8266.  L'utilisation de l'Arduino Uno comporte cependant quelques inconvénients:
  • L'Arduino Uno fonctionne à un niveau logique de 5 V, alors que l'ESP8266 fonctionne à un niveau logique de 3,3 V:  il faut donc prévoir une conversion de niveau logique.  J'ai utilisé le circuit intégré 4050, que nous avions déjà étudié dans un précédent article; d'autres personnes ont eu du succès avec un simple diviseur de tension constitué de deux résistances.
  • L'ESP8266 nécessite un courant élevé (300 mA), qui ne peut être fourni de façon fiable et sécuritaire par la sortie 3,3 V de l'Arduino: pour cette raison, il faut prévoir une alimentation autonome pour l'ESP8266.  J'ai utilisé une alimentation de laboratoire réglée à 3,3 V, une alimentation ATX aurait certainement fait l'affaire aussi (n'oubliez de relier sa borne négative à une des pins GND de l'Arduino...).  Plusieurs personnes utilisent des piles combinées à un régulateur de tension.  À un moment où mon ESP8266 semblait avoir un comportement étrange, j'ai ajouté un condensateur de 100 µF en parallèle avec l'alimentation, ce qui ne peut pas faire de mal même si, dans mon cas, ça n'a rien changé du tout.
  • L'Arduino Uno ne comporte qu'un seul canal de communication série (les pins 0 et 1), qui sera utilisé pour la communication entre l'ordinateur et l'Arduino.  Pour la communication entre l'Arduino et l'ESP8266, nous utiliserons deux autres pins (10 et 11) qui seront transformées en canal de communication série de façon logicielle grâce à la  bibliothèque software serial.  

Brochage de l'ESP-01

Le breakout ESP-01 comporte 8 pins disposées de telle façon qu'il est impossible de l'insérer directement dans une breadboard:  j'ai donc utilisé des câbles mâle-femelle pour les connexions entre l'ESP8266 et la breadboard.

  • UTXD:  C'est la sortie des données de  l'ESP8266.  Nous la relierons à l'entrée de l'Arduino (pin 10).  Ce signal sera de 3,3 V et sera reconnu sans problème par l'Arduino, sans qu'une  conversion de niveau logique ne soit  nécessaire.
  • CH_PD ("chip power down"):  doit être à 3,3 volts pour permettre le fonctionnement du module.
  • RST ("reset"):  lorsque cette pin est reliée à la masse, il en résulte un reset (redémarrage) du module.   J'ai constaté qu'un tel redémarrage peut s'avérer nécessaire si le module ESP8266 a démarré avant l'Arduino auquel il est branché.
  • Vcc:  alimentation du module:  3,3 V
  • GND:  GND...
  • GPIO2:  "general purpose input output" peut être utilsé pour brancher un capteur si vous programmez directement l'ESP8266 (ce que nous ne ferons pas aujourd'hui)
  • GPIO0:  mise à 3,3 volts en utilisation normale (branchée à GND lorsqu'on veut mettre à jour le firmware de l'ESP8266).
  • URXD:  entrée des données, qui doivent obligatoirement être à un niveau logique de 3,3 volts. Cette pins sera branchée indirectement à la sortie (pin 11) de l'Arduino, par l'intermédiaire d'un convertisseur de niveau logique (4050).


Brochage du 4050

Le circuit intégré 4050 comporte suffisamment d'entrées et de sorties pour abaisser 6 tensions logiques, alors que nous n'en abaisserons qu'une seule...  Les pins 1 (Vcc) et 8 (GND) servent à alimenter le circuit intégré.  La pin 1 devra être à 3,3 V alors que la pin 8, sans trop de surprise, sera  branchée à la masse  (GND).   La pin 3 est une entrée: nous y acheminerons le signal de sortie (pin 11) de l'Arduino. La pin 2 est la sortie associée à la  pin  3:  chaque fois que la pin 3 est à 5 volts, la  pin 2 se met à 3,3 volts.  Nous brancherons donc la pin 2 du 4050 à l'entrée (URXD) de l'ESP8266.


Circuit complet

Ce circuit comporte un bouton "reset" permettant le redémarrage du module en cas de besoin.

4 des pins de l'ESP8266 sont branchées à 3,3 V:  VCC,  CH_PD, GPIO0 et GPIO2.

Je le répète:  l'alimentation 3,3 volts n'est pas la sortie 3,3 volts de l'Arduino.


Sketch

Tel que mentionné précédemment, ce sketch ne comporte rien de spécifique au ESP8266:  tout ce que vous écrivez dans le moniteur série (et que l'Arduino reçoit par par USB ("Serial") est retransmis à la pin 11 (donc vers l'ESP8266, "mySerial").  Inversement, tout ce que l'Arduino reçoit sur sa pin 10 en provenance de l'ESP8266 est recopié dans le moniteur série.



Réglages du moniteur série

Votre ESP8266 est probablement réglé pour communiquer à 9600 bauds, et c'est ce que nous avons supposé dans le sketch proposé plus haut.  Donc, réglez le moniteur série à cette valeur.  (Si vous disposez d'un module équipé d'une vieille version du firmware, il est possible qu'il soit plutôt réglé à 115200 bauds!)  De  plus (c'est très important), choisissez la terminaison de ligne "NL & CR".


Envoi de commandes AT à l'ESP8266

Les commandes AT sont des instructions qu'on peut envoyer à l'ESP8266 dans le but de lui faire accomplir certaines tâches.  Ici, nous écrirons nous-mêmes ces commandes dans le moniteur série, mais on pourrait aussi écrire un sketch pour que l'Arduino les envoie de façon plu automatisée.

Conseil:  assurez-vous que l'Arduino est branché à l'ordinateur et affichez le moniteur série de l'IDE Arduino avant de démarrer l'ESP8266.

Lorsque vous démarrer l'ESP8266 (en branchant son alimentation), vous devriez voir apparaître quelque chose de ce genre sur le moniteur série:


Vous pouvez ensuite écrire vos commandes dans le moniteur série:

Si vous écrivez "AT", l'ESP8266 devrait répondre "OK".

La commande "AT+RST" cause un redémarrage de l'ESP8266 (similaire à  ce qu'on obtient en appuyant sur le bouton, dans le schéma de circuit montré plus haut).

"AT+GMR" permet de connaître le numéro du firmware de l'ESP8266, ce qui peut être bon à savoir.  Le mien retourne "0018000902-AI03".


Passons maintenant aux choses un peu plus sérieuses:  demandons à notre ESP8266 de se brancher à notre réseau Wi-Fi domestique.

La commande "CWMODE" permet de définir l'ESP8266 comme une station (STA), un point d'accès (AP) ou les deux, selon qu'on lui assigne la valeur 1, 2 ou 3.  À moins d'avoir en tête une application précise, il n'y a rien de mal, je suppose, à rendre notre ESP8266 le plus polyvalent possible, alors écrivons la commande "AT+CWMODE=3". L'ESP8266 répondra "OK" s'il a fait le changement, ou "no change" si l'ESP8266 était déjà dans l'état demandé.

Dressons maintenant une liste des réseaux sans fils détectés par l'ESP8266:  il s'agit de la commande "AT+CWLAP".  Après un délai de quelques secondes, une impressionnante liste de 16 réseaux Wi-Fi s'est affichée dans le moniteur série (je suis dans une maison unifamiliale:  la plupart de ces réseaux sont à plusieurs dizaines de mètres de chez moi.)


Avant de demander à mon ESP8266 de se brancher à mon réseau domestique, j'utilise "Fing" pour voir les appareils qui se trouvent déjà sur le réseau:


Il y a déjà 5 adresses IP dans la liste:  des ordinateurs portables, des tablettes, etc.

Maintenant, je demande à mon ESP8266 de joindre mon réseau WiFi en écrivant:

AT+CWJAP="SSID","PSK"

... où vous remplacez SSID par le nom de votre réseau Wi-Fi (tel qu'il apparaît dans la liste des réseaux disponibles affichés avec CWLAP) et PSK par le mot de passe de votre réseau Wi-Fi.  Vous devez gardez les guillemets.  Par exemple, si votre réseau s'appelle Marcel et que votre mot de passe pour y accéder est w83hgdt22, vous écrivez:

AT+CWJAP="Marcel","w83hgdt22"

Pas d'espaces, une virgule entre le nom de réseau et le mot de passe, et vous conservez les guillemets.

L'ESP8266 devrait répondre "OK".

Si maintenant j'écris la commande "AT+CIFSR", l'ESP8266 me fournit l'adresse IP qu'on lui a assigné:

192.168.4.1
192.168.1.75

J'utilise à nouveau "Fing" pour voir ce qui est branché sur mon réseau et, effectivement, un nouvel appareil est apparu dans la liste,  à l'adresse IP 192.168.1.75 !




On peut maintenant quitter le réseau sans fil, grâce à la commande "AT+CWQAP".

Maintenant que l'ESP8266 s'est branché avec succès à votre réseau Wi-Fi, il s'y branchera automatiquement dès son prochain démarrage, sans que vous ayez besoin de le lui  demander au moyen  de la commande CWJAP.  Il conserve en mémoire le nom et le mot de passe de votre réseau.

Dans un prochain article, nous tenterons de faire quelque chose d'utile avec notre ESP8266.  Ce serait chouette.


Yves Pelletier   (TwitterFacebook)

8 commentaires:

  1. Super ton article je suis pressé de le mettre en oeuvre. Pour info, je crois que le dernier hackable magazine en parle. On peut trouver un module serie chez cypress pour 4 euro.

    RépondreSupprimer
  2. Salut,
    Après une période d'apprentissage du langage C, surtout avec la manipulation des "String" et des "char array" que je trouve imbuvable, je suis enfin capable d'écrire des programmes conséquents et fiables.
    La dernière étape à franchir qu'il me reste à franchir, c'est la communication Internet. Enfin bref, je ne suis pas là pour raconter mes déboires.

    Je voulais intervenir au sujet du 4050 que tu utilises. Etant électronicien avant tout, j'ai été confronté au problème de conversion des signaux 5V en 3,3V et vis-et-versa. Dans la famille CMOS, il existe des sous familles comme les BE et BM (Ex : CD4051BE). Les BE ont une diode de protection qui empêche que la tension d'entrée dépasse celle d'alimentation de 0,6V. Donc si tu envoies du 5V sur une entrée, la réjection via cette diode va faire "grimper" celle d'alimentation VDD du circuit à 4,4 V max, ce qui risque de ne pas plaire à L'ESP8266, ni au régulateur qui donne le 3,3V. J'ai eu ce problème en adaptant les cartes SD. Pour palier ce problème, il suffit de mettre en série avec chaque entrée utilisée une résistance de 220 à 470 Ohms, ou d'utiliser un CD4051BM qui n'a pas ce problème, mais qui n'est pas facile à trouver en DIP16.

    Dans le cas où on utilise un 74HC125, on a le même problème, à moins d'utiliser un 74ALSVC125 ... en boîtier SOP14.

    Merci pour ton post, je vais enfin pouvoir explorer les ténèbres du net.

    RépondreSupprimer
  3. Re,

    Encore un truc ! Il faut éviter de laisser une entrée CMOS ou TTL flottante, car ceci entraîne parfois des oscillations parasites. Le mieux est de les mettre au niveau haut (1) avec la broche VDD, ou via une résistance pull-up d'une dizaine de kiloohms (Ex : 10k).

    Merci aussi pour Fing. Très utile !

    RépondreSupprimer
  4. Merci pour ce super billet que je vais pas tarder a expemrimenter, vous auriez pu aussi utiliser la sortie 3.3V du UNO non ?

    RépondreSupprimer
  5. Oups en relisant en detail j'ai compris que la pin 3.3v de l'arduino ne delivre pas assez de courant désolé pour le commentaire précédent.

    RépondreSupprimer
    Réponses
    1. Gaffe ! En effet, ne pas utiliser le 3.3V du UNO !!!

      Supprimer
  6. L'article est vraimant super mais stp j'ai un souci .
    mon esp ne detecte aucun reseau wifi il me renvoit error .
    a quoi peut etre du cela?

    RépondreSupprimer
  7. Très bon article. J'ai testé ce montage il y a 1 an, je me suis heurté au problème de 3.3v versus 5v arduino, j'ai essayé de bidouiller sans convertisseur, et surtout sans succès. J'y reviens aujourd'hui avec une alim 3.3V pour breadboard et un convertisseur de niveau logique. Victoire!
    Nouveau déboire avec la recherche des réseaux WIFI: n'apparaissent que 2 réseaux puis des lignes non structurées... Après une heure de recherche, j'ai découvert que je pouvais tester la commande en lui fournissant le nom de mon réseau:
    AT+CWLAP="Bbox-2E1547" par exemple et j'ai pu avoir une réponse cette fois.
    Ensuite la connection avec AT+CWJAP s'est bien passée.
    Merci encore pour ce tuto!

    RépondreSupprimer