temps de réponse interrupteur

Bonour,

Je suis en plein projet domotique. J’utilise un shield EasyVR (commande vocale) pour commander un volet par la voix. Le moteur est relié à un shield motor de chez arduino (officiel).

Voici le code

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

#if defined(SERIAL_PORT_USBVIRTUAL)
  // Shield Jumper on HW (for Leonardo and Due)
  #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(6, 7);
  #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_VOLET = 0,
};

enum Group1 
{
  G1_OUVRE = 0,
  G1_FERME = 1,
  G1_STOP = 2,
};


int8_t group, idx;



const int buttonPin = 5;
const int buttonPin1 = 4;
int buttonState = 0;  //capteur haut sur broche 5
int buttonState1 = 0; //capteur bas sur broche 4

int arrete = 0;


int val = 0;
int currentA = A0;







void setup()
{
    //capteur haut et bas
  pinMode(buttonPin, INPUT);
  pinMode(buttonPin1, INPUT);
  
  //moteur
  pinMode(12, OUTPUT); //Initiates Motor Channel A pin
  pinMode(9, OUTPUT); //Initiates Brake Channel A pin
  
  
  
  
  
  // setup PC serial port
  pcSerial.begin(9600);

  // 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("---"));
    pcSerial.println(F("Bridge not started!"));
    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("---"));
    pcSerial.println(F("Bridge connection aborted!"));
    break;
    
  case EasyVR::BRIDGE_BOOT:
    // setup EasyVR serial port (high speed)
    port.begin(115200);
    // soft-connect the two serial ports (PC and EasyVR)
    easyvr.bridgeLoop(pcSerial);
    // resume normally if aborted
    pcSerial.println(F("---"));
    pcSerial.println(F("Bridge connection aborted!"));
    break;
  }

  while (!easyvr.detect())
  {
    Serial.println("EasyVR not detected!");
    delay(1000);
  }

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

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

void action();

void loop()
{
  {
  val = analogRead(currentA);
  //Serial.println(val);
  //delay (1);
  }
  
  
  
  /*
     Serial.print(buttonState);
   Serial.print("                                    ");
   Serial.println(buttonState1);
  */
  
  arret();
  {
   buttonState = digitalRead(buttonPin);
   buttonState1 = digitalRead(buttonPin1);
   arrete = digitalRead(9);  
   }
   
  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_VOLET:
        // write your action code here
        group = GROUP_1;
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      }
      break;
    case GROUP_1:
      switch (idx)
      {
      case G1_OUVRE:
        // write your action code here
        monte();
        /*
        digitalWrite(12, HIGH); //Establishes forward direction of Channel A
        digitalWrite(9, LOW);   //Disengage the Brake for Channel A
        analogWrite(3, 255);   //Spins the motor on Channel A at full speed
        */
        
        
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_FERME:
        // write your action code here
        descente();
   /*
        digitalWrite(12, LOW); //Establishes forward direction of Channel A
        digitalWrite(9, LOW);   //Disengage the Brake for Channel A
        analogWrite(3, 255);   //Spins the motor on Channel A at full speed   
   */
   
   
        
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      case G1_STOP:
        // write your action code here        
        digitalWrite(9, HIGH);   //Disengage the Brake for Channel A       
        // group = GROUP_X; <-- or jump to another group X for composite commands
        break;
      }
      break;
    }
}

void arret()
{
  if ((arrete ==LOW)&&(buttonState1 ==HIGH)&&(digitalRead(12) ==LOW))
  {
    digitalWrite(9, HIGH); //Eengage the Brake for Channel A
   }
   else if ((arrete ==LOW)&&(buttonState ==HIGH)&&(digitalRead(12) ==HIGH))
   {
     digitalWrite(9, HIGH); //Eengage the Brake for Channel A
     }
   else if ((arrete ==LOW)&&(digitalRead(12) ==LOW)&&(17 < (val + 2)))
   {
     digitalWrite(9, HIGH); //Eengage the Brake for Channel A
     }
  else if ((arrete ==LOW)&&(digitalRead(12) ==HIGH)&&(17 < (val + 2)))
   {
     digitalWrite(9, HIGH); //Eengage the Brake for Channel A
     }
     
  }
  
  
  void descente()
{
  if ((buttonState1 ==LOW)&&(17 > (val - 2)))
      {
          digitalWrite(12, LOW); //Establishes forward direction of Channel A
          digitalWrite(9, LOW);   //Disengage the Brake for Channel A
          analogWrite(3, 255);   //Spins the motor on Channel A at full speed
        }
   else if ((buttonState ==HIGH)&&(17 > (val - 2)))
      {
          digitalWrite(12, LOW); //Establishes forward direction of Channel A
          digitalWrite(9, LOW);   //Disengage the Brake for Channel A
          analogWrite(3, 255);   //Spins the motor on Channel A at full speed
        }   
  }

void monte()
{
  if ((buttonState ==LOW)&&(17 > (val - 2)))
      {
          digitalWrite(12, HIGH); //Establishes forward direction of Channel A
          digitalWrite(9, LOW);   //Disengage the Brake for Channel A
          analogWrite(3, 255);   //Spins the motor on Channel A at full speed
        }
   else if ((buttonState1 ==HIGH)&&(17 > (val - 2)))
      {
          digitalWrite(12, HIGH); //Establishes forward direction of Channel A
          digitalWrite(9, LOW);   //Disengage the Brake for Channel A
          analogWrite(3, 255);   //Spins the motor on Channel A at full speed
        }        
  }

Le problème c’est que quand le volet est en haut ou en bas l’interrupteur se déclenche mais met 5 seconde avant que le moteur se coupe. J’ai remarqué que c’est en même temps que le serial moniteur qui affiche les instructions pour la carte vocale. Les interrupteurs marche niquel car j’ai un autre programme pour des touches tactiles. Merci de votre aide.

Cordialement

Bonjour,

fais une petite recherche sur les interruptions, tu devrais résoudre ton souci avec.

les interruptions ? Je viens de regarder, j'ai ce code :

int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()
{
  state = !state;
}

cependant pour mon programme ça ne fonctionne pas.

Oui, il existe deux sortes d' interruption: -Les interruptions internes, déclenchées par un évènement dans le programme. -Les interruption externes, déclenchées par un évènement externe.( c' est celle dont tu as besoin ).

Plus d' info ici, ou

Le référentiel arduino en français: http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ReferenceMaxi

Selon ton arduino, tu dois connaitre quelles broches sont concernées, pour ce faire, tape " arduino XX diagramme pinout ",( exemple avec l' arduino UNO) les broches d' interruptions externes sont nommées INT0, INT1, dans ce cas, les broches sont D2, et D3.

C' est donc sur ces deux broches que tu dois câbler tes contacts de fin de course. Ensuite, tu créer deux fonctions, une pour store fermé, et une pour store ouvert.

Cherches les fonctions attachInterrupt et detacheInterrupt dans le référentiel Arduino en français pour apprendre à les utiliser.

Tu trouveras tout ce qui faut dans les liens ci dessus.

weetoz: Oui, il existe deux sortes d' interruption: -Les interruptions internes, déclenchées par un évènement dans le programme. -Les interruption externes, déclenchées par un évènement externe.( c' est celle dont tu as besoin ).

Plus d' info ici, ou

Le référentiel arduino en français: http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ReferenceMaxi

Selon ton arduino, tu dois connaitre quelles broches sont concernées, pour ce faire, tape " arduino XX diagramme pinout ",( exemple avec l' arduino UNO) les broches d' interruptions externes sont nommées INT0, INT1, dans ce cas, les broches sont D2, et D3.

C' est donc sur ces deux broches que tu dois câbler tes contacts de fin de course. Ensuite, tu créer deux fonctions, une pour store fermé, et une pour store ouvert.

Cherches les fonctions attachInterrupt et detacheInterrupt dans le référentiel Arduino en français pour apprendre à les utiliser.

Tu trouveras tout ce qui faut dans les liens ci dessus.

J'ai déjà fait celà, le problème c'est que le shield vocale se synchronise tout les 5s et mon interrupteur aussi, c'est pour celà que j'ai 5s où le moteur tourne pour rien. J'essaie de trouver où changer ce temps de 5000ms mais je ne trouve, librairies et autre dossier passé en revue... Mais merci de ton aide

Ok, bonne chance alors! :wink:

Et comment je fais du coup ? Pas de solution ?

hello as tu regardé là: https://github.com/RoboTech-srl/EasyVR-Arduino/blob/master/libraries/EasyVR/EasyVR.h il y a ça:

ifndef EASYVR_PLAY_TIMEOUT

54 /** @brief Playback maximum duration (in ms). 55 The maximum time that is spent waiting for a synchronous playback operation 56 to complete. Asynchronous playback is not affected. 57 */ 58 #define EASYVR_PLAY_TIMEOUT 5000 59 #endif

dfgh: hello as tu regardé là: https://github.com/RoboTech-srl/EasyVR-Arduino/blob/master/libraries/EasyVR/EasyVR.h il y a ça:

ifndef EASYVR_PLAY_TIMEOUT

54 /** @brief Playback maximum duration (in ms). 55 The maximum time that is spent waiting for a synchronous playback operation 56 to complete. Asynchronous playback is not affected. 57 */ 58 #define EASYVR_PLAY_TIMEOUT 5000 59 #endif

oui j'ai déjà modifié :-/ j'ai modifié toute les librairies repris les anciennes, bref... Rien ne marche jusqu'à maintenant. Mais je suis certain que le problème ce situe dans les librairies car dans le code j'ai

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

de base la ligne :

easyvr.setTimeout(1);

est sur 5 (secondes) je l'est donc mis sur 1(seconde) mais j'aimerais que ce soit des ms ! pas des secondes ! Les 9/10 du temps c'est ms et comme par hasard, c'est en seconde sur un truc hyper important ^_^

Merci de votre attention cependant. Cordialement