Arduino moteur et ultrasons

Résolu/Fermé
Signaler
Messages postés
85
Date d'inscription
mercredi 21 octobre 2015
Statut
Membre
Dernière intervention
19 novembre 2020
-
 Utilisateur anonyme -
Bonjour,
J'utilise l’Arduino , ainsi qu'un pont en H.
Mon problème est sur cette ligne de code :
if (range < 20) {
if (rangegauche < rangedroite) {
x = 0;
y = 255;
delay(700);
}

pour expliquer , range , rangegauche et rangedroite sont des capteurs a ultrasons placer sur une robot comme l'indique leur nom.La première partie du programme fonctionnent et n'a pas besoin de modification c'est un if dans if , si un obstacle est détecter devant le robot , il cherche si un obstacle est plus prés a droite ou a gauche et tourne en fonction.
Mais voila le problème et que mon robot ne tourne très peu car des que l'obstacle devant n'est plus a 20 cm et bien le robot se remet a avancer tout droit et se prend le mur. Ma première idée a donc était de mettre un delay afin de lui faire faire un 90° mais , ce delay affecte avant que les roues tourne , c'est a dire que il détecte un obstacle et tourne 700ms après , et ce n'est pas ce que je veux. Ce que je voudrais c'est que , lors de la détection de l'obstacle c'est qu'il tourne durant 700ms.
Voila j’espère avoir était claire et je m'excuse pour les fautes , merci d'avance et si vous avez des questions n'hésiter pas.

2 réponses


Salut, il nous faudrait plus d'informations sur ton montage électrique (schéma) ainsi que le code complet si possible.
Messages postés
85
Date d'inscription
mercredi 21 octobre 2015
Statut
Membre
Dernière intervention
19 novembre 2020
118
Ok , pour le schéma electrique ca va être compliquer j'ai fais ca a l'envoler sans schéma particulier
mais voici le code complet

//Module GSM



// Ici entrer le numéro
// Ici le message

//Vitesse des moteurs
int x = 0; //roue droite
int y = 0; //roue gauche
//PIN Utiliser par le moteur
int E1 = 5;
int M1 = 4;
int E2 = 6;
int M2 = 7;

// déclarations des variables pour l'ultrasons
#include "Ultrasonic.h"
int range;
int rangegauche;
int rangedroite;
Ultrasonic ultrasonic(11);
Ultrasonic ultrasonicgauche(8);
Ultrasonic ultrasonicdroite(9);

void setup()
{
//Module GSM

// sendSMS();

//initialisation a 9600 baud
Serial.begin(9600);

// Moteur 1 et Moteur 2 déclarer comme des sorties afins de les alimenters.
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
}


void loop()
{
//Capteur a ultraons devant
long range;
range = ultrasonic.MeasureInCentimeters(); // Mesure en centimetre
Serial.print(range);//Afficher dans le moniteur série la distance de 0 a 400cm
Serial.println(" cmdevant");

//Capteur a ultraons droite
long rangedroite;
rangedroite = ultrasonicdroite.MeasureInCentimeters(); // two measurements should keep an interval
Serial.print(rangedroite);//0~400cm
Serial.println(" cmdroite");
//Capteur a ultraons gauche
long rangegauche;
rangegauche = ultrasonicgauche.MeasureInCentimeters(); // two measurements should keep an interval
Serial.print(rangegauche);//0~400cm
Serial.println(" cmgauche");


// Moteur 1 et 2 initialiser vers l'avant , puis leur vitesse en fonction du x et y dans les if
digitalWrite(M1, LOW);
digitalWrite(M2, LOW);
analogWrite(E1, x); //PWM Speed Control
analogWrite(E2, y); //PWM Speed Control



if (range < 20) {
if (rangegauche < rangedroite) {
delay(700);
x = 0;
y = 255;
}
else {
delay(700);
x = 255;
y = 0;
}
}
else {
x = 255;
y = 255;
} ç
if ( (rangedroite < 10) && (rangegauche < 10) && (range < 10) ) {
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
delay(5000);
x = 255;
y = 255;

}
}
// Mini programme pour envoyer les messages

Je ne peut pas tester mais essai dans cette idée :


//PIN Utiliser par le moteur
int E1 = 5;
int M1 = 4;
int E2 = 6;
int M2 = 7;


// déclarations des variables pour l'ultrasons
#include "Ultrasonic.h"
long range;
long rangegauche;
long rangedroite;


Ultrasonic ultrasonic(11);
Ultrasonic ultrasonicgauche(8);
Ultrasonic ultrasonicdroite(9);

void setup()
{

// Moteur 1 et Moteur 2 déclarer comme des sorties afins de les alimenters.
Serial.begin(9600);
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);

}


