Tous les capteurs reliés au RPI par Wifi avec module ESP8266

Parce que les applications du Raspberry Pi sont illimités...

Modérateur : Francois

Répondre
domi
Administrateur
Messages : 3230
Enregistré le : mer. 17 sept. 2014 18:12
Localisation : Seine et Marne

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par domi » mer. 4 mars 2015 20:21

Jean-Marie a écrit :je poste l'ensemble définitif des commandes de chacun des PC.
Yes,
C'est sympa de partager, moi je suis preneur.

Si tu t'en sent le courage, je verrai bien un petit tuto qui reprend toutes les étapes importantes avec photo du montage. :geek:

y a une rubrique ici ;)
Passionné de Raspberry, Arduino, ESP8266, ESP32, et objets connectés :
Spécial débutant, concevez vous-même votre domotique DIY : https://www.youtube.com/c/DomoticDIY
Conception d'une station météo DIY, et envoi des infos à votre Domotique.

Avatar du membre
Jean-Marie
Raspinaute
Messages : 240
Enregistré le : sam. 24 janv. 2015 18:01
Localisation : Arlon, Belgique
Contact :

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par Jean-Marie » jeu. 5 mars 2015 00:17

Grâce à votre aide plus que précieuse, la connexion wifi que je tentais d'établir depuis un bout de temps a été couronnée de succès. Merci les amis !
Je pense que cette réalisation devrait beaucoup faire avancer la domotique et surtout faire baisser son prix. La communication wifi entre une unité centrale et les divers capteurs et effecteurs est à la portée de celui qui sait mettre en oeuvre une simple communication Série.

Il est donc temps de rassembler ici les précautions, les paramètres et les commandes qui permettent d'établir la communication wifi entre deux modules ESP8266.

La première chose dont il faut tenir compte est l'alimentation du module. Une source de 3.3V assez puissante est nécessaire. J'ai eu des problèmes en essayant d'alimenter le module avec le 3.3V fourni par le convertisseur USB-Série. J'utilise maintenant une alimentation breadboard pour un module et une ancienne alimentation de PC pour l'autre. Pour les connexions Rx et Tx, il est prudent d'adapter le niveau 5V au niveau 3.3 à l'aide d'un "Logic Level Converter" du commerce ou avec une diode Zener:
Logic Level Converter.jpg
Logic Level Converter.jpg (6.08 Kio) Vu 7050 fois
Zener Level shifter.jpg
Zener Level shifter.jpg (8.64 Kio) Vu 7050 fois
Pour faire les tests, j'ai utilisé deux ordinateurs, munis chacun d'un convertisseur USB-Série et d'un module USB8266. On trouve des USB-Serial converters sur AliExpress (par exemple le PL2303) pour moins de 1€. Pour les modules ESP8266, il existe actuellement au moins 12 modèles du ESP-1 au ESP-12. Ces modèles varient selon le nombre de pins de connexion, le type et la présence d'antenne et la disposition des pins. Le modèle ESP-1 est parmi les moins chers et convient parfaitement. Personnellement, j'ai utilisé des ESP-7.

La suite à demain.

Veloce
Messages : 79
Enregistré le : sam. 24 janv. 2015 20:12

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par Veloce » jeu. 5 mars 2015 11:43

Jean-Marie a écrit :
YOUPIIIIE
Félicitations, Giulielmo Marconi serait fier de toi ! :lol:

Pour la conversion de niveau, j'utilise juste une diode. Je mettrais bien un schéma mais j'ai fini
ma période d'évaluation gratuite sur Imageshack et maintenant ils me réclament 39 EUR par an,
ça fait cher pour quelques pauvres images en basse résolution.
En attendant de trouver un hébergeur, voilà le principe :

Code : Tout sélectionner

Arduino                     ESP8266              Alim
2 ----------------------- TXD
3 --------|<-------------RXD
                                CH_PD------------- +3,3V
