Aller au contenu


Photo
- - - - -

UGV à base d'éléments de trottinette ou d'hoverboard


411 réponses à ce sujet

#341 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 13 avril 2023 - 02:38

Et maintenant, il fait régler le PID ! Tu peux commencer par le kp.

 

Voici le résultat avec  Kp = 1.5, Ki = 0.0, Kd = 0.0

Spoiler


#342 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 10 165 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 13 avril 2023 - 04:01

j'ai remarque quelques valeurs bizarre dans les logs ... 

  TargetSpeed: 149 Hz  HallSpeed: 61.20 Hz  pid_Speed: 0 pwm
 

  TargetSpeed: 158 Hz  HallSpeed: 22727.27 Hz  pid_Speed: 141 pwm

  TargetSpeed: 180 Hz  HallSpeed: 22727.27 Hz  pid_Speed: 157 pwm

  TargetSpeed: 178 Hz  HallSpeed: 22727.27 Hz  pid_Speed: 154 pwm

 

  TargetSpeed: 185 Hz  HallSpeed: 22727.27 Hz  pid_Speed: 164 pwm
 
TargetSpeed: 184 Hz  HallSpeed: 22727.27 Hz  pid_Speed: 163 pwm

 

  TargetSpeed: 197 Hz  HallSpeed: 75.21 Hz  pid_Speed: 0 pwm

 

  TargetSpeed: 197 Hz  HallSpeed: 74.38 Hz  pid_Speed: 0 pwm
 

  TargetSpeed: 199 Hz  HallSpeed: 22727.27 Hz  pid_Speed: 186 pwm

  TargetSpeed: 199 Hz  HallSpeed: 75.03 Hz  pid_Speed: 0 pwm

C'est pas ton problème principal mais c'est assez récurrent va falloir trouver pourquoi tu as ces valeurs ...

Déjà pour corriger le  227277.27 tu devrais vérifier que ta période est non nulle dans ton interruption avant de diviser ... 

=> 
 

void ISR_Hall(){     //  Sandro Interrupt Service Routine
  new_tick = micros();                                                    // feedback of the Hall sensor
  Period = new_tick - prev_tick;                                          // time between 2 feedbacks
  if(Period != 0 ) HallSpeed = 1000000.0 / Period;                        // HallSpeed, rotation wheel frequency 
  prev_tick = new_tick;                                                   // previous feedback of the Hall sensor
}

Ensuite pourquoi est ce que ton pxm est à 0 de temps en temps ça je ne sais pas encore ... 

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#343 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 796 messages
  • Gender:Male

Posté 13 avril 2023 - 05:28

 

Voici le résultat avec  Kp = 1.5, Ki = 0.0, Kd = 0.0

Spoiler

Ca manque de Kp et Ki...



#344 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 13 avril 2023 - 05:48

Oui, Mike, il faudrait que je remette l'ancienne log pour voir tout cela. Je m'y attèle dès que j'ai un début de commencement de fonctionnement, à peu près correct.

 

Ok, Patrick, je mets Kp=2, pour commencer. Et après, tu mettrais quoi en Ki ?



#345 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 796 messages
  • Gender:Male

Posté 13 avril 2023 - 05:54

Dans ce cas, il faut itérer jusqu'à obtenir un comportement correct. Attention aux réglages à vide ! Le comportement peut être assez différent une fois le robot sur ses roues.



#346 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 13 avril 2023 - 06:27

J'ai mis Kp=2. Résultat, la sortie était à 255 très rapidement.

J'ai donc augmenté Kp petit à petit, et à mon avis le meilleur résultat, c'est avec Kp=1.54.

 

Kp = 1.54, Ki = 0.0, Kd = 0.0

Après TargetSpeed=200, le moteur décroche.

 

Spoiler


#347 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 796 messages
  • Gender:Male

Posté 13 avril 2023 - 06:51

Bon, ta mesure de vitesse en Hz n'est pas très pratique. Chez moi, une vitesse se mesure en km/h ou en m/s ! :-)

 

Je vois que ca plafonne à 75Hz. Alors, je me suis demandé à quelle vitesse cela correspond en vrai.

 

Tu peux me confirmer que c'est approximativement 15km/h (soit la vitesse attendue d'un tel moteur) ? Note : 75Hz => 5 tours/s ==> ~4m/s ==> ~15km/h

 

Si on est d'accord, il faut tester ton PID dans la plage de vitesse de 0 à 15km/h (soit 75Hz max). 

 

Tu peux tester :

1) 5km/h départ arrêté.

2) 10km/h départ arrêté

3) 15 km/h départ arrêté



#348 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 13 avril 2023 - 08:24

Le périmètre de la roue fait 52cm.

52 x 5 = 260cm = 2,6m/s x 3600 = 9360m/h

 

Bonne nuit.



#349 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 14 avril 2023 - 06:42

Voici le résultat des test à 40Hz = 5km/h, 80Hz = 10km/h, 120Hz = 15km/h.

 

Avec Kp = 1.54, Ki = 0.0, Kd = 0.0

 

La roue tournait rarement, à 80Hz.

