Easyvr 3 et rc-switch

Bonjour,
J'utilise la librairie arduino.h et rc-switch dans mon prog.
Au debut tout fonctionne, mais au bout de quelques minutes, plus rien.
J'ai remarqué qu'avec plusieurs librairies, je rencontré le même problème.
Par exemple arduino.h et servo, mes moteurs font des petits sauts par exemples.
Est ce que je suis le seul à rencontrer ce genre de problèmes ?
C'est assez déconcertant...

arduino.h fait partie de tous les projets Arduino. C'est la base qui permet d'avoir facilement accès à tout ce qu'offre l'environnement Arduino de manière simple

Si vous avez des soucis particuliers, merci de lire "Les bonnes pratiques du Forum Francophone” et ouvrez un fil de discussion approprié par problème.

Sans le code, réponse impossible :woozy_face:

oups pardon !

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
#define TELECOMMANDE_VISIERE 3     //retour info arduino nano telecommande RF433
#define TELECOMMANDE_YEUX 4        //retour info arduino nano telecommande RF433
#define TELECOMMANDE_AILES 5       //retour info arduino nano telecommande RF433
#define TELECOMMANDE_LEDS 6        //retour info arduino nano telecommande RF433
#define CONNEXION_CASQUE_ARMURE 7  //retour info interconnection arduino uno (easyvr) et arduino armure (blocage des sons du casque)
#define LEDS 10 //bandeau de leds
#define YEUX 14  //A0
int position_visiere=1;
bool raspi=false;

#include "Arduino.h"
#if !defined(SERIAL_PORT_MONITOR)
  #error "Arduino version not supported. Please update your IDE to the latest version."
#endif

#if defined(__SAMD21G18A__)
  // Shield Jumper on HW (for Zero, use Programming Port)
  #define port SERIAL_PORT_HARDWARE
  #define pcSerial SERIAL_PORT_MONITOR
#elif defined(SERIAL_PORT_USBVIRTUAL)
  // Shield Jumper on HW (for Leonardo and Due, use Native Port)
  #define port SERIAL_PORT_HARDWARE
  #define pcSerial SERIAL_PORT_USBVIRTUAL
#else
  // Shield Jumper on SW (using pins 12/13 or 8/9 as RX/TX)
  #include "SoftwareSerial.h"
  SoftwareSerial port(12, 13);
  #define pcSerial SERIAL_PORT_MONITOR
#endif

#include "EasyVR.h"

EasyVR easyvr(port);

//Groups and Commands
enum Groups
{
  GROUP_0  = 0,
  GROUP_1  = 1,
};

enum Group0 
{
  G0_JARVIS = 0,
};

enum Group1 
{
  G1_OUVERTURE_CASQUE = 0,
  G1_FERMETURE_CASQUE = 1,
  G1_MUSIQUE = 2,
  G1_RESTE_EN_ALERTE = 3,
  G1_TU_ES_LA = 4,
  G1_MODE_ALPHA = 5,
  G1_OK_C_EST_PARTI = 6,
  G1_ARRETE_LA_MUSIQUE = 7,
  G1_DESACTIVE_MODE_COMBAT = 8,
  G1_ACTIVE_MODE_ALPHA = 9,
  G1_ARRETE_LE_MODE_ALPHA = 10,
};

//Grammars and Words
enum Wordsets
{
  SET_1  = -1,
  SET_2  = -2,
  SET_3  = -3,
};

enum Wordset1 
{
  S1_ACTION = 0,
  S1_MOVE = 1,
  S1_TURN = 2,
  S1_RUN = 3,
  S1_LOOK = 4,
  S1_ATTACK = 5,
  S1_STOP = 6,
  S1_HELLO = 7,
};

enum Wordset2 
{
  S2_LEFT = 0,
  S2_RIGHT = 1,
  S2_UP = 2,
  S2_DOWN = 3,
  S2_FORWARD = 4,
  S2_BACKWARD = 5,
};

enum Wordset3 
{
  S3_ZERO = 0,
  S3_ONE = 1,
  S3_TWO = 2,
  S3_THREE = 3,
  S3_FOUR = 4,
  S3_FIVE = 5,
  S3_SIX = 6,
  S3_SEVEN = 7,
  S3_EIGHT = 8,
  S3_NINE = 9,
  S3_TEN = 10,
};


// use negative group for wordsets
int8_t group, idx;

