/
Tutoriel 05 - Structure de programmes séquentiels

Tutoriel 05 - Structure de programmes séquentiels

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 l'interrupteur de position est ici utilisé. // Cela veut dire que, lorsque le bouton ou l'interrupteur 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… 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; //------------------ } }

 

Related content

Tutoriel 11 - Conception de code séquentiel pour robots
Tutoriel 11 - Conception de code séquentiel pour robots
More like this
Tutoriels - Page d'introduction
Tutoriels - Page d'introduction
More like this
Tutoriel 02 - Reproduire la fonction delay()
Tutoriel 02 - Reproduire la fonction delay()
More like this
Tutoriel 01 - Moteur avec interrupteur de position
Tutoriel 01 - Moteur avec interrupteur de position
Read with this
Tutorial 05 - Sequential program structure
Tutorial 05 - Sequential program structure
More like this
Tutorial 11 - Code design for sequential robots
Tutorial 11 - Code design for sequential robots
More like this