Aller au contenu


Photo
- - - - -

Erreur dans mon code pour mon robot à base d'ESP8266


2 réponses à ce sujet

#1 Gamepigeek

Gamepigeek

    Membre

  • Membres
  • 61 messages
  • Gender:Male
  • Location:Auxerre

Posté 06 avril 2021 - 09:30

Bonjour a toutes et tous,

 

Je cherche a connecter un NodeMCU a base d'ESP8266 pour "vigiboter" un train lego.

 

J'ai utilisé l'exemple de @Mike118 modifié par @Firened sans succès car j'obtiens l'erreur : 

void writePiSerial()':
sketch_apr06a:237:34: error: 'struct TrameRx' has no member named 'choixCameras'
   trameTx.choixCameras = trameRx.choixCameras;
                                  ^
exit status 1
'struct TrameRx' has no member named 'choixCameras'

le code est : 

#include <WiFi.h>
#include <ESP8266WiFi.h>
 
//ici c'est simplement en tant que serveur :P
const char* ssid = "your_ssid";
const char* pass = "your_pass";
// Set your Static IP address
IPAddress local_IP(192, 168, 1, 61);
// Set your Gateway IP address
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
 
 
// Meta Type :
 
typedef struct {
  union {
    struct {
      int16_t x;
      int16_t y;
    };
    int16_t coordonnees[2];
    uint8_t bytes[4];
  };
} Point;
 
typedef struct {
  union {
    struct {
      int8_t x;
      int8_t y;
      int8_t z;
    };
    uint8_t bytes[3];
  };
} Vitesses;
 
 
// CONFIG
 
//#define PISERIAL Serial
#define NBPOSITIONS 2
#define FAILSAFE 250 // ms
 
 
// TTS
 
#define TTSBUFFERSIZE 255
uint8_t ttsBuffer[TTSBUFFERSIZE];
uint8_t ttsCurseur = 0;
 
 
// TX
 
#define TXFRAMESIZE (NBPOSITIONS * 4 + 17)
 
typedef struct {
  union {
    struct {
      uint8_t sync[4];               // 4
      Point positions[NBPOSITIONS];  // NBPOSITIONS * 4
      uint16_t val16[2];             // 2 * 2
      uint8_t choixCameras;          // 1
      Vitesses vitesses;             // 3
      uint8_t interrupteurs;         // 1
      uint8_t val8[4];               // 4
    };
 
    uint8_t bytes[TXFRAMESIZE];
  };
} TrameTx;
 
 
// RX
 
#define RXFRAMESIZE (NBPOSITIONS * 4 + 9)
 
typedef struct {
  union {
    struct {                       // Sizes
      uint8_t sync[4];              // 4
      Point positions[NBPOSITIONS]; // NBPOSITIONS * 4      uint8_t choixCameras;         // 1
      Vitesses vitesses;            // 3
      uint8_t interrupteurs;        // 1
    };
 
    uint8_t bytes[RXFRAMESIZE];
  };
} TrameRx;
 
 
TrameTx trameTx;
TrameRx trameRx;
 
uint32_t lastTrameTimestamp = millis();
uint32_t lastSleepBeacon;
 
WiFiServer server(7070);  //ESP server port
WiFiClient client;
 
void setup()
{
  Serial.begin(115200);
  Serial.println();
 
  WiFi.begin("SSID", "PASS");
 
  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
 
  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
}
 
void loop() {
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
 
  if (readPiSerial()) {
    // each time we receive a full trame run repeatedly:
    // use values inside trameRx to tell your robot how to move ...
    // trameRx.vitesses.x , trameRx.vitesses.y, trameRx.vitesses.z
    // trameRx.positions[i].x trameRx.positions[i].y  etc....
 
    
 
    writePiSerial();
    lastTrameTimestamp = millis();
  }
  if ( millis() - lastTrameTimestamp > FAILSAFE ) {
    if ((millis() - lastSleepBeacon > 10000) ) { // every 10 seconds
      writePiSerial();                        // Beacon to say that the robot is alive
      lastSleepBeacon = millis();
    }
    // Stop the robot in case the robot lost connection with the Pi
    
  } else {
    // put your main code here, to run repeatedly:
    // avoid abstacle, run speed ...
    
  }
  
}
 
 
bool readPiSerial() {
  uint8_t current;
  static uint8_t lastType = 0;
  static uint8_t n = 0;
  static uint8_t frame[RXFRAMESIZE];
  static byte lastClientState = 0;
  if (client.connected()) {
    if (!lastClientState) {
      lastClientState = 1;
      Serial.println("New Client.");
    }
    while (client.available()) {
      current = client.read();
      //Serial.write(current); //debug
 
      switch (n) {
 
        case 0:
          if (current == '$')
            n = 1;
          break;
 
        case 1:
          if (current != 'T' && lastType == 'T')
            writeTtsBuffer('\n');
 
          if (current == 'S' || current == 'T') {
            lastType = current;
            n = 2;
          } else
            n = 0;
          break;
 
        default:
          frame[n++] = current;
 
          if (n == RXFRAMESIZE) {
 
            if (lastType == 'T') {
 
              for (uint8_t i = 4; i < RXFRAMESIZE; i++) // Do not send the 4 sync data in tts
                writeTtsBuffer(frame[i]);
 
            } else if (lastType == 'S') {
 
              for (uint8_t p = 0; p < RXFRAMESIZE; p++)
                trameRx.bytes[p] = frame[p];
 
            }
            n = 0;
            return true;
          }
          //break;
      }
    }
  } else { //if current client is not actively connected anymore, disconnect and wait for new client
    if (lastClientState) {
      lastClientState = 0;
      // close the connection:
      client.stop();
      Serial.println("Client Disconnected.");
    }
    client = server.available();   // listen for incoming clients
  }
  return false;
}
 
