barbu

Piloter les moteurs du LX200GPS avec arduino

Recommended Posts

Bonjour à tous, depuis maintenant 6 mois la carte mère de mon LX200GPS est morte. J'ai beau relancer le SAV de Meade au Etats-Unis, rien n'y fait ils sont en rupture d'approvisionnement de composants. En attendant j'ai bricolé une connexion direct du moteur d'AD sur une carte ARDUINO connecté à un shield de controle des moteurs CC utilisant la PWM (Pulse Width Modulation) https://www.robot-maker.com/shop/blog/33_Asservir-moteurs-courant-continu-PID.html .

Le problème que je rencontre c'est le controle du moteur pour de très faible vitesse de rotation, c'est le cas en suivie à vitesse sidérale, le moteur est tellement proche du décrochage et le codeur incrémentant tellement lentement que le suivie est saccadé et n’arrête pas d’osciller en accélérant et ralentissant autour de la vitesse de suivie avec une période d'environ 100ms et un écart de +- 1" d'arc. Pour le suivie visuelle c'est parfait mais pour de la photo planétaire ou de ciel profond c'est catastrophique. J'ai un floue systématique sur toutes mes images impossible à corriger avec des ondelettes ou autres filtres.

Je cherche désespérément un spécialiste Meade LX200GPS qui pourrait m'expliquer comment piloter ces foutus moteurs avec plus de stabilité.

Ex: Jupiter impossible d'obtenir mieux. La compilation avec Autostacker 20220909225921239_lapl5_ap1509_Drizzle15.tif et ondelette SIRIL 20220909225921239_lapl5_ap1509_Drizzle15_ondeletteSIRIL.thumb.jpg.8cd987dc76441ae8bc57dcb2bfb565ba.jpg

Share this post


Link to post
Share on other sites
Advertising
By registering on Astrosurf,
this type of ad will no longer be displayed.
Planetary Astronomy
Observing, imaging and studying the planets
A comprehensive book about observing, imaging, and studying planets. It has been written by seven authors, all being skillful amateur observers in their respective domains.
More information on www.planetary-astronomy.com

Salut,

 

déjà bravo pour le bricolage !

Pour être sûr de comprendre :

- quelle est la fréquence de l'encodeur du moteur ?

- quel est le pas du moteur (en rad)?

 

Si tu as un bonne résolution sur le pas du moteur, tu pourrais essayer d'ajouter un filtre passe bas avant l'envoi de la consigne au driver. Ou si tu as suivis la méthode PID du lien fourni, peut être qu'en jouant sur le poids des coefficients tu peux obtenir un meilleur suivi.

 

PS: je n'y connnais rien en Meade LX200 GPS, je propose juste une réponse ^^'

 

Cordialement

Share this post


Link to post
Share on other sites

J'ai récupéré un LX200GPS récemment et toute l’électronique est HS .

Je me tourne donc vers une solution Onstep. Mon cas est évidement différent du tient ; mais c'est peut-être une solution !!?

 

Share this post


Link to post
Share on other sites
Le 19/09/2022 à 17:26, barbu a dit :

Je cherche désespérément un spécialiste Meade LX200GPS qui pourrait m'expliquer comment piloter ces foutus moteurs avec plus de stabilité.

je peux pas t'aider sur ce point mais de tres tres nombreux soucis de SAV meade US ont été reglés par une petite equipe
meade.sav@aol.fr

je ne te garantie si cela fonctionne encore après ces dernières années.Mais tu peux toujours essayer chez eux ;)

Share this post


Link to post
Share on other sites

Ah évidement, si tu n'as pas récupéré les moteurs d'origine et que tu as un moteur comme dans le liens .

ça ne m’étonne pas que ça ne fct pas .

 

 

Share this post


Link to post
Share on other sites

Merci pour vos réponses,

Alors pour le moteur c'est celui d'origine, le codeur à 256 pas il est relié à un réducteur de 1:50 qui attaque la vis sans fin qui fait tourner l'axe de lAD de 2° par tour en 8 minutes (période du PEC).

Je contrôle 60 fois par secondes les écarts de vitesse comme le fait Meade dans sa programmation d'origine. ( j'ai trouvé l'info sur un forum meade ricain sur yahoo).

