Go Down

Topic: problema con easyvr shield e newsoftserial.... (Read 1 time) previous topic - next topic

nytro81

Oct 25, 2012, 08:45 pm Last Edit: Oct 29, 2012, 01:32 pm by nytro81 Reason: 1
Salve, avrei x le mani un easyvr shield, ma sto incontrando qualche problemino.... qualcuno di voi ne possiede uno o ci ha messo le mani sopra? Il mio problema consiste nel fatto che dopo aver caricato la libreria, caricato lo sketch di esempio, aprendo il terminal seriale mi dice "EasyVR not detected!".... idee? Grazie!!

pelletta

#1
Oct 25, 2012, 11:52 pm Last Edit: Oct 25, 2012, 11:54 pm by Pelletta Reason: 1
Ho usato un anno fa l'easyvr, solo il modulo senza shield.
Con lo shield non devi fare nessun collegamento basta solo che lo monti sopra l'arduino (almeno credo).
Sicuramente fai un errore con il software, hai letto la documentazione rilasciata dal produttore?
Purtroppo non ce l'ho più sotto mano, non posso aiutarti a fare le prove.

nytro81

In teoria dovrei aver fatto tutto ok... ho connesso prima il modulo direttamente alla seriale in modo da farlo comunicare col commander, per caricare, addestrare nuovi comandi e testare il riconoscimento, e li funziona. Una volta caricate le libreria e sketch non me lo rileva proprio a terminale!!!! Cercando su google ho trovato poco....

nytro81

questo è il codice di prova che sto utilizzando:

/**
  EasyVR Tester
 
  Dump contents of attached EasyVR module
  and exercise it with playback and recognition.
 
  Serial monitor can be used to send a few basic commands:
  'c' - cycles through available command groups
  'b' - cycles through built-in word sets
  's123.' - play back sound 123 if available (or beep)
 
  With EasyVR Shield, the green LED is ON while the module
  is listening (using pin IO1 of EasyVR).
  Successful recognition is acknowledged with a beep.
  Details are displayed on the serial monitor window.

**
  Example code for the EasyVR library v1.0
  Written in 2011 by RoboTech srl for VeeaR <http:://www.veear.eu>

  To the extent possible under law, the author(s) have dedicated all
  copyright and related and neighboring rights to this software to the
  public domain worldwide. This software is distributed without any warranty.

  You should have received a copy of the CC0 Public Domain Dedication
  along with this software.
  If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.
*/

#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
  #include "SoftwareSerial.h"
  SoftwareSerial port(12,13);
#else // Arduino 0022 - use modified NewSoftSerial
  #include "WProgram.h"
  #include "NewSoftSerial.h"
  NewSoftSerial port(12,13);
#endif

#include "EasyVR.h"

EasyVR easyvr(port);

int8_t set = 0;
int8_t group = 0;
uint32_t mask = 0; 
uint8_t train = 0;
char name[32];
bool useCommands = true;

EasyVRBridge bridge;

void setup()
{
  // bridge mode?
  if (bridge.check())
  {
    cli();
    bridge.loop(0, 1, 12, 13);
  }
  // run normally
  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(EasyVR::ITALIAN);
 
  int16_t count = 0;
 
  Serial.print("Sound table: ");
  if (easyvr.dumpSoundTable(name, count))
  {
    Serial.println(name);
    Serial.print("Sound entries: ");
    Serial.println(count);
  }
  else
    Serial.println("n/a");
 
  if (easyvr.getGroupMask(mask))
  {
    uint32_t msk = mask; 
    for (group = 0; group <= EasyVR::PASSWORD; ++group, msk >>= 1)
    {
      if (!(msk & 1)) continue;
      if (group == EasyVR::TRIGGER)
        Serial.print("Trigger: ");
      else if (group == EasyVR::PASSWORD)
        Serial.print("Password: ");
      else
      {
        Serial.print("Group ");
        Serial.print(group);
        Serial.print(": ");
      }
      count = easyvr.getCommandCount(group);
      Serial.println(count);
      for (int8_t idx = 0; idx < count; ++idx)
      {
        if (easyvr.dumpCommand(group, idx, name, train))
        {
          Serial.print(idx);
          Serial.print(" = ");
          Serial.print(name);
          Serial.print(", Trained ");
          Serial.print(train, DEC);
          if (!easyvr.isConflict())
            Serial.println(" times, OK");
          else
          {
            int8_t confl = easyvr.getWord();
            if (confl >= 0)
              Serial.print(" times, Similar to Word ");
            else
            {
              confl = easyvr.getCommand();
              Serial.print(" times, Similar to Command ");
            }
            Serial.println(confl);
          }
        }
      }
    }
  }
  group = 0;
  mask |= 1; // force to use trigger
  useCommands = (mask != 1);
}

