Ajouter simplement du Wifi à vos montages grâce au module ESP8266

Un module miniature coûtant moins de 5 Euros et vous permettant d’ajouter facilement une connexion Wifi à vos montages Arduino, cela vous intéresse ? Moi OUI ! Voici donc un excellent moyen de rentrer à moindre frais dans le monde de l’IoT (le fameux Internet Of Things / L’Internet des objets). Voyons comment tout cela fonctionne…

Introduction

Ce petit module est apparu sur le marché il y a quelques mois et fait déjà beaucoup de bruit. Concrètement il s’agit d’un mini circuit-imprimé relativement impressionnant puisqu’il est composé d’un SOC (System On Chip – comme sur un Raspberry Pi) comprenant un processeur 32 bits, un peu de RAM et surtout une interface Wifi 802.11 (b/g/n).

Ce petit module permet à la fois d’agir comme station (c’est à dire une machine rejoignant un réseau Wifi existant) ou en tant que point d’accès (AP pour Access Point) permettant cette fois de créer un réseau Wifi. Dans les deux cas il est possible de le programmer soit en tant que client (pour pousser des données vers un serveur local ou distant) soit en tant que serveur (pour recevoir des données). Il supporte à la fois les réseaux « ouverts » (c’est à dire non cryptés) mais aussi les modes de chiffrement WEP, WPA et WPA2. Le tout est accessible via une interface série et se pilote à l’aide de commandes « AT« . Dernier point important, ce module s’alimente en 3,3 v (et non 5v comme un Arduino classique).

Homer se mesure à l'ESP8266

Homer se mesure à l’ESP8266

Pour ma part j’ai fait l’acquisition de ce module sur eBay.fr (mon fournisseur préféré à condition de ne pas être trop pressé) pour 3,97 Euros (FdP inclus) auprès du vendeur yesstar2013 mais vous pouvez également le trouver sur le site www.electrodragon.com pour 4,5 Dollars US (plus environ 4$ de FdP).

Expérimentation

Afin d’expérimenter le fonctionnement de ce module j’ai fait le choix d’utiliser un convertisseur USB/Série s’appuyant sur le célèbre composant FT232RL. Si vous n’en disposez pas vous pouvez en trouver facilement sur eBay pour quelques euros. Attention à bien opter pour un modèle 3,3v (ou un modèle 3,3v/5v permettant de switcher facilement d’une tension à une autre via un jumper par exemple).

J’avais initialement en tête d’utiliser un PC ou un Mac pour y connecter cet adaptateur mais pour des problèmes de driver j’ai fini par me rabattre sur mon Raspberry Pi… et là aucun soucis de driver, merci Linux !

En synthèse, voici le montage de test utilisé:

Le montage complet pour expérimenter le module ESP8266

Le montage complet pour expérimenter le module ESP8266

 

La broche CH_PB permet de mettre en fonctionnement le module lorsqu’elle est au niveau « haut » (soit 3,3v), cela peut être utile par exemple afin de partager la connexion série avec un autre périphérique et n’activer ce module que lorsque vous en avez besoin…

Le brochage est détaillé ici:

Le brochage du connecteur 2x4 de l'ESP8266

Le brochage du connecteur 2×4 de l’ESP8266

En pratique voici ce que cela donne:

L'ensemble du montage de test autour du module ESP8266

L’ensemble du montage de test autour du module ESP8266

Pour l’alimentation 3,3v j’ai fait le choix d’utiliser une « breadboard power supply » (encore une fois disponible pour quelques euros sur eBay) afin de ne pas prendre de risques vis à vis du régulateur intégré sur le FT232RL ou encore sur le Raspberry Pi. Ce petit module peut consommer jusqu’à 250 mA en pointe ce qui n’est pas négligeable.

Commençons à dialoguer

La première étape consiste à identifier le port série qui nous a été attribué par l’OS à la connexion de l’adaptateur USB/série.

Pour cela saisissez la commande suivante:

root@raspberrypi:~# dmesg|grep FTDI

et vous devriez voir apparaitre les lignes suivantes:

[ 8076.117624] usb 1-1.5: Manufacturer: FTDI
[ 8076.259223] usbserial: USB Serial support registered for FTDI USB Serial Device
[ 8076.259637] ftdi_sio 1-1.5:1.0: FTDI USB Serial Device converter detected
[ 8076.264518] usb 1-1.5: FTDI USB Serial Device converter now attached to ttyUSB0

Ce que nous cherchons se trouve sur la dernière ligne: ttyUSB0. Rassurez-vous dans la plupart des cas c’est cette valeur qui apparaitra sauf si vous avez d’autres adaptateurs connectés.