J'utilise le PID comme methode de boucle d'asservissement et j'ai à peu près tout essayé en jouant sur les 3 coefficients Kr Ki et Kd (erreur, somme des erreurs, dérivé par rapport à l'erreur précédente)

Le résultat le plus stable que j’obtiens donne les écarts que je vous ai donnés au début.

Un pas du codeur représente environ 0.3" d'arc et donc en vitesse de suivie sidéral  environ 53.47 pas par seconde soit environ 1/5 de tour par seconde.

Le problème c'est qu'il faut piloter le moteur avec une PWM très forte pour que le moteur commence à accélérer mais dans la foulé après à peine un pas codeur (18ms) il faut quasiment le couper si non il accélère trop vite.

J'essaye en posant ma question de savoir si quelqu'un sait si il y a une astuce de programmation qu'utiliserait Meade dans le pilotage de ces moteurs autre que l'asservissement PID.

La je suis bloqué, l'autre solution c'est de cannibaliser un autre Meade dont l'électronique fonctionnerait pour en faire un fonctionnel, mais d'occas le moins chère que j'ai trouvé c'est un 8" à 1800€ autant ajouter un peu d'argent et changer de monture pour une EQ8 par exemple.

Pour la solution Onstep, je ne connais pas si tu peux préciser, en regardant sur la toile il semblerait que ce soit fait pour les petites monture de Meade pour un LX200GPS 14" je en sais pas si cela passe et si c'est compatible.

Pour le SAV, j'ai déjà écrit à cette adresse sans succès.

Je suis un peu dans l'impasse. Donc si quelqu'un a une monture LX200GPS sans le télescope je veux bien la récupérer.

Share this post


Link to post
Share on other sites

Vu la description que tu fais , je pense que tu ne pourras pas le piloter avec cette électronique . C'est un problème du au moteur , donc a mon sens il n'y a rien à faire .

Pour onstep , il n'y a pas de souci le hardware est modulable . Donc si les moteurs sont à la hauteur , il n'y a pas de pb . les driveurs sont aussi modulable . mais déjà des nema 17 c'est pas mal , il y a évidement plus gros mis attention a l’intégration .

je suis justement en train de regarder l’intégration sur mon LX200GPS 12" , il n'y a pas beaucoup de place , je crois que je vais être obligé de mettre des nema 11 avec réducteur .

J'aurai surement une faible vitesse de pointage , mais ça me gêne pas trop.

 

https://onstep.groups.io/g/main/wiki/4414

 

Meade LX200

Dan Walker converted his 12" LX200 mount to OnStep using the MaxESP board, TMC5160 for axis1 and axis2, and TMC2208 for the focuser.

Kevin Ma converted a 1985 Meade LX-3 2120 fork mount to OnStep.

Mike Gore is in the process of converting a Meade LX200 fork mount to OnStep. Details and images here, here and here.

 

Dommage les liens ne fonctionnent plus !!

 

https://onstep.groups.io/g/main/wiki/3860

 

 

Share this post


Link to post
Share on other sites

Bonsoir,

Oui il y a une astuce et c'est un beau défi pour la régulation. 

 

Il faut mettre un filtre de Kalman pour estimer la position du moteur entre 2 pas du codeur.

Le filtre de Kalman permet d'évaluer la position du moteur en fonction de :

1. La dernier pas lu (information fiable mais lente)

2. Les ordres envoyés au moteur et sa réponse théorique (information rapide mais peu fiable).

 

Ainsi tu continues d'ajuster la PWM moteur en fonction de sa réponse théorique même entre 2 pas et la PWM n'est pas "à fond" dans la zone aveugle entre les 2 pas.

Ca marche bien.

 

Tu pourrais partager ton code Arduino pour que l'on puisse regarder.

 

A noter : C'est une bonne idée d'utiliser un moteur DC et non un pas à pas. Proprement régulé tu dois avoir un mouvement plus fluide et une consommation nettement inférieure.

 

Nicolas

 

 

Edited by NicoF
  • Like 1

Share this post


Link to post
Share on other sites
il y a une heure, NicoF a dit :

