Problème de lecture/écriture des E/S digitales

Bonjour,
L’utilisation d’un moteur pas-à-pas 28BYJ-48 (piloté via une carte VMA401 – ULN2003) me pose des problèmes dans un sketch : le moteur tourne très lentement, voire resté bloqué alors qu’avec le sketch fourni par le constructeur, il tourne rond. Pour tenter de résoudre ce problème, j’ai fait un autre sketch où j’ai remplacé les enroulements du moteur par leds pour vérifier l’enchaînement des différents pas et j’y ai rajouté deux leds pour visualiser les ordres donnés par des BP.
Résultat : l’enchaînement des pas est correct (les 4 leds s’allument en cadence), en revanche, les leds de visu ne s’allument pas. A contrario, si je désactive les procédures Montée et Descente, ces leds de visu s’allument correctement. Impossible d'avoir les leds représentant les enroulements et celles représentant les ordres s'allumer en même temps et pourtant, j'utilise les sorties de même port… J’ai pensé à assigner directement des valeurs (binaires ou hexadécimal) aux variables PORTB et PORTD mais cela n’a pas mieux fonctionné. Alors, si quelqu’un a une idée ou un conseil, je suis preneur. Merci d’avance !

Matériel utilisé :

// Essai d'écriture/lecture E/S digitales Port B & D sur un Arduino Uno Rev3
// IDE Arduino 1.8.9
// OS Ubuntu 18.04

// Déclaration des variables
int Led_Montee = 12;          // Visualiation par Led de la Montée
int Led_Descente = 13;        // Visualisation par Led de la Descente

int motorPin1 = 8;            // Broche 1 du moteur pas-à-pas 28BYJ48 - remplacé par une Led
int motorPin2 = 9;            // Broche 2 du moteur pas-à-pas 28BYJ48 - remplacé par une Led
int motorPin3 = 10;           // Broche 3 du moteur pas-à-pas 28BYJ48 - remplacé par une Led
int motorPin4 = 11;           // Broche 4 du moteur pas-à-pas 28BYJ48 - remplacé par une Led

//============ Déclaration des valeurs des constantes ==============================                  
int motorSpeed = 500;          // Variable pour régler la vitesse du moteur
int count = 0;                // Compteur de nombre de pas effectués
int countsperrev = 512;       // Nombre de pas par tour
int lookup[4] = {B1100, B0110, B0011, B1001}; // Enchaînement des enroulements à mettre sous tension

byte Montee = 7;              //capteur haut sur la broche 7
byte Descente = 6;            //capteur bas sur la broche 6

//============ Procédure Descente ===================================================
void anticlockwise()
{
  for(int i = 0; i < 4; i++)
  {
    setOutput(i);
    delay(motorSpeed);        // Temporisation entre 2 pas
  }
}

//============ Procédure Montée ====================================================
void clockwise()
{
  for(int i = 3; i >= 0; i--)
  {
    setOutput(i);
    delay(motorSpeed);        // Temporisation entre 2 pas
  }
}


//=========== Procédure Enclenchement des enroulements ============================
void setOutput(int out)
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}

//=========== Procédure SetUp ====================================================
void setup()
{
  // Déclaration des broches Sortie pour le moteur
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  pinMode(Led_Montee, OUTPUT);
  pinMode(Led_Descente, OUTPUT);

  // Déclaration des broches Entrées pour les capteurs fin de course =============
  pinMode(Montee,INPUT_PULLUP);             // Broche digitale D7 en entrée pour le BP Montee
  pinMode(Descente,INPUT_PULLUP);           // Broche digitale D6 en entrée pour le BP Descente
}

//========== Procédure Loop ======================================================
void loop()
{
  Montee = digitalRead(7);                  // Lecture de l'entrée Broche digitale D7 en entrée pour le BP Montee
  Descente = digitalRead(6);                // Lecture de l'entrée Broche digitale D6 en entrée pour le BP Montee
  
  if(Montee == HIGH)                        // Si on actionne le BP Montée
    {
      clockwise();                          // Procédure Montée
      digitalWrite(Led_Montee, HIGH);       // Visualisation de la montée par une Led
    }
  else                                      // Si pas action sur le BP Montée, toutes les broches à zéro
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW);
    digitalWrite(Led_Montee, LOW);    

  if(Descente  == HIGH)                     // Si on actionne le BP Descente    
    {
      anticlockwise();                      // Procédure Descente
      digitalWrite(Led_Descente, HIGH);     // Visualisation de la descente par une Led
    }
  else                                      // Si pas action sur le BP Descente, toutes les broches à zéro
    digitalWrite(motorPin1, LOW);
    digitalWrite(motorPin2, LOW);
    digitalWrite(motorPin3, LOW);
    digitalWrite(motorPin4, LOW); 
    digitalWrite(Led_Descente, LOW);     
}

Vous avez des variables globales pour vos N° de pin (le type byte est bin vous auriez pu rajouter const devant)

 byte Montee = 7;              //capteur haut sur la broche 7
byte Descente = 6;            //capteur bas sur la broche 6

mais plus loin dans le code vous redéfinissez la valeur des pins par leur état

 Montee = digitalRead(7);                  // Lecture de l'entrée Broche digitale D7 en entrée pour le BP Montee
  Descente = digitalRead(6);                // Lecture de l'entrée Broche digitale D6 en entrée pour le BP Montee

c’est pas terrible - pas super gênant non plus mais vous ne gérez pas les rebonds

Le soucis principal vient de {} manquantes dans les else (vous êtes en C++ pas en Python, l’Indentation ne structure pas le code)

Bonsoir, Je vous remercie pour cette réponse rapide. Effectivement avec des {} cela marche nettement mieux ! Je vais étudier cette piste pour mon premier sketch, le souci étant que je n'ai pas de message d'erreur quand je compile. Et effectivement, je suis plus familier du python que du c++. Merci beaucoup !

L’histoire des variables ne génére pas d’erreurs, ni le manque d’accolade

La syntaxe du if c’est

if (condition) expression1 else expression2

Une expression c’est soit une instruction simple se terminant par un point virgule, soit si vous voulez en grouper plusieurs, alors vous mettez des instructions simples (ou expression) au sein d’accolades.

Si vous dites

if (condition) fonctionVrai();
else fonctionFaux();

ça marchera car il n’y a qu’une instruction simple si vrai ou faux.

Mais

if (condition) fonctionVrai();
else 
  fonction1Faux();
  fonction2Faux();

ne fait pas ce que l’Indenttion laisse à penser, car fonction2Faux() est en dehors du if/else et sera toujours exécutée

il faut écrire

if (condition) fonctionVrai();
else {
  fonction1Faux();
  fonction2Faux();
}

Une bonne habitude a prendre c’est de mettre tout le temps des accolades

if (condition) {
  fonctionVrai();
} else {
  fonction1Faux();
  fonction2Faux();
}

comme ça si vous rajoutez des instructions elles sont bien groupées et la lecture est claire (certains mettent même les accolades sur une ligne seule pour bien faire voir le bloc)

Dans votre cas donc le else ne contenait que le premier digitalWrite(), les autres étaient exécutés tout le temps

Pour les pins c’est une bonne pratique de les déclarer en const (constante) et d’utiliser leur nom dans l’appel à digitalRead ou digitalWrite

const byte pinMontee = 7;              //capteur haut sur la broche 7
const byte pinDescente = 6;            //capteur bas sur la broche 6

....

byte etatMontee = digitalRead(pinMontee);
....