Prise en charge WIFI sur Arduino MEGA en ajoutant un ESP01S

Bonjour à tou(te)s !

Situation
Depuis deux semaines, je travaille sur un projet artistique qui intègre un arduino mega reliée à plusieurs potentiomètres (une dizaine) et des ponts H pour piloter quelques moteurs. Le programme interne, simplifié, à le role de lire les valeurs des potards et de les envoyer en série via le port USB. Tout fonctionne jusque la.

Problème
Le dispositif, fonctionnel, est relié à une UC cachée dans un local sous clé. Du coup, un fil traverse 4m de l'arduino au PC. Pas ouf pour de l'USB, pas ouf pour un ERP car cela fait un fil qui traverse l'issue de secours...

Solution envisagée
Dans cette salle, le dispositif qui contient l'arduino est alimenté d'une manière invisible (prise au sol masquée). C'est donc uniquement l'usb qui nous embête. La solution miracle serait d'ajouter du WIFI ! Le concepteur de circuits AI Thinker à créé une série de petits modules comportant une antenne wifi, un soc ESP8266, deux gpio, un port série et une alim qui accepte du 3.3. Un firmware est préchargé dessus, similaire aux cartes LTE. Il recoit des commandes AT. Ce module (ESP01S) peut aussi être programmé comme tout soc ESP par un prog Cpp. Ce truc à 10 ans, mais ne coûte rien du tout en quantité de 10. Pour faire court, le truc serait de relier les ports RX TX à l'arduino, et de relier l'autre bout à ce petit module, qui lirait le port série comme un pc en usb, avec la lib Serial1 et qui l'encapsulerait dans du TCP. L'idéal serait de pouvoir récupérer la data pour l'interpréter comme une liaison série. J'ai essayé un programme simple pour le faire, et le module ne répond tout simplement pas aux commandes AT via l'arduino. :melting_face: Ce que j'ai aussi essayé, c'est de brancher le module à un FTDI, et là, il répond et fait sont job. :slight_smile: Le seul problème doit être moi, ou bien le wiring entre les deux.

J'arrête d'écrire, je suis pas écrivain non plus, et pour votre patience :))))

[Pinouts]

ESP01S Pinout

Pinout MEGA

[Code Arduino]

void setup() {
  Serial.begin(9600);          // Pour la communication avec le moniteur série
  Serial1.begin(115200);       // Pour la communication avec l'ESP-01S

  delay(2000); // Attendre 2 secondes pour s'assurer que tout est initialisé

  // Configuration initiale
  if (sendATCommand("AT", "OK", 1000)) {
    Serial.println("ESP-01S répond à AT");
  } else {
    Serial.println("Pas de réponse à AT");
  }

  if (sendATCommand("AT+CWMODE=1", "OK", 1000)) {
    Serial.println("Mode client configuré");
  } else {
    Serial.println("Echec de la configuration du mode client");
  }

  if (sendATCommand("AT+CWJAP=\"id wifi\",\"vousaurezpaslepwd\"", "OK", 5000)) {
    Serial.println("Connecté au réseau Wi-Fi");
  } else {
    Serial.println("Echec de la connexion Wi-Fi");
  }
}

void loop() {
  // Vérifier les messages de l'ESP-01S
  if (Serial1.available()) {
    while (Serial1.available()) {
      char c = Serial1.read();
      Serial.write(c);
    }
  }

  // Envoyer les commandes depuis le moniteur série
  if (Serial.available()) {
    String command = Serial.readString();
    Serial1.println(command);
  }
}

bool sendATCommand(String command, String response, int timeout) {
  Serial1.println(command);
  long int time = millis();
  while ((time + timeout) > millis()) {
    while (Serial1.available()) {
      String res = Serial1.readString();
      Serial.println("Réponse: " + res);
      if (res.indexOf(response) != -1) {
        return true;
      }
    }
  }
  Serial.println("Commande échouée : " + command);
  return false;
}

un très grand merci en minuscules pour ne pas passer à la trappe ! hésitez pas à me demander des renseignements supplémentaires.

il faut aussi l'alimenter et partager le GND avec votre arduino

certains ESP-01S ne sont pas compatibles avec 5V donc il faut une adaptation de tension au moins pour la liaison Tx (Arduino) ➜ Rx (ESP01s)

Bien évidemment ! J’ai relié le 3.3 à la sortie de l’arduino, et il s’allume correctement. Le seul problème, c’est l’alimentation, et peut être le wiring avec le reset et le ch pd…

Est-ce que la pub 3.3V de la mega donne assez de courant pour faire fonctionner le module ?

Quel module avez vous ?

