Wemos Mega 2650 avec Wifi intégré

Bonjour, je viens solliciter votre aide après des jours de recherches...

J'ai acheté cette carte :

  • WeMOS Mega + WiFi R3 ATmega2560 + ESP8266 (32Mbits) USB-TTL for NodeMCU Arduino Mega

J'ai des difficulté pour faire fonctionner l'esp et atmega ensemble.

J'arrive à faire fonctionner l'arduino seul, donc j'upload un sketch dessus il fonctionne bien.
J'arrive aussi à faire fonctionner l'esp de façon séparé. J'arrive pas exemple avec le moniteur série envoyer des commande AT.

Et je souhaite, que le sketch dans l'arduino envoi des commandes AT à l'esp. Et ça je n'y arrive pas.

J'ai bien suivi les instructions sur les dip switch :

upload sur l'arduino 3-4 sur ON le reste off.
upload sur l'esp8266 5-6 ON reste off
et communication USB <-> Atmega <-> ESP = 1-2-3-4 ON avec le petit switch séparé sur TX3-RX3

Sauf que l'esp ne semble pas recevoir de messages de l'atmega. Ou alors il ne répond pas...

j'utilise pour tester le script suivant :

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  Serial3.begin(115200);

}
int first = 0;
void loop() 
{
  if (first == 0)
  {
    String str = "";
    Serial.println("GMR");
    Serial3.println("AT+GMR");
    delay(500);
    while (Serial3.available())
    {
      char c = Serial3.read();
      str += c;
    }
    if (str != "")
    {
      Serial.print(str);
    }
    first++;
  }
}
// put your main code here, to run repeatedly:

J'ai aussi essayé des codes d'exemple que j'ai trouvé sur les forum qui parle la carte wemos.

En gros ce code est un version simplifié...

Soit je fais une erreur sur les combinaison de switch, soit sur le Serial à utiliser...

En gros le projet final est de commander un robot, c'est à dire que je vais avoir le robot, toutes les commandes moteurs, et les capteurs ( ultra son télémètre gyro scope ) sont recueilli par l'arduino, puis envoyer à l'esp qui va via websocket transmettre toutes ces infos à script python ( serveur websocket ) et le script python va prendre toutes les décisions (une sorte de petite IA), donc en réponse aux infos des capteurs, le script python renvoi tourne à droite, avance etc... Et aussi grâce au télémètre surtout, cartographier la pièce. Donc j'ai pas mal d'info à communiquer.

Du coup je suppose que le websocket est la solution la plus performante par rapport à l'esp8266. Mais je suis bloqué au niveau de la communication entre ESP8266 et l'ATmega 2650 !

Merci d'avance ! Si vous avez une autre solution que le websocket à proposer je suis preneur !

Bon dimanche!

Bonjour

Un lien vers cette carte "Mega + WiFi R3 ATmega2560 + ESP8266 (32Mbits) USB-TTL for NodeMCU Arduino Mega" (qui n'a rien à voir avec la société Wemos.cc) ?

ca ressemble à cette carte de Robodyn ? (voir le tableau de positionnement des interrupteurset le schéma)

https://robotdyn.com/mega-wifi-r3-atmega2560-esp8266-flash-32mb-usb-ttl-ch340g-micro-usb.html

Un schéma est-il disponible ? (ça permettrait de comprendre le fonctionnement des dip switch)

J'arrive aussi à faire fonctionner l'esp de façon séparé. J'arrive pas exemple avec le moniteur série envoyer des commande AT.

A 115200 bauds ?

Bonjour

C'est cette usine à gaz 8) ?

Il y en a qui ont essayé......
https://forum.arduino.cc/index.php?topic=495840.0

... beaucoup de galères et peu de réussites

Un firmware AT est-il actuellement présent dans l'ESP8266 ? n'aurait-t-il pas été effacé par des flashages de l'ESP ? C'est à craindre en lisant ceci :

J'ai aussi essayé des codes d'exemple que j'ai trouvé sur les forum qui parlent de la carte wemos.

Bien souvent ces forums montrent comment implanter dans un ESP8266 sur carte WEMOS D1 Mini un code édité sous IDE Arduino , ce qui a comme conséquence l'écrasement du firmware AT

Peut-on placer le programme de son choix sur l'ESP8266 embarqué ? A-t-on accès au broche Rx et Tx de la mega et de l'esp embarqué. Si oui regardes peut-être (en phase de développement).

Du coup je suppose que le websocket est la solution la plus performante par rapport à l'esp8266. Mais je suis bloqué au niveau de la communication entre ESP8266 et l'ATmega 2650 !

Pour moi la solution websocket est compliquée et inutile dans ton cas. Un simple client TCP sur l'arduino suffit à communiquer avec un processus (sur raspberry ou PC). La websocket n'a d'intérêt que pour les navigateurs web (mais comme elle embarque une socket TCP c'est faisable, juste inutilement compliqué de se trimbaler la couche HTTP, mais je peux me tromper).

