Auteur Sujet: BALDUINO WIFI  (Lu 1704 fois)

Gorgio-arduino

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
BALDUINO WIFI
« le: juin 28, 2019, 10:05:14 am »
Bonjour, à tous.
Il y a quelque temps, j'ai créé un post sur le BAL piloté par Arduino nano.
Je travaille sur ce projet depuis un an, et il est abouti et fonctionnel.
L’Arduino du canton N dépend de l’état de l’Arduino du canton N+1, le N+1 dépend du N+2, jusqu’à revenir à l’Arduino N (Réseau en Os)
3 à 4 câbles sont nécessaire pour ce fonctionnement entre Arduino, autant dire un paquet de spaghettis.
Je souhaiterai remplacer ces liaisons filaires par des liaisons wifi avec module ESP8266 peu chère
Ceci aura une conséquence immédiate : Il n’y aura plus que les GND, + alim marche réduite, + alim marche normale et 5V pour les Arduino, donc pour chaque canton.
De plus, cela permettra d’ajouter des tronçons au réseau sans modification de câblage.
Pour cela, il faut programmer les ESP8266 avec le bon code et c’est là que je bloque. (Je sais téléverser dans un ESP8266)
En fait, je veux envoyer de l’ARDUINO (IP 192.168.0.151) N+1 texte « Avertissement » vers l’Arduino (IP 192.168.0.150) N.
Si ARDUINO N reçoit « Avertissement » de ARDUINO N+1 (BAL rouge ou carré du N+1), alors mettre
BAL N au jaune (avert.). 
Il faut aussi que l’ARDUINO N puisse envoyer à son N-1 son état (carré ou rouge etc.)
J’ai aussi imaginé pouvoir piloter depuis un Arduino Méga + ESP8266 les différents accessoires de voie (Arduino+ESP8266 + servo pour aiguillage) mais aussi envoyer les positions aiguille déviée au BAL pour l’affichage Rappel Ralentissement, commander les carrés.
Si quelqu’un sait, je suis preneur
Georges.




Pierre59

  • Full Member
  • ***
  • Messages: 145
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #1 le: juin 29, 2019, 10:08:34 am »
Bonjour

Cette démarche sans fil me semble tout à fait dans l'air du temps, on commence déjà à trouver des décodeurs de loco WIFI.

Oui je sais faire mais avec des ESP32, il me semble qu'il y a quelques petites différences entre l'ESP32 et ESP8266, mais cela ne devrait pas être un problème.

Comme il y a plusieurs ESP il va falloir un routeur et utiliser des adresses IP fixes, le routeur cela peut être une box ou un routeur dédié.

Un octet transmis d'un ESP à un autre ESP est largement suffisant dans ce cas.

L'ESP32 a des bibliothèques pour faire cela assez facilement, celles de ESP8266, doivent êtres semblables.

On peut discuter de tout cela.

Cordialement

Pierre




Gorgio-arduino

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #2 le: juin 29, 2019, 02:08:36 pm »
Bonjour,
Merci pour ce post
J'essaye bon grè malgrè de transmettre une variable d'un ESP à un autre.
Le soucis, c'est qu'un ESP doit être à la fois être envoyeur et receveur de données pour ensuite les communiquer à leur Arduino respectif par liaison série,
Je ne sais pas comment envoyer d'un ESP150 (IP x.x.x.150) une valeur "Z"  vers un ESP151 (ip x.x.x.151) mais aussi recevoir sur ESP151 une valeur "Y" d'un ESP152 (ip x.x.x.152)
Tous les ESP sont connectés sur la même box WIFI en IP fixe.
Il y a pas mal de tuto , comment allumer une led depuis un smartphone au par HTTP, mais rien trouvé entre ESP.
Pour ce qui est de l'ESP32, la différence est sur le nombre de GPIO,
Possédant déjà un circuit avec 14 cantons donc 14 ARDUINO NANO, j'ai opté pour l'ESP8266 qui lui possède 2 GPIO, j'utilise une  liaison série entre ESP et NANO , mais le principe d’échange WIFI doit rester le même que celui ESP32 , au code et librairy prés.

