Communication ESP-NOW entre 2 ESP32

Bonjour,

Après pas mal de vidéos et de tests, je n'arrive pas à réaliser un test simple :frowning:

Je tente de faire communiquer 2 ESP32 avec un joystick.

Lorsque je fais le code sur un ESP32 seul pour renvoyer le résultat du joystick sur le moniteur, cela fonctionne correctement avec le code suivant :

//ref. https://101010.fun/iot/esp32-joystick.html
//ref. https://wak-tech.com/archives/742

#define Right_VRX_PIN 12
#define Right_VRY_PIN 13
#define Left_VRX_PIN 25
#define Left_VRY_PIN 26

int left_x_val;
int left_y_val;
int right_x_val;
int right_y_val;  

void setup() {
  Serial.begin(115200);
  
  pinMode(Left_VRX_PIN, INPUT);
  pinMode(Left_VRY_PIN, INPUT);
  pinMode(Right_VRX_PIN, INPUT);
  pinMode(Right_VRX_PIN, INPUT);
  }

void loop() {
  
  left_x_val = analogRead(Left_VRX_PIN) >> 4;//value 0-255 (">> 4" convert maximum value from 4095 to 255 )
  left_y_val = analogRead(Left_VRY_PIN) >> 4;//value 0-255  
  right_x_val = analogRead(Right_VRX_PIN) >> 4;//value 0-255
  right_y_val = analogRead(Right_VRY_PIN) >> 4;//value 0-255
  
  Serial.printf("left_x: %d, left_y: %d, right_x: %d, right_y: %d\n", left_x_val, left_y_val, right_x_val, right_y_val);

  delay(100);
}

J'obtiens bien les valeurs de mon Joystick quand je le bouge.

J'essaye ensuite d'adapter mon code pour l'ESP32 qui va servir de transmetteur (Tx) :

#include <esp_now.h>
#include <WiFi.h>

#define VRx 12
#define VRy 13
const byte SW = 14; 

// ESP-NOW -- REPLACE WITH YOUR RECEIVER MAC Address
uint8_t broadcastAddress[] = {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; 

// ESP-NOW -- Structure example to send data -- Must match the receiver structure
typedef struct struct_message { // For ESP-NOW
  int vX;
  int vY;
  int SW_state;
} struct_message;

// ESP-NOW -- Create a struct_message called senderData
struct_message senderData;

// ESP-NOW -- 
esp_now_peer_info_t peerInfo;

// ESP-NOW -- callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  //Serial.print("\r\nLast Packet Send Status:\t");
  //Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}

void setup() {
  // Init Serial Monitor
  Serial.begin(115200);
  
  // Init PIN Joystick
  pinMode(VRx, INPUT);
  pinMode(VRy, INPUT);
  pinMode(SW, INPUT_PULLUP);

  // ESP-NOW -- Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA); // For ESP-NOW

  // ESP-NOW -- Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // ESP-NOW -- Once ESPNow is successfully Init, we will register for Send CB to get the status of Trasnmitted packet
  esp_now_register_send_cb(OnDataSent);

  // ESP-NOW -- Register peer
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;

  // ESP-NOW -- Add peer
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed to add peer");
    return;
  }
}

void loop() {
  // Set values to send
   senderData.vX = analogRead(VRx);
   senderData.vY = analogRead(VRy);
   senderData.SW_state = digitalRead(SW);

  // ESP-NOW -- Send message
  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &senderData, sizeof(senderData));
/*
  if (result == ESP_OK) {
    Serial.println("Sent with success");
  }
  else {
    Serial.println("Error sending the data");
  }
*/
  Serial.print("X: ");  Serial.print(senderData.vX);
  Serial.print(" | Y: ");  Serial.print(senderData.vY);
  Serial.print(" | Bouton: ");  Serial.println(senderData.SW_state);
  delay(100);
}