void setup()
{
  // setup PC serial port
  pcSerial.begin(9600);
bridge:
  // bridge mode?
  int mode = easyvr.bridgeRequested(pcSerial);
  switch (mode)
  {
  case EasyVR::BRIDGE_NONE:
    // setup EasyVR serial port
    port.begin(9600);
    // run normally
    pcSerial.println(F("Bridge not requested, run normally"));
    pcSerial.println(F("---"));
    break;
    
  case EasyVR::BRIDGE_NORMAL:
    // setup EasyVR serial port (low speed)
    port.begin(9600);
    // soft-connect the two serial ports (PC and EasyVR)
    easyvr.bridgeLoop(pcSerial);
    // resume normally if aborted
    pcSerial.println(F("Bridge connection aborted"));
    pcSerial.println(F("---"));
    break;
    
  case EasyVR::BRIDGE_BOOT:
    // setup EasyVR serial port (high speed)
    port.begin(115200);
    pcSerial.end();
    pcSerial.begin(115200);
    // soft-connect the two serial ports (PC and EasyVR)
    easyvr.bridgeLoop(pcSerial);
    // resume normally if aborted
    pcSerial.println(F("Bridge connection aborted"));
    pcSerial.println(F("---"));
    break;
  }

  // initialize EasyVR  
  while (!easyvr.detect())
  {
    pcSerial.println(F("EasyVR not detected!"));
    for (int i = 0; i < 10; ++i)
    {
      if (pcSerial.read() == '?')
        goto bridge;
      delay(100);
    }
  }

  pcSerial.print(F("EasyVR detected, version "));
  pcSerial.print(easyvr.getID());

  if (easyvr.getID() < EasyVR::EASYVR3)
    easyvr.setPinOutput(EasyVR::IO1, LOW); // Shield 2.0 LED off

  if (easyvr.getID() < EasyVR::EASYVR)
    pcSerial.print(F(" = VRbot module"));
  else if (easyvr.getID() < EasyVR::EASYVR2)
    pcSerial.print(F(" = EasyVR module"));
  else if (easyvr.getID() < EasyVR::EASYVR3)
    pcSerial.print(F(" = EasyVR 2 module"));
  else
    pcSerial.print(F(" = EasyVR 3 module"));
  pcSerial.print(F(", FW Rev."));
  pcSerial.println(easyvr.getID() & 7);

  easyvr.setDelay(0); // speed-up replies

  easyvr.setTimeout(5);
  easyvr.setLanguage(5); //<-- same language set on EasyVR Commander when code was generated

  group = EasyVR::TRIGGER; //<-- start group (customize)

  //****************** CODE IRONMAN
  pinMode(TELECOMMANDE_VISIERE, INPUT); //interupteur (D3)
  pinMode(TELECOMMANDE_YEUX, INPUT); //interupteur (D4)
  pinMode(TELECOMMANDE_AILES, INPUT); //interupteur (D5)
  pinMode(TELECOMMANDE_LEDS, INPUT); //interupteur (D6)
  pinMode(CONNEXION_CASQUE_ARMURE, INPUT); //interupteur (D7)
  pinMode(LEDS, OUTPUT); //interupteur (D7)
  pinMode(YEUX, OUTPUT); //oeil 1 (A0)
  analogWrite(YEUX,0);
  
  mySwitch.enableReceive(0);
  
}

