maintien d'une distance latérale constante (véhicule autonome)

Bonjour à tous, je suis débutante sur Arduino et ai un projet à réaliser. J’ai choisi comme sujet la conservation d’une distance latérale d constante entre la voiture et le trottoir (par exemple). Pour être plus précise, je compte asservir l’angle de braquage afin de permettre un maintien uniforme et automatiser l conduite. J’ai déjà monter une voiture à l’aide de tutoriels : elle est munie d’une carte arduino uno, de 4 moteurs chacun lié à une roue et de deux capteurs ultrasons. Elle marche très bien (j’ai déjà codé des scripts simples marche avant, arrière , tourner etc…) et le problème s’annonce lorsque je veux me lancer dans la rédaction d’un code pour justement collecter toutes les valeurs de cette angle de braquage et les corriger en fonction de la distance avec une chaussée.
J’ai joint une photo résumant la situation en espérant que quelqu’un puisse m’éclairer je commence à perdre espoir et la date limite approche :slight_smile:

merci d’avance à tous ceux qui liront ceci

Capture.PNG

En premier lieu, je te conseille de ne pas te lancer dans la rédaction d'un code, mais de poser le problème avec un papier et un crayon.

Il faut faire un "modèle" de ta voiture, c'est à dire écrire les équations qui la caractérisent. Tu parles de 4 moteurs, mais pas de possibilité de braquage (qui consiste à modifier l'angle des roues par rapport à la voiture). Peut-être prévois-tu de "braquer" en faisant tourner les roues avec des vitesses différentes à droite et à gauche ? Dans tous les cas, il faut commencer par établir une relation mathématique entre tes "poignées" de commande (la vitesse des roues par ex.) et la direction prise par la voiture.

Ensuite il faudra réaliser un asservissement de la distance au trottoir (d) en agissant sur tes "poignées" de commande.

Tu as choisi un sujet difficile, fais-toi aider par ton professeur ... et bon courage !

merci beaucoup de m’avoir répondu
j’ai donc essayé de d’abord faire une étude automatique et pour ce, il me faut un code tout simple pour faire tourner la voiture quelque peu en virage ou en ligne droite pour quelle conserve une distance constante (exemple 10 cm) avec l’obstacle de type mur que je lui met à coté par contre je vais péter un câble vu que mon code qui marchait bien avant se met à faire des siennes
de l’aide encore svp si vous pouvez avoir la gentillesse de me corriger cette catastrophe vu que je n’ai aucun professeur spécialiste en ARDUINO (je l’ai attaché) et merci encore

mon_code.ino (892 Bytes)

Commencez par libérer votre prof, après, on verra.

Bonsoir,

Traduction du code :

Si je suis a plus de 10cm j'avance, sinon je tourne à droite.

_

Problème: Admettons que la voiture se trouve à plus de 10cm elle va toujours avancer tout en s'éloignant de la consigne.

Il faut lui dire "Hey tu es un peu trop loin là reviens à droite".

Bonsoir Standby, en fait ce que je compte faire c'est une étude automatique il faut maintenant juste que ma voiture avance et tourne suivant un long "parcours" que je vais monter demain et donc j'ai cru coder tant que la distance entre la voiture et le mur >10 cm avancer sinon tourner de façon à ce que cette distance =10cm (et que donc elle est constante) étant une buse en C et plus a l'ase en python je me perds un peu :) que me proposez vous comme changements s'il vous plaît

hello
ton code n’a jamais compilé donc encore moins fpnctionné.
en voici un bout qui va te permettre de réfléchir.

il semble que tu joues sur les commandes de sens de rotation des moteurs, mais ce n’est pas cela qui va faire tourner les roues ( dans le sens “traction de la voiture”)

# define pinM1  3
# define pinM2  5
# define pinM3 10
# define pinM4 11
# define pin_triger 4
# define pin_echo   6

#include "Ultrasonic.h"

Ultrasonic ultrasonic(pin_triger, pin_echo);
int distance;

void setup() {
  Serial.begin(115200);
  pinMode(pinM1, OUTPUT);
  pinMode(pinM2, OUTPUT);
  pinMode(pinM3, OUTPUT);
  pinMode(pinM4, OUTPUT);

}

void loop()
{
  distance = ultrasonic.read();
  if ((distance > 10) && (distance < 11))
  {
    avancer();
  }
  else
  {
    if (distance < 10)
    {
      turn_left();            //ou l'inverse
    }
    else
    {
      if (distance > 11)
      {
        turn_right();         //ou l'inverse
      }
    }
  }
}
void avancer() {
  digitalWrite(pinM1, HIGH);
  digitalWrite(pinM3, HIGH);
  digitalWrite(pinM2, LOW);
  digitalWrite(pinM4, LOW);
}

void turn_right ()
{
  digitalWrite(pinM1, HIGH);
  digitalWrite(pinM3, LOW);
  digitalWrite(pinM2, LOW);
  digitalWrite(pinM4, HIGH);
}

void turn_left ()
{
  digitalWrite(pinM1, LOW);
  digitalWrite(pinM3, HIGH);
  digitalWrite(pinM2, HIGH);
  digitalWrite(pinM4, LOW);
}

Merci beaucoup j'ai vu qu'en effet elle n'avançais pas dois je utiliser la bibliothèque motor ? Je commence enfin à voir plus clair en matière d'Arduino merci à tous par contre je n'ai aucune idée de comment débloquer le problème (je passe donc évidemment pour la débile de service)

pour te répondre, il nous faut des renseignements que tu ne donnes pas type de carte arduino? moteur? courant continu ou pas à pas driver pour la puissance moteur?

lire ICI

pour comprendre "arduino et les moteurs" c'est ICI qu'il faut aller s'instruire

Désolé je ne m’en était pas rendu compte, j’ai 4 moteurs à courant continu chacun lié à une roue , une carte arduino uno et pour le driver je ne m’en souviens plus très bien mais je joindrai une photo

tu as donc 2 "drivers" comme celui de la photo 2 moteurs par drivers 4 moteurs = 2 drivers

pour commander le moteur A, tu raccordes les entrées A1 et A2 ? pour changer de sens de rotation, tu dois inverser A1 et A2 tu modifies donc deux sorties de l'arduino pour 1 moteur.

comment fais tu avec tes fonctions pour commander 4 moteurs en ne changeant que 4 sorties ?

void turn_right ()
{
  digitalWrite(pinM1, HIGH);
  digitalWrite(pinM3, LOW);
  digitalWrite(pinM2, LOW);
  digitalWrite(pinM4, HIGH);
}

pour moi ce bout de code va avec un autre type de driver (qui a une entrée "dir").

mais tu nous dis en #1 que tu as déjà fais rouler ta voiture

Elle marche très bien (j'ai déjà codé des scripts simples marche avant, arrière , tourner etc...)