Merci pour vos réponses !

al1fch:
A 115200 bauds ?

Oui c'est bien à 115200, et c'est bien cette carte là.

Artouste, c'est bien celle ci mais acheter ailleurs.

Al1ch, j'ai vue que beaucoup de monde avait des problèmes...
Alors j'hésite à prendre un esp8266 séparément.... Tant pis.

Ou alors configurer les dip switch pour que tout fonctionne séparément. Et d'utiliser les broches de sortie de l'esp et les connecter à rx3 et tx3. Faut-il que j'utilise un level shifter du coup ? Ou à minima un pont diviseur de tension pour les niveaux ttl ?

Merci encore !

supercc:
Peut-on placer le programme de son choix sur l'ESP8266 embarqué ? A-t-on accès au broche Rx et Tx de la mega et de l'esp embarqué.

Normalement oui on a accès au pin rx tx de l'esp. Donc je vais explorer cette solution.
J'avais choisi le websocket car c'était très rapide pour envoyer une bonne quantité d'Informations.

Oui on peut mettre le programme qu'on veut sur l'esp. Mais c'est finalement galère...
C'est peut être plus simple avec un fdti et un esp à part.
Mais au pire je vais laisser le firmware de base avec les commandes AT.
Et communiquer via ces commandes en passant par les wire que je vais mettre en rx tx de l'esp et celle de l'atmega. Au final je peu utiliser n'importe quel serial 1 2 ou 3.
Mais il faut que je vois pour les niveaux ttl. Normalement l'esp est en 3.3v et les ttl de l'atmega sont à 5v si je ne me trompe pas ?

PS : désolé pour le double poste mais vous répondez trop vite :smiley:

J'ai eu cette réflexion aussi au niveau des tensions. Dans le lien que je t'ai donné plus haut je suis arrivé à la conclusion en lisant sur Internet que la non adaptation des niveaux (dans le cas esp8266 uniquement) bien que non officiellement recommandé est en fait fonctionnelle. A long terme je ne sais pas et ce n'est pas une recommandation que je fais hein :wink:

supercc:
J'ai eu cette réflexion aussi au niveau des tensions. Dans le lien que je t'ai donné plus haut je suis arrivé à la conclusion en lisant sur Internet que la non adaptation des niveaux (dans le cas esp8266 uniquement) bien que non officiellement recommandé est en fait fonctionnelle. A long terme je ne sais pas et ce n'est pas une recommandation que je fais hein :wink:

Oui normalement il y a une marge de sécurité comme pour les mpu6050...
Je peu tester comme ça puis au final je prendrais deux level shifter, j'ai vue qu'il existe des 8 voies.
Pour être sur d'avoir une bonne durée de vie.

Je vais voir pour la connexion tcp
Merci !

Je vais voir pour la connexion tcp
Merci !

N'hésite pas à demander, j'ai pris un peu d'avance sur toi (c'est ce que je code en ce moment ;-)).

Charly26:
Oui normalement il y a une marge de sécurité comme pour les mpu6050...
Je peu tester comme ça puis au final je prendrais deux level shifter, j'ai vue qu'il existe des 8 voies.
Pour être sur d'avoir une bonne durée de vie.

Je vais voir pour la connexion tcp
Merci !