Je pense que si j'arrive à maitriser ces liaisons WIFI entre ESP, je serais en mesure de passer toute mes locos en WIFI pilotées par un ARDUINO MEGA qui se chargera de les contrôler.
Une chose à la fois.
Je programme beaucoup avec Blockly, étant nul en langage, mais bon en automatisme (Vieux souvenir du GRAFCET).
Je ne désepère pas.

Cdt




bobyAndCo

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 362
  • HO avec DCC++
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #3 le: juin 29, 2019, 04:31:00 pm »
Si vous voulez vraiment utiliser du WiFi (sur ESP 8266 ou 32) donc du TCP, regardez la diffusion broadcast. Le mieux serait peut être d'ailleurs de UDP. Toujours en broadcast bien sûr.

Toujours si vous voulez vraiment faire du WiFi, il faut à mon avis utiliser un protocole UDP donc et s'inspirer du fonctionnement des satellites (SAM en particulier) et avoir une communication d'état et non événementielle. Cela va bien avec l'UDP qui est léger mais où il y a un risque de perte de données.

Travaillez directement en ESP32, pas plus cher et commence à supplanter définitivement l'ESP8266 (dont certaine biblio ne sont même plus maintenues).

A mon sens, vous ne pourrez pas vous dispenser d'une gestion centralisée. Vous ne raisonnerez donc pas en n+1 ou n+2... mais en identifiants fixes avec une base de données qui peut être un simple tableau ou plus complexe.

Mais franchement, regardez y à deux fois entre ce type d'infrastructure qui nécessitera de toutes façon du filaire et une architecture basée sur les satellites !

Bien cordialement

Christophe.

Pierre59

  • Full Member
  • ***
  • Messages: 145
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #4 le: juin 29, 2019, 04:56:50 pm »
Les communications réseau donc celles en WIFI, se font généralement avec le protocole TCP/IP (mais il existe un autre protocole moins utilisé UDP/IP). Avec le protocole TCP/IP il faut fonctionner en mode client/serveur :
- le serveur est démarré avant le client et attend la connection d'un client. On peut aussi avoir plusieurs clients.
- le client se connecte à un serveur.
Une fois que le client est connecté au serveur le client peut envoyer des messages au serveur ou en recevoir, avec des read et des write, le serveur peut envoyer des messages au client ou en recevoir, avec des read et des write.
Dans le cas présent chaque ESP doit être a la fois serveur et client, c'est à dire que chaque ESP va démarrer un serveur (disons un serveur de signal) et va se connecter au serveur de signal d'un autre ESP, chaque ESP peut alors communiquer avec 2 ESP (ceux des cantons adjacents) en lecture et/ou en écriture.

Je vais rechercher, j'ai un petit programme de serveur de boutons sur ESP32.

Pierre

bobyAndCo

  • Global Moderator
  • Sr. Member
  • *****
  • Messages: 362
  • HO avec DCC++
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #5 le: juin 29, 2019, 05:06:03 pm »
Je ne pense pas que de travailler en client/serveur sur chaque ESP soit la bone solution. Pour moi il est préférable de centraliser la gestion. J'ai oublié de dire tout à l'heure que tous ceci devrait bien sûr communiquer à l'aide de websockets (pour avoir une communication bi directionnelle client -> serveur, serveur -> client) sans pour autant créer autant de serveurs de d'ESP.

Pierre59

  • Full Member
  • ***
  • Messages: 145
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #6 le: juin 29, 2019, 05:44:58 pm »
Bonjour

Quelques remarques :

Certes l'UDP est plus simple, mais il y a toujours des risques de pertes de paquets !  avec TCP pas de risques.

Dans le cas présent il n'y a pas vraiment besoin de diffusion.

La bibliothèque WIFI des ESP cache (presque) complètement les sockets, et on a pas besoin de sockets pour écrire des applications simples comme c'est le cas ici..