Lorsque la patte n°3 est à +5V, la diode empêche le passage du courant, mais
côté ESP on a une résistance de pull-up reliée au +3,3V, donc l'ESP lit un niveau haut.
Lorsque la patte n°3 est à 0V, la diode conduit et l'entrée de l'ESP passe à 0,7V,
c'est à dire un niveau un peu élevé pour une entrée TTL.
Ça ne devrait pas marcher, ça devrait même faire hurler les électroniciens professionnels.
Sauf que L'ESP8266 considère comme niveau bas un niveau inférieur à 0,25*3,4V, soit 0,85V.
Donc avec n'importe quelle diode au silicium ça marche. :P
Et je m'en fous, je ne suis pas professionnel donc je fais ce que je veux :twisted:

Je communique en SoftwareSerial :

Code : Tout sélectionner

SoftwareSerial esp8266(2,3);
Et la vraie liaison série de l'Arduino me sert à débugger sur le PC.
Pour l'instant mon code est un peu brouillon, mais je publierai mes résultats bientôt...

Veloce :mrgreen:

Avatar du membre
Jean-Marie
Raspinaute
Messages : 240
Enregistré le : sam. 24 janv. 2015 18:01
Localisation : Arlon, Belgique
Contact :

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par Jean-Marie » jeu. 5 mars 2015 12:01

Voici le principe du montage qui a été réalisé pour faire les tests:
Montage de base4.jpg
Montage de base4.jpg (80.8 Kio) Vu 7038 fois
Je n'ai pas représenté l'alimentation des ESP pour ne pas surcharger l'image.
Les ordinateurs utilisent un programme de Terminal pour dialoguer avec les ESP.
Dans une utilisation domotique, la moitié gauche de l'image sera par exemple l'unité centrale et la moitié droite sera un capteur périphérique. Dans ce cas, le PC n°1 et son convertisseur USB-Série seront remplacés par un Raspberry, un Arduino, ou tout autre système informatique capable d'intégrer les données provenant des capteurs périphériques. Ce système communiquera avec l'ESP n°1 par la liaison série. Le PC n°2 et son convertisseur USB-série seront remplacés par un capteur et un microcontrôleur (Arduino ou autre) communiquant avec l'ESP n°2 par la liaison série. Les deux ESP pourront s'échanger des données grâce au réseau wifi commun établi par le Routeur wifi.