(Note : j'ai changé mon adresse MAC dans ce code)

Avec ce dernier code, j'arrive à obtenir le résultat du bouton poussoir du Joystick mais aucune informations concernant les mouvement X et Y du Joystick, les valeurs restent à 0
J'obtiens ca :
X: 0 | Y: 0 | Bouton: 1

Sauriez-vous me dire ce que j'ai loupé ?

Merci par avance pour votre aide.

si vous commentez la ligne qui effectue l'envoi

que voyez vous?

(sur certains ESP32 les pins 14 et 15 ont un signal PWM au boot mais ça ne devrait pas gêner)

Bonjour @J-M-L ,

Merci pour ton aide.
Je viens de tester, ca ne change rien à part qu'il n'envoi plus sur l'autre ESP32.

Mais le problème semble local. Je veux dire, la com entre les 2 ESP fonctionne.
Et dans mon test de l'ESP vers le moniteur, ca marche aussi.
Ca ne marche plus lorsque le transforme ma data dans la Structure, comme s'il n'interprétait plus pareil l'information dans la structure.

testez ce code

#define VRx 12
#define VRy 13
const byte SW = 14;

struct Message { // For ESP-NOW
  int vX;
  int vY;
  int SW_state;
} ;

Message senderData;


void setup() {
  pinMode(VRx, INPUT);
  pinMode(VRy, INPUT);
  pinMode(SW, INPUT_PULLUP);
  Serial.begin(115200);
}


void loop() {
  senderData.vX = analogRead(VRx);
  senderData.vY = analogRead(VRy);
  senderData.SW_state = digitalRead(SW);

  Serial.print("X: ");  Serial.print(senderData.vX);
  Serial.print(" | Y: ");  Serial.print(senderData.vY);
  Serial.print(" | Bouton: ");  Serial.println(senderData.SW_state);
  delay(100);
}

Oui ca fonctionne.
Du coup c'est lorsqu'on le combine avec le code nécessaire pour la communication ESP-NOW qu'il arrive plus !?

alors j'ai complété le code au fur et a mesure et ca ne marche plus quand je rajoute cette ligne là :
WiFi.mode(WIFI_STA); dans le Setup.

En fait, toutes les lignes de code qui concernent la connexion distante ESP-NOW qui ne permettent plus d'avoir les données correctes.

Ce que je ne comprends pas c'est que ca marche pour tout les autres dans leur tutos :frowning:

quel ESP32 avez vous ?
essayez de bouger les pins de votre joystick

Voilà l'ESP32 que j'utilise : "AZ-Delivery ESP-32 Dev Kit C V2"

J'ai ajouté un 2e Joystick sur les PIN 25, 26 et 27 : pareil :frowning:

#include <esp_now.h>
#include <WiFi.h>

#define VRx 12
#define VRy 13
#define RSW 14
#define VLx 25
#define VLy 26
#define LSW 27

// ESP-NOW -- REPLACE WITH YOUR RECEIVER MAC Address
uint8_t broadcastAddress[] = {0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}; 

typedef struct struct_message { 
  int right_vX;
  int right_vY;
  int right_SW_state;
  int left_vX;
  int left_vY;
  int left_SW_state;
} struct_message;

struct_message senderData;

// ESP-NOW -- 
esp_now_peer_info_t peerInfo;

// ESP-NOW -- callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
  //Serial.print("\r\nLast Packet Send Status:\t");
  //Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}

void setup() {
  // Init Serial Monitor
  Serial.begin(115200);
  
  // Init PIN Joystick
  pinMode(VRx, INPUT);
  pinMode(VRy, INPUT);
  pinMode(RSW, INPUT_PULLUP);
  pinMode(VLx, INPUT);
  pinMode(VLy, INPUT);
  pinMode(LSW, INPUT_PULLUP);

  // ESP-NOW -- Set device as a Wi-Fi Station
  WiFi.mode(WIFI_STA); // For ESP-NOW

  // ESP-NOW -- Init ESP-NOW
  if (esp_now_init() != ESP_OK) {
    Serial.println("Error initializing ESP-NOW");
    return;
  }

  // ESP-NOW -- Once ESPNow is successfully Init, we will register for Send CB to get the status of Trasnmitted packet
  esp_now_register_send_cb(OnDataSent);

  // ESP-NOW -- Register peer
  memcpy(peerInfo.peer_addr, broadcastAddress, 6);
  peerInfo.channel = 0;
  peerInfo.encrypt = false;

  // ESP-NOW -- Add peer
  if (esp_now_add_peer(&peerInfo) != ESP_OK) {
    Serial.println("Failed to add peer");
    return;
  }
}

void loop() {
  // Set values to send
  senderData.right_vX = analogRead(VRx);
  senderData.right_vY = analogRead(VRy);
  senderData.right_SW_state = digitalRead(RSW);
  senderData.left_vX = analogRead(VLx);
  senderData.left_vY = analogRead(VLy);
  senderData.left_SW_state = digitalRead(LSW);

  // ESP-NOW -- Send message
  esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &senderData, sizeof(senderData));
  
  //if (result == ESP_OK) {    Serial.println("Sent with success");  }
  //else {    Serial.println("Error sending the data");  }

  Serial.print("l_X: ");  Serial.print(senderData.left_vX);
  Serial.print(", l_Y: ");  Serial.print(senderData.left_vY);
  Serial.print(", l_Sw: ");  Serial.print(senderData.left_SW_state);
  Serial.print(" || r_X: ");  Serial.print(senderData.right_vX);
  Serial.print(", r_Y: ");  Serial.print(senderData.right_vY);
  Serial.print(", r_Sw: ");  Serial.println(senderData.right_SW_state);
  delay(100);
}