void loop()
{
  if (easyvr.getID() < EasyVR::EASYVR3)
    easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening)

  if (group < 0) // SI wordset/grammar
  {
    pcSerial.print("Say a word in Wordset ");
    pcSerial.println(-group);
    easyvr.recognizeWord(-group);
  }
  else // SD group
  {
    pcSerial.print("Say a command in Group ");
    pcSerial.println(group);
    easyvr.recognizeCommand(group);
  }

  do
  {
    // allows Commander to request bridge on Zero (may interfere with user protocol)
    if (pcSerial.read() == '?')
    {
      setup();
      return;
    }
    // <<-- can do some processing here, while the module is busy
    if (mySwitch.available()) {
     long int value = mySwitch.getReceivedValue();
     pcSerial.println(value);
     mySwitch.resetAvailable();
     /*if(value == 7061154){
        bp1=1;
      }*/
    }
  }
  while (!easyvr.hasFinished());
  
  if (easyvr.getID() < EasyVR::EASYVR3)
    easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off

  idx = easyvr.getWord();
  if (idx == 0 && group == EasyVR::TRIGGER)
  {
    // beep
    //easyvr.playSound(0, EasyVR::VOL_FULL);
    // print debug message
    pcSerial.println("Word: ROBOT");
    // write your action code here
    // group = GROUP_X\SET_X; <-- jump to another group or wordset
    return;
  }
  else if (idx >= 0)
  {
    // beep
    //easyvr.playSound(0, EasyVR::VOL_FULL);
    // print debug message
    uint8_t flags = 0, num = 0;
    char name[32];
    pcSerial.print("Word: ");
    pcSerial.print(idx);
    if (easyvr.dumpGrammar(-group, flags, num))
    {
      for (uint8_t pos = 0; pos < num; ++pos)
      {
        if (!easyvr.getNextWordLabel(name))
          break;
        if (pos != idx)
          continue;
        pcSerial.print(F(" = "));
        pcSerial.println(name);
        break;
      }
    }
    // perform some action
    action();
    return;
  }
  idx = easyvr.getCommand();
  if (idx >= 0)
  {
    // beep
    
    // print debug message
    uint8_t train = 0;
    char name[32];
    pcSerial.print("Command: ");
    pcSerial.print(idx);
    if (easyvr.dumpCommand(group, idx, name, train))
    {
      pcSerial.print(" = ");
      pcSerial.println(name);
    }
    else
      pcSerial.println();
    // perform some action
    action();
  }
  else // errors or timeout
  {
    if (easyvr.isTimeout())
      pcSerial.println("Timed out, try again...");
    int16_t err = easyvr.getError();
    if (err >= 0)
    {
      pcSerial.print("Error ");
      pcSerial.println(err, HEX);
    }
    group = GROUP_0;
  }



  
}