void loop()
{

mesureCapteur(range);
mesureCapteur(rangegauche);
mesureCapteur(rangedroite);

digitalWrite(M1, LOW);
digitalWrite(M2, LOW);


// Rotation Gauche
if (range < 20 and (rangegauche < rangedroite)) {
rotationMoteur(0, 255);
}

// Rotation Droite
if (range < 20 and (rangedroite < rangegauche)) {
rotationMoteur(255, 0);
}

// Avancer
if (range >= 20) {
analogWrite(E1, 255); //PWM Speed Control
analogWrite(E2, 255); //PWM Speed Control
}


}



void rotationMoteur(long x, long y) {

// ICI REGLE LE TEMPS DE ROTATION EN CHANGANT ""100""
for (int i = 0; i < 100; i ++) {
analogWrite(E1, x);
analogWrite(E2, y);
delay(5);
}

}


void mesureCapteur(long capteur) {

capteur = ultrasonicdroite.MeasureInCentimeters();
Serial.print(capteur);
Serial.println(" cmdroite");
}
Messages postés
85
Date d'inscription
mercredi 21 octobre 2015
Statut
Membre
Dernière intervention
19 novembre 2020
118
Ok super intelligent , je n'y avais pas du tout penser , merci beaucoup j'essaye et je communique le résultats merci encore !
Messages postés
85
Date d'inscription
mercredi 21 octobre 2015
Statut
Membre
Dernière intervention
19 novembre 2020
118
Et bien le résultats est super , c'est exactement ce qu'il me fallait , merci beaucoup a toi , voici le programme final avec quelque modification pour les intéressé.




//Module GSM



// Ici entrer le numéro
// Ici le message

//Vitesse des moteurs
int x = 0; //roue droite
int y = 0; //roue gauche
//PIN Utiliser par le moteur
int E1 = 5;
int M1 = 4;
int E2 = 6;
int M2 = 7;

// déclarations des variables pour l'ultrasons
#include "Ultrasonic.h"
int range;
int rangegauche;
int rangedroite;
Ultrasonic ultrasonic(11);
Ultrasonic ultrasonicgauche(8);
Ultrasonic ultrasonicdroite(9);

void setup()
{
//Module GSM

// sendSMS();

//initialisation a 9600 baud
Serial.begin(9600);

// Moteur 1 et Moteur 2 déclarer comme des sorties afins de les alimenters.
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
}


void loop()
{
//Capteur a ultraons devant
long range;
range = ultrasonic.MeasureInCentimeters(); // Mesure en centimetre
Serial.print(range);//Afficher dans le moniteur série la distance de 0 a 400cm
Serial.println(" cmdevant");

//Capteur a ultraons droite
long rangedroite;
rangedroite = ultrasonicdroite.MeasureInCentimeters(); // two measurements should keep an interval
Serial.print(rangedroite);//0~400cm
Serial.println(" cmdroite");
//Capteur a ultraons gauche
long rangegauche;
rangegauche = ultrasonicgauche.MeasureInCentimeters(); // two measurements should keep an interval
Serial.print(rangegauche);//0~400cm
Serial.println(" cmgauche");


// Moteur 1 et 2 initialiser vers l'avant , puis leur vitesse en fonction du x et y dans les if
digitalWrite(M1, LOW);
digitalWrite(M2, LOW);
analogWrite(E1, x); //PWM Speed Control
analogWrite(E2, y); //PWM Speed Control


// Rotation Gauche
if (range < 20 && (rangegauche < rangedroite)) {
rotationMoteur(0, 255);
}
// Rotation Droite
if (range < 20 && (rangedroite < rangegauche)) {
rotationMoteur(255, 0);
}
// Avancer
if (range >= 20) {
analogWrite(E1, 255); //PWM Speed Control
analogWrite(E2, 255); //PWM Speed Control
}
//Reculer
if ( (rangedroite < 10) && (rangegauche < 10) && (range < 10) ) {
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
rotationMoteur(255, 255);


}

}
// Mini programme pour envoyer les messages


void rotationMoteur(long x, long y) {

// ICI REGLE LE TEMPS DE ROTATION EN CHANGANT ""100""
for (int i = 0; i < 250; i ++) {
analogWrite(E1, x);
analogWrite(E2, y);
delay(5);
}

}
Utilisateur anonyme
Merci pour le retour, je marque ton poste comme résolu.