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é :
- carte Arduino Uno Rev3
- ide Arduino 1.8.9
- os : Ubuntu 18.04
- Moteur pas-à-pas 5Vcc avec carte contrôleur ULN2003 (108990000 Moteur pas-à-pas économique avec driver pour arduino)
// 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);
}