Il faut mettre un filtre de Kalman pour estimer la position du moteur entre 2 pas du codeur.

 

+1 Kalmann + PID  (+ éventuellement un passe bas ou un sigma cliping si tu as des échantillons erronés / discontinuités)

  • Like 1

Share this post


Link to post
Share on other sites

Bonjour

 

Un autre point m'est venu :

Le 9/23/2022 à 00:17, barbu a dit :

Un pas du codeur représente environ 0.3" d'arc et donc en vitesse de suivie sidéral  environ 53.47 pas par seconde soit environ 1/5 de tour par seconde.

 

Utilises tu les 2 voies du codeur : direct et quadrature, associé au comptage sur front montant et descendant, cette technique permet de multiplier par 4 le nombre de pas codeur.

Dans un tour tu as donc 1024 pas au lieu de 256.

 

image.png.2175514b17c77170cde984b61dbfa22c.png

 

Sur Arduino, il faut que tu attaches une interruption de type "CHANGE"  sur chacune des voies (direct et quadrature du codeur)

https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

 

Ensuite :

Sur l’interruption "CHANGE" de la voie A tu applique ceci

image.png.1f29f5d938eb6f5c9b903e26c1808524.png

 

Sur l'interruption change Voie B :

image.png.29c17102c46c729100767281608d5383.png

 

Ca devrait améliorer significativement les performances de suivi, tiens nous au courant !

 

Bonne journée,

Nicolas

Share this post


Link to post
Share on other sites

Bonjour, merci pour les liens je vais y jeter un coup d'œil.

 

Pour le codeur j'utilise les deux voies mais iniquement pour déterminer le sens de rotation.

 

Je ne sais pas pourquoi, mais lorsque j'utilise les deux interruptions (ARDUINO UNO) sur les PIN 2 (A) et 3(B) seul celles de la pin 2 sont traitées au niveau des interruptions pas celle de la PIN 3. A priori les interruptions de la pin2 sont prioritaires sur la 3.  De toute façon sur le scope et dans la doc du codeur le signal A et B ne sont pas tout à fait en quadrature loin de là. ça varie de 40° à 130° au lieu de 90° en théorie.

 

J'utilise déjà les fronts montant et descendant donc en fait je compte 512 pas par tour.

 

Je vais essayer la prédiction de position avec le filtre de Kalman ente deux fronts de la PIN 2

 

Voilà le programme de la version la plus stable.

ControleMoteurLX200V3.28.1.ino

 

Bonne soirée,

je vais essayer de filmer Didymos après l'impact car invisible en france à l'heure de l'impact. Peut être qu'un nuage ou un hallo autours de l'astéroïde apparaitra ?

Par contre comme je n'est plus de GOTO le trouver va être compliqué Magnitude 14.7 je crois.

 

Share this post


Link to post
Share on other sites

Bonsoir,

 

J'ai regardé le code. Je te propose dans un premiers temps les modifs suivantes :

1. fréquence d'asservissement.

Il est important de maîtrise la fréquence d'asservissement et que cette fréquence ne soit pas trop rapide par rapport à la dynamique du système.

Je propose de commencer par tester à 5ms.

C'est l'objet de la modif dans le timer et dans la boucle principale la variable servoTrigger permet de déclencher la boucle toutes les 10.000 coups de timer

Après cette modif tout tes réglages de gains seront à revoir;

 

2. Saturation et annulation d'intégrateur

Les problèmes de seuils de démarrage du moteur que tu rencontres se règlent normalement avec l'intégrateur (I du PID).

Simplement il faut lui ajouter 2 éléments sinon il va rendre rapidement la boucle instable dès que tu vas monter le gain :

i. Une saturation (A ajuster) qui bloque la valeur pour l'empecher de dépasser un seuil (paramètre SautrationI)

ii. Purger l'intégrateur lorsque l'erreur change de signe.

 

3. Filtrage de la dérivée.

La dérivée numérique est un filtre passe haut très bruité. Il faut lui ajouter un filtre passe bas pour lisser les valeurs.

C'est l'objet du paramètre deri vativeFilter à tester entre 0.1 et 0.8

Cela va te permettre de monter la valeur du gain.

 