Je parlais sinon de la liaison série. La mega envoie 5V sur son Tx pour émettre un 1 qui arrive sur la pin Rx de l’ESP qui lui ne tolère que 3.3V….

Le module utilisé est un ESP01-S de chez Ai Thinker. C'est basé sur un ESP8266EX avec une petite flash et un régulateur.

Datasheet : https://www.microchip.ua/wireless/esp01.pdf

Merci d'avoir fait la remarque sur la liaison série. Sur internet, les schémas de connexions sont assez différents. Certains prescrivent l'usage de résistances, d'autres non sur le même hôte. Selon la DS (je ne suis pas sur d'être au bon endroit dedans) on lit que le maximum du voltage du port série est l'alimentation + .3 V. Quand a elle, l'arduino sort uniquement de 5V :hot_face:

Cela impliquerait de mettre une résistance dans les deux cas, 5V ou 3.3V pour abaisser à 3.
Je trouve ca bizzare que cela fonctionne pour les autres sans resistance... J'ai compris ! Il semble y avoir deux modes : programmation et interrogation. Après avoir regardé la ds de l'arduino et de l'esp, il faut une résistance sur txrx comme tu avais dit. Je teste et je te dis !

Tout le monde ne tient pas compte des spécifications des composants et l'ESP8266 semble supporter certains mauvais traitements .....
Espressif dégage sa responsabilité au delà de VDD+0.3V....
Au delà , ça passe ou ça casse....
le client fait ce qu'il veut du composant acheté mais dire ou écrire que ça fonctionne toujours et dans tous les cas est irresponsable

pour éviter de se poser la question, on trouve des supports qui font le boulot pour 1€ livraison gratuite (offre de bienvenue)

Le courant absorbé par un ESP8266 lors de la connexion au WIFI dépasse 400mA.
Le régulateur LP2985 de la MEGA fournit 150mA.

oui je sais que ce n'est pas forcément suffisant.

Je voulais que @atelien48 se pose la question

Ok, ca y est. J'ai rajouté une résistance 1K sur la RX de l'esp vers la TX de l'arduino. Ca fonctionne, je peux lire la console de l'esp01 via l'arduino en USB. On peut envoyer et recevoir !

Voilà ce que ça donne :

Maintenant, deux choses :

  • List item

J'aimerais voir s'il est possible d'ajouter une robustesse à l'assemblage. On voit bien que l'esp parle dans sa barbe. Peut on corriger cela ? Y'a til des additions a faire au circuit pour que ca tienne dans le temps ?

  • List item
    Maintenant, il faudrait élaborer un programme pour permettre a larduino de faire sortir son terminal série sur du TCP pour que je puisse récupérer les données en Wifi. Cela implique la connexion à un réseau et la diffusion sur une IP. Je ne sais pas par ou commencer d'autant plus qu'il n'y a pas de librairie spécialisée pour cela.

Merci à tous pour votre investissement dans le sujet.

Je me suis posé la question, mais tout ca, cela veut dire que je vais devoir rajouter plein de trucs que je n'ai pas forcément. Il faut que je réfléchisse à comment je ne peux pas finir ma course dans un plat de nouilles :=)

heu c'est 2 résistances qu'il faut mettre pour abaisser la tension (pont diviseur)

image
par exemple 1 kΩ et 2 kΩ

--

quel code utilisez vous ? sur quelles pins tout cela est-il branché ? et comme on l'a dit plus haut, quid de l'alim ?

Voilà le schéma de ce qu’il y a pour l’instant et une photo

Cela marche comme ça, est ce que vous pouvez m’expliquer le rôle du pont diviseur comme ça je suis sûr de comprendre

Le code pour obtenir un accès au réseau est le même qu’il y a en haut, mais avec softwareserial vu que je fait mes tests sur une uno.

Merci,

En toute rigueur il faudrait ajouter une résistance à la masse pour faire un diviseur de tension. Si tu gardes la 1kΩ entre le Tx Arduino et le Rx de l'ESP, il faudrait ajouter une résistance de 1,5kΩ à 2,2kΩ entre Rx et la masse.

cf l'article Diviseur de tension — Wikipédia

l'idée c'est de prendre la tension entre deux résistances
image
et donc par effet de la loi d'Ohm on a la formule
image

Si R2 vaut 2xR1 la formule en simplifiant par R1 devient

U2 = 2/3 U
et donc si vous avez U = 5 alors U2 = 2 * 5V / 3 = 3.33 V ➜ la tension que l'on souhaite voir sur l'ESP.

Merci beaucoup pour votre réponse détaillée, et le Wiki je comprends mieux à présent !

Je vais tester cela demain,
Bon week-end

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.