L'esp8266 en mode AT c'etait le debut
Déjà il faut connaitre quel firmware AT est reellement "embarqué"
Pour ce qui st de la pseudo tolérance de l'esp8266 aux IO 5V , perso je n'en ai jamais cramé un pour çà (pour d'autres s situations oui :grin: )

en fait par securité tu n'a besoin que d'adapter le niveau entrant sur RX de l'esp8266 , pas vraiment besoin de level converter , un diviseur de tension resistif ou qq diodes basiques en serie et l'adaptation est réalisée.

Ceci étant , sur le papier ce genre de carte "mouton à 5 pattes" :wink: çà semble "super" mais c'est tres generalement difficile à effectivement mettre en œuvre

Oui les ESP8266 encaissent assez bien certains mauvais traitements (déconseillés formellement par le fabricant dans sa Data Sheet qui affiche maintenant une non tolérance au 5V sur les entrées = ne garantit pas le bon fonctionnement)

Affaire de prise de risque, donc choix perso !

Avec içi un ESP8266 en boitier QFN soudé sur la carte mieux vaut éviter le 'hors piste', on n'est pas dans la situation d'un ESP12 à devoir peut être remplacer un jour !

al1fch:
Avec içi un ESP8266 en boitier QFN soudé sur la carte mieux vaut éviter le 'hors piste', on n'est pas dans la situation d'un ESP12 à devoir peut être remplacer un jour !

Oui tu as raison, j'ai fais un pont diviseurs de tension avec une résistance de 1K et 2K.

Du coup sa marche très bien.

Au final sa m'a pris, le temps de câbler ( 2min ), mettre les dip switch sur USB <-> ATmega et d'envoyer un bout de code sur l'arduino...

Sa fait plusieurs jours que j'essais de faire marcher cette esp avec les dip switch...

Artouste avait bien raison quand il a dit que ces cartes ont l'air géniale sur le papier mais en vrai....

Je vais chercher plus d'info sur les serveur TCP.

supercc apparemment tu fais un truc un peu similaire, tu travail sur quoi ?

Pour conclure la meilleure solution d'utiliser cette carte tout en un c'est de faire comme si ça en était deux séparé !

Merci pour votre aide !

supercc apparemment tu fais un truc un peu similaire, tu travail sur quoi ?

Je ne travaille sur rien donc du coup je prépare une classe (BoardView cf plut haut) qui me permettra d'avoir une boite a outils "réseaux" quand j'aurai quelque choses à faire :wink:

Il y a des points communs dans nos développements (TCP).

Ton script python il tourne où (PC Linux, windows, raspberry) ?

As-tu une idées des débits que tu cherches à atteindre dans un sens comme dans l'autre ?

  1. commandes du script vers le robot : commandes de petites tailles je pense mais à quelle fréquence ?
  2. arduino (états capteurs) : quelle est la taille des données produites ("ultra son télémètre gyro scopepar") et aussi a quelle fréquence il doit les envoyer au PC ?

supercc:
Je ne travaille sur rien donc du coup je prépare une classe (BoardView cf plut haut) qui me permettra d'avoir une boite a outils "réseaux" quand j'aurai quelque choses à faire :wink:

Il y a des points communs dans nos développements (TCP).

Ton script python il tourne où (PC Linux, windows, raspberry) ?

As-tu une idées des débits que tu cherches à atteindre dans un sens comme dans l'autre ?

  1. commandes du script vers le robot : commandes de petites tailles je pense mais à quelle fréquence ?
  2. arduino (états capteurs) : quelle est la taille des données produites ("ultra son télémètre gyro scopepar") et aussi a quelle fréquence il doit les envoyer au PC ?

Le script python va fonctionner sur Raspberry Pi 3.

Non pas vraiment d'idée, d'autant que la réactivité n'est pas obligatoirement à la µs !

Lorsque le robot détecte un obstacle il s'arrête de lui même et enverra l'info à au script python.

Par exemple le message sera : stop - capteur gauche = libre - capteur centre = obstacle - capteur droite = libre

Donc pas quelque chose d'énorme, et puis si il met un peu de temps pour réagire c'est pas trop grave, ce n'est qu'un robot aspirateur :slight_smile:

Je veux réaliser tout ça pour progresser en programmation, parce que j'aime fabriquer un robot utile et puis je vais un script sur le RPi parce que je veux que les mesure du télémètre embarqué m'envoi toutes les infos pour pouvoir cartographier la maison et là ou il est passé. Tout ça pour le plaisir :slight_smile:
En tout cas je suis pas prêt d'arrêter de passer l'aspirateur moi même :smiley:

Ceci dit je m'heurte à un nouveau problème, lorsque avec les commandes AT je me connecte à mon wifi, l'esp à une ip complètement à côté genre 197.7.1.150 au lieu d'utiliser celle de mon réseau 192.168.0.x ...

j'hésite à passer sur un script directement flashé sur l'esp mais les commandes AT je trouves ça plus flexible pour par exemple changer en court de route le réseau wifi, ou j'en sais rien quoi sans avoir à reflasher l'esp !

Ok, c'est beaucoup plus clair :wink:

En tout cas je suis pas prêt d'arrêter de passer l'aspirateur moi même :smiley:

:wink:

Perso je n'ai aucune expérience des commandes AT, je préfère faire les miennes (et donc flasher mais encore une fois je ne connais pas du tout ta carte, si cela ne fonctionne pas je ne sais pas par exemple restaurer le "firmware" d'origine).