Je vais regarder ensuite pour la partie estimateur de position, mais je pense que ces mofifs devraient déjà améliorer les choses.

 

Bonne soirée,

Nicolas

ControleMoteurLX200V3.28.1.ino

  • Like 1

Share this post


Link to post
Share on other sites

Un grand merci pour ton aide. Je vais essayer dès demain.

 

Entre temps j'ai essayé de comprendre le problème avec les interruptions sur la Pin 3 qui ne sont pas prises en compte. Après étude de ce bug, il y a un problème de lecture du niveau de la Pin 2 juste après le déclenchement de l'interruption sur la Pin 3 en fait le programme n'arrive pas à lire la bonne valeur de la Pin 2 pour savoir si il faut compter ou décompter, du coup les impulsions sont comptée une fois sur deux dans un sens et une fois dans l'autre, au bout du compte le compteur d'impulsions sur la voie B compte 0, -1, 0, -1... alors qu'a l'oscillo à chaque front de B, A est bien toujours au même niveau que B donc on devrait toujours compter car on ne change pas de sens. Bref du coup j'ai modifié le programme pour chaque fois qu'il y a un front sur la pin 3 j'incrémente le compteur et je ne tiens pas compte du sens de rotation et la ça fonctionne. Étrange. J'ai déjà un système un peu plus stable.

J'ai passé la journée à changer les Coef de la PID et j'ai trouvé des paramètres à peu près stables qui permet d'avoir -+ 1/2 pas de codeur d'oscillation à cours terme soit 0.15" d'arc. La somme des erreurs oscille de +-10 pas codeur sur 0.5s je pense que c'est trop, ça fait +-3" d'arc d'oscillation je pense que c'est trop.

 

Je te tiens au courant dès que j'ai testé ta proposition.

 

Bonne soirée

  • Like 1

Share this post


Link to post
Share on other sites

Bonjour,

J'ai regardé de plus près les modifs, et celle concernant la fréquence d'asservissement ne peut pas fonctionner car l'interruption ISR et l'incrémentation de la position théorique de télescope n'est déclenchée que toutes les 18ms (période x 0.5µs) et donc avant que positTelescope n’atteigne les 10000 il faudra 180s ou 3min

Donc je vais essayer l'asservissement sans le contrôle précis de la fréquence d'asservissement.

Je te tiens au courant.

 

Bonne journée

Share this post


Link to post
Share on other sites

bonjour,

 

pendant mon stage de fin d'études (1995) j'avais eu à piloter divers systèmes. A un moment on avait réalisé un PI²D, soit une double intégration.

Cela permettait de rattraper l'erreur statique pour une consigne de rampe.

 

Je ne sais pas si ce type d'info peut t'aider, mais le PID ne se limite pas seulement à l'utilisation de paramètres linéaires.

A toi de voir selon les résultats que tu obtiens comment ajuster ces paramètres.

 

cordialement,

Gilles

Share this post


Link to post
Share on other sites

Merci pour ces infos, très intéressant  le montage Teenastro. si je n'arrive à finaliser mon montage et que la SAV de meade n'arrive pas à me fournir une carte mère, je me pencherai sur ce système. Ce qui me chagrine un petit peu c'est l'utilisation de moteur pas à pas qui avec ma monture demanderait de mettre un réducteur supplémentaire. Je chercherai sur ce forum dans ce cas si d'autre l'on déjà monté sur un LX200GPS.

 

@Gilles : Je vais essayé la double intégration.

 

@Nicola : J'ai essayé ta proposition et comme je le pensais l'appel de la routine toute les 5ms ne se fait pas. J'ai donc divisé par 2 le temps pour appeler de cette interruption qui basculer le flag d'autorisation de faire les calculs de PID et je n'incrémente la position telescope qu'au bout de ces 2 appels à la routine calcul de la PID. J'appel donc les calculs toutes les 9ms. Mais ça ne marche pas, je ne suis pas sure que les calculs prennent moins de 9ms.

Pour la limitation de la valeur intégration cela à pour effet de bloquer cette valeur à 5 puisque les erreurs sont toujours positives et que leur sommes ne cessent d'augmenter donc je mette 0 ou 1000 au coefficient Ki j'ai toujours Cmdi bloquée à la valeur de la saturation. Et la le système oscille en tout ou rien la commande est soit 0 soit 255 avec une frèquence de 200ms.

