Faire varier la vitesse d'un moteur DC en fonction de la distance

Bonjour à tous,

Dans le cadre de mes études je dois faire une plateforme motorisée capable de détecter des obstacles et les éviter (capteur à ultrasons qui détecte les obstacles à une certaine distance). Ainsi lorsque qu'elle rencontre un obstacle à 10 cm, le moteur (qui tourne à 100 rpm) est censé s'arrêter jusqu'à 5 cm de l'obstacle.
J'ai pu réussir à coder le principal mais je n'arrive pas à écrire le fait que la vitesse du moteur diminue linéairement jusqu'à 5 cm de l'obstacle.
Est ce que vous pourriez me guider et m'aider s'il vous plait ?

Je vous remercie d'avance.

Bonne journée.

c'est quoi cette image en pièce jointe...


copier/coller ça vous parle pour du texte ?

avez vous lu les règles du forum? qu'avez vous essayé de faire ? quel est votre matériel ?

Pour bien comprendre les moteurs (et pour bien débuter avec l'arduino), c'est bien de lire Le mouvement grâce aux moteurs - les tutos d'eskimon. (commencez par la partie Le moteur à courant continu)

J'ai déjà exposé mon problème juste au dessus....
Pour ce qui est du matériel je dispose d'un motoréducteur et d'une arduino uno. Pour ce que j'ai fait voici le montage que j'ai retranscris sur tinkercad afin que cela soit plus clair. Et voici le code qui va avec.
Je n'arrive donc pas à faire diminuer la vitesse de mon moteur.

const int motor_enablePin = 11; // pont en H
const int motor_in1 = 13; // avance
const int motor_in2 = 12; // recule
const int speed = 255; // vitesse du moteur

const byte triggerPin = 4;
const byte echoPin = 5;

const unsigned long measure_timeout = 25000UL; // temps nécessaire avant de considérer qu'il n'y a pas d'obstacle

const float sound_speed = 340.0 / 1000; // vitesse du son dans l'air

void setup()
{
pinMode(motor_enablePin, OUTPUT); // initialisation du moteur
pinMode(motor_in1, OUTPUT);
pinMode(motor_in2, OUTPUT);

pinMode(triggerPin, OUTPUT); // initialisation du capteur
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
Serial.begin(115200);
}

void loop()
{
digitalWrite(motor_enablePin, HIGH);
analogWrite(motor_in1, speed);
analogWrite(motor_in2, 0);

digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
long measure = pulseIn(echoPin, HIGH, measure_timeout);
float distance_mm = measure / 2.0 * sound_speed;

/*
if(distance_mm <= 1000 && distance_mm > 500)
{
for(int slowdown=100; slowdown>=0; slowdown-=25)
{
int value = map(slowdown, 100, 0, 255, 0);
analogWrite(motor_enablePin, value);
Serial.print(F("Distance: "));
Serial.print(distance_mm /10.0, 2);
Serial.print(F(" cm,"));
Serial.print(" Vitesse: +");
Serial.print(value);
Serial.println(" rpm");
}
}
*/

/*
if(distance_mm <= 1000)
{
do
{
slowdown(100);
Serial.print(F("Distance: "));
Serial.print(distance_mm /10.0, 2);
Serial.print(F(" cm,"));
Serial.print(" Vitesse: +");
Serial.print(speed*100/255);
Serial.println(" rpm");
}
while (distance_mm > 500);
}
*/

Serial.print(F("Distance: "));
Serial.print(distance_mm / 10.0, 2);
Serial.print(F(" cm,"));
if (distance_mm <= 100)
{
analogWrite(motor_in1, 0);
analogWrite(motor_in2, speed);
Serial.print(" Vitesse: -");
}
else
Serial.print(" Vitesse: +");
Serial.print(speed * 100 / 255);
Serial.println(" rpm");

delay(1000);
}

/*
void slowdown(int percentage)
{
int power = map(percentage, 0, 100, 0, 255);
analogWrite(motor_enablePin, power);
}
*/

code_moteur.ino (2.29 KB)

vous n'avez pas lu les règles du forum on dirait...

Peut être mais là n'est pas la question, en tout cas je ne vous remercie pas pour votre aide. >:(

vous partez mal... j'essayais de vous aider pour que votre poste ne finisse pas à la poubelle...

lisez cela (et les autres règles)

bon courage donc... vu votre attitude ce sera sans moi.

Je ne sais pas comment le faire, comme vous avez pu le voir je suis tout nouveau donc normal que je ne sache pas utiliser toutes les fonctionnalités du forum.
Tant pis au moins je saurai pour l'avenir.
Bonne soirée.

update so :

const int motor_enablePin = 11; // pont en H
const int motor_in1 = 13; // avance
const int motor_in2 = 12; // recule
const int speed = 255; // vitesse du moteur

const byte triggerPin = 4;
const byte echoPin = 5;

const unsigned long measure_timeout = 25000UL; // temps nécessaire avant de considérer qu'il n'y a pas d'obstacle

const float sound_speed = 340.0 / 1000; // vitesse du son dans l'air

void setup()
{
  pinMode(motor_enablePin, OUTPUT); // initialisation du moteur
  pinMode(motor_in1, OUTPUT);
  pinMode(motor_in2, OUTPUT);

  pinMode(triggerPin, OUTPUT); // initialisation du capteur
  digitalWrite(triggerPin, LOW);
  pinMode(echoPin, INPUT);
  Serial.begin(115200);
}

void loop()
{
  digitalWrite(motor_enablePin, HIGH);
  analogWrite(motor_in1, speed);
  analogWrite(motor_in2, 0);

  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);
  long measure = pulseIn(echoPin, HIGH, measure_timeout);
  float distance_mm = measure / 2.0 * sound_speed;

  /*
    if(distance_mm <= 1000 && distance_mm > 500)
    {
    for(int slowdown=100; slowdown>=0; slowdown-=25)
    {
      int value = map(slowdown, 100, 0, 255, 0);
      analogWrite(motor_enablePin, value);
      Serial.print(F("Distance: "));
      Serial.print(distance_mm /10.0, 2);
      Serial.print(F(" cm,"));
      Serial.print(" Vitesse: +");
      Serial.print(value);
      Serial.println(" rpm");
    }
    }
  */

  /*
    if(distance_mm <= 1000)
    {
    do
    {
      slowdown(100);
      Serial.print(F("Distance: "));
      Serial.print(distance_mm /10.0, 2);
      Serial.print(F(" cm,"));
      Serial.print(" Vitesse: +");
      Serial.print(speed*100/255);
      Serial.println(" rpm");
    }
    while (distance_mm > 500);
    }
  */

  Serial.print(F("Distance: "));
  Serial.print(distance_mm / 10.0, 2);
  Serial.print(F(" cm,"));
  if (distance_mm <= 100)
  {
    analogWrite(motor_in1, 0);
    analogWrite(motor_in2, speed);
    Serial.print(" Vitesse: -");
  }
  else
    Serial.print(" Vitesse: +");
  Serial.print(speed * 100 / 255);
  Serial.println(" rpm");

  delay(1000);
}

/*
  void slowdown(int percentage)
  {
  int power = map(percentage, 0, 100, 0, 255);
  analogWrite(motor_enablePin, power);
  }
*/
[code]

HolaLa9:
Je ne sais pas comment le faire, comme vous avez pu le voir je suis tout nouveau donc normal que je ne sache pas utiliser toutes les fonctionnalités du forum.

c'est bien pour cela que je vous disais de lire les règles de base... les titres sont assez clairs quand vous arrivez sur le forum...

Ok au temps pour moi, je n'avais pas lu les topics déjà postés.
Mais cela ne vous permet pas de ne pas être aimable avec les gens.

La moindre des politesse quand vous venez demander à des bénévoles de passer du temps sur VOTRE projet ou que vous souhaitez rejoindre un "groupe", c'est de faire l'effort de vous adapter aux usages (qui ont en plus une très bonne raison concernant les balises de code).

Donc si votre définition de "pas aimable" c'est de vous demander de lire les bonnes pratiques du forum... alors j'assume et votre agressivité ne vous emmènera pas bien loin...

bye

Je ferme le topic....

Pour avoir une réponse à la question posée, il faudra passer par la case départ comme indiqué... et refaire un nouveau topic dans les régles.