void action()
{
  switch (group)
  {
  case GROUP_0:
    switch (idx)
    {
    case G0_JARVIS:
      pcSerial.println("oui_monsieur");
      easyvr.playSound(1, EasyVR::VOL_FULL); //if(raspi == HIGH)
      group = GROUP_1;
      // write your action code here
      //group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    }
    break;
  case GROUP_1:
    switch (idx)
    {
    case G1_OUVERTURE_CASQUE:
      pcSerial.println("ouverture_casque");
      easyvr.playSound(3, EasyVR::VOL_FULL); //if(raspi == HIGH) 
      position_visiere=1;
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case G1_FERMETURE_CASQUE:
      pcSerial.println("fermeture_casque");
      easyvr.playSound(2, EasyVR::VOL_FULL); //if(raspi == HIGH)  
      delay(1572);
      easyvr.playSound(4, EasyVR::VOL_FULL); //if(raspi == HIGH)  
      position_visiere=0;
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case G1_MUSIQUE:
      pcSerial.println("musique");
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case G1_RESTE_EN_ALERTE:
      pcSerial.println("reste_en_attente");
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case G1_TU_ES_LA:
      pcSerial.println("oui_monsieur");
      easyvr.playSound(1, EasyVR::VOL_FULL); //if(raspi == HIGH) 
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case G1_MODE_ALPHA:
      pcSerial.println("combat");
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case G1_OK_C_EST_PARTI:
      pcSerial.println("c_est_parti");
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case G1_ARRETE_LA_MUSIQUE:
      pcSerial.println("stop_musique");
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case G1_DESACTIVE_MODE_COMBAT:
      pcSerial.println("stop_combat");
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case G1_ACTIVE_MODE_ALPHA:
      pcSerial.println("leds_allume");
      digitalWrite(LEDS,HIGH);
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case G1_ARRETE_LE_MODE_ALPHA:
      pcSerial.println("leds_etteintes");
      digitalWrite(LEDS,LOW);
      group = GROUP_0;
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    }
    break;
  case SET_1:
    switch (idx)
    {
    case S1_ACTION:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S1_MOVE:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S1_TURN:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S1_RUN:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S1_LOOK:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S1_ATTACK:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S1_STOP:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S1_HELLO:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    }
    break;
  case SET_2:
    switch (idx)
    {
    case S2_LEFT:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S2_RIGHT:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S2_UP:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S2_DOWN:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S2_FORWARD:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S2_BACKWARD:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    }
    break;
  case SET_3:
    switch (idx)
    {
    case S3_ZERO:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S3_ONE:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S3_TWO:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S3_THREE:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S3_FOUR:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S3_FIVE:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S3_SIX:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S3_SEVEN:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S3_EIGHT:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S3_NINE:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    case S3_TEN:
      // write your action code here
      // group = GROUP_X\SET_X; <-- or jump to another group or wordset for composite commands
      break;
    }
    break;
  }
}


J'utilise la librairie arduino.h et rc-switch dans mon prog.
Au debut tout fonctionne, mais au bout de quelques minutes, plus rien.

pas de rc-switch dans ce code ?

la communication Software Serial peut-être peu robuste même à 9600 bauds si le flux de données est important (bcp d'interruptions qui bloquent longtemps le processeur). Pour éliminer cette hypothèse faites tourner le code sur une MEGA ou un Arduino qui a au moins 2 ports séries matériels et utilisez un port série hardware

La déclaration de rc-switch se trouve au début de mon code.
Par soucis de place dans mon projet final, je ne peux qu'utiliser un arduino nano.
J'avoue que je sèche sur ce coup, je ne comprends pas pourquoi ça fonctionne qu'un certain temps. Comment puis je debuguer ?

La solution qui est vraiment bateau, c'est que j'utilise un autre nano pour gérer rc-switch... Mais j'aimerai comprendre d'où vient le problème. Fuite mémoire ?

j'avais raté lerc-switch

Je ne connais pas la stabilité de la bibliothèque EasyVR

Bonsoir

ça fait penser à un problème thermique : montée en température du régulateur 5V de al carte Nano , puis abaisssement de la tension par mise en sécurité thermique de la puce

Nous n'avons aucune information sur l'alimentation du montage :rage: alors que les Bonnes Pratiques du Forum Francophone demandent explicitement de bien documenter le montage qui pose problème

Ce qui suit donne également envie de vérifier la manière dont le montage est alimenté

J'ai remarqué qu'avec plusieurs librairies, je rencontré le même problème.
Par exemple arduino.h et servo, mes moteurs font des petits sauts par exemples.

Suffit de demander lol, je ne pensais pas que ça pouvait être source de problème étant donné que la conso du dispositif est moindre.
Pour le moment je passe par l'alimentation usb. Mais je peux essayer via un alim externe :blush: :crossed_fingers:
J'ai testé le code sans la'partie rc-switch pendant 48 heures, pas de soucis. J'ai un rbx12 comme récepteur, je doute que sa consommation pose problème. Mais pourquoi pas.

Suffit de lire Les Bonnes pratiques du Forum francophone ... pour voir que c'est demandé !
Pour ne pas avoir à 'tirer les vers du nez ' . (tout le monde gagne du temps ; le demandeur d'aide et les aidants)


...........

Quand le problème survient est-ce que des composants, des modules ... sont alimentés en 5V via la carte Arduino ?

OK mes excuses, je n'ai pas pris le temps de les lire...
Je vais préparer correctement mon sujet afin de vous l'exposer avec toutes les infos dès demain. Je vous remercie pour votre temps :muscle:

Oui le récepteur rbx et la carte sont alimentes par le nano, pour répondre à la question dans un premier temps :blush:

Ok !

En fait des dysfonctionnements peuvent survenir si le régulateur 5V de la carte Arduino est amené à fournir un courant trop important, doù le besoin d'infos sur la manière dont les divers éléments sont alimentés.

ce lien expose le problème thermique autour du régulateur de al carte Arduino : [Tuto :Régulateur de l'arduino, puissance dans un transistor un peu de thermique](https://forum.arduino.cc/t/tuto-regulateur-de-larduino-puissance-dans-un-transistor-un-peu-de-thermique
/76063)

C'est peut être une fausse piste mais , par éliminations, déductions .... on finit par trouver la solution !

Au top ! Comme dit, je vais faire les choses sérieusement en fournissant tous les éléments afin de trouver la solution et pourquoi pas aider d'autres personnes.
Vous utilisez quel logiciel pour faire les schémas électroniques sur pc ?

je vais faire les choses sérieusement en fournissant tous les éléments afin de trouver la solution et pourquoi pas aider d'autres personnes.

:+1:

Sur ce forum l'Open Souce est privilégié, c'est donc KIcad qui est en vedette

Eagle (pas Open Source) est encore utilisé
Des étudiants ou des lycéens ont accès à Proteus

Perso; par manque de place sur le SSD de ma machine actuelle j'utilise EasyEDA (en ligne)