A 120Hz, elle tournait avec des saccades raisonnables.

 

Spoiler

 

Je remets mon dernier code.

Spoiler


#350 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 796 messages
  • Gender:Male

Posté 14 avril 2023 - 07:09

Bonjour,

 

Quelques observations : 

 

1) la boucle d'asservissement tourne très lentement (Période ~200ms; 5Hz). Ce n'est certainement pas le principal problème, mais une carte Arduino devrait pouvoir faire tourner le PID plus vite. Je pense que ca bourre à cause des traces et du faible débit de la liaison série.

 

- Peux-tu augmenter le débit de la liaison série et le porter à 115200 bauds ? Tu sais configurer ton moniteur pour un tel débit ?

void setup()
{
  Serial.begin(115200);

- Peux-tu faire la trace en un seul appel, stp ? Je n'ai pas la syntaxe exacte, mais c'est du genre :

void Trace()
{
   char buffer[256] {0};
   sprintf(buffer,"Consigne: %d Hz - Mesure: %d Hz - PID: %d PWM\n",Target_Speed,HallSpeed,pid_Speed);
   Serial.print(buffer);
}

2) Est-ce que tu rencontrais les mêmes problèmes de saccades et de saturation en pilotant le PWM directement avec ton potentiomètre ?

- Est-ce que tu peux faire un sketch de test ou tu pilotes directement le PWM tout en faisant les mêmes mesures ?

 

nouveau sketch de test :

void loop() {
  if (! digitalRead(pb)) { Serial.print("\n\t Operator Interrupt !!!"); delay(400); analogWrite(PWM_PIN_OUT,0); resetFunc(); }
 
  Throttle = analogRead(POT_PIN_IN);
  analogWrite(PWM_PIN_OUT, map(Throttle,0,1023,0,255));                           // the PWM is determined by the THROTTLE !!
  //digitalWrite(DIR_PIN_OUT, digitalRead(DIR_PIN_BT));                 // change direction of the wheel when button enabled
  Trace();
}

Est-ce que arrives à atteindre les vitesses à 5 et 9km/h avec une réponse assez rapide (<1s), sans saccades, ? 

 

 

3) Si tu as une valeur de PWM au dela de laquelle le moteur ne répond plus correctement, tu peux l'itnégrer dans ton code entre la sortie PID et la sortie PWM.

analogWrite(PWM_PIN_OUT, constrain(abs(pid_Speed),0,NNNN));       // NNN est la valeur PWM au delà de laquelle le contrôleur moteur risque de décrocher.

Patrick.



#351 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 796 messages
  • Gender:Male

Posté 14 avril 2023 - 07:20

Mon réglage PID sur le robot à roulettes des pages précédente. Deux courbes : en bleu la consignes (gamepad) et en rouge la réelle (odometrie).

La vitesse en ordonnée est en m/s (max 2m/s). La consigne est filtrée pour tenir compte de l'accélération du robot (d'où la pente a l'accélération et la décélération).

 

https://youtu.be/xxJ8xrGM2Kc

 

Le PID permet d'atteindre des vitesses de l'ordre de 4cm/s malgré le "trou" des contrôleur moteur (PMW entre 0 et 50).

 

Patrick.



#352 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 14 avril 2023 - 01:57

J'ai fait quelques modifications proposées par Patrick.


  Serial.begin(115200);

void Trace(){
  Serial.print(String() +("\n TargetSpeed: ") + Target_Speed +(" Hz   HallSpeed: ") + HallSpeed +("Hz  pid_Speed: ") + pid_Speed + " pwm");
}

J'ai imposé une vitesse, 120Hz

  Target_Speed = 120;
 
Je pense que c'est mieux.
Avec ou sans Trace() , cela ne change pas grand chose.
Dans la trace, il y a toujours les incohérences soulignées par Mike.
En jouant avec la molette de la souris, on visualise très bien les oscillations, dans la trace.
 
Une très longue Trace :
Spoiler
 
La nouvelle version du code :
Spoiler

 

Malheureusement, aujourd'hui, je ne vais avoir le temps de faire beaucoup plus.

 

Mike, si la trace est trop longue, il n'y aura qu'à la supprimer.

 



#353 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 796 messages
  • Gender:Male

Posté 15 avril 2023 - 06:42

Grace à ma fonction Trace(), j'ai récupéré les valeurs de Throttle (pwm) et de HallSpeed (Hz) avec une version précédente de mon programme où on a :

    Throttle = map(analogRead(POT_PIN_IN),0,1023,0,255);

 

J'ai fait un tableau Excel, dans lequel, on peut voir que la roue commence à tourner à partir d'un PWM égal à environ 100 pour une fréquence d'environ 7,5Hz, et s'arrête de tourner pour un PWM égal à environ 150, et une fréquence d'environ 190Hz.

 

Je pense donc déterminer la vitesse de référence, variable Speed_Target, en la mappant ainsi :  Speed_Target = map( Throttle, 0, 150, 0, 190)

 