Pour une fois que l'on peut se passer de centralisation, il ne faut pas se priver. Le mot serveur sur chaque ESP est un bien grand mot, c'est juste pour se conformer au modèle client/serveur.

Cordialement

Pierre


Pierre59

  • Full Member
  • ***
  • Messages: 145
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #7 le: juin 29, 2019, 06:06:14 pm »
Voici un exemple prévu pour un M5stack, c'est un ESP32 avec un affichage LCD couleur, 3 boutons et plein d'autre choses.

L'exemple est un serveur de boutons, chaque fois que l'on appuie sur un (ou plusieurs) bouton(s) l'état des boutons est envoyé au client connecté, on pourrait facilement le transformer en serveur de signal.

Comme l'ESP est doté d'un affichage celui ci est utilisé pour afficher l'état WIFI et l'état du client, tout ce qui concerne l'affichage est dans un onglet séparé (affichage.h). Il faut aussi gérer l'affichage et les boutons, toutes les méthodes nécessaires sont préfixées par "M5".

Le programme serveur.ino

// LCD 320x240
// 16 bit/pixel color order (R:5-bit, G:6-bit, B:5-bit), 65,536 colors

IPAddress ip; // adresse ip du serveur

#include <WiFi.h>
#include <M5Stack.h>
#include "Affichage.h"

char ssid[]="WIFI MAC"; // nom du reseau
char pass[]="Ma phrase de securite"; // mot de passe WPA

WiFiServer server(22); // serveur sur le port 22
int status=WL_IDLE_STATUS; // etat connexion wifi

void setup() {
  M5.begin();
  afficher(false,false);
 
  while (status!=WL_CONNECTED) { // connexion wifi
    status=WiFi.begin(ssid, pass);
    delay(5000);
  }
 
  server.begin(); // demarrage du serveur    (config)
  ip=WiFi.localIP(); // obtention de l'adresse ip du serveur
  afficher(true,false);
}

void loop() {   
  WiFiClient client=server.available(); // test si client connecte
  if (client) { byte data; int color; // client connecte
    afficher(true,true);
    while (client.connected()) { // boucle de traitement
      data=M5.BtnA.read()*4+M5.BtnB.read()*2+M5.BtnC.read(); // lecture des boutons
      client.write(data); // envoi au client
      boutons(data);
      delay(100);
    }
    afficher(true,false);
    client.stop(); // client deconnecte
  }
}

Si on veut des adresses IP fixes il faut changer "server.begin()"; en "server.config(...);"

Accessoirement le fichier faisant les affichages :
void afficher(boolean b1,boolean b2) { // affichage des messages
  M5.Lcd.setTextColor(BLACK);
  M5.Lcd.setTextFont(4);
  M5.Lcd.fillScreen(WHITE);
  M5.Lcd.setCursor(25,50);
  if (!b1) {
    M5.Lcd.print("Connexion WIFI ...");
    return;
  }
  else {       
    M5.Lcd.print("Serveur : ");
    M5.Lcd.print(ip);
  }
 
  if (b2) {
    M5.Lcd.setTextColor(RED);
    M5.Lcd.setCursor(25,100);
    M5.Lcd.print("Client connecte");
  }
}

void boutons(byte data) { int color; // affichage des boutons
    if ((data&4)!=0) color=BLACK; else color=WHITE;
    M5.Lcd.fillRoundRect(35,165,60,40,4,color);
    if ((data&2)!=0) color=BLACK; else color=WHITE;
    M5.Lcd.fillRoundRect(35+35+60,165,60,40,4,color);
    if ((data&1)!=0) color=BLACK; else color=WHITE;
    M5.Lcd.fillRoundRect(35+35+35+60+60,165,60,40,4,color);
}

Pierre

Gorgio-arduino

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #8 le: juin 29, 2019, 06:10:18 pm »
houla, TCP UDP , ce que font les modules WIFI entre eux, je m'en cogne un peu :P.

J'ai juste besoin de faire passer l’état d'une variable d'un ESP à un autre.

Dans mon cas pour un BAL: Si le BAL et sémaphore ou carré alors envoyer au BAL précédent "un truc" qui lui dit de se mettre au jaune , c'est tout.

