Tout ce que vous vouliez savoir sur le pendule inversé

L'article sert de feuille de triche pour ceux qui veulent faire leur pendule inversé. Voici les problèmes en raison desquels j'ai retravaillé plusieurs fois, un bref aperçu de la théorie est nécessaire pour comprendre comment stabiliser le système.


Pourquoi ai-je besoin de ça?


En bref: je voulais agrandir ma machine CNC, mais quelque chose s'est mal passé ...
Histoire complète
Depuis mon enfance, je voulais avoir ma propre machine CNC, car traité avec des modèles d'avion où vous devez faire beaucoup de petits détails répétitifs. J'ai d'abord acheté un kit de bricolage prêt à l'emploi, puis j'ai décidé de l'augmenter. J'ai joué pendant deux mois, mais la machine est toujours petite, la zone de travail n'était que de 18 sur 10 cm, elle n'a pas de capteurs de positionnement. J'ai décidé d'acheter un guide plus grand, de mettre les interrupteurs de fin de course et d'installer le chariot au milieu avec un moteur pas à pas. Je l'ai fait en une demi-journée, mais vous ne pouvez pas aller directement au rêve - dans un grand CNC, vous devez compliquer la tâche et mettre le pendule sur le chariot, puis cela m'a semblé facile, mais je devais me rappeler les années de l'institut et me familiariser avec TAU.


Tentatives infructueuses


