Go Down

Topic: Attente d'une réponse de l'utilisateur en plein milieu d'une structure "SI" (Read 145 times) previous topic - next topic

Ardginner

Salut.
Mon objectif: après avoir mesuré une distance, je souhaite faire translater une lentille avec une autre distance calculée à l'aide d'une formule. Pour cela, j'utilise un capteur à ultrasons HC-SR04, un moteur pas à pas et un driver A4988.
La structure principale de mon programme est composée de plusieurs SI imbriqués. En fait, le système attend les réponses des utilisateurs au milieu du programme - via des boutons poussoirs -

-Au début, lors du lancement du programme, la boucle s'exécute sans que rien ne se passe.
-Ensuite, vous pouvez décider d'appuyer sur le bouton "buttonON" pour démarrer les mesures du capteur à ultrasons qui apparaissent sur le moniteur de la série Arduino.
-Enfin, lorsque la distance est stabilisée, vous pouvez appuyer sur "buttonNEXT" qui suit le programme en traduisant l'objectif avec l'action du moteur pas à pas.

Le problème est que lorsque je lance le programme, le moteur pas à pas démarre directement, sans attendre l'utilisateur. Ce week-end, cela fonctionnait parfois, mais pas du tout. (Je n'ai absolument pas changé les connexions)

voici le programme en question:
Code: [Select]

// On apporte les différentes bibliothèques
#include <Keypad.h>
#include <Stepper.h>
#include "SR04.h"

// Initialisation des boutons
int buttonONPin = 8; // bouton-poussoir ON - Broche 8
int buttonNEXTPin = 9; // bouton-poussoir NEXT - Broche 9

int buttonONState; // variable d'état du bouton ON
int buttonNEXTState; // variable d'état du bouton NEXT


// On initialise les différentes variables du prgm
int DistTransLent = 0;
int StepsMotor = 0;
int nombreDePas = 200;
int DistLentObj;
   
// Commande Moteur pas-à-pas
Stepper monMoteur (nombreDePas,3,4);

// Commande capteur-ultrasons
#define TRIG_PIN 6
#define ECHO_PIN 5
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN); // Ports de mesure
long DistLenObj; // est la distance mesurée par le capteur US

void setup() {
   Serial.begin(9600);
   delay(1000);
   pinMode(buttonONPin,INPUT); // Boutons comme entrées
   pinMode(buttonNEXTPin,INPUT);
   }
   
void loop() {
   buttonONState = digitalRead(buttonONPin);
   buttonNEXTState = digitalRead(buttonNEXTPin);
   
   if (buttonONState == HIGH)
   {
     // On mesure la distance
     DistLentObj = sr04.Distance();
     Serial.print(DistLentObj);
     Serial.println("cm");
     // PREMIERE VERIFICATION DE LA DISTANCE MESUREE
     if ((DistLentObj > 300) || (DistLentObj == 0) || (DistLentObj == 6)|| (DistLentObj == 2280))
     {
     // La distance mesurée ne rentre pas dans le prgm car trop grande
     }
     else
     {
       // La distance mesurée rentre dans le prgm
       // DEUXIEME VERIFICATION DE LA DISTANCE MESUREE
     }
       if (buttonNEXTState == HIGH)
       {
         DistTransLent = int(-6*DistLentObj/(DistLentObj-6));
         // La distance de translation est transformée en nombre de Pas-Moteur
         StepsMotor = DistTransLent*1019.87;
         monMoteur.setSpeed(300);
         monMoteur.step(StepsMotor);
       }
       else
       {
         // On ne fait rien
       }
   }
   else
   {   
    // On ne fait rien
   }
}

Leptro

Bonjour,
Comment sont connectés les boutons On et Next?

Il y a t'il des résistances de rappel ?



Bonne bidouilles.


Ardginner

Bonjour,
Il n'y a aucunes résistances de rappel. 
voici les branchements.

Driver A4988:
VMOT->Alimentation 9V +
GND -> Alimentation 9V -
2B -> 2B Stepper Motor
2A -> 2A
1A -> 1A
1B -> 1B
VDD -> 5V Arduino
GND -> GND Arduino
RESET -> SLEEP
STEP-> PIN 3
DIR -> PIN 4

HC SR04 sensor:
VVC -> 5V Arduino
Trig -> PIN 6
Echo -> PIN 5
GND -> GND Arduino


(| représente un des 4 pins du bouton) 
button(ON):
5V Arduino  PIN 8
|                   |
|                   |