Résultat : (seul les switchs fonctionnent)

...
l_X: 0, l_Y: 0, l_Sw: 1 || r_X: 0, r_Y: 0, r_Sw: 1
l_X: 0, l_Y: 0, l_Sw: 1 || r_X: 0, r_Y: 0, r_Sw: 1
...

en laissant branché l'autre ? mettez le sur 34 35 36

aaah ! bah oui !

Ca marche sur les PIN 34 et 35 (j'ai laissé le bouton sur le 14)
Du coup j'ai passé l'autre aussi sur les 36 et 39 et les 2 fonctionnent bien du coup :slight_smile:
Egalement sur l'ESP32 distant, je recois bien les bonnes informations.

Une explication pour que je meure moins bête !?
c'est lié à ça ? :

image

je n'ai peut être pas bien compris comment interpréter ce shéma :confused:
Comment dois-je le lire ?

certaines pins servent à certaines fonctions, ça dépend des ESP. Les pins qui sont notées juste avec GPIO, ADC1 et/ou RTC sont généralement libres d'emploi et sans soucis. Les autres peuvent avoir des restrictions.

Sur l'ESP32 une restriction spéciale, c'est que l'ADC2 ne fonctionne pas si le WiFi est activé

vos pins 12 et 13 sur lesquelles vous faites un analogRead() sont sur l'ADC2

c'est pour cela que dès que vous activez le WiFi

vous ne pouvez plus lire le joystick

(elles servent aussi pour la SD et le bus SPI H)

Très clair !
Merci beaucoup pour l'aide et pour ces explications :slight_smile:

amusez vous bien :slight_smile:

J'ai trop l'impression d'être vraiment une quiche :frowning:

Je ne sais pas si je dois poursuivre sur ce post ou en créer un autre ... mais c'est pour alimenter mon ESP32 par une source extérieur.

Pour me permettre de rendre autonome ma télécommande.

Branché sur le PC, ça fonctionne bien --> dès que je branche mon transmetteur, je vois le moniteur de mon Récepteur s'animer avec les données.

Si je branche mon Transmetteur sur une alimentation externe --> Le récepteur ne reçoit rien :frowning:

Il me semble pourtant correctement faire le digramme. Alimenté par la PIN +5V.

Voici mon diagramme :

quelle alim ?

pour l'instant j'utilise comme ce qu'il y a sur la photo, une alimentation réglable que je règle avec une sortie de 5V. Mais l'idée serait d'utiliser une batterie 18650 (3,7V)

vous avez réglé le courant max dispo?

cad ?
J'ai réglé avec une sortie de 5V

Avec les alims de labo on règle la tension que l'on souhaite avoir, mais aussi le courant max que peut fournir l'alim de labo

➜ mettez au moins 500mA, ça correspond à ce que fournit votre USB

Je crois que j'avais 9A de réglé dessus :open_mouth:

Bon j'ai revérifié et réglé 1A, ca ne marche toujours pas.
En mettant une pile 3,7V 2000mAh , ca ne marche pas non plus.

l'ESP32 est bien alimenté, je cois la led qui s'allume mais le récepteur ne recoit pas