Le projet a pris près de deux ans d'essais et d'erreurs, reconcevoir, attendre des détails et des jours de congé incomplets, de sorte que ceux qui souhaitent répéter ont économisé leur temps et leurs nerfs, je considère qu'il est nécessaire de parler de décisions infructueuses.
  • un gyroscope (MPU6050) au lieu d'un encodeur - fondamentalement rien contre, mais le capteur doit être placé sur une tige rotative, cela introduit un effet imprévisible et l'impossibilité de faire défiler la tige plusieurs fois autour de l'axe.
  • codeur absolu - s'il s'agit d'un potentiomètre, même le mouvement des fils (principalement dû aux contacts dans l'arduino) introduit du bruit dans les mesures, un ADC 10 bits n'est pas encore suffisant; s'il s'agit d'un capteur plus cher, la lecture s'effectue via une interface série, ce qui introduit un retard dans le système, notamment en combinaison avec un moteur pas à pas.
  • la rigidité du système - à un moment donné, j'ai pris un tube en aluminium avec une charge à la fin, lorsque le chariot a vibré, de fortes vibrations ont commencé à l'intérieur, et il n'était pas immédiatement clair quel système nous stabilisions. Nous devons nous efforcer de faire en sorte que le système physique soit aussi proche que possible de ce qui est modélisé.
  • friction - ce phénomène est souvent négligé, j'ai essayé de le réduire en utilisant de grandes roues de chariot et des profils à rainure en V, contrairement aux rails avec des curseurs avec de petites billes, car la friction de roulement est inversement proportionnelle au rayon.
  • l'utilisation d'un moteur pas à pas - j'ai passé beaucoup de temps à essayer de suivre cette voie, il est trompeur de simplifier les formules (en fait, nous contrôlons immédiatement l'accélération de la base du pendule) et la simplicité de la conception (nous pouvons oublier les frottements dans le rail, l'encodeur du moteur, si nous supposons que le moteur ne saute pas les étapes) , mais ... Pour contrôler avec précision la vitesse, le temps entre les étapes doit être de dizaines de microsecondes, ce qui signifie que vous pouvez oublier la sortie d'état vers la console. Sans rétroaction, vous ne pouvez pas être sûr que le moteur n'a pas manqué les étapes et la vitesse est vraiment ce que pense le système. Je ne prétends pas qu'il s'agit d'une solution sans issue, si quelqu'un réussit à stabiliser le pendule avec un moteur pas à pas, je serai heureux de l'examiner.


Pendule gratuit


Pour compléter l'image, nous simulons un pendule sur un chariot libre sans frottement.

Les équations du mouvement peuvent être obtenues en différenciant le lagrangien par rapport aux coordonnées généralisées. On obtient les équations suivantes:

 begincasesL cdot ddot theta+g cdotsin( theta) ddotx cdotcos(th)=0(m+M) cdot ddotx+m cdot ddot theta cdotL cdotcos( theta)m cdotL dot theta2 cdotsin( theta)=0 endcases


à partir de laquelle vous pouvez trouver comment le vecteur d'état change:

 begincases dot theta=w dotw= fracg cdotsin( theta)+b cdotL cdotw2 cdotsin( theta) cdotcos( theta)L cdot(1+b cdotcos2( theta)) dotx=v dotv=b cdot fracL cdotw2 cdotsin( theta)g cdotsin( theta) cdotcos( theta)1+b cdotcos2( theta) endcases,b= fracmM+m


et simuler le système. Le code est ici .


Pourquoi le système est-il instable?


Le bon sens et la visualisation nous disent que le pendule lui-même ne résistera pas. Mais comment vérifier cela mathématiquement?
De manière générale, le système et la solution linéarisés sont les suivants:

 dot mathbfx=A mathbfx, mathbfx(t)=eAt mathbfx(0)


Un exposant de la puissance de la matrice semble plus clair si vous allez au système de coordonnées à partir de vecteurs propres, alors la matrice Asera diagonale ( D), et l'exposant ressemblera à:

e ^ {Dt} = \ begin {bmatrix} e ^ {\ lambda_1t} & 0 & \ dots & 0 \\ 0 & e ^ {\ lambda_2t} & \ dots & 0 \\ \ vdots & \ vdots & \ ddots & \ vdots \\ 0 & 0 & \ dots & e ^ {\ lambda_nt} \\ \ end {bmatrix}


On le voit maintenant, en présence de valeurs propres (  lambdai) avec une partie réelle positive, la composante correspondante du vecteur d'état tendra vers l'infini et le système s'effondrera. Ce qui précède s'applique aux systèmes continus, plus sur la durabilité est décrit dans cette conférence vidéo.
Vérifiez si c'est le cas pour le pendule inversé. Nous linéarisons notre système près de la position d'équilibre pour  theta=0,sin( theta) approx theta,cos( theta) approx1,w2 approx0:

\ begin {bmatrix} \ dot \ theta \\ \ dot \ omega \\ \ dot {x} \\ \ dot {v} \ end {bmatrix} = \ begin {bmatrix} 0 & 1 & 0 & 0 \\ \ frac {g} {L (1 + b)} {\ theta} & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ -g \ frac {b} {1 + b} \ theta & 0 & 0 & 0 \ end {bmatrix} \ begin {bmatrix} \ theta \\ \ omega \\ x \\ v \ end {bmatrix}


Les valeurs propres non nulles ont la forme  pm sqrt fracgL(1+b), ainsi nous sommes devenus convaincus de l'instabilité.

Ajouter des commentaires


Maintenant, la force agira sur le chariot f, l'une des équations peut être réécrite sous la forme: (m+M) cdot ddotx+m cdot ddot theta cdotL cdotcos( theta)m cdotL dot theta2 cdotsin( theta)=f, et le système linéarisé prendra la forme:

\ begin {bmatrix} \ dot \ theta \\ \ dot \ omega \\ \ dot {x} \\ \ dot {v} \ end {bmatrix} = \ begin {bmatrix} 0 & 1 & 0 & 0 \\ \ frac {g} {L (1 + b)} {\ theta} & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ -g \ frac {b} {1 + b} \ theta & 0 & 0 & 0 \ end {bmatrix} \ begin {bmatrix} \ theta \\ \ omega \\ x \\ v \ end {bmatrix} + \ begin {bmatrix} 0 \\ \ frac {1} {L} \ frac {1} {2m + M} \\ 0 \\ \ frac {1} {2m + M} \ end {bmatrix} \ cdot {f}


Maintenant, le système (  dot mathbfx=A mathbfx+Bu) est devenu contrôlable , cela peut être vérifié en vérifiant que le rang de la matrice \ begin {bmatrix} B && AB && A ^ 2B && A ^ 3B \ end {bmatrix} égale à la dimension du vecteur d'état, c'est-à-dire 4. Pour garder le pendule en position verticale, j'ai utilisé un contrôleur d'état linéaire-quadratique, c.-à-d. le contrôle (u ou f) est le produit du vecteur d'état [ theta, dot theta,x, dotx]par un vecteur de paramètres que l'on retrouve une fois en minimisant la fonction quadratique . Le code de simulation est ici .


Contrôle moteur


Maintenant, vous devez contrôler le moteur à courant continu, il contient de nombreux paramètres que je ne connais pas, alors je l'ai pris pour une "boîte noire", décrite par les équations suivantes, en tenant compte du frottement:

 begincases dotx=v dotv=a cdotv+b cdotU+c cdotsign(v) endcases


Vous pouvez en savoir plus sur la dérivation des équations et l'estimation des paramètres ici . Voici mes graphiques de l'accélération du moteur avec le chariot en fonction de la tension (en réalité, le signal PWM est émis par le contrôleur) et les courbes ajustées.

J'ai également trouvé les coefficients du modèle par force brute, le code .
Ainsi, le contrôleur nous donne l'accélération requise, et à partir de la 2ème équation, connaissant toutes les constantes, nous trouvons la tension.

Assembler le vrai appareil


Nous avons maintenant toutes les connaissances pour collecter et stabiliser le pendule. J'ai utilisé le fer suivant:
  • L'Arduino Mega 2560 n'est pas UNO, car deux encodeurs ont besoin de 4 broches pour les interruptions
  • L'encodeur pour le pendule - OMRON E6B2-CWZ6C 2500 impulsions par tour - nous donne l'angle, nous calculons la vitesse angulaire, la résolution est assez élevée, donc il y avait suffisamment de différences finies sans lissage et moyennage
  • Encodeur pour le moteur - LPD3806-600BM-G5-24C 600 impulsions par tour - donne la position du chariot, calcule la vitesse
  • Moteur 12V DC avec réducteur 5: 1
  • Pilote de moteur 10Amp 5V-30V

Ainsi, nous mesurons explicitement l'angle du pendule, la position du chariot, calculons la vitesse angulaire du pendule et la vitesse du chariot - nous obtenons l'état complet, j'ai trouvé les paramètres du contrôleur avec ce script. Étonnamment, tout a rapidement fonctionné comme il était. Je suis satisfait du résultat, il tient et tient même un verre!


Le code pour Arduino est ici
Ce qui pourrait être amélioré par rapport à de nombreuses options disponibles sur YouTube - ce pendule est silencieux car le PWM est réglé en dehors de la plage auditive et des roues en plastique sont utilisées.
Maintenant, cette tâche ressemble à un travail de laboratoire: mesurer les paramètres du moteur et trouver les coefficients du régulateur, comprendre simultanément ce qui se passe.

Et ensuite?


J'ai l'intention de produire un pendule: faire une balançoire, se débarrasser d'une bobine de fils, faire un bouclier avec des connecteurs pratiques afin qu'il ne soit pas dommage de faire un don à une école ou un musée. Si quelqu'un veut se joindre, je serai heureux qu'il y ait beaucoup plus d'idées ambitieuses.

Les références




Merci de votre attention!

Source: https://habr.com/ru/post/fr472588/


All Articles