button(NEXT):
5V Arduino  PIN 9
|                   |
|                   |
Les boutons ON et NEXT sont donc connectés par deux fils chacuns. Sont-ils mal connectés?
L'ordre des branchements sur la ligne + de la "breadboard" est-il important?
Voulez-vous le programme en entier?

fdufnews

Lorsque les boutons sont au repos les entrées sont en l'air.
2 solutions:
  - ajouter des résistances entre les entrées et la masse pour les polariser
  - modifier le câblage des boutons pour mettre leur point commun à la masse au lieu du 5V et remplacer ces 2 lignes
Code: [Select]
   pinMode(buttonONPin,INPUT); // Boutons comme entrées
   pinMode(buttonNEXTPin,INPUT);
par
Code: [Select]
   pinMode(buttonONPin,INPUT_PULLUP); // Boutons comme entrées
   pinMode(buttonNEXTPin,INPUT_PULLUP);
pour que les entrées ne soient pas en l'air lorsque les boutons sont au repos

Ardginner

J'ai essayé, la capteur mesure directement une distance et le moteur tourne presque instantanément.
Ce qui est pourtant bizarre, car ce week-end, parfois, le programme ne faisait rien du tout, on appui sur ON, le capteur se lance, on appui sur NEXT, le moteur tourne.
Je n'ai pas changé les branchements.... je ne vois donc pas du tout où est le problème.
De plus, l'état des boutons n'a pas l'air d'affecter les mesures dans le moniteur de série, ni même la rotation du moteur. Des boutons alors inutiles qui pourtant marchaient ce WE.

UPDATE! : avec l'inversion des 5V sur GND
-Il semblerait que lorsque je ne fais rien, le capteur mesure une valeur et le moteur tourne (ce que je ne veux pas)
-Lorsque j'appuie sur ON longtemps (pendant la rotation du moteur), une seule et unique mesure se fait par le capteur et dès que je lâche le moteur translate. (ce que je ne veux pas non plus)
-Lorsque j'appuie sur NEXT longtemps (pendant la rotation du moteur), des centaines de mesures défilent sur le moniteur de série et dès que je lâche, le moteur prend la dernière mesure et tourne. (ce qui est l'inverse de ce que je veux)

kamill

Bonjour,

Ce n'est pas la peine de chercher pourquoi ça ne fonctionne pas avant d'avoir fait un cablage correct.

Comme le dit fdufnews une entrée ne doit pas être en l'air. Il dit y avoir une résistance de pulldown ou de pullup (externe ou interne).

J'ajouterai que le problème que tu décris est typique des entrées en l'air. Leur niveau est indéterminé donc "des fois ça marche, des fois ça marche pas".

Ardginner

Oui à la base je ne devais pas avoir de boutons, finalement le projet a évolué..
Où puis-je trouver de tels résistances ?
Enfin, est-ce que le code est bon?



PS : j'ai le kit arduino pour débutant avec plein de résistances différentes mais sans les noms.


kamill

Généralement on met une résistance de 10k, mais n'importe quelle résistance entre 4.7 et 100k ira bien.

Mais plutôt que de mettre des résistances je te conseille d'utiliser INPUT_PULLUP et d'inverser le niveau dans les tests.

dbrion06

"Où puis-je trouver de tels résistances ? "
Vous ne pouvez pas les trouver si vous utilisez l'astuce préconisée par fdufnews en #4; en effet, elles sont toutes petites, cachées par le boîtier du microprocesseur. Iµl vous suffit de savoir qu'elles sont là.
"est ce que le code est bon"
A priori, aucune horreur ne m'a fait sursauter (et je n'ai pas de checker de code sous la main). Deux petits détails:
a) } else { gagne à être sur la même ligne (plus lisible avec les petits écrans de telephone portable; cpplint le signale) ... pareil pour if (xx) { .
b) vous avez rajouté une verrue pour vos interrupteurs; faites attention aux risques de rebonds (ou constatez que vos inetrrupteurs sont exempts de cette plaie, et ignorez le)...

Ardginner

b) vous avez rajouté une verrue pour vos interrupteurs; faites attention aux risques de rebonds (ou constatez que vos inetrrupteurs sont exempts de cette plaie, et ignorez le)...
qu'entendez-vous par verrue?

dbrion06

Une modification après coup, impliquant une reflection moins poussée que l'original, donc un risque de pannes plus grand (je vois les rebonds).

Go Up