const char* ws0[] =
{
  "ROBOT",
};
const char* ws1[] =
{
  "ACTION",
  "MOVE",
  "TURN",
  "RUN",
  "LOOK",
  "ATTACK",
  "STOP",
  "HELLO",
};
const char* ws2[] =
{
  "LEFT",
  "RIGHT",
  "UP",
  "DOWN",
  "FORWARD",
  "BACKWARD",
};
const char* ws3[] =
{
  "ZERO",
  "ONE",
  "TWO",
  "THREE",
  "FOUR",
  "FIVE",
  "SIX",
  "SEVEN",
  "EIGHT",
  "NINE",
  "TEN",
};
const char** ws[] = { ws0, ws1, ws2, ws3 };

bool checkMonitorInput()
{
  if (Serial.available() <= 0)
    return false;
 
  // check console commands
  int16_t rx = Serial.read();
  if (rx == 'b')
  {
    useCommands = false;
    set++;
    if (set > 3)
      set = 0;
  }
  if (rx == 'c')
  {
    useCommands = true;
    do
    {
      group++;
      if (group > EasyVR::PASSWORD)
        group = 0;
    } while (!((mask >> group) & 1));
  }
  if (rx == 's')
  {
    int16_t num = 0;
    delay(5);
    while ((rx = Serial.read()) >= 0)
    {
      if (isdigit(rx))
        num = num * 10 + (rx - '0');
      else
        break;
      delay(5);
    }
    if (rx == '.')
    {
      easyvr.stop();
      easyvr.playSound(num, EasyVR::VOL_DOUBLE);
    }
  }
  if (rx >= 0)
  {
    easyvr.stop();
    Serial.flush();
    return true;
  }
  return false;
}

void loop()
{
  checkMonitorInput();
 
  easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening)
  if (useCommands)
  {
    Serial.print("Say a command in Group ");
    Serial.println(group);
    easyvr.recognizeCommand(group);
  }
  else
  {
    Serial.print("Say a word in Wordset ");
    Serial.println(set);
    easyvr.recognizeWord(set);
  }

  do
  {
    if (checkMonitorInput())
      return;
  }
  while (!easyvr.hasFinished());
 
  easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off

  int16_t idx = easyvr.getWord();
  if (idx >= 0)
  {
    Serial.print("Word: ");
    Serial.print(easyvr.getWord());
    Serial.print(" = ");
    if (useCommands)
      Serial.println(ws[group][idx]);
    else
      Serial.println(ws[set][idx]);
    // ok, let's try another set
    set++;
    if (set > 3)
      set = 0;
    easyvr.playSound(0, EasyVR::VOL_FULL);
  }
  else
  {
    idx = easyvr.getCommand();
    if (idx >= 0)
    {
      Serial.print("Command: ");
      Serial.print(easyvr.getCommand());
      if (easyvr.dumpCommand(group, idx, name, train))
      {
        Serial.print(" = ");
        Serial.println(name);
      }
      else
        Serial.println();
      // ok, let's try another group
      do
      {
        group++;
        if (group > EasyVR::PASSWORD)
          group = 0;
      } while (!((mask >> group) & 1));
      easyvr.playSound(0, EasyVR::VOL_FULL);
    }
    else // errors or timeout
    {
      if (easyvr.isTimeout())
        Serial.println("Timed out, try again...");
      int16_t err = easyvr.getError();
      if (err >= 0)
      {
        Serial.print("Error ");
        Serial.println(err, HEX);
      }
    }
  }
}


pelletta

Ti sei fatto generare lo sketch dal commander?
Da quanto vedo hai ancora i comandi di default in inglese nel tuo sketch.
C'è un pulsante nel commander che ti genera il codice con i vocaboli che hai impostato, dovresti usare quello e modificarlo leggermente; la modifica consiste nell'aggiungere cosa dovrà fare l'arduino quando arrivano i comandi quindi accendere led, azionare motori, scrivere sulla seriale, ecc.

Per una migliore leggibilità inserisci il codice dentro i tag [*code]  [*/code] (senza asterisco iniziale)

