Dans la fonction setup(), je lis un potentiomètre : Speed = map(analogRead(POT),0,1023,0,255);
Pourquoi dans le setup et pas dans le loop? ça permettrait de changer de réglage sans redémarer l'arduino (par exemple quand le robot est posé sur une caisse de manière à ce que les roues tournent dans le vide)
T = map(c1,970,1970,0,90);
...
R=R*cos(T*PI/180); // turn right
L=L*sin(T*PI/180); // turn left
ça correspond à quoi exactement T? je trouve ça étrange d'avoir quelque chose qui vas de 0 à 90 pour tourner. Est-ce que c'est un angle tourné de 45° (donc allant de -45° à +45°)? En tout cas c'est la seule manière que je vois qui permet d'avoir un comportement similaire en tournant vers la gauche ou vers la droite.
Mais si c'est ça, quand tu vas tout droit, tu as L=R=R*sqrt(2)/2, donc tu ne dépassera jamais un PWM de 180 en ligne droite.
Tu noteras également que les deux lignes "turn right" et "turn left" s'exécutent toujours, même si tu tournes pas ou dans un seul sens.
La formule "classique":
- v : vitesse linéaire du robot (m/s)
- w : vitesse de rotation du robot (rad/s)
- d : la distance entre les roues gauches et droites
alors la vitesse linéaire de chaque roue est : v_roue = v +- w*d (+ pour une roue, - pour l'autre) si tu définis une vitesse positive vers l'avant. Selon les branchements, il se peut que tu doives inverser le sens de rotation pour effectivement aller vers l'avant.
Je te suggère de mettre le robot sur un support, et de mesurer le PWM obtenu, pour vérifier si c'est bien celui attendu.
Sinon, deux petits conseils sur ton code :
- quand tu as des variables locales à ta fonction (ie qui ne servent pas en dehors), alors déclare les dans la fonction : c'est plus lisible, plus performant, et ça réduit le risque d'erreurs. NB : penses à supprimer leur déclaration globale. Je sais que l'utilisation de variables globales se voit (trop) souvent sur Arduino, mais c'est une très mauvaise pratique, surtout à mesure que les programmes deviennent plus gros. A titre d'exemple, sur le programme que j'écris au boulot (sur Jetson), j'ai exactement 1 variable globale (le logger), alors que je travailles sur le projet depuis avril
delay(10); int c2 = pulseIn(A2,HIGH,25000); // receiver channel 2 getting value Forward and Backward int c1 = pulseIn(A1,HIGH,25000); // receiver channel 1 getting value turn Left and Right
- pourquoi mets tu tes analog_write dans une boucle for? Analog write enregistre la valeur de PWM que tu veux, ça sert absolument à rien de la répéter. Et si c'est un délai que tu veux, alors une boucle for est un moyen peu précis de l'obtenir (utilises plutôt un delay (ou delayMicroseconds))