Mais si on considère que ce moteur est différent de ceux montés sur le robot, on pourrait considérer qu'une bonne approximation serait l'égalité entre le PWM et la vitesse de référence.  Avec, Speed_Target = Throttle  

 

J'hésite.

 

 

attachicon.gifGraphique.png

attachicon.gifVitesse-data.txt

Bonjour,

 

Ce jour là, le moteur tournait à 190Hz, commandé manuellement. Bizarrement, depuis la mise en place du code PID, j'ai l'impression que tu es limité à 75Hz voire moins à cause du décrochage du contrôleur BLDC.

 

Patrick.



#354 bubu17

bubu17

    Nouveau membre

  • Membres
  • 15 messages

Posté 15 avril 2023 - 08:29

Bonjour

 

j'ai essayer ton code et modifier plusieurs fois sans succès,

donc je suis reparti de mon code en reprenant au maximum tes données , il fonctionne bien pour la parti effort, moins bien pour le freinage.

je n'ai pas de bouton, la consignemoteur donne la vitesse cible:

 

     actuellement  30 tr/mn

     fréquence de 20-22hz

     rpm mesuré  29-31tr/mn

     pid (pwm) 11-14

     vitesse(roue de 10 pouce) 1,5 km/h

 

je ferais une copie du sérial plus tard(j'ai un RDV)   

Fichier(s) joint(s)



#355 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 15 avril 2023 - 10:32

Ce jour là, le moteur tournait à 190Hz, commandé manuellement. Bizarrement, depuis la mise en place du code PID, j'ai l'impression que tu es limité à 75Hz voire moins à cause du décrochage du contrôleur BLDC.

Je ne sais plus. Je décroche là .

 

Désolé Bubu17, j'ai complètement zappé tes messages précédents. Je vais tester ton programme. Merci pour ton aide.

 

J'ai voulu éliminer le paramètre moteur. Peut-être n'est-il pas bon. J'ai donc changé de moteur pour un, strictement identique, c'est l'autre moteur du même Hoverboard.

Et, miracle ! C'est beaucoup mieux !

C'est beaucoup mieux, question bruits/oscillations du moteur, mais je n'arrive toujours pas à régler le PID.

 

J'ai mis Kp = 1.54, Ki = 0.0, Kd = 0.0 et voici le résultat. J'ai mis l'horodatage sur la console (je ne sais pas si cela impacte le programme).

Si je mets une valeur en Kd=0.5, j'ai l'impression que c'est mieux, mais c'est peut-être subjectif. Mon avis est basé sur le bruit, la musique de la rotation du moteur.

Je mets la moindre valeur à Ki, le moteur s'emballe et décroche.

Les erreurs remarquées par Mike sont toujours là.

 

Spoiler


#356 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 15 avril 2023 - 11:24

Désolé Bubu. Il n'y a rien qui bouge.
J'ai essayé des valeurs jusqu'à 200.  volatile int consignemoteur = 100;

J'ai fait quelques modifications mineurs à ton programme.

J'ai ajouté mon bouton stop/start.

J'ai modifié les prints.

J'ai modifié les paramètres du Kp, Ki, mais rien n'y fait.

Ma roue fait environ 52cm de diamètre.

 

Ton code modifié:

Spoiler

 

La log :

Spoiler


#357 bubu17

bubu17

    Nouveau membre

  • Membres
  • 15 messages

Posté 15 avril 2023 - 12:29

sur ton sérial, la fréquence est à 0 : le pilote moteur ne lit pas la sortie vitesse, donc rpm et kph sont à zéro

par contre les corrections fonctionnent err=100 ,serr 1000 et pid à 50, limite imposer par le code



#358 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 15 avril 2023 - 12:55

le pilote moteur ne lit pas la sortie vitesse

Que veux-tu dire, que la fonction d'interruption ne fonctionne pas? N'est pas appelée ?



#359 bubu17

bubu17

    Nouveau membre

  • Membres
  • 15 messages

Posté 15 avril 2023 - 06:42

pour que la lecture fonctionne, il faut que la roue tourne

essaie de la lancer à la main, si ca ne marche pas essai d'enlever la securité; " if (freq > 800) ...

remet dans le serial la lecture de newtick et prevtick pour les controller



#360 bubu17

bubu17

    Nouveau membre

  • Membres
  • 15 messages

Posté 16 avril 2023 - 08:05

Bonjour Oracid

 

j'ai réétudier le sérial et je modifie un peu mon commentaire:

la roue ne tourne pas donc il est normal que la lecture indique 0 pour la frequence, rpm et vitesse

par contre la correction à mis le pid(pwm) au maximum autoriser par le code :50

à 50 le moteur doit tourner, revoie tes branchements sur la commande pwm, frein activé? ,entrer en? masse commune?

 

avec un pid à 50 mon moteur tourne à 150 tr/mn

j'ai rajouter une rampe d'accélération et ralentissement à mon code: de 15 à 200 et 200 à 15tr/mn

en piéce-jointe la sortie serial et la modification du code

Fichier(s) joint(s)





Répondre à ce sujet



  


1 utilisateur(s) li(sen)t ce sujet

0 members, 1 guests, 0 anonymous users