nytro81

no, questo è lo sketch che compare negli example una volta inserita la libreria, l'unica cosa che ho cambiato è appunto la lingua in italiano... ma anche generando il codice dal commander mi da sempre il solito messaggio... non riesco a capire dove è che si impunta con la comunicazione... adesso proverò con un altra arduino tante volte fossero i pin 12 e 13 che danno problemi... dovrebbero essere proprio questi quelli adibiti alla comunicazione seriale con il modulo giusto?

pelletta

Puoi usare qualsiasi pin per la seriale, se fai caso usa la softwareSerial per il modulo
Code: [Select]
SoftwareSerial port(12,13);
e la seriale hardware per il collegamento al pc (bridge)
Code: [Select]
bridge.loop(0, 1, 12, 13);

nytro81

ok, ma sulla shield i pin sono forzati a quelli collegati no!??!

nytro81

mi aiuti a comprendere questa parte... che dovrebbe essere quella che mi genera il messaggio su seriale...

if (!easyvr.detect())
  {
    Serial.println("EasyVR not detected!");       //questo è il messaggio maledetto!!
    for (;;);
  }

  easyvr.setPinOutput(EasyVR::IO1, LOW);
  Serial.println("EasyVR detected!");
  easyvr.setTimeout(5);
  easyvr.setLanguage(EasyVR::ITALIAN);

pelletta


Code: [Select]
if (!easyvr.detect()) // se il modulo non è rilevato (il punto esclamativo all'inizio è la negazione)
  {
    Serial.println("EasyVR not detected!");       //stampa il "messaggio maledetto" sulla seriale hardware (0 e 1)
    for (;;); // entra in un ciclo infinito, lo sketch si ferma qui
  }


il resto del codice non viene eseguito.



nytro81

ed il controllo se rileva o meno l'easyvr come lo fa?! adesso proverò i pin 12 e 13 x vedere se c'è qualche problema hardware... ma che tu ti ricordi, quando collegando sempre tramite arduino il modulo (o in questo caso la shield) al pc e verificandone il funzionamento con il software commander, i pin che utilizza su arduino ovviamente sono i soliti no?

nytro81

Nulla, i pin 12 e 13 sono ok... non so dove sbattere la capoccia!!!!!!!

nytro81

nessuno che ha un modulo così eh!!?!? Come sono triste....!

pelletta

Posta il codice generato dal commander, ci devono essere i comandi che hai registrato

nytro81

#14
Oct 27, 2012, 04:04 pm Last Edit: Oct 27, 2012, 04:29 pm by nytro81 Reason: 1
ecco, questo è il codice generato con il commander connesso al modulo tramite arduino, ovviamente mettendo il jumper sulla posizione PC. Ho provato soltanto ad aggiungere un trigger chiamato prova, tutto il resto sono i comandi già presenti di default

#if defined(ARDUINO) && ARDUINO >= 100
 #include "Arduino.h"
 #include "SoftwareSerial.h"
 SoftwareSerial port(12,13);
#else // Arduino 0022 - use modified NewSoftSerial
 #include "WProgram.h"
 #include "NewSoftSerial.h"
 NewSoftSerial port(12,13);
#endif




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

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

enum Group0
{
 G0_PROVA = 0,
};

enum Group1
{
 G1_PROVA = 0,
};


EasyVRBridge bridge;

int8_t group, idx;

void setup()
{
 // bridge mode?
 if (bridge.check())
 {
   cli();
   bridge.loop(0, 1, 12, 13);
 }
 // run normally
 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(1);

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

void action();

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

 Serial.print("Say a command in Group ");
 Serial.println(group);
 easyvr.recognizeCommand(group);

 do
 {
   // can do some processing while waiting for a 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.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.print("Error ");
     Serial.println(err, HEX);
   }
 }
}

void action()
{
   switch (group)
   {
   case GROUP_0:
     switch (idx)
     {
     case G0_PROVA:
       // write your action code here
       // group = GROUP_X; <-- or jump to another group X for composite commands
       break;
     }
     break;
   case GROUP_1:
     switch (idx)
     {
     case G1_PROVA:
       // write your action code here
       // group = GROUP_X; <-- or jump to another group X for composite commands
       break;
     }
     break;
   }
}


anche se vado a caricare questo, sempre andando prima a mettere il jumper stavolta in posizione SW come da manuale, quando apro il monitor seriale mi da sempre il messaggio che non rileva la easyvr!!

Go Up