programme et module EasyVR

Bonjour à tous,
je suis nouveau sur ce forum et j'espère y trouver des réponses à un problème ( et je n'en doute pas ! ) qui est le suivant:
pour un projet de TPE j'ai choisi de me baser sur la reconnaissance vocale en domotique. J'ai donc fait l'acquisition d'un module EasyVR, le shield qui lui correspond ainsi qu'une carte arduino Uno. Maintenant, je cherche ( et ça devient très urgent pour moi ) à allumer/éteindre une led par la voix.
J'ai donc écrit grâce à des conseils trouvés sur la toile un petit programme et j'aimerai dans un premier temps que quelqu'un me dise si je n'ai pas fait d'erreur et s'il convient pour ce que je veux en faire ( je ne peux pas le tester avec l'arduino car je n'arrive pas à faire un "reset" d'un autre petit programme, encore un problème à résoudre !).
Le programme est le suivant:

#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
  #include "SoftwareSerial.h"
  SoftwareSerial port(12,13);

#endif

#include "EasyVR.h"
EasyVR easyvr(port);

//Groupes et Commandes
enum Groups
{
  GROUP_0 = 0,
  GROUP_1 = 1,
};

enum Group0
{
  GO_ROBOT = 0,
};

enum Group1
{
  G1_HAUT = 0,
  G1_ETEINT = 1,
};


EasyVRBridge bridge;

int8_t group, idx;


void setup()
{
   
  //bridge mode?
  if (bridge.check())
  {
    cli();
    bridge.loop(0, 1, 12, 13);
  }
  //fonctionnement normale
  Serial.begin(9600);
  port.begin(9600);
  
  if (!easyvr.detect())
  {
    Serial.println("easyVR not detected!");
    for(;;);
  }
  easyvr.setPinOutput(EasyVR::IO1, LOW);
  Serial.println("EasyVR detected!");
   easyvr.setTimeout(5);
  easyvr.setLanguage(5);
  
  group = EasyVR::TRIGGER; //lancement du groupe (customisé)
  pinMode(12, OUTPUT);
}

void action();

void loop()
{
  easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED allumée/ module sur écoute
  
  Serial.print("Say a command in Group ");
  Serial.println(group);
  easyvr.recognizeCommand(group);
  
  do
  {
    //peut réaliser des processus pendant l'attente de la "spoken command"
  }
  while (!easyvr.hasFinished());

  easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off

  idx = easyvr.getWord();
  if (idx >= 0)
  {
   // built-in trigger (ROBOT)
   // group = GROUP_X; jump to another group X
    return;
  }
  idx = easyvr.getWord();
  if (idx >= 0)
  {
    //print debug message
    uint8_t train = 0;
    char name[32];
    Serial.print("Command: ");
    Serial.print(idx);
    if (easyvr.dumpCommand(group, idx, name, train))
    {
      Serial.print(" = ");
      Serial.println(name);
    }
    else
      Serial.println();
    easyvr.playSound(0, EasyVR::VOL_FULL);
    //perform some action
    action();
  }
  else // errors or timeout
  {
    if (easyvr.isTimeout())
      Serial.println("Timed out, try again...");
      int16_t err = easyvr.getError();
      if (err >= 0)
      {
        Serial.println("Error ");
        Serial.println(err, HEX);
      }
  }
}

void action()// la LED s'allume quand on dit ALLUME et s'éteint avec ETEINS
{
  switch (group)
  {
    case GROUP_1:
      switch (idx)
      {
      case G1_HAUT:
           digitalWrite(12, HIGH);
           group = GROUP_1;
           break;
        case G1_ETEINT:
          digitalWrite(12, LOW);
          group = GROUP_1;
          break;
        }
        break;
    }
}

Merci de vos réponses que j'espère rapides et instructives.

bonjour,

je ne peux pas le tester avec l'arduino car je n'arrive pas à faire un "reset" d'un autre petit programme, encore un problème à résoudre !).

?????
c'est a dire?
tu as essayé de programme le shield avec easycommander déjà et tu veux virer ce que tu as déjà fait?
il y a une commande dans un menu du programme pour ca.

si c'est un prog via l'ide que tu as dans le nono, pas de pb, il suffit d'uploader le nouveau prog dedans, ca écrase l'autre.

pas trop pris le temps de vérifier ton code, mais si tu n'as pas programmé le shield en fonction, ca marchera pas :wink:

Merci beaucoup de m'avoir répondu !
Pour répondre à ta question infobarquee, le programme que je n'arrive pas à effacer sur l'arduino est le "Blink" ( pour faire clignoter une led à intervalle donné ) et quand je veux téléverser le nouveau programme, le logiciel ARDUINO affiche l'erreur:
avrdude: stk500_getsync(): not in sync: resp=0x00

Ensuite, avec easyvrcommander, on peut générer un code mais c'est pour l'arduino non ? Et d'ailleurs, je ne peux pas générer ce code: le message "no code generation template is avalaible ! " As-tu un exemple ou la marche à suivre pour programmer le shield car je ne sais pas du tout comment faire ! (je n'ai pour ainsi dire que mon programme d'arduino )

Je te remercie encore d'avoir envoyer une réponse (ça fait un bon bout de temps que je galère !!! :astonished:) et j'espere que tu pourras encore m'aider :slight_smile:

Bonjour,

Mirageleader:
Pour répondre à ta question infobarquee, le programme que je n'arrive pas à effacer sur l'arduino est le "Blink" ( pour faire clignoter une led à intervalle donné ) et quand je veux téléverser le nouveau programme, le logiciel ARDUINO affiche l'erreur:
avrdude: stk500_getsync(): not in sync: resp=0x00

Avant de continuer il faut résoudre le problème suivaant :

avrdude: stk500_getsync(): not in sync: resp=0x00

Fait une recherche sur googlo avec " avrdude: stk500_getsync(): not in sync: resp=0x00" et tu auras des pistes de recherche, par exemple : Erreur Arduino UNO : avrdude: stk500_getsync(): not in sync

Bonsoir,
Un des deux est peut être de trop

oui, tu as raison je n’ai pas fait attention.
C’est à moi ou aux modérateurs de l’enlever ?

Bonjour à tous,
je vois que certains sont en lignes, ceux-ci pourraient-ils continuer de m'aider en regardant mon programme ?
Merci à tout le monde !

Bonjour,

J'ai regardé ton programme et apparemment tu utilises 2 fois le pin Digital 12.

Ce pin sert déjà pour la communication du module par l'intermédiaire du SoftSerial:

SoftwareSerial port(12,13);

Tu ne peux donc pas utiliser les pins 12 et 13 qui servent déjà pour le module EasyVR.
Choisi le pin 4 par exemple.

Je te propose donc de corriger ton code comme ceci:

/* EASY VR SHIELD TEST 1 */

#include "Arduino.h"
#include "SoftwareSerial.h"
SoftwareSerial port(12,13);

#include "EasyVR.h"
EasyVR easyvr(port);

#define LED_PIN 4 // déclare la led sur le pin de son choix, ici le 4 est choisi


//Groupes et Commandes
enum Groups
{
  GROUP_0 = 0,
  GROUP_1 = 1,
};

enum Group0
{
  GO_ROBOT = 0,
};

enum Group1
{
  G1_HAUT = 0,
  G1_ETEINT = 1,
};


EasyVRBridge bridge;

int8_t group, idx;


void setup()
{
   
  //bridge mode?
  if (bridge.check())
  {
    cli();
    bridge.loop(0, 1, 12, 13);
  }
  //fonctionnement normale
  Serial.begin(9600);
  port.begin(9600);
  
  if (!easyvr.detect())
  {
    Serial.println("easyVR not detected!");
    for(;;);
  }
  easyvr.setPinOutput(EasyVR::IO1, LOW);
  Serial.println("EasyVR detected!");
   easyvr.setTimeout(5);
  easyvr.setLanguage(5);
  
  group = EasyVR::TRIGGER; //lancement du groupe (customisé)
  
  
  pinMode(LED_PIN, OUTPUT); // NE PAS METTRE PIN 12 OU 13 DEJA UTILISES PAR LE SERIAL
}

void action();

void loop()
{
  easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED allumée/ module sur écoute
  
  Serial.print("Say a command in Group ");
  Serial.println(group);
  easyvr.recognizeCommand(group);
  
  do
  {
    //peut réaliser des processus pendant l'attente de la "spoken command"
  }
  while (!easyvr.hasFinished());

  easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off

  idx = easyvr.getWord();
  if (idx >= 0)
  {
   // built-in trigger (ROBOT)
   // group = GROUP_X; jump to another group X
    return;
  }
  idx = easyvr.getWord();
  if (idx >= 0)
  {
    //print debug message
    uint8_t train = 0;
    char name[32];
    Serial.print("Command: ");
    Serial.print(idx);
    if (easyvr.dumpCommand(group, idx, name, train))
    {
      Serial.print(" = ");
      Serial.println(name);
    }
    else
      Serial.println();
    easyvr.playSound(0, EasyVR::VOL_FULL);
    //perform some action
    action();
  }
  else // errors or timeout
  {
    if (easyvr.isTimeout())
      Serial.println("Timed out, try again...");
      int16_t err = easyvr.getError();
      if (err >= 0)
      {
        Serial.println("Error ");
        Serial.println(err, HEX);
      }
  }
}

void action()// la LED s'allume quand on dit ALLUME et s'éteint avec ETEINS
{
  switch (group)
  {
    case GROUP_1:
      switch (idx)
      {
      case G1_HAUT:
           digitalWrite(LED_PIN, HIGH);
           group = GROUP_1;
           break;
        case G1_ETEINT:
          digitalWrite(LED_PIN, LOW);
          group = GROUP_1;
          break;
        }
        break;
    }
}

Sinon le programme se compile sans problème donc cela doit fonctionner.

:wink:

Mais les problème d' "avrdude: stk500_getsync(): not in sync: resp=0x00" sont résolus ??

oui, le problème de "avrdude: stk500_getsync(): not in sync: resp=0x00" est réglé: pour compiler, il faut enlever le blindage EasyVR ou mettre le jumper sur SW (SoftWare).
Merci pour le coup de main john_lenfr, je vais aussitôt essayer. Je n'avais jamais fait attention que j'avais déja utiliser le pin 12 !

C'est tout a fait ça, je peux garder le blindage et juste bouger le jumper. Après le message de john_lenfr j'ai mis ma led sur D4 comme marqué dans le programme, j'ai de nouveau compiler mais cela ne fonctionne toujours pas :., y a-t-il un problème au niveau du Trigger ?
Ou au niveau de l'énumération des groupes peut-être ?
Merci de votre aide précieuse !

( un passé dans l'armée de l'air AlienArea51 ? ) :wink:

Mirageleader:
C’est tout a fait ça, je peux garder le blindage et juste bouger le jumper. Après le message de john_lenfr j’ai mis ma led sur D4 comme marqué dans le programme, j’ai de nouveau compiler mais cela ne fonctionne toujours pas :., y a-t-il un problème au niveau du Trigger ?
Ou au niveau de l’énumération des groupes peut-être ?
Merci de votre aide précieuse !

Je ne pense pas que cela vienne des groupes si tu as respecté la procédure d’upload des voix dans le chip avec le logiciel d’EasyVR normalement pas de problème.

Que se passe-t-il exactement, à quel moment c’est bloqué?

Tu arrives à mettre le programme dans l’arduino mais après qu’est ce qu’il se passe?

As tu la led verte du port IO1 de l’easyVR qui s’allume?
LA led de l’arduino est-elle allumée?
As tu quelque chose qui s’affiche dans le terminal quand tu active la liaison série avec le PC?

Donnes nous plus de détails ou fait une vidéo sinon on pourra pas t’aider :grin:

Ok je pense avoir trouvé pourquoi cela ne marche pas.

A la ligne:

group = EasyVR::TRIGGER; //lancement du groupe (customisé)

Il faut remplacer EasyVR::TRIGGER; par le groupe de ton choix, et comme tu travailles sur le groupe 1 il faut donc mettre:

group = GROUP_1; //lancement du groupe (customisé)

Ainsi le code complet donne:

/* EASY VR SHIELD TEST 1 */

#include "Arduino.h"
#include "SoftwareSerial.h"
SoftwareSerial port(12,13);

#include "EasyVR.h"
EasyVR easyvr(port);

#define LED_PIN 4 // déclare la led sur le pin de son choix, ici le 4 est choisi


//Groupes et Commandes
enum Groups
{
  GROUP_0 = 0,
  GROUP_1 = 1,
};

enum Group0
{
  GO_ROBOT = 0,
};

enum Group1
{
  G1_HAUT = 0,
  G1_ETEINT = 1,
};


EasyVRBridge bridge;

int8_t group, idx;


void setup()
{
   
  //bridge mode?
  if (bridge.check())
  {
    cli();
    bridge.loop(0, 1, 12, 13);
  }
  //fonctionnement normale
  Serial.begin(9600);
  port.begin(9600);
  
  if (!easyvr.detect())
  {
    Serial.println("easyVR not detected!");
    for(;;);
  }
  easyvr.setPinOutput(EasyVR::IO1, LOW);
  Serial.println("EasyVR detected!");
   easyvr.setTimeout(5);
  easyvr.setLanguage(5);
  
  //group = EasyVR::TRIGGER; //lancement du groupe (customisé)
  group = GROUP_1; //lancement du groupe (customisé)
  
  pinMode(LED_PIN, OUTPUT); // NE PAS METTRE PIN 12 OU 13 DEJA UTILISES PAR LE SERIAL
}

void action();

void loop()
{
  easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED allumée/ module sur écoute
  
  Serial.print("Say a command in Group ");
  Serial.println(group);
  easyvr.recognizeCommand(group);
  
  do
  {
    //peut réaliser des processus pendant l'attente de la "spoken command"
  }
  while (!easyvr.hasFinished());

  easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off
  
  idx = easyvr.getWord();
  idx = easyvr.getCommand();
  if (idx >= 0)
  {
    //print debug message
    uint8_t train = 0;
    char name[32];
    Serial.print("Command: ");
    Serial.print(idx);
    if (easyvr.dumpCommand(group, idx, name, train))
    {
      Serial.print(" = ");
      Serial.println(name);
    }
    else
      Serial.println();
    easyvr.playSound(0, EasyVR::VOL_FULL);
    //perform some action
    action();
  }
  else // errors or timeout
  {
    if (easyvr.isTimeout())
      Serial.println("Timed out, try again...");
      int16_t err = easyvr.getError();
      if (err >= 0)
      {
        Serial.println("Error ");
        Serial.println(err, HEX);
      }
  }
}

void action()// la LED s'allume quand on dit ALLUME et s'éteint avec ETEINS
{
  switch (group)
  {
    case GROUP_1:
      switch (idx)
      {
      case G1_HAUT:
           digitalWrite(LED_PIN, HIGH);
           Serial.println("led allumee");
           group = GROUP_1;
           break;
        case G1_ETEINT:
          digitalWrite(LED_PIN, LOW);
           Serial.println("led eteinte");
          group = GROUP_1;
          break;
        }
        break;
    }
}

Après ça je pense que c’est bon si tu as bien enregistré tes voix cela devrait fonctionner.

Pour le vérifier, quand tu ouvres le terminal en 9600bauds avec l’IDE Arduino tu devrais avoir:

EasyVR detected!
Say a command in Group 1
Timed out, try again…
Say a command in Group 1
Timed out, try again…
Say a command in Group 1
Timed out, try again…

CA FONCTIONNE !!!!
Merci beaucoup à tous, c'est vraiment super chouette !!!!
Je vais pouvoir bien m'amuser !!!
C'est sympa de m'avoir aidé jusqu'au bout, maintenant, je sais bien comment faire et j'ai compris, je vais pouvoir expliquer à d'autres s'il le faut !
Pour vous dire, j'ai poster une autre demande d'aide sur un autre forum bien connu mais sans réponse donc je sais sur lequel je vais rester !!!!
Merci pour votre aide bien utile !
A bientôt

Absolument l'ami , engagé à la BA110 , époque des Mirages III , IV , et F1 , la belle époque smiley-grin ,reste FAN d'aviation de chasse ,même si c'est une arme de guerre (dont je suis contre) , mais plus pour le fun (la technologie et l'aviation en général) ,pour répondre à ta question smiley-wink

Je suis comme toi un passionné d'aéronautique militaire et étant en première SI, c'est une filière pleine de technologie de pointe interessante.
On pourra peut-être échanger sur le sujet un jour !