J'ai flashé 100 fois l'esp avec le firmware d'origine ou un script c'est pas compliqué.

Sa te dit de continuer cette conversation en privé ? Parce que j'ai quelques questions qui n'ont pas vraiment à voir avec le sujet du post :slight_smile:

En tout cas merci

Je t'en prie :wink:

Merci de partager votre travail dans "Réalisation et Projets finis" quand il sera terminé

68tjs:
Merci de partager votre travail dans "Réalisation et Projets finis" quand il sera terminé

D'accord pas de problème, si j'arrive à faire un truc fonctionnel, je partagerai tout, avec des photos du robot tout tout !!

Si non supercc j'ai quelques question !!!

J'ai trouvé ce petit script en python

#!/usr/bin/env python

import socket


TCP_IP = '192.168.0.50'
TCP_PORT = 65432
BUFFER_SIZE = 20  # Normally 1024, but we want fast response

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

conn, addr = s.accept()
print 'Connection address:', addr
while 1:
    data = conn.recv(BUFFER_SIZE)
    if not data: break
    print "received data:", data
    conn.send(data)  # echo
conn.close()

et pour le script arduino :

/*  Connects to the home WiFi network
 *  Asks some network parameters
 *  Sends and receives message from the server in every 2 seconds
 *  Communicates: wifi_server_01.ino
 */ 
#include <SPI.h>
#include <ESP8266WiFi.h>
 
char ssid[] = "SFR-6c00";           // SSID of your home WiFi
char pass[] = "Charly0406!";            // password of your home WiFi
 
IPAddress server(192,168,0,50);       // the fix IP address of the server
WiFiClient client;
 
void setup() {
  Serial.begin(115200);               // only for debug
  WiFi.begin(ssid, pass);             // connects to the WiFi router
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  if (WiFi.status() == WL_CONNECTED)
  {
    Serial.println("0:1"); // 0 ==  wifi
  }
  if (!client.connect(server, 65432)) {
    Serial.println("1:0");
    delay(5000);
    return;
  }
  else
  {
    Serial.println("1:1"); // 1 = serveur TCP
  }
 // Connection to the server

/*  Serial.println("Connected to wifi");
  Serial.print("Status: "); Serial.println(WiFi.status());    // Network parameters
  Serial.print("IP: ");     Serial.println(WiFi.localIP());
  Serial.print("Subnet: "); Serial.println(WiFi.subnetMask());
  Serial.print("Gateway: "); Serial.println(WiFi.gatewayIP());
  Serial.print("SSID: "); Serial.println(WiFi.SSID());
  Serial.print("Signal: "); Serial.println(WiFi.RSSI());*/
}
 
void loop () {
  while (client.available() != 0) {
    char c = client.read();
    Serial.print(c);
  }
  while (Serial.available() != 0)
  {
    char c = Serial.read();
    client.print(c);
  }
  // do something...
  client.flush();
  delay(1000);                  // client will trigger the communication after two seconds
}

sa fonctionne, j'envoi un message via le moniteur série par exemple :

  • 123

et côté python je reçois ceci :
received data: 1
received data: 23

j'envoi bien la chaîne "123" sur la même ligne, je ne comprend pas d'où ça peut venir...
je ne comprends pas du tout pourquoi

EDIT : je pense avoir compris, en gros la boucle while se termine car il n'y a plus de donnée disponible sur le Serial, sauf que tout n'est pas arrivé, en gros la boucle tourne trop vite. Donc je vais plutôt déclencher l'envoi au serveur TCP lorsque j'ai mis un caractère de terminaison, comme ";"