
UGV à base d'éléments de trottinette ou d'hoverboard
#361
Posté 16 avril 2023 - 08:39
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#362
Posté 16 avril 2023 - 12:05
Cela fonctionne assez bien, même si je n'ai pas réussi à paramétrer le PID pour avoir une rotation bien continu.
- Ma principale modification, c'est maxPID=255. Avec 50, cela ne fonctionnait pas du tout.
- J'ai fait pas mal de modification sur le nom des variables dans la parti PID pour me rapprocher du code ici, https://www.robot-ma...board/?p=118300 qui semble être une référence.
- j'ai commenté le if (millis() >= nextTimepid) , pour au contraire calculer le PID un maximum de fois.
- dans la fonction interrupt1() , je ne comprends pas pourquoi tu divises par 45, rpm = freq/ 45 * 60;
- je n'utilise pas le frein.
Voici la log :
Le code :
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#364
Posté 16 avril 2023 - 06:38
Sur mon moteur, il y a 15 ticks.
Attention, avec le paramètre RISING dans la fonction attachInterrup(), il ne faut pas diviser par 2.
https://reference.ar...ttachinterrupt/
-
RISING to trigger when the pin goes from low to high,
Je ne sais pas où sont les problèmes et encore moins les solutions.
Néanmoins, quelque chose me trouble. Moi, je pensais que le PID était un traitement de l'erreur. Et donc, qu'il fallait ajouter le PID à la valeur de consigne.
Il semblerait que ce ne soit pas le cas.
Et donc, je ne comprends pas.
Pour la log, avec ta souris, tu sélectionnes une zone de ta log et tu copies/colles entre les balises "code" que tu auras écrit préalablement.
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#365
Posté 17 avril 2023 - 05:47
Un rapide résumé du correcteur PID :
=> Correcteur, le but c'est de corriger quelque chose => on a une Consigne et une Mesure, et à partir de là on a une Erreur qui par convention est Erreur = Consigne - Mesure.
Pour corriger cette erreur il nous faut un moyen d'action sur lequel va intervenir notre correcteur .
=> PID, Proportionnel, Intégral, Dérivé, ce sont les méthode de calculs qui vont s'appliquer sur l'erreur.
Parfois un simple correcteur proportionnel suffit souvent ça ne suffit pas ... Cela va dépendre du système qu'on cherche à corriger ( on parle d'ordre du système mais on va pas rentrer dans ce détail là pour notre rapide résumé )
Cas classique d'un correcteur sur la vitesse de rotation de notre moteur.
On a une consigne ( si possible on fait en sorte de l'avoir dans une unité compréhensible ) dans notre cas je pars sur des RPM.
On a une mesure ( il nous faudra la mettre dans la même unité que notre consigne ) je prends aussi des RPM.
Notre moyen d'action sur la vitesse de notre moteur c'est le PWM.
Dans notre cas, le but du correcteur c'est de donner une valeur de PWM en fonction de la valeur de l'Erreur de sorte à ce que notre erreur diminue et si possible reste stable à 0 ( = Consigne atteinte, Mesure = Consigne )
Le cas d'un correcteur uniquement proportionnel on un calcule du genre PWM = KP * Erreur .
Quelque soit notre gain KP fixe on se rend vite compte qu'avec une formule du genre c'est pas suffisant pour avoir un système stable
Si à un moment donné l'erreur est nulle ( ce qui est l'objectif ) la forumule nous donnera PWM = 0 et donc notre moteur va vouloir s'arrêter ... Donc la seule consigne "potentiellement stable " c'est l'ordre d'arrêt ... Consigne = 0 , si Mesure = 0, Pwm = 0 et le moteur est bien à l'arrêt ...
Quelque soit les autres cas on aura soit un système " oscillant " soit un système avec une erreur statique constante ( et plus la vitesse demandée sera élevée et plus l'erreur statique sera grande ... )
Exemples si on demande 100 RPM
Cas oscillant :
le gain KP est tellement grand que la PWM est mis directement à 100%, le moteur part trop vite, la mesure indique 150 RPM, du coup le PID change le PWM pour le mettre à - 100% en marche arrière ... puis la mesure indique qu'on est à -10 RPM .... Le PID met le PWM à 100% et rebelote ...
Cas stabilisé :
après une phase " transistoire " le moteur atteint une vitesse de 80 RPM, il resulte une erreur statique de 20 RPM, avec un KP de 4 le calcul du PID donne un PWM de 80% ( les chiffres sont arbitraire juste pour l'exemple ) ce PWM de 80% est tout juste suffisant pour maintenir la vitesse de 80 RPM... Si le moteur accélère un peu, l'erreur diminue et le pwm va baisser un peu et le moteur retourne à 80 RPM et pid à 80% à l'inverse si le moteur ralentit un peu l'erreur va augmenter et le pwm va augmenter...
Afin de corriger cette erreur statique on peut imaginer une formule du style :
PWM = KP * Erreur + "Constante de maintient de vitesse quand l'Erreur est nulle "....
Malheureusement, cette constante n'est pas " constante " est dépend de la consigne demandé ... Avec les chiffre arbitraires de l'exemple ci dessus on peut imaginer qu'il faut mettre le PWM à 100% pour atteindre les 100 RPM, 80% pour les 80RPM etc ...
Mais si on avait une relation magique qui lie directement la vitesse du moteur au pwm qui marche tout le temps ça serait plus simple ... Et comme on a pas cette relation on utilise la partie I de notre correcteur . L'intégrale ( qui n'est rien d'autre qu'une somme à chaque fois qu'on fait le calcul : erreur 0 + erreur 1 + ... + erreur n
"Constante de maintient de vitesse quand l'Erreur est nulle" = Ki * ( Somme des erreur ) afin d'avoir une valeur qui se calcule automatiquement ...
=> En régime stable Si on a une erreur nulle alors PWM = Ki * ( Somme des erreur ) , La somme n'est pas nulle et ne change pas... On a notre super constante qui se calcule toute seule automatiquement indépendamment de la consigne demandé ... Mais en fonction du système le calcule peut osciller un peu autour de la bonne valeur ( le terme en intégrale peut " overshot" pendant sa phase de calcule et il faudra que l'erreur reste négative assez longtemps pour que la somme des erreurs diminue ... )
Et le D ça sert à quoi ? => Le terme dérivé c'est pour essayer de rajouter un peu de prévision. grosso mode, c'est la différence entre ton erreur précédente et ton erreur actuelle.
Si tu vois que ton erreur à augmenter, alors tu es en train de t'éloigner de ta consigne il va falloir accélérer un peu plus. Par contre si ton erreur est en train de se rapprocher de 0 tu peux commencer à progressivement ralentir ....
- Melmet aime ceci
Si mon commentaire vous a plus laissez nous un avis !
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!
#366
Posté 17 avril 2023 - 08:17
Merci Mike.
Concentrons nous sur Kp, pour faire plus simple.
On a P = erreur * Kp , donc P est égal à l'erreur multiplié par un coefficient. Je comprends parfaitement que l'on corrige l'erreur, proportionnellement à sa hauteur. Plus l'erreur est importante, plus la correction est grande.
Donc, si on parle de vitesse, la nouvelle vitesse est égale à P.
Et là, je décroche, car pour moi, la nouvelle vitesse est égale à la somme de la consigne et de P. Soit vitesse = consigne + P
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#367
Posté 17 avril 2023 - 08:54
Oracid a écrit hier, 19:38
Sur mon moteur, il y a 15 ticks.
Attention, avec le paramètre RISING dans la fonction attachInterrup(), il ne faut pas diviser par 2.
15 ticks, ca m'étonne!
j'ai fais un code pour les mesurer:
sur mon moteur j'ai 45 ticks avec RISING et 90 avec CHANGE
pour faire la mesure il faut tourner la roue à la main
#368
Posté 18 avril 2023 - 01:36
Et là, je décroche, car pour moi, la nouvelle vitesse est égale à la somme de la consigne et de P. Soit vitesse = consigne + P
Non si tu reprends ce que j'ai écrit plus haut :
Il faut bien distinguer
" ta nouvelle vitesse obtenue / viesse de sortie " = la mesure de vitesse, ta mesure réelle
" ta consigne " = la vitesse souhaitée.
" ton moyen d'action " = pwm.
Le but du correcteur est de calculer la valeur de contrôle de ton moyen d'action => Ton Pwm.
Dans le cas d'un correcteur P classique : PWM = KP * erreur ( = KP * ( Consigne - mesure ) ).
Ta vitesse de sortie , (ta mesure), va fluctuer en fonction de ce PWM et des éléments extérieurs couple résistants etc ...
Si tu remet ta consigne dans le calcul de ton PWM ( autrement que dans le calcul de l'erreur ) tu n'es plus dans le cas d'un correcteur proportionnel classique...
Tu peux choisir de faire un correcteur à ta sauce de la forme PWM = Kp * erreur + Kc * consigne
Ce genre de correcteur " non classique" est utilisé quand on connait la relation théorique entre la consigne ( des RPM ) et la valeur de contrôle ( PWM ) il suffit de choisir Kc qui correspond à la valeur théorique PWM = KC * consigne... ( l'ajout de l'erreur avec un kp permettra de faire des corrections autour de cette relation théorique )...
- pat92fr aime ceci
Si mon commentaire vous a plus laissez nous un avis !
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!
#369
Posté 18 avril 2023 - 06:36
Désolé Mike, je te remercie, mais je ne comprends pas.
Ce n'est pas grave. Je ferai comme si j'avais compris.
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#370
Posté 18 avril 2023 - 06:40
Merci Bubu.
Je vais tester ton code ce matin.
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#371
Posté 18 avril 2023 - 07:21
Bubu, il est génial, ton programme !
Je viens de tester ma roue. Elle fait bien 15 ticks en un tour.
Ton code:
La log:
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#372
Posté 18 avril 2023 - 10:10
Désolé Mike, je te remercie, mais je ne comprends pas.
Ce n'est pas grave. Je ferai comme si j'avais compris.
Ha ça non alors ! =)
Je vais reformuler. =)
Quelle est la partie que tu ne comprends pas ?
A ) Dans le cadre de ton exemple le but du correcteur c'est de calculer la valeur de PWM qu'il faut envoyer à ton moteur pour qu'il tourne à la bonne vitesse. +> Le résultat du PID c'est le calcul de la valeur du PWM à appliquer à ton moteur
B ) Dans le cadre d'un correcteur proportionnel ( un classique ) la formule indiqué dans les livres c'est PWM = KP * Erreur.
C ) L'Erreur c'est la différence entre la Consigne ( la vitesse souhaitée ) et la Mesure ( La vitesse réelle mesurée ) : Erreur = Consigne - Mesure .
Je peux essayer de détailler et reformuler autant que besoin les 3 points A B et C ), le quel n'est pas bien compris ? Si ces 3 points sont bien compris alors c'est moi qui n'ai pas compris ce que toi tu n'as pas compris =) et dans ce cas là je veux bien plus d'explications.
- pat92fr aime ceci
Si mon commentaire vous a plus laissez nous un avis !
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!
#373
Posté 19 avril 2023 - 06:26
Merci Mike.
Ce que je ne comprends pas, c'est ton point B
La théorie dit que PWM = P = Kp * erreur
Alors que pour moi, cela devrait être PWM = consigne + P
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#374
Posté 19 avril 2023 - 07:16
Bonjour,
Quand on écrit "PWM = PID(erreur)", il faut bien comprendre que le but est de trouver (de manière simple et approximative) une valeur de PWM qui va permettre de réduire l'erreur entre la vitesse réelle et la vitesse de consigne.
On ne peut pas manipuler cette formule pour tenter de modéliser un système aussi complexe qu'une voiture. Ce n'est pas une relation mathématique qui modélisme la physique entre la vitesse réelle à la valeur de PWM moteur.
Ta formule n'est pas plus erronée que celle du PID de base. Elle se rapproche d'ailleurs de ce que je fais dans mes robots (PID + Feed-Forward) : "PWM = Kff * Consigne + PID(erreur)" avec un Kff=1.
De toute façon, toutes ces "techniques" (PID, PID+FF, PID², etc) sont relativement simplistes et approchées, et l'essentiel est de trouver une technique qui donne un bon résultat.
Donc, si tu implémentes "ta technique" et que ton résultat te semble optimal, alors c'est une bonne solution ! C'est juste qu'il faut garder à l'esprit quelle ne sera pas transposable à l'diénique dans un autre robot.... enfin pas plus qu'un PID au passage.
Patrick.
#375
Posté 19 avril 2023 - 09:38
Quand on écrit "PWM = PID(erreur)", il faut bien comprendre que le but est de trouver (de manière simple et approximative) une valeur de PWM qui va permettre de réduire l'erreur entre la vitesse réelle et la vitesse de consigne.
Donc si je comprends bien, on attribut un coefficient à l'erreur, mais également à la consigne, pour qu'au final le total soit approximativement égal à la somme de la consigne et de l'erreur.
Je ne trouve pas cela très logique.
Il n'y a aucune raison d'apporter une correction à la consigne. A mon avis, seul l'erreur devrait être corrigée.
Est que si on diminue le coefficient Kp et que l'on fait PWM = P = consigne + (Kp * erreur) , on pourrait s'approcher d'un meilleur résultat ?
Il est vrai que c'est ce que tu suggères dans ton avant dernière phrase.
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#376
Posté 19 avril 2023 - 10:25
Tu noteras que faire une somme de vitesses pondérées donne un % (PWM). En termes d'unités, la formule peut paraître curieuse aussi !
En pratique,on cherche les quelques coefficients PID pour obtenir un asservissement satisfaisant et on passe a la suite.
Patrick.
- Oracid aime ceci
#377
Posté 19 avril 2023 - 11:11
Faut-il vraiment chercher une 'logique' dans un PID.
Pour tout dire, je voulais comprendre.
Alors, j'ai acheté ce bouquin, https://www.elektor....uino-uno-e-book
Je l'ai feuilleté pour regarder les images. Il n'y en avait pas beaucoup . . .
Ma chaine YouTube : https://www.youtube..../oracid1/videos
#378
Posté 19 avril 2023 - 11:29
Je trouve que l'analogie du conducteur qui appuie sur les pédales pour maintenir sa vitesse était claire (cf. https://www.ufrjnaut...lizando-arduino).
Il n'y a pas de relation mathématique entre la vitesse en km/h et le degré de pression sur la pédale. Enfin, ce n'est pas le calcul que je fais au volant !
Sandro avait expliqué en faisant le lien avec le PID (https://www.robot-ma...board/?p=118295)
- Oracid aime ceci
#379
Posté 19 avril 2023 - 01:03
Il n'y a pas vraiment de difficulté à faire une fonction PID.
Le problème, c'est de trouver les bons paramètres.
Je me demande si je ne vais pas utiliser 3 potentiomètres, c'était mon idée de départ.
Ainsi, je pourrai voir la dynamique de toute modification.
Ma chaine YouTube : https://www.youtube..../oracid1/videos
Répondre à ce sujet

2 utilisateur(s) li(sen)t ce sujet
0 members, 2 guests, 0 anonymous users