La première chose à faire est de créer pour chaque ordinateur un Port COM virtuel en branchant un convertisseur USB-Série et en installant si nécessaire le driver adéquat. Le gestionnaire de périphérique de Windows indique le N° du Port COM créé. (Je m'excuse auprès des Linuxiens mais je suis bien trop débutant en Linux pour pouvoir donner des indications valables).


L'étape suivante est d'ouvrir un Terminal sur les PC. Personnellement, j'utilise le Terminal de Bray mais j'imagine que tous les programmes de Terminal peuvent convenir.
Dans le Terminal,
  1. Choisissez le Port COM créé
  2. Cliquez sur Connect
Terminal start.jpg
Terminal start.jpg (116.81 Kio) Vu 7038 fois
Vérifiez que le mot "Connected" apparaît dans le coin inférieur gauche de l'écran du Terminal. En même temps, le bouton "Connect" devient "Disconnect".

Il est temps de connecter le module.
ESP8266 Module de base1.jpg
ESP8266 Module de base1.jpg (47.47 Kio) Vu 7038 fois
  • GND doit être connecté à GND du convertisseur USB-Série
  • 3.3V doit être connecté à une alimentation 3.3V suffisante (pas le 3.3V d'un Arduino ou du convertisseur)
  • CH_PD doit être connecté à 3.3V
  • TX doit être connecté à Rx du convertisseur, de préférence en passant par un Level Shifter
  • Rx doit être connecté à Tx du convertisseur, de préférence en passant par un Level Shifter
La suite à cet après-midi.

Avatar du membre
Jean-Marie
Raspinaute
Messages : 240
Enregistré le : sam. 24 janv. 2015 18:01
Localisation : Arlon, Belgique
Contact :

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par Jean-Marie » jeu. 5 mars 2015 14:31

Comme le propose Veloce, son système de régulation des niveaux logique fonctionne.
Il est vrai que la ligne reliant le Tx de l'ESP au Rx de l'Arduino ou du convertisseur ne nécessite théoriquement pas de régulation, sauf que ... j'ai deux convertisseurs USB-Série et l'un d'eux a un marquage Rx/Tx inversé de sorte qu'il est très facile de connecter ces pins à l'envers. Voilà pourquoi il est prudent de sécuriser les deux lignes.

Pour la connection du module, il y a encore une chose à ajouter. Si la pin GPIO15 est exposée, elle doit être connectée à GND, sans quoi la communication est impossible.
Maintenant que le module ESP est connecté, on va vérifier qu'il peut communiquer avec le terminal.
Terminal contact.jpg
Terminal contact.jpg (119.95 Kio) Vu 7027 fois
  1. Cochez la case CR=CR+LF, cequi signifie que quand on tape un "Carriage Return", le programme ajoute un "Line Feed"
  2. Cochez la case +CR, ce qui veut dire que le programme ajoute un "Carriage Return" à l'envoi
  3. Choisissez le Baud rate. C'est souvent 9600 ou 115200, mais parfois encore une autre vitesse, à essayer
  4. Entrez la commande AT, suivie de "Enter" ou cliquez sur "Send"
  5. La commande se répercute dans la fenêtre de réception. Si la communication réussi, le module répond par OK
Si le module ne répond pas ou répond par des caractères bizarres, vérifiez une nouvelle fois l'alimentation, toutes les connexions et modifiez éventuellement le Baud rate.
Il est absolument inutile d'aller plus loins tant qu'on n'obtient pas "OK" comme réponse.

Pour les test et la mise au point ultérieure, le Terminal dispose de quelques outils pratiques :
  • Il y a 3 petites cases carrées à cocher (Dec, Hex et Bin) qui font apparaître à droite tous les caractères reçus, même ceux qui ne sont pas visibles en ASCII
  • Un peu plus haut, il y a le bouton "ASCII table" donnant la liste des caractère ASCII
  • Le bouton "StartLog" démarre l'enregistrement sous forme de fichier texte de ce qui apparaît dans la fenêtre Receive

smba38
Modérateur
Messages : 193
Enregistré le : mar. 24 févr. 2015 09:28
Localisation : Bourgoin

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par smba38 » jeu. 5 mars 2015 20:46

Bonsoir à tous,

Après les connexions en utilisant les Datagrams UDP voici la version des sockets TCP.

Utilisation de Lua ou des commandes AT coté esp8266 et Python sur Raspberry coté serveur.

La gestion en Sockets TCP permet d’avoir :
Plusieurs clients en simultanés
Dialogue bidirectionnel par exemple pour: Acquitter les messages, ou demande de reboot des clients (A développer).
Une gestion automatique des reconnexions suite à : Une relance du serveur, Un reboot d’un client.
(Non testé sur commandes AT).

Trace coté client de l’esp8266 N°5 d’adresse IP 192.168.1.255
Le serveur renvoie au client son propre message.

Code : Tout sélectionner

NodeMcu 0.9.5 build 20150105  powered by Lua 5.1.4
192.168.1.155
en cours
CreatConnexion ok statuts = 
Connexion
Reçu  ->Connexion Ok avec le serveur
Envoi ->capteur5=240
Reçu  ->Thread-1> statut=C Capteur5=240
Envoi ->capteur5=71
Reçu  ->Thread-1> statut=C Capteur5=71
 
Trace coté serveur avec deux clients connectés N°5 et N°7.
Arrêt des messages du serveur par CTRL+Z

Code : Tout sélectionner

pi@raspberrypi:~/esp8266/tcp$ python serveur_tcp.py
Serveur en attente de connexions
Connexion client Thread-1 d'adresse IP 192.168.1.155, port 4098.
Thread-1> statut=C Capteur5=240
Thread-1> statut=C Capteur5=71
Connexion client Thread-2 d'adresse IP 192.168.1.157, port 34387.
Thread-1> statut=C Capteur5=100
Thread-2> statut=C Capteur7=9
Thread-1> statut=C Capteur5=93
Thread-2> statut=C Capteur7=11
^Z
[1]+  Stop    python serveur_tcp.py
 
Liste des connexions TCP coté serveur.
On peut lister avec la commande netstat les connexions TCP sur le port 5005 (en utilisant un grep)
On retrouve bien les deux adresse ip des deux esp8266

Code : Tout sélectionner

pi@raspberrypi:~$ netstat |grep 5005
tcp        0      0 pc33.home:5005          192.168.1.155:22629     ESTABLISHED
tcp        0      0 pc33.home:5005          192.168.1.157:23541     ESTABLISHED
pi@raspberrypi:~$


Pour tuer définitivement le serveur, il faut faire un kill -9 du process

Code : Tout sélectionner

En premier on liste par la commande ps  les process   utilisant Python  et ensuite on arrête le serveur serveur_tcp.py

pi@raspberrypi:~/esp8266/tcp$ ps -edf |grep python
pi        3606  3587  0 18:38 pts/0    00:00:00 python serveur_tcp.py
pi        3615  3587  0 18:45 pts/0    00:00:00 grep python
pi@raspberrypi:~/esp8266/tcp$ kill -9 3606
[1]+  Processus      python serveur_tcp.py
 
Essais avec les commandes AT à la place de Lua.
Le serveur DHCP du routeur a affecté l’adresse 192.168.1.20 à l’esp8266
Essai d’envoi de 5 caractères 12345

Code : Tout sélectionner

AT+CWMODE=3 
OK
AT+CWJAP="SSID","mot de passe"
OK
AT+CIPMUX=1  
OK
AT+CIPSTART=0,"TCP","192.168.1.22",5005
0,CONNECT
OK

+IPD,0,28:Connexion Ok avec le serveur
OK
AT+CIPSEND=0,5
> 12345busy s...
SEND OK
+IPD,0,17:->Thread-1> 12345
OK
Avec les commandes AT la connexion est bidirectionnelle (le serveur peut répondre au client)
Les messages reçus du serveur sont post fixés par "+IPD,0,17" (canal, longueur).
A la connexion le serveur envoi le message "Connexion Ok avec le serveur" à l'esp8266
L’esp8266 en commandes AT récupère bien le message "->Thread-1> 12345" renvoyé par le serveur.

Trace coté serveur

Code : Tout sélectionner

pi@raspberrypi:~/esp8266/tcp$ python serveur_tcp.py
Serveur en attente de connexions
Connexion client Thread-1 d'adresse IP 192.168.1.20, port 29675.
Thread-1> 12345

Et pour finir les sources.
Côté Lua.

Code : Tout sélectionner

tmr.delay(2000000)  -- pour prise de main si PB
IP_routeur="192.168.1.1"
IP_serveur="192.168.1.22"
IP_client="192.168.1.157"
CAPTEUR="7"
statut=""

wifi.setmode(wifi.STATION)  -- Wifi en mode station 
cfg = { ip=IP_client, netmask="255.255.255.0", gatway=IP_routeur}
wifi.sta.setip(cfg)  -- on force l'adresse IP
wifi.sta.config("SSID","mot de passe")
print(wifi.sta.getip())  -- vérification adresse IP 

function connected()
 if (statut  =="D") then   conn=net.createConnection(net.TCP, 0)   statut="x"   end 
 if (conn ~= nil) then print ("CreatConnexion ok statuts = " .. statut ) end 
 if (statut  ~="C") then   conn:connect(5005,IP_serveur)   end 
end

conn=net.createConnection(net.TCP, 0)  
tmr.alarm(0,2000, 1, function() if statut ~= "C" then  connected() end  end )

conn:on("receive", function(conn, payload) print("Reçu  ->" .. payload) end) 
conn:on("sent",function(conn)                   print("Envoi ->capteur"..CAPTEUR.."=" ..capteur)    end) 
conn:on("disconnection", function(conn)     print("Deconnexion")  statut="D"  conn:close()  end) 
conn:on("connection", function(conn)         print("Connexion")   statut="C"  end) 
conn:on("reconnection", function(conn)      print("Reconnexion")   statut="C"  end) 
 
tmr.alarm(1,2000, 1, function() capteur=adc.read(0) 
   if (statut=="C") then conn:send("statut=" .. statut .. " Capteur" ..CAPTEUR .."=" .. capteur ) end end)  -- lecture capteur 
print("en cours")
Et coté serveur en python
Récupéré sur Wikibooks avec ajout de quelques modifications et commentaires.
http://fr.wikibooks.org/wiki/Apprendre_ ... %C3%A9seau

Code : Tout sélectionner

#
# -*- coding: utf8 -*-
# Serveur TCP en attentes messages des ESP8266
# Utilise les threads pour traiter les  connexions clientes

HOST = '192.168.1.22'  # Adresse du serveur
PORT = 5005            # Port d'ecoute
NBCLIENTS=6            # nbclients
import socket, sys, threading
class ThreadClient(threading.Thread):
    '''Gestion des treads '''
    def __init__(self, conn):
        threading.Thread.__init__(self)
        self.connexion = conn

    def run(self):
        # Dialogue avec le client :
        nom = self.getName()        # Chaque thread dispose d'un  nom
        while 1:
            msgClient = self.connexion.recv(1024)
            if msgClient.upper() == "FIN" or msgClient =="":
                break
            message = "%s> %s" % (nom, msgClient)
            print message
            # acquitement
            for cle in conn_client:
                if cle == nom:      # Acquitement
                    conn_client[cle].send("->" + message)

        # Fermeture de la connexion :
        self.connexion.close()      # couper la connexion  au serveur
        del conn_client[nom]        # supprimer  nom dans le dictionnaire
        print "Arret Client %s " % nom
        # Le thread se termine ici

# Initialisation du serveur - Mise en place du socket :
mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
    mySocket.bind((HOST, PORT))
except socket.error:
    print "Erreur de liaison du socket d'adresse choisie"
    sys.exit()
print "Serveur en attente de connexions"
mySocket.listen(NBCLIENTS)

# Attente et prise en charge des connexions des clients :
conn_client = {}                # dictionnaire des connexions clients
while 1:
    connexion, adresse = mySocket.accept()
    # Nouveau thread pour la connexion d'un client :
    th = ThreadClient(connexion)
    th.start()
    # MAJ connexion dans le dictionnaire :
    it = th.getName()        # identifiant du thread
    conn_client[it] = connexion
    print "Connexion client %s d'adresse IP %s, port %s." %\
           (it, adresse[0], adresse[1])
    # Dialogue avec le client :
    connexion.send("Connexion Ok avec le serveur")
Jean-Marie, tu peux utiliser seulement le programme python sur un Raspberry pour tester des clients.

C'est tout pour aujourd'hui.
Michel.

smba38
Modérateur
Messages : 193
Enregistré le : mar. 24 févr. 2015 09:28
Localisation : Bourgoin

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par smba38 » jeu. 5 mars 2015 21:27

Re bonsoir,

Pour info, J'ai acheté il y a quelque temps sur EBay ce module peu cher 1,09€ livraison comprise.
http://www.ebay.fr/itm/301478498717?ssP ... 1497.l2649

Image

Ce module se branche sur une prise USB il permet de fournir du 5v et du 3,3V sur un breadboard.
On peur également l'alimenter par une prise externe.
Je n'ai pas testé ce module mais je pense qu'il peut convenir pour alimenter un montage à base de esp8266.
Specifications:

1.Brand new and high quality.
2.Breadboard power supply module, compatible with 5 V, 3.3 V
Apply to MB102 breadboard
3.Input voltage: 6.5-12 V (DC) or USB power supply
4.Output voltage: 3.3V/5V can switch over
5.Maximum output current: <700 ma
6.Fluctuation two road independent control, can switch over to 0 V, 3.3 V, 5 V
7.On-board two groups of 3.3V, 5V DC output plug pin, convenient external lead use.
8.Size:5.3cm x 3.5cm

A+
Michel.

Avatar du membre
Jean-Marie
Raspinaute
Messages : 240
Enregistré le : sam. 24 janv. 2015 18:01
Localisation : Arlon, Belgique
Contact :

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par Jean-Marie » jeu. 5 mars 2015 22:13

Merci Michel pour ton avant-dernier message qui mérite une étude approfondie, ainsi que ton dernier message concernant le module d'alimentation. Mais avant cela, je poursuis (et termine) mon explication.

C'est ici que les choses sérieuses commencent.
Nous allons d'abord configurer l'ESP n°1 en serveur, représentant l'unité centrale.
Une liste de toutes les commandes AT est disponible sur ce site.
Si vous avez déjà tapé quelques commandes dans le Terminal, commencez d'abord par la commande AT+RST qui est un Reset du module.

Voici les 6 commandes à entrer successivement. J'ai décalé vers la droite et mis en vert les réponses pour y voir un peu plus clair.
Commandes Serveur.jpg
Commandes Serveur.jpg (129.7 Kio) Vu 7012 fois
Voici les commentaires de ces commandes:
  • AT+CWMODE=1: Le paramètre 1 indique un mode de fonctionnement en Station wifi
  • AT+CWLAP: Cette commande donne la liste des réseaux wifi disponibles. Mon routeur est le premier. Les autres viennent des voisins
  • AT+CWJAP="Wifi Collette","": Connexion au routeur Wifi Collette. En principe, on écrit le mot de passe après la virgule. Le mien est vide
  • AT+CIFSR: Donne l'adresse de connexion au routeur. A noter car nécessaire pour configuration du module périphérique.
  • AT+CIPMUX=1: Le paramètre 1 indique "multiple connection"
  • AT+CIPSERVER=1,23: Le paramètre 1 indique la création d'un serveur. Le paramètre 23 est le port choisi.
A partir de là, le module attend de recevoir quelque chose du réseau.

Ces commandes sont en majuscules et sans espace (sauf dans les strings). Elles sont chaque fois suivies de CR+LF.

Voyons maintenant la liste des commandes à envoyer à l'ESP n°2, c'est-à-dire au poste périphérique.
  • AT+CWMODE=1: Le paramètre 1 indique un mode de fonctionnement en Station wifi
  • AT+CWJAP="Wifi Collette","": Connexion au routeur Wifi Collette. En principe, on écrit le mot de passe après la virgule. Le mien est vide
  • AT+CIPSTART="TCP","192.168.0.100",23:Création d'un socket pour communiquer avec l'ESP n°1. L'adresse est celle notée. 23 est le port. La réponse à cette commande est "OK Linked"
  • AT+CIPSEND=7: Commande d'envoi de 7 caractères (Maximum= 2048). La réponse est >. Après ce signe il faut impérativement décocher l'envoi de CR et LF. On peut alors taper les x caractères prévus, p. ex. Bonjour. La réponse est SEND OK
Les caractères envoyés apparaissent alors dans le Terminal du PC n°1, sous la forme suivante:
  • +IPD,0,7:Bonjour
Si vous voulez encore envoyer des commandes, ne pas oublier de recocher CR et LF.
Modifié en dernier par Jean-Marie le jeu. 5 mars 2015 22:32, modifié 4 fois.

Avatar du membre
Jean-Marie
Raspinaute
Messages : 240
Enregistré le : sam. 24 janv. 2015 18:01
Localisation : Arlon, Belgique
Contact :

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par Jean-Marie » jeu. 5 mars 2015 22:17

Merci pour l'info, Michel.
Le petit module d'alimentation que tu mentionnes est justement celui que j'utilise pour alimenter l'un des ESP.
Je n'ai pas remarqué d'instabilité jusqu'à présent. Je ne me sers pas de la prise USB mais je l'alimente séparément avec un adaptateur 220V - 7,5V.

Avatar du membre
Jean-Marie
Raspinaute
Messages : 240
Enregistré le : sam. 24 janv. 2015 18:01
Localisation : Arlon, Belgique
Contact :

Re: Tous les capteurs reliés au RPI par Wifi avec module ESP

Message par Jean-Marie » jeu. 5 mars 2015 22:42

Veloce a écrit :Je mettrais bien un schéma mais j'ai fini ma période d'évaluation gratuite sur Imageshack et maintenant ils me réclament 39 EUR par an,
ça fait cher pour quelques pauvres images en basse résolution.
Il n'y a pas besoin d'avoir un hébergeur d'images. Il suffit de cliquer sur "Ajouter des fichier joints" et de sélectionner l'image désirée sur don disque dur.

Répondre

Retourner vers « Et tout le reste »