Bonjour,
Je viens de modifier un programme de gestion d’une pompe péristaltique que j’ai mis au point il y a quelques semaines. (c’est un simple moteur DC piloter avec un Pololu Max14870 plus une arduino Metro Mini.
Le programme originel attend la monté à 1 un signal extérieur (une centrale avec un UNO, et divers poussoirs qui ne font que des bascules GO/STOP) .
C’est donc un de ces signaux qui rentre dans le Mini de la pompe ( sur “int cmdpin = 3”) et déclenche un cycle de pompage (x secondes dans un sens, y sec. de pause, z secondes de pompage inversé).
ou bien le stop/relance à chaque nouvelle impulsion sur le poussoir.
Tout ceci marche très bien mais j’ai voulu ajouter un timer pour que le cycle de la pompe ne dure pas plus de 20 minutes sans que l’on ait à appuyer sur le poussoir pour faire un ‘STOP’ forcément.
Je gère donc le signal venant du poussoir extérieur && un temps calculé grâce à millis();
Là aussi ca marche (voir code ici avec seulement 12 secondes de timer pour les tests).
Sauf que les rebascules de poussoir ne font plus rien une fois le temps écoulé et la pompe stoppée. un ré-appui sur le poussoir reapasse le signal à 0, et un 3ème appui devrait en le repassant à 1 relancer la pompe… (voir à partir de ligne 58)
C’est quoi donc que j’ai foiré ??
Merci
/*
* Gestion par Arduino Metro Mini d'une pompe péristaltique (moteur DC 12v)
* pilotée par module driver Polulu Max14870
* Le Metro Mini est lui-même piloté par une commande centrale à base d'Arduino UNO qui envoie
* sur un fil un LOW (la pompe est OFF) ou un HIGH ( la pompe est activée ) - reçu sur pin 3 du Mini
*
* Le Max14870 nécessite un PWM sur son entrée 'PWM', un HIGH/LOW sur son entrée 'DIR', le GND
* un +12V sur son Vin et se raccorde au moteur par ses sorties M1 et M2.
*
* But: faire tourner la pompe pendant t1 dans un sens (pomper), stopper durant t2, puis pendant t3 tourner dans l'autre sens (refouler).
* On va ajouter un potar lu sur A0 du Mini pour faire varier la vitesse de la pompe.
*/
unsigned long millis_ON = millis();
unsigned long ThisMillis = millis_ON; // 32bits : environ 50 j max avant retour zéro
long dTrun = 0; // delta T calcul du temps de pompage à base de millis()
unsigned long maxTimer = 12000; // 1200000
const int cmdPin = 3; // stop/go 3 en vrai depuis la centrale, 2 interne pullup pour le test
const int PWM_drive= 9; // PWM du driver moteur
int PWM_Value = 0; //mise à 0 par défaut - valeur de vitesse moteur
const int DIRControl = 7; // DIR du driver moteur
// const int Out5VPin = 12; // test
int valPota8b = 0;
int mapPota8b = 0;
float pause_cycle = 0;
int wait_cycle = 2000;
int ThiscmdPin;
int prevGo = 0;
void setup() {
//start serial connection
Serial.begin(15200);
//configure pin 3 as an input and enable the internal pull-up resistor
// pinMode(cmdPin, INPUT_PULLUP); // pseudo signal 2 GO/STOP pour le test
pinMode(cmdPin, INPUT); // recevra le signal GO/STOP en vrai
pinMode(13, OUTPUT); // test led interne
// pinMode(Out5VPin, OUTPUT); // sortie permanente 5V HIGH pour test
// digitalWrite(Out5VPin, HIGH);
pinMode(DIRControl, OUTPUT); // DIR du driver moteur
pinMode(PWM_drive, OUTPUT); // PWM du driver moteur
// init tout est stoppé
digitalWrite(LED_BUILTIN, LOW);
analogWrite(PWM_drive, PWM_Value);
ThiscmdPin=digitalRead(cmdPin);
prevGo = ThiscmdPin; // en principe à LOW au démarrage
Serial.println("cmdPin ");
Serial.println(digitalRead(cmdPin));
Serial.println("------------");
}
void loop() {
ThiscmdPin=digitalRead(cmdPin);
Serial.println("ThiscmdPin");
Serial.println(ThiscmdPin);
Serial.println("------------ prevGo : ");Serial.println(prevGo); Serial.println("------------");
if (ThiscmdPin != prevGo) {
// le poussoir de commande a changé d'état
prevGo=ThiscmdPin; // memo de cet état
if (ThiscmdPin == 1) {
// go
millis_ON=millis(); // temps de départ
}
} /*else {
// le poussoir de commande n'a pas changé d'état
}*/
while ((ThiscmdPin) == 1 && dTrun < maxTimer){ // on stop automatiquement la pompe au bout de 20 minutes
// si le signal GO venant de l'unité de commande est haut on active sinon, stop.
// calcul du temps de pompage
ThisMillis = millis();
dTrun=ThisMillis-millis_ON;
Serial.println("cmdPin");
Serial.println(digitalRead(cmdPin));
Serial.println("------------");
// gestion potar de 'vitesse' moteur
valPota8b=analogRead(A0)+1;
mapPota8b=map(valPota8b,1,1024,30,400);
// les paramètres du driver du moteur acceptent de [0, 400]
Serial.println("valPota8b");
Serial.println(valPota8b);
Serial.println(" mapPota8b");
Serial.println(mapPota8b);
Serial.println("------------");
digitalWrite(LED_BUILTIN, HIGH); // turn internal LED on
// faire tourner moteur
// sens 1
PWM_Value = mapPota8b; // cette valeur vient du potar A0
//
digitalWrite(DIRControl, 1);
Serial.println("PWM dir1");
Serial.println(PWM_Value);
Serial.println("------------");
analogWrite(PWM_drive, PWM_Value);
delay(3000); //durée du pompage t1
// stop - repos attente
analogWrite(PWM_drive, 0);
digitalWrite(LED_BUILTIN, LOW);
Serial.println("PWM stop");
Serial.println("------------");
delay(2000); // stop durant un t2
// reprise en sens inverse
digitalWrite(DIRControl, 0);
digitalWrite(LED_BUILTIN, HIGH);
Serial.println("PWM dir2");
Serial.println(PWM_Value);
Serial.println("------------");
analogWrite(PWM_drive, PWM_Value);
delay(3000); //durée du pompage t3 inversé
analogWrite(PWM_drive, 0);
digitalWrite(LED_BUILTIN, LOW);
Serial.println("PWM stop");
Serial.println(PWM_Value);
Serial.println("------------");
delay(2000); // stop durant un t2
ThiscmdPin=digitalRead(cmdPin);
}
// on stoppe tout
ThiscmdPin=digitalRead(cmdPin);
digitalWrite(LED_BUILTIN, LOW);
PWM_Value = 0;
analogWrite(PWM_drive, PWM_Value);
Serial.println("cmdPin");
Serial.println(digitalRead(cmdPin));
Serial.println("------------");
}