Arduino moteur et ultrasons

Résolu/Fermé
WiildLife Messages postés 85 Date d'inscription mercredi 21 octobre 2015 Statut Membre Dernière intervention 19 novembre 2020 - 24 mars 2018 à 12:59
 Utilisateur anonyme - 25 mars 2018 à 14:57
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

Utilisateur anonyme
24 mars 2018 à 16:18
Salut, il nous faudrait plus d'informations sur ton montage électrique (schéma) ainsi que le code complet si possible.
0
WiildLife Messages postés 85 Date d'inscription mercredi 21 octobre 2015 Statut Membre Dernière intervention 19 novembre 2020 122
24 mars 2018 à 17:31
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
0
Utilisateur anonyme
24 mars 2018 à 18:30
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");
}
0
WiildLife Messages postés 85 Date d'inscription mercredi 21 octobre 2015 Statut Membre Dernière intervention 19 novembre 2020 122
24 mars 2018 à 21:11
Ok super intelligent , je n'y avais pas du tout penser , merci beaucoup j'essaye et je communique le résultats merci encore !
0
WiildLife Messages postés 85 Date d'inscription mercredi 21 octobre 2015 Statut Membre Dernière intervention 19 novembre 2020 122
25 mars 2018 à 14:50
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);
}

}
0
Utilisateur anonyme
25 mars 2018 à 14:57
Merci pour le retour, je marque ton poste comme résolu.
0