bonjour
je boss sur un mini robot arduino mais voila mais il se fait que quand je ne donne pas la valeur de 255 aux pins EN du moteurs, la roue gauche ne tourne. et quand le pdonne la valeur 255, les roues tournent trop vite. j'aimerai pouvoir réguler la puissance des moteurs. j'utilse une carte Arduino UNO et un shield BB-L298 pour la gestion des moteurs
PS le code que j'utilse
#include <Servo.h>
/*DECLARATIONS EN LIEN AVEC LE MOTEUR*/
const int DOUT_MOTEUR_GAUCHE_EN = 6;
const int moteurGaucheA = 5;
const int moteurGaucheR = 7;
const int DOUT_MOTEUR_DROIT_EN = 9;
const int moteurDroitA = 8;
const int moteurDroitR = 10;
//DECLARATION EN LIEN AVEC LE CAPTEUR DISTANCE ET LE SERVOMOTEUR*/
const byte TRIGGER = 4; // broche TRIGGER
const byte ECHO = 2; // broche ECHO
//const unsigned long MEASURE_TIMEOUT = 25000UL;
//const float SOUND_SPEED = 340.0 / 1000;
float intervalle;
int distanceAvant;
float distanceDroite;
float distanceGauche;
const int delay_time = 250;
Servo myservo;
//DECLARATION VARIABLE DHT
void setup() {
// put your setup code here, to run once:
// initialisation de la communication série:
Serial.begin(115200);
pinMode(moteurGaucheA, OUTPUT);
pinMode(moteurGaucheR, OUTPUT);
pinMode(moteurDroitA, OUTPUT);
pinMode(moteurDroitR, OUTPUT);
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, LOW);
// inialisation du capteur de distance et du servomoteur
pinMode(TRIGGER, OUTPUT);
//digitalWrite(TRIGGER, LOW);
pinMode(ECHO, INPUT);
myservo.attach(3);
myservo.write(30);
pinMode(DOUT_MOTEUR_GAUCHE_EN, OUTPUT);
pinMode(DOUT_MOTEUR_DROIT_EN, OUTPUT);
}
//FONCTION MOTEURS
void avancer()
{
analogWrite(DOUT_MOTEUR_GAUCHE_EN, 255); // les deux moteurs tournent à la même vitesse//
analogWrite(DOUT_MOTEUR_DROIT_EN, 255);
digitalWrite(moteurGaucheA, HIGH);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, HIGH);
digitalWrite(moteurDroitR, LOW);
}
void reculer()
{
analogWrite(DOUT_MOTEUR_GAUCHE_EN , 255); // les deux moteurs tourne dans le sens opposé à celui qu'ils avait dans la commande pour avancer en ligne droite//
analogWrite(DOUT_MOTEUR_DROIT_EN, 255);
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, HIGH);
//
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, HIGH);
}
void arreter()
{
analogWrite(DOUT_MOTEUR_GAUCHE_EN , 0); // les deux moteurs s'arrêtent //
analogWrite(DOUT_MOTEUR_DROIT_EN, 0);
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, LOW);
}
void pivoterGauche()
{
analogWrite(DOUT_MOTEUR_GAUCHE_EN , 0); // le moteur gauche frenne en tournant dans le sens opposé à celui du moteur droit //
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, HIGH);
analogWrite(DOUT_MOTEUR_DROIT_EN, 255);
digitalWrite(moteurDroitA, HIGH);
digitalWrite(moteurDroitR, LOW);
delay(250);
analogWrite(DOUT_MOTEUR_GAUCHE_EN , 0); // les deux moteurs s'arrêtent //
analogWrite(DOUT_MOTEUR_DROIT_EN, 0);
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, LOW);
}
void pivoterDroite()
{
analogWrite(DOUT_MOTEUR_GAUCHE_EN , 255); // le moteur gauche continue à tourner avec la même vitesse //
digitalWrite(moteurGaucheA, HIGH);
digitalWrite(moteurGaucheR, LOW);
analogWrite(DOUT_MOTEUR_DROIT_EN, 0);
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, HIGH);
delay(250);
analogWrite(DOUT_MOTEUR_GAUCHE_EN , 0); // les deux moteurs s'arrêtent //
analogWrite(DOUT_MOTEUR_DROIT_EN, 0);
digitalWrite(moteurGaucheA, LOW);
digitalWrite(moteurGaucheR, LOW);
digitalWrite(moteurDroitA, LOW);
digitalWrite(moteurDroitR, LOW);
}
//FONCTIONs UTRASONs
void mesurerDistanceAvant()//controle direction droit du servocommande
{
myservo.write(30);
delay(delay_time);
digitalWrite(TRIGGER, LOW);
delayMicroseconds(10);
digitalWrite(TRIGGER, HIGH);
intervalle = pulseIn(ECHO, HIGH);
/* 3 calcul la distance a partir du temps mesuré */
distanceAvant = ((intervalle / 2) / 29.1);
Serial.print(" Distance ");
//distanceAvant = distance_mm / 10.0, 2;
Serial.print(distanceAvant);
//Serial.println("cm");
// delay(300);
}
void mesurerDistanceGauche()//controle direction droit du servocommande
{
myservo.write(0);
delay(delay_time);
digitalWrite(TRIGGER, LOW);
delayMicroseconds(10);
digitalWrite(TRIGGER, HIGH);
intervalle = pulseIn(ECHO, HIGH);
/* 3 calcul la distance a partir du temps mesuré */
distanceGauche = ((intervalle / 2) / 29.1);
/*Serial.println("distance Gauche ");
Serial.print(distanceGauche);
Serial.print("cm de ");*/
delay(300);
}
void mesurerDistanceDroite()//controle direction droit du servocommande
{
myservo.write(60);
delay(delay_time);
digitalWrite(TRIGGER, LOW);
delayMicroseconds(10);
digitalWrite(TRIGGER, HIGH);
intervalle = pulseIn(ECHO, HIGH);
/* 3 calcul la distance a partir du temps mesuré */
distanceDroite = ((intervalle / 2) / 29.1);
/*Serial.println("distance Droite ");
//distanceAvant = distance_mm / 10.0, 2;
Serial.print(distanceAvant);
Serial.print("cm de ");*/
delay(300);
}
//FONCTION UTASONS
void modeUltrason()
{
mesurerDistanceAvant();
delay(delay_time);
if (distanceAvant < 25) //Si la distance avant est de moins de 25cm
{
arreter();
//"Obstacle à l'avant")
delay(delay_time);
mesurerDistanceGauche();
delay(delay_time);
mesurerDistanceDroite();
delay(delay_time);
//delay(delay_time);
//reculer();
//delay(delay_time);
//pivoterGauche();
//delay(delay_time);
//avancer();
if (distanceGauche < 15 && distanceDroite < 15) //Si la distance à gauche et la distance à droite sont de moins de 15cm
{
//Obstacles à gauche et à droite, reculer
reculer();
delay(500);
pivoterGauche();
delay(250);
}
else if (distanceGauche > distanceDroite) //Si la distance gauche est plus grande que la distance droite
{
//Obstacle à droite, tourner à gauche
pivoterGauche();
delay(250);
}
else if (distanceGauche <= distanceDroite) //Si la distance gauche est plus petite ou égale à la distance droite
{
//Obstacle à gauche, tourner à droite
pivoterDroite();
delay(250);
}
}
else //Si la distance avant est de plus de 15cm
{
/* Serial.println("Aucun obstacle, continuer tout droit");
Serial.println();*/
avancer();
}
}
void loop() {
// put your main code here, to run repeatedly:
modeUltrason();
}