Notez que nous aurions également pu utiliser le port série intégré dans le Raspberry Pi (qui fonctionne en 3,3 v) ce qui présente l’avantage de ne pas nécessiter d’adaptateur mais qui en contrepartie nécessite quelques manipulation pour désactiver la console série qui s’y trouve par défaut et ainsi pour l’utiliser librement. Plus d’info ici si besoin…

Il existe de nombreux clients permettant de dialoguer via une console série (screen, minicom, ..). Après quelques expérimentation j’ai décidé de me tourner vers un script python « miniterm.py » qui répond bien à notre besoin…

La raison est en fait assez simple, la version du module que j’utilise nécessite l’envoi d’un « Retour Chariot » (CR pour Carriage Return) et d’un saut à la ligne (LF pour Ligne Feed) pour valider les commandes saisies. Les clients standards tel que Screen ou Minicom n’activent pas ce comportement par défaut alors que c’est le cas pour ce petit script Python…

Ce script est normalement installé par défaut sur votre Raspbian car il fait partie du package python-serial. Vous pouvez toutefois le vérifier (et le mettre à jour si besoin) en tapant la commande suivante:

root@raspberrypi:~# apt-get update && apt-get install python-serial 

Ensuite il ne vous reste plus qu’à vous connecter sur le port série pour communiquer avec le module:

root@raspberrypi:~# miniterm.py /dev/ttyUSB0 9600

Notez que dans mon cas j’utilise un débit de 9 600 bps (Bits Par Seconde) mais certaines versions (notamment les premières) fonctionnent en 115 200 bps. Si cela ne fonctionne pas essayez donc avec cette valeur.
Si ce n’est pas déjà fait, c’est le moment d’activer votre module. Cela peut être réalisé en l’alimentant ou tout simplement en passant la pin CH_PD au niveau « haut » (soit +3,3v).
Si votre montage est bien réalisé (il n’est pas très compliqué), vous devriez voir le petit voyant bleu clignoter sur le module mais surtout voir apparaitre quelque chose dans ce style:

@?I???
[Vendor:www.ai-thinker.com Version:0.9.2.4]

ready

Félicitations vous êtes désormais prêt à dialoguer avec votre module !
Commençons par un simple commande « AT » pour laquelle vous devriez recevoir en retour un « OK »:

AT

OK

Youpi, cela fonctionne ! Interrogeons désormais ce module avant de connaitre le numéro de version du firmware utilisé en utilisant la commande « AT+GMR »:

AT+GMR
0018000902-AI03

OK 

Le numéro de version correspondant au quatre derniers octets de la première série de chiffre, dans notre cas il s’agit donc de 0902 soit la version V092. Si vous voyez apparaitre un numéro de version plus ancien (V090 ou V091) il est fortement recommandé de mettre à jour le firmware car il contient quelques « erreurs » de jeunesse… (ie. des bugs). La mise à jour s’effectue via un utilitaire Windows mais il existe également un projet libre de mise à jour basé sur Python dénommé ESPTool.

Notez qu’à partir de la version 091 la mise à jour peut s’effectuer directement depuis Internet (le fameux « Cloud Update »…).

Connexion à un réseau Wifi

Une fois le dialogue établi nous allons désormais nous connecter à un réseau Wifi existant.

Pour cela nous allons commencer par lui indiquer que nous souhaitons nous comporter comme une « station » (STA)c’est à dire un poste souhaitant se connecter à un réseau Wifi. Pour cela on utilise la commande « AT+CWMODE=1 »:

AT+CWMODE=1

OK

A titre d’information, la valeur 2 correspond au mode « point d’accès » (AP) et la valeur 3 au mode combiné « station + point d’accès » (AP+STA).

Nous pouvons désormais lister les réseaux accessibles via la commande « AT+CWLAP »:

AT+CWLAP
+CWLAP:(0,"FreeWifi_secure",-90,"f4:ca:a5:c1:c5:ae",11)
+CWLAP:(0,"FreeWifi",-93,"f2:cd:e5:f1:b5:2d",11)
+CWLAP:(3,"MonWIFIaMoi",-46,"00:24:d2:e3:2a:c8",13)

OK

Dans l’ordre on voit apparaitre:

  • Le SSID de la station (le « nom »)
  • Le RSSI (Received Signal Strength Indication) correspondant à la force de reception du signal
  • L’adresse MAC
  • Et enfin le numéro du canal Wifi utilisé.

Il nous reste désormais à nous connecter à un réseau Wifi identifié, pour cela nous allons utiliser la commande AT+CWJAP= »MonWIFIamoi », »MotDePAsseSecretDeVotreWifi »:

AT+CWJAP="MonWIFIamoi","MotDePAsseSecretDeVotreWifi"

