Robot suiveur de ligne et régulateur de vitesse

Bonjour à tous,

Je viens aujourd'hui vous demander de l'aide, car j'ai un projet à rendre pour le 11 juin, mais je rencontre un petit problème. En effet, mon projet est de coder un robot suiveur de ligne. Jusque là pas de soucis. J'avais commencé à coder sur un Raspberry Pi, sauf que celui ci est mort ne me laissant pas d'autres choix que d'utiliser un Arduino pour la première fois de ma vie. J'ai réussi à refaire le code concernant les capteurs et à coder les fonctions avancer, reculer, tourner à droite, tourner à gauche. Néanmoins le robot avance trop vite, et donc décroche trop facilement de sa ligne. Auriez vous une idée afin de pouvoir réguler la vitesse ?

Merci d'avance.

Je dispose de :

-Une carte Arduino Uno - Un Châssis éco DG008 (Ici) - 2 Capteurs de lignes - 2 Potentiomètres (ici) - D'un pont en H, afin de pouvoir faire tourner mes moteurs dans les deux sens. Brancher comme cela (ici )

Je crois avoir tout dis, je ne sais pas si cela est utile pour le moment, mais je vous laisse quand même mon code au cas où

const int capteurGauche = 3 ;
    const int capteurDroit = 2;
    bool etatCapteurGauche;
    bool etatCapteurDroit;
    const int moteurGaucheA = 10;
    const int moteurGaucheR = 11;
    const int moteurDroitA = 5;
    const int moteurDroitR = 6;
    char valSerie;


    void setup()
    {
      // put your setup code here, to run once:
      Serial.begin(9600);
      pinMode(capteurGauche, INPUT);
      pinMode(capteurDroit, INPUT);
      pinMode(moteurGaucheA, OUTPUT);
      pinMode(moteurGaucheR, OUTPUT);
      pinMode(moteurDroitA, OUTPUT);
      pinMode(moteurDroitR, OUTPUT);

    }


     void avancer()
    {
      digitalWrite(moteurGaucheA, HIGH);
      digitalWrite(moteurGaucheR, LOW);
      digitalWrite(moteurDroitA, HIGH);
      digitalWrite(moteurDroitR, LOW);
      delay(1000); 
      
    }
    void gauche()
    {
      digitalWrite(moteurGaucheA, LOW);
      digitalWrite(moteurGaucheR, LOW);
      digitalWrite(moteurDroitA, HIGH);
      digitalWrite(moteurDroitR, LOW);
    }
    void droite()
    {
      digitalWrite(moteurGaucheA, HIGH);
      digitalWrite(moteurGaucheR, LOW);
      digitalWrite(moteurDroitA, LOW);
      digitalWrite(moteurDroitR, LOW);
    }
    void reculer()
    {
      digitalWrite(moteurGaucheA, LOW);
      digitalWrite(moteurGaucheR, HIGH);
      digitalWrite(moteurDroitA, LOW);
      digitalWrite(moteurDroitR, HIGH);
    }
    void arreter()
    {
      digitalWrite(moteurGaucheA, LOW);
      digitalWrite(moteurGaucheR, LOW);
      digitalWrite(moteurDroitA, LOW);
      digitalWrite(moteurDroitR, LOW);
    }
    void pivoterGauche()
    {
      digitalWrite(moteurGaucheA, LOW);
      digitalWrite(moteurGaucheR, HIGH);
      digitalWrite(moteurDroitA, HIGH);
      digitalWrite(moteurDroitR, LOW);
    }
    void pivoterDroite()
    {
      digitalWrite(moteurGaucheA, HIGH);
      digitalWrite(moteurGaucheR, LOW);
      digitalWrite(moteurDroitA, LOW);
      digitalWrite(moteurDroitR, HIGH);
    }
    
    void loop()
    {
      // put your main code here, to run repeatedly:

      etatCapteurGauche = digitalRead(capteurGauche);
      etatCapteurDroit = digitalRead(capteurDroit);
      Serial.print (etatCapteurGauche);
      Serial.println ("-");
      Serial.print (etatCapteurDroit);
      

        if(etatCapteurGauche) //Si le capteur de gauche détecte du noir
      {
         if ( (etatCapteurDroit)) //S'il y a du blanc à droite, tourner à gauche
        {
          Serial.println("Tourner à gauche");
          droite ();
          delay(2000);
          arreter();
          delay(1000);
          droite();
        }
         else if ((!etatCapteurDroit)) //S'il y a du noir à droite, Continuer tout droit
        {
          Serial.println("Continuer tout droit");
          avancer();
                 }
      }
      else //Si le capteur de gauche détecte du blanc
      {
        if  (!etatCapteurDroit) //S'il y a du noir à droite, tourner à droite
        {
          Serial.println("Tourner à droite");
          gauche ();
          delay(1000);
          arreter();
          delay(10);         
          gauche();

        }
        else //Si les conditions plus haut ne s'appliquent pas, reculer
        {
          Serial.println("Reculer");
          reculer () ;
          delay(1000);
          reculer();

        }
     }}

Comme on peut le voir j'avais essayé de réguler la vitesse en ajoutant des fonctions delay dans mon code afin de temporiser, mais cela ne fonctionne pas vraiment. Merci d'avance pour votre aide, et n'hésitez pas à me l'indiquer si je n'ai pas été assez claire, ou s'il manque des informations.

Cordialement, lel_9

PS: Dans le code il est écrit "Tourner à droite" alors que j'utilise la fonction gauche() et inversement, car il doit y avoir une inversion quelque part dans mes branchements mais je n'ai pas encore réussi à la trouver, c'est donc le moyen le plus rapide que j'ai trouvé pour le moment pour répondre à ce problème

J'avais commencé à coder sur un Raspberry Pi, sauf que celui ci est mort ne me laissant pas d'autres choix que d'utiliser un Arduino pour la première fois de ma vie.

euh... et le choix de racheter un RPi? c'était pas possible?

Vos delay() ne vont rien faire, en branchant comme cela


vous avez dit à vos moteurs d'aller à fond... En effet les pins Enables sont mises à Vcc

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 et comprenez à quoi servent les broches d’activation des ponts en comment on peut utiliser le PWM sur ces broches.