void writePiSerial() {
  // Header, do not modify
  trameTx.sync[0] = '$';
  trameTx.sync[1] = 'R';
  trameTx.sync[2] = ' ';
  trameTx.sync[3] = ' ';
 
  // modify the feedback according your need. By default we copy the trameRx content ...
  for (uint8_t i = 0; i < NBPOSITIONS; i++) {
    trameTx.positions[i].x = trameRx.positions[i].x;
    trameTx.positions[i].y = trameRx.positions[i].y;
  }
  trameTx.val16[0] = 0;   // Voltage (will be updated by Raspberry pi)
  trameTx.val16[1] = 0;   // Percent (will be updated by Raspberry pi)
  trameTx.choixCameras = trameRx.choixCameras;
  trameTx.vitesses.x = trameRx.vitesses.x;
  trameTx.vitesses.y = trameRx.vitesses.y;
  trameTx.vitesses.z = trameRx.vitesses.z;
  trameTx.interrupteurs = trameRx.interrupteurs;
  trameTx.val8[0] = 0;   // CPU load (will be updated by Raspberry pi)
  trameTx.val8[1] = 0;   // Soc temp (will be updated by Raspberry pi)
  trameTx.val8[2] = 0;   // link (will be updated by Raspberry pi)
  trameTx.val8[3] = 0;   // RSSI (will be updated by Raspberry pi)
 
  for ( uint8_t i = 0; i < TXFRAMESIZE; i++)
    client.write(trameTx.bytes[i]);
}
 
void displayTtsBuffer (uint8_t * ttsBuffer, uint8_t bufferSize) {
  // you can modify this function to display text on a screen depending on your hardware...
  for ( uint8_t i = 0; i < bufferSize; i++) {
    Serial.write(ttsBuffer[i]);
  }
  Serial.println("");
}
 
void writeTtsBuffer( uint8_t ttsChar) {
  static uint8_t ttsCurseur = 0;
  if ( ttsCurseur < TTSBUFFERSIZE && ttsChar != '\n') {
    ttsBuffer[ttsCurseur] = ttsChar;
    ttsCurseur ++;
  }
  if ( ttsCurseur == TTSBUFFERSIZE || ttsChar == '\n') {
    displayTtsBuffer (ttsBuffer, ttsCurseur);
    ttsCurseur = 0;
  }
}

Merci de votre aide !

 

Pierre


Pierre

 

Pour visiter mon site perso auto hébergé, cliquez sur ce : Lien.

Je possède des robots sur Vigibot, n'hésitez pas a y faire un tour et demander l'accès au pilotage x).


#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 06 avril 2021 - 09:36

tu as pas su copier coller la structure correctement ... 

 

#define RXFRAMESIZE (NBPOSITIONS * 4 + 9)

typedef struct {
  union {
    struct {                       // Sizes
      uint8_t sync[4];              // 4
      Point positions[NBPOSITIONS]; // NBPOSITIONS * 4
      uint8_t choixCameras;         // 1
      Vitesses vitesses;            // 3
      uint8_t interrupteurs;        // 1
    };

    uint8_t bytes[RXFRAMESIZE];
  };
} TrameRx;

Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 firened

firened

    Membre

  • Membres
  • 44 messages
  • Gender:Male

Posté 07 avril 2021 - 11:19

I recommend using a ESP 32 because the esp8266 only has one core, which means the the codes and the Wi-Fi stack will shared time on the processor, causing delays from time to time. also this code might need some adjustments to work on the esp8266



Répondre à ce sujet



  


0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users