OK

Et vous pouvez désormais consulter l’adresse IP qui a vous a été attribuée par votre serveur DHCP en utilisant la commande AT+CIFSR:

AT+CIFSR
192.168.1.25

OK

Tout fonctionne ! Notez qu’à tout moment vous pouvez utiliser la commande « AT+RST » pour réinitialiser le module.

Connexion à un serveur Web

Voyons désormais comment se connecter à un serveur Web afin de lui transmettre des données (issues d’un capteur de température par exemple…)

Pour cela nous allons utiliser le site https://thingspeak.com qui est n’est autre qu’une plateforme « Internet of Things » permettant de recueillir les données en provenance de différents « capteurs ». Notez qu’il est tout à fait possible de fonctionner en local (via votre Raspberry Pi par exemple) en développant un tout petit script PHP (par exemple) afin de recueillir les informations transmises.

Page d'accueil de ThingSpeak

Page d’accueil de ThingSpeak

Si ce n’est pas déjà fait, inscrivez-vous sur https://thingspeak.com et commencez par créer un nouveau « channel » (New Channel). Ensuite récupérez simplement la clé API associée à ce channel (exemple: PJS26TIGV9EKVYE1).

Avant de pouvoir se connecter au serveur, il est nécessaire de spécifier si nous souhaitons ou non autoriser les connexion multiples. Dans le cas du mode client (comme ici) ce n’est pas indispensable mais par contre cela est nécessaire lors d’une utilisation en mode serveur.

Dans notre cas, on désactive cette fonctionnalité en utilisant la commande AT+CIPMUX=0 (=1 pour l’activer):

AT+CIPMUX=0

OK

Essayons désormais de se connecter au serveur en utilisant la commande AT+CIPSTART de la façon suivante:

AT+CIPSTART="TCP","184.106.153.149",80

OK
Linked

La syntaxe est relativement simple, on commence par préciser le type de connexion (TCP ou UDP), l’adresse IP de la cible (ici thingspeak.com) et enfin le numéro de port (80 en standard). Notez l’utilisation des guillemets pour les deux premières variables mais pas pour la troisième.

Si tout se passe bien un « Linked » devrait apparaitre.

Il ne nous reste plus qu’à envoyer nos données en utilisant cette fois la commande AT+CIPSEND:

AT+CIPSEND=44
> GET /update?key=PJS26TIGV9EKVYE1&field1=21
SEND OK

+IPD,1:1
OK

OK
Unlink

La syntaxe est assez simple: nous commençons par envoyer une commande AT+CIPSEND=xx avec xx qui correspondant au nombre total d’octets que nous souhaitons transmettre. Dans notre cas notre chaine contient 42 caractères auxquels il faut rajouter « CR+LF » soit 2 octets donc 44 au total. Une fois cette commande validée un signe « > » apparait invitant à saisir ces 44 octets. Nous saisissons ici une requête de type GET contenant le numéro de la clé API de votre channel ThingSpeak.com et la valeur associée, ici 21.

Une fois les données transmises, la connexion est automatiquement coupée du côté du serveur d’où l’apparition du « Unlink ». D’ailleurs si n’êtes pas assez rapide entre l’étape de connexion AT+CIPSTART et celle de l’envoi AT+CIPSEND vous verrez également apparaitre un « Unlink » vous obligeant à vous reconnecter. Vous pouvez consulter la valeur de time-out via la commande AT+CIPSTO? et en définir une nouvelle via AT+CIPSTO=60 (par exemple pour 60 secondes).

Si besoin vous pouvez clôturer la connexion via la commande AT+CIPCLOSE.

Et vous devriez pouvoir constater le résultat sur ThingSpeak:

Notre valeur "21" sur le site ThingSpeak.com

Notre valeur « 21 » sur le site ThingSpeak.com

Formidable non ? Voici pour ce premier article déjà relativement dense. Nous verrons prochainement comment utiliser ce module directement depuis un Arduino ou encore comment utiliser ce module en mode « serveur » afin par exemple d’autoriser le pilotage d’un servo-moteur depuis un iPhone…

17 Responses to “Ajouter simplement du Wifi à vos montages grâce au module ESP8266”
  1. franssoa says:
    • Jerome says:
  2. fidoboulettes says:
    • fidoboulettes says:
      • Jerome says:
  3. fidoboulettes says:
  4. Tupapau says:
    • Jerome says:
      • Tupapau says:
  5. Emmett_Brown says:
  6. cyril says:
    • Jerome says:
  7. Francois dudoubs says:
    • killian says:
  8. guillaume de fatines says:
    • Coco piano says:
  9. galaadouille la trémouille says:

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *