Skip to end of metadata
Go to start of metadata

You are viewing an old version of this content. View the current version.

Compare with Current View Version History

« Previous Version 2 Current »

Objectif

L’objectif de ce tutoriel est d’explorer une façon facile d'écrire un programme visuellement logique pour le CRCduino qui répète la section loop() en boucle aussi vite que possible, tout en permettant d’exécuter des actions dans une séquence ordonnée et prévisible.

2 styles sont présentés ci-dessous. Ils accomplissent tous deux la même chose, avec le même circuit.

  • En utilisant des « if »: la façon la moins complexe pour des débutants

  • En utilisant des « switch-case »: une façon un peu plus compacte et efficace, à utiliser pour passer au prochain nouveau.

Le Tutoriel 11 démontre un processus basé sur cette même structure.

Schéma électrique et présentation complète

Code - avec des « IF »

Téléchargez le code de démonstration:

Qui est ici retranscrit:

//***************************************************************************
// Tutoriel CRCduino 5.1 - exemple d'une structure de programme séquentiel pour robot autonome, à l'aide de « if »
// NOTE: contrairement aux autres tutoriels, le contact Normalement Fermé des boutons et de la « limit switch » est ici utilisé.
//       Cela veut dire que, lorsque le bouton ou la « switch » ne sont pas appuyés, la valeur lue sera "LOW", puisqu'il y
//        aura un chemin direct vers le GND. À l'inverse, lorsqu'appuyés, la valeur lue sera "HIGH".
//       Pourquoi changer, alors que tous les autres tutoriels utilisent des boutons NO? Pour vous montrez que tous les chemins mènent à Rome :)
//***************************************************************************
#include <CrcLib.h>

// C'est pratique d'avoir un nom pour chaque port de contrôle
#define PROCHAINE_ETAPE_IMPAIRE CRC_DIG_1
#define PROCHAINE_ETAPE_PAIRE CRC_DIG_2

// Déclaration des variables
// Étapes
bool dodo = false;
bool etape1 = false;
bool etape2 = false;
bool etape3 = false;

//***************************************************************************

void setup() {
  CrcLib::Initialize();
  
  Serial.begin(2000000); // Établir la connection à la console

  CrcLib::SetDigitalPinMode(PROCHAINE_ETAPE_IMPAIRE, INPUT); // Initialiser les ports comme entrées
  CrcLib::SetDigitalPinMode(PROCHAINE_ETAPE_PAIRE, INPUT);
  
  // Au début du programme, nous souhaitons être en train de dormir
  dodo = true; etape1 = false; etape2 = false; etape3 = false;
}

//***************************************************************************

void loop() {
  CrcLib::Update();

  // Afficher en continu sur la console l'état du programme (à quelle étape nous sommes rendus)
  // vrai sera affiché comme 1 et faux comme 0
  Serial.print("  dodo: "); Serial.print(dodo);
  Serial.print("etape1: "); Serial.print(etape1);
  Serial.print("etape2: "); Serial.print(etape2);
  Serial.print("etape3: "); Serial.print(etape3);
  Serial.print(" durée de la boucle: "); Serial.println( CrcLib::GetDeltaTimeMicros() ); // Affiche la durée de la dernière boucle

//------------------
  if (dodo) {
    // Le code à exécuter lors du mode repos
    // Quand les actions suivantes sont exécutées (on appuie sur un bouton mais pas l'autre), quitter l'état repos…
    if(CrcLib::GetDigitalInput(PROCHAINE_ETAPE_IMPAIRE) == HIGH && CrcLib::GetDigitalInput(PROCHAINE_ETAPE_PAIRE) == LOW) {
      // … on change de configuration pour être à une autre étape la prochaine fois
      dodo = false; etape1 = true; etape2 = false; etape3 = false;
    }
  }
//------------------
  if (etape1) {
    // Le code à exécuter durant la première étape irait ici
    // Quand les actions suivantes sont exécutées (on appuie sur un bouton mais pas l'autre), quitter l'étape 1…
    if(CrcLib::GetDigitalInput(PROCHAINE_ETAPE_PAIRE) == HIGH && CrcLib::GetDigitalInput(PROCHAINE_ETAPE_IMPAIRE) == LOW) {
      // … on change de configuration pour être à une autre étape la prochaine fois
      dodo = false; etape1 = false; etape2 = true; etape3 = false;
    }  
  }
//------------------
  if (etape2) {
    // Le code à exécuter durant la 2e étape irait ici
    // Quand les actions suivantes sont exécutées (on appuie sur un bouton mais pas l'autre), quitter l'étape 2…
    if(CrcLib::GetDigitalInput(PROCHAINE_ETAPE_IMPAIRE) == HIGH && CrcLib::GetDigitalInput(PROCHAINE_ETAPE_PAIRE) == LOW) {
      // … on change de configuration pour être à une autre étape la prochaine fois
      dodo = false; etape1 = false; etape2 = false; etape3 = true;
    }
  }
//------------------
  if(etape3) {
    // Le code à exécuter durant la 3e étape irait ici
    // Quand les actions suivantes sont exécutées (on appuie sur un bouton mais pas l'autre), quitter l'étape 2…met (we press the button/switch and the other one is not pressed)...
    if (CrcLib::GetDigitalInput(PROCHAINE_ETAPE_PAIRE) == HIGH && CrcLib::GetDigitalInput(PROCHAINE_ETAPE_IMPAIRE) == LOW) {
      // … on change de configuration pour être à une autre étape la prochaine fois
      dodo = true; etape1 = false; etape2 = false; etape3 = false;
    }
  }
//------------------

}

Code - Avec un « switch-case »

Téléchargez le code de démonstration:

Qui est ici retranscrit:

//***************************************************************************
// Tutoriel CRCduino 5.2 - exemple d'une structure de programme séquentiel pour robot autonome, à l'aide d'un « switch-case »
// NOTE: contrairement aux autres tutoriels, le contact Normalement Fermé des boutons et de la « limit switch » est ici utilisé.
//       Cela veut dire que, lorsque le bouton ou la « switch » ne sont pas appuyés, la valeur lue sera "LOW", puisqu'il y
//        aura un chemin direct vers le GND. À l'inverse, lorsqu'appuyés, la valeur lue sera "HIGH".
//       Pourquoi changer, alors que tous les autres tutoriels utilisent des boutons NO? Pour vous montrez que tous les chemins mènent à Rome :)
//***************************************************************************
#include <CrcLib.h>

// C'est pratique d'avoir un nom pour chaque port de contrôle
#define PROCHAINE_ETAPE_IMPAIRE CRC_DIG_1
#define PROCHAINE_ETAPE_PAIRE CRC_DIG_2

enum etape_t {
  DODO = 0,
  ETAPE1 = 1,
  ETAPE2 = 2,
  ETAPE3 = 3
};

etape_t etape; // Variable d'état courant
//***************************************************************************
void setup() {
  CrcLib::Initialize();
  
  Serial.begin(2000000); // Établir la connection à la console

  CrcLib::SetDigitalPinMode(PROCHAINE_ETAPE_IMPAIRE,INPUT); // Initialiser les ports comme entrées
  CrcLib::SetDigitalPinMode(PROCHAINE_ETAPE_PAIRE,INPUT);
  
  // Au début du programme, nous souhaitons être en train de dormir
  etape = DODO;
}
//***************************************************************************
void loop() {
  CrcLib::Update();
  // Afficher en continu sur la console l'état du programme (à quelle étape nous sommes rendus)
  // La valeur affichée sera un entier correspondant à l'étape
  Serial.print("Étape courante: "); Serial.print(etape);
  Serial.print(" durée de la boucle: "); Serial.println( CrcLib::GetDeltaTimeMicros() ); // Affiche la durée de la dernière boucle

  switch(etape) {
//------------------
    case DODO:
    
      // Le code à exécuter lors du mode repos
      
      if(CrcLib::GetDigitalInput(PROCHAINE_ETAPE_IMPAIRE) == HIGH && CrcLib::GetDigitalInput(PROCHAINE_ETAPE_PAIRE) == LOW) {
        etape = ETAPE1;
      }
      break;
//------------------
    case ETAPE1:
    
      // Le code à exécuter durant la première étape irait ici
  
      if( CrcLib::GetDigitalInput(PROCHAINE_ETAPE_PAIRE) == HIGH && CrcLib::GetDigitalInput(PROCHAINE_ETAPE_IMPAIRE) == LOW) {
        etape = ETAPE2;
      }  
      break;
//------------------
    case ETAPE2:
    
      // Le code à exécuter durant la 2e étape irait ici
  
      if( CrcLib::GetDigitalInput(PROCHAINE_ETAPE_IMPAIRE) == HIGH && CrcLib::GetDigitalInput(PROCHAINE_ETAPE_PAIRE) == LOW )
      {
        etape = ETAPE3;
      }
      break;
//------------------
    case ETAPE3:
    
      // Le code à exécuter durant la 3e étape irait ici
  
      if( CrcLib::GetDigitalInput(PROCHAINE_ETAPE_PAIRE) == HIGH && CrcLib::GetDigitalInput(PROCHAINE_ETAPE_IMPAIRE) == LOW )
      {
        etape = DODO;
      }  
      break;
//------------------
  }
}

  • No labels

0 Comments

You are not logged in. Any changes you make will be marked as anonymous. You may want to Log In if you already have an account.