ce que j'aimerai faire, c'est de remplacer une liaison série TX RX qui véhicule les variables d’état entre 2 Arduino par une liaison wifi.

Cdt

PS j'ai chaud




Pierre59

  • Full Member
  • ***
  • Messages: 145
    • Voir le profil
Re : Re : BALDUINO WIFI
« Réponse #9 le: juin 29, 2019, 06:25:51 pm »

J'ai juste besoin de faire passer l’état d'une variable d'un ESP à un autre.

Dans mon cas pour un BAL: Si le BAL et sémaphore ou carré alors envoyer au BAL précédent "un truc" qui lui dit de se mettre au jaune , c'est tout.

ce que j'aimerai faire, c'est de remplacer une liaison série TX RX qui véhicule les variables d’état entre 2 Arduino par une liaison wifi.

C'est bien dans ce sens que va le programme ci dessus, il faut lui enlever tout ce qui est propre au "M5", tous les affichages, et remplacer l'état des boutons par l'état du signal. On ne peut pas faire moins sur un ESP.

Pierre

PS j'ai chaud aussi

Gorgio-arduino

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #10 le: juin 29, 2019, 06:32:11 pm »
Oui, j'ai vu après mon dernier post
Je m’attelle à l'adapter avec pour mon module, car la structure semble y être
Je reviendra vers vous
Merci à vous tous en tout cas
Cdt

Gorgio-arduino

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #11 le: juin 30, 2019, 10:30:48 pm »
Bonsoir,
J'ai essayer d'avancer mais je deviens ou je suis déjà maboule

Je tombe toujours sur cette erreur de compilation

request for member 'indexOf' in 'request', which is of non-class type 'char'

La compilation bloque ici  >:(

 if (request.indexOf("client.read") != -1) {

ci joint le code


#include <ESP8266WiFi.h>

IPAddress ip(192,168,0,150);
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
WiFiServer server(80);


void setup() {
  WiFi.disconnect();
  delay(2500);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin("mabox","monmotdepasse");
  while (WiFi.status() != WL_CONNECTED) { delay(250); };
  server.begin();


}

void loop() {
    WiFiClient client = server.available();
    if (!client) return;
    while (!client.available()) { delay(1); }
    char request = client.read();
    client.flush();
      if (request.indexOf("client.read") != -1) {
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println("");
      client.println("<!DOCTYPE HTML>");
      client.println("<html>");
      client.println("Test Ok");
      client.println("</html>");
    }

}



« Modifié: juin 30, 2019, 10:33:59 pm par Gorgio-arduino »

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1440
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #12 le: juillet 01, 2019, 07:50:26 am »
Bonjour,
request est un char, il est déclaré deux lignes au dessus. Ce n'est donc pas un objet et par conséquent il n'a pas de méthode indexOf.
Cordialement

nopxor

  • Jr. Member
  • **
  • Messages: 86
    • Voir le profil
Re : BALDUINO WIFI
« Réponse #13 le: juillet 01, 2019, 11:46:45 am »
Bonjour,

Pour faire communiquer plusieurs modules, il est sûrement plus simple d'utiliser une communication basée sur le protocole UDP plutôt que TCP.

https://www.tala-informatique.fr/wiki/index.php/Esp8266_udp_server

Pierre59

  • Full Member
  • ***
  • Messages: 145
    • Voir le profil
Re : Re : BALDUINO WIFI
« Réponse #14 le: juillet 02, 2019, 08:45:24 am »
Bonjour
Pour faire communiquer plusieurs modules, il est sûrement plus simple d'utiliser une communication basée sur le protocole UDP plutôt que TCP.
UDP est plus simple, cependant UDP est un protocole non fiable, certes sur un réseau local c'est très relatif, mais peut-on garantir qu'il n'y aura pas perte ou inversion de paquets. S'il faut mettre en oeuvre des contrôles alors autant utiliser TCP, d'autant plus que le débit ici sera très très faible.

Pierrre