J'ai donc repris la version sans les modifs et j'ai laissé la modif de pondération du Kd, en ajustant les valeurs des constantes Kp et Ki cela donne une meilleur stabilité autours de 15 pas codeurs soit 1.6" d'arc d'oscillation. J'ai essayé sur une étoile et sur saturne hier soir. ça semble plus stable. Une image du suivie des  voies A B du codeurs. A en vert B en Jaune et en violet la différence.

D'autre part, je ne comprend toujours pas pourquoi lors de l'interruption générée par le codeur voie B je n'arrive pas à avoir la bonne valeur du niveau logique de A pour déterminer le sens. Ça ne fonctionne que si je ne tiens pas compte de A en incrémentant les pas codeurs systématiquement à chaque interruption, alors que l'interruption sur A fonctionne très bien et c'est le même code. A creuser.

ChronoAB.jpg.b2777d98038d6ebdd73b91831cc3aa91.jpg

Share this post


Link to post
Share on other sites

Teenastro te permet d ajuster les rapports de réduction comme tu veux

Ce qui veut dire que tu n as pas besoin de réducteur supplémentaire.

C est Teenastro qui s adapte à ta monture et non l inverse, le soft s adapte au hard existant

La gestion en micropas te permet de lisser les rapports de réduction un peu faible

 

 

Share this post


Link to post
Share on other sites

Bonjour

Ne lâche pas tu vas y arriver et tu auras un tracking nickel à la sortie, bien meilleur qu'avec du pas à pas.

 

Donc quelques suggestions complémentaires

Le 9/30/2022 à 15:50, barbu a dit :

@Gilles : Je vais essayé la double intégration.

 

- Une intégration simple permet d'annuler l'erreur statique :

On comprend bien ce qui se passe en prenant en compte  le seuil de démarrage du moteur : Lorsque la cible est presque atteinte, l'erreur est faible et la commande envoyée est inférieure à ce seuil. Le moteur ne bouge plus et pourtant la cible n'est pas atteinte.

 

- La double intégration permet d'annuler l'erreur de poursuite à vitesse constante.

Cependant dans notre cas la vitesse est tellement faible par rapport à la dynamique que l'approximation statique est bonne. Je ne pense pas qu'une double intégration apportera un plus.

 

Le 9/30/2022 à 15:50, barbu a dit :

J'ai essayé ta proposition et comme je le pensais l'appel de la routine toute les 5ms ne se fait pas. J'ai donc divisé par 2 le temps pour appeler de cette interruption qui basculer le flag d'autorisation de faire les calculs de PID et je n'incrémente la position telescope qu'au bout de ces 2 appels à la routine calcul de la PID. J'appel donc les calculs toutes les 9ms. Mais ça ne marche pas, je ne suis pas sure que les calculs prennent moins de 9ms.

 

Je doute que les calculs prennent plus de 10ms, il n'y a quasiment rien dans le boucle.

Regarde au moins avec ton oscillo si les pas de temps de ta boucle sont bien constant.

 

Le 9/30/2022 à 15:50, barbu a dit :

Pour la limitation de la valeur intégration cela à pour effet de bloquer cette valeur à 5 puisque les erreurs sont toujours positives et que leur sommes ne cessent d'augmenter donc je mette 0 ou 1000 au coefficient Ki j'ai toujours Cmdi bloquée à la valeur de la saturation. Et la le système oscille en tout ou rien la commande est soit 0 soit 255 avec une frèquence de 200ms.

 

Dans ce cas il faut que tu augmentes fortement la valeur de saturation (50 au lieu de 5  par exemple)  mais tu devrais en laisser une cela permet d'augmenter la stabilité et donc d'augmenter la valeur de Ki

Idem pour la purge de l'erreur si l'erreur change de signe.

Ligne 120 :

          if (erreur_precedente * erreur<0) somme_erreur=0;

 

Le 9/30/2022 à 15:50, barbu a dit :

D'autre part, je ne comprend toujours pas pourquoi lors de l'interruption générée par le codeur voie B je n'arrive pas à avoir la bonne valeur du niveau logique de A pour déterminer le sens.

 

Je comprends pas trop non plus mais c'est fondamental ca te permettra de doubler la résolution et tu en a grand besoin à cette vitesse.

Hypothèses : un rebond dans la descente du front : la valeur de PIND change pendant le if  (essaye de regarder au scope si tu vois un rebond

Solution possible

A. utiliser une variable intermédiaire pour ne lire qu'une fois le port

Remplacer :

  if ((PIND & 0b00000100) != (PIND & 0b00001000))
    positMoteurSB--;
  else
    positMoteurSB++;

 

par

unsigned byte portD=PIND;

  if ((portD & 0b00000100) != (portD & 0b00001000))
    positMoteurSB--;
  else
    positMoteurSB++;

 

B. Une  capa (1nF) entre la masse et la voie B

Bon courage

Nicolas

 

Share this post


Link to post
Share on other sites

Bonjour,

Alors hier matin j'avais fait une réponse mais apparemment elle n'a pas été prise en compte. Bref du coup je résume mon dernier message qui n'a été publié et je vous donne des nouvelles de mes essaies.

 

Alors pour les interruptions du codeur piste B j'ai résolue le problème en changeant  une variable d'état à chaque appel. Idem pour la voie A. du coup je sais ou en est chacune des voies et le test d’incrémentation fonctionne. Après si je loupe une impulsion et que me décale dans la lecture le système va croire que le moteur tourne à l'envers du coup je vais peut ajouter une vérification du niveau de temps en temps.

 

Pour le calcul de la PID j'ai laissé tombé la double intégration, car comme tu le dis Nico, cela n'a rien changé et n'a pas apporté un plus.

Pour le temps de la boucle j'ai introduit une lecture du temps micros() au début de la boucle loop cela me donne 3200µs j'ai donc placé une boucle while en fin de la boucle principale pour qu'elle ne recommence qu'après 3800µs cela me laisse du temps pour aller dans toutes les interruptions et revenir sans modifier le rythme du calcul de la PID.

 

Pour le calcul de la PID J'ai ajouté une constante après les termes de la formule standard ce qui a pour effet, en la choisissant bien d'annulée la somme des erreurs et de me permettre d'augmenter le coef Ki ce qui rend le système bien plus stable et plus précis. La valeur de commande n'évolue plus exclusivement sur une dizaine de valeurs de 5 ou 6 en 6 mais de 1 à 10.

 

Du coup j'ai ouvert la coupole et essayé le suivie sur saturne et jupiter et la stabilité c'est grandement améliorée. Pour la précision sur la vitesse sur le long terme c'est quasiment parfait trois heures de film et aucun recadrage  au max un 1/2 diamètre de jupiter à la fin. Après j'ai toujours l'erreur PEC mais la c'est de la mécanique. Et à cours terme toujours de l’oscillation mais beaucoup plus faible de l'ordre de -+1 pas codeur sur 10 boucle de test de la PID. A moyen terme j'ai une erreur +-5 pas codeur sur une période d'une centaine de bloucle PID. Je pense pouvoir réduire ces erreurs en jouant plus finement sur la constante que j'ai ajouté et sur les coef de la PID.

 

Une petite de saturne faite hier soir pour remotiver il y a du mieux même si c'est pas encore ça. Après je ne sais pas si le manque de qualité de l'image est uniquement dû au suivie. Il y à peut être aussi la hauteur de saturne bien basse sur l'horizon, la mise en température du télescope absolument pas faite, les turbulences au dessus de la coupole encore chaude de la journée par rapport à l’extérieur, l'alignement de la lame et du secondaire pas vérifié depuis le dernier nettoyage, par contre la collimation et  la mise au point sont au plus fin et vérifiées plusieurs fois pendant les prises de vues. Je refais des essaies ce soir en diminuant le temps de pose sur jupiter au max pour figer la turbu et les erreurs de suivie et je vous tiens au courant.

 

Saturne04-10-2022.jpg.c28c7a7c9a85d83e0b27ef5fd42d82b7.jpg

 

Bonne journée

 

Edited by barbu
  • Like 3

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now