Besoin d'aide pour notre projet : boutons qui ne marchent pas (tinkercad)

Bonjour, nous sommes au lycée et avons un projet à faire.
Nous voulons faire marcher 2 boutons et un pont en H pour changer le sens de nos 2 moteurs. Cependant, notre programme(fait sur Tikercad) ne marche pas: nous n'arrivons pas à connecter notre 2eme bouton et les moteurs marchent tous seuls.
De plus nous ne savons pas si nous avons fait les connections filaires correctement.
Pouvez-vous nous aider svp?
Merci :slight_smile:
(PS: on a aussi demandé sur le forum anglais/international)

Ci-joint notre lien vers le circuit Tikercad : Circuit design 2 moteur + bouton + peh +capteur | Tinkercad

Et voici le programme :

//Connection bouton
const int bouton = 1;
int etatBouton;
//Connection capteur distance
int sinal=6;
float distance;
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;


void setup() {
    // Set up du capteur
    Serial.begin(9600); //on sait pas
    pinMode(sinal,OUTPUT);
    digitalWrite(sinal,LOW);
	
  // Set all the motor control pins to outputs
	pinMode(enA, OUTPUT);
	pinMode(enB, OUTPUT);
	pinMode(in1, OUTPUT);
	pinMode(in2, OUTPUT);
	pinMode(in3, OUTPUT);
	pinMode(in4, OUTPUT);
	
	// Turn off motors - Initial state
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}

void loop() {
	directionControl();
	delay(1000);
    etatBouton = digitalRead(bouton); //lire état bouton
    read(); //lire la distance
    distance=distance/2;
    distance=distance*0.034029;
  
    Serial.println(distance);
    delay(100);
}  

// This function lets you control spinning direction of motors
void directionControl() {
	// Set motors to maximum speed
	// For PWM maximum possible values are 0 to 255
	analogWrite(enA, 255);
	analogWrite(enB, 255);
  
	//Conditions moteurs
    if(distance<100 && etatBouton == 1){ //bouton pas appuyé
    digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW); // les moteurs ne tournent pas
    }
    else if (distance>100 && etatBouton == 1){ // bouton pas appuyé
    digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW); // Le moteur ne tourne pas 
    }
    else if (distance<100 && etatBouton == 0){ // bouton appuyé
    digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW); // Le moteur ne tourne pas 
    }
    else if (distance>100 && etatBouton == 0){ // bouton appuyé
    digitalWrite(in1, HIGH);
	digitalWrite(in2, LOW);
	digitalWrite(in3, HIGH);
	digitalWrite(in4, LOW); // Le moteur tourne 
    }
  else{
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW); // Le moteur s'arrête de tourner
  }
}	
  void read(){
  pinMode(sinal,OUTPUT);
  digitalWrite(sinal,HIGH);
  delayMicroseconds(5);
  digitalWrite(sinal, LOW);
  
  pinMode(sinal,INPUT);
  distance=pulseIn(sinal,HIGH);
}

Bonjour leogal

L'entrée du bouton n'est pas initialisée.

Du fait que:
if(distance<100 && etatBouton == 1){ //bouton pas appuyé

Il faut:
pinMode(bouton, INPUT_PULLUP);
Pour INPUT_PULLUP voir ici.

L'usage de la pin 1 pour le bouton
const int bouton = 1;

n'est pas recommandé, c'est le Tx de la communication USB (moniteur/téléchartgement de l'IDE Arduino),
image

il est préférable d'en choisir d'autres.

Cordialement
jpbbricole

Merci beaucoup, nous allons essayer les changements! :slight_smile:

Bonjour leogal

J'ai essayé sur Thinkercad, ça fonctionne avec
const int bouton = 10;

Petit conseil pour la clareté du schéma, il est bien de colorer les fils GND en noir et réserver le rouge pour le +5V.

A+
Cordialement
jpbbricole

Change le titre (icône crayon à coté du titre) !

Un titre doit obligatoirement refléter la question posée.
Les titres servent pour le moteur de recherche du forum et sont utilisés par ceux qui font des recherches avant de poser des questions.

Et par la même occasion lit le message d'accueil :

C'est fait, merci :+1:

Le circuit que nous avons envoyé est avec un seul bouton. Ici nous avons 2 boutons et rien ne marche. Pouvez-vous y jeter un oeil svp ?

Merci :smiling_face_with_tear:

Bonjour leogal

Tu as choisi la mauvaise platine d'essai, il faut en choisir une avec les bus d'alimentation que l'on repère avec les lignes noires et rouges:

Ce n'est pas juste cette platine a bien le bus connecté mais pas marqué.
image
image

Je recherche une autre cause :wink:

A+
cordialement
jpbbricole

Bonjour leogal
Un truc bizarre, la remarque dit PWM maximum et la valeur analogWrite est à 0 ?

void directionControl() {
	// Set motors to maximum speed
	// For PWM maximum possible values are 0 to 255
	analogWrite(enA, 0);
	analogWrite(enB, 0);

}

Ce qui veut dire que dans loop(), à chaque appel de directionControl() on arrête le moteur?

Ta logique des boutons est inversée, quand un bouton est appuyé il donne un LOW du fait de INPUT_PULLUP, il donne HIGH quand il est relâché.

	if(distance<100 && etatBouton == LOW && etatBouton2 == LOW){ //boutons pas appuyés
doit être
	if(distance<100 && etatBouton == HIGH && etatBouton2 == HIGH){ //boutons pas appuyés

Tes 4 premières conditions on toutes la même action:

		digitalWrite(in1, LOW);
		digitalWrite(in2, LOW);
		digitalWrite(in3, LOW);
		digitalWrite(in4, LOW); // Le moteur ne tourne pas

Ah les joies du presse-papier :wink:
Tu aurais du ajouter le 2ème bouton à ta première version du programme qui tournait mieux :wink:

A+
Cordialement
jpbbricole

Merci beaucoup! On va essayer et on revient vers vous :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.