Aller au contenu


Photo
- - - - -

Equalizing motors speed for balancing robot

equilibre balancing

2 réponses à ce sujet

#1 vivitern

vivitern

    Nouveau membre

  • Membres
  • 1 messages

Posté 13 décembre 2017 - 08:25

I am currently working on a balancing robot project using Arduino Uno. I am able to get the robot to balance but one of its motor have the tendency to rotate more than the other.

Je pense avoir déjà lu un concept similaire sur ce lien: http://jjrobots.com/projects-2/b-robot/ ,  Malheureusement, je n'ai pas complètement saisi le concept présenté.

I am using the L298N Fiche techniquehttp://www.kynix.com/uploadfiles/pdf9675/L298N.pdf)motor controller with 2 x 30:1 Metal Gearmotor 37Dx68L mm with 64 CPR Encoder from polulu.com. I have also tried to compensate for the difference in speed by monitoring the encoder value on each motor. Unfortunately, the compensation logic seems to contradict the PWM control needed to balance the robot and causes it to oscillate quite a lot.

I am currently using the following code to balance the motor speed:

dPos = leftCounterCurr - rightCounterCurr;
if(dPos > 10) {
leftPWM = u + k*abs(dPos);
rightPWM = u - k*abs(dPos);
}
else if(dPos < -10) {
leftPWM = u - k*abs(dPos);
rightPWM = u + k*abs(dPos);
}

dPos refers to the difference in the two encoders values. leftPWM and rightPWM are the PWM values to control the left and right motor respectively. u is the output of the PID control and it is adjusted by certain gain value to compensate for the difference in motor speed.

I hope someone with similar experiences can help me out. Thanks in advance.

Edit 1: @Marko I did some characterization of my motors today. Thought I would post it here in case anyone might find it useful. The results are shown below. It seems that with proper capacitance tuning, I am able to get the motors to give almost similar responses. However, I believe there is still a need to use a control loop for better performance.

4t2ce.png

For example,if the left motor has a 0.3uF capacitor across its terminals while the right motor has a 0.2uF capacitor across its terminal, we can observed that the two response curve are very close together.

Another thing that I notice was that the motor would not move for duty cycle below 20%. And it seems like a universal problem with PWM control of DC brush motors... or at least I have not find any methods to overcome this behavior yet.

 

 

En Français : 

 

Je travaille actuellement sur un projet de robot équilibrise utilisant Arduino Uno. Je suis capable d'équilibrer le robot mais l'un de ses moteurs a tendance à tourner plus que l'autre.
Je pense avoir déjà un concept similaire sur ce lien: http://jjrobots.com/projects-2/b-robot/ , Malheureusement, je n'ai pas complètement saisi le concept présenté.
J'utilise le contrôleur de moteur L298N Fiche technique ( http://www.kynix.com/uploadfiles/pdf9675/L298N.pdf) avec 2  motoréducteur de rapport de réduction  30: 1 reférence Metal Gearmotor 37Dx68L  avec encodeur CPR 64 . J'ai également essayé de compenser la différence de vitesse en surveillant la valeur du codeur sur chaque moteur. Malheureusement, la logique de compensation semble contredire le contrôle PWM nécessaire pour équilibrer le robot et le fait osciller beaucoup.
J'utilise actuellement le code suivant pour équilibrer la vitesse du moteur:
 
dPos = leftCounterCurr - rightCounterCurr;
if (dPos> 10) {
leftPWM = u + k * abs (dPos);
rightPWM = u - k * abs (dPos);
}
else if (dPos <-10) {
leftPWM = u - k * abs (dPos);
rightPWM = u + k * abs (dPos);
}
 
dPos fait référence à la différence entre les valeurs des deux encodeurs. leftPWM et rightPWM sont les valeurs PWM pour contrôler respectivement le moteur gauche et le moteur droit. u est la sortie de la commande PID et est ajustée par une certaine valeur de gain pour compenser la différence de vitesse du moteur.
J'espère que quelqu'un avec des expériences similaires peut m'aider. Merci d'avance.
Edit 1: @Marko J'ai fait une caractérisation de mes moteurs aujourd'hui. Je pensais que je l'afficherais ici au cas où quelqu'un pourrait le trouver utile. Les résultats sont montrés plus bas. Il semble qu'avec un réglage de capacitance approprié, je puisse obtenir des réponses presque similaires. Cependant, je crois qu'il est toujours nécessaire d'utiliser une boucle de contrôle pour de meilleures performances.
( voir image ) 
 
Par exemple, si le moteur gauche a un condensateur de 0,3 uF à travers ses bornes alors que le moteur droit a un condensateur de 0,2 uF à travers sa borne, nous pouvons observer que les deux courbes de réponse sont très proches les unes des autres.
Une autre chose que j'ai remarqué était que le moteur ne bougerait pas pour un cycle de service inférieur à 20%. Et cela semble être un problème universel avec le contrôle PWM des moteurs à balais à courant continu ... ou du moins je n'ai trouvé aucune méthode pour surmonter ce problème pour le moment.


#2 Path

Path

    Made By Humans

  • Modérateur
  • PipPipPipPipPip
  • 2 503 messages
  • Gender:Male
  • Location:Paris

Posté 13 décembre 2017 - 08:33

Hi Vivitern,

You might have noticed that it's written in french here. :)

Are you sure it's the best way to get an answer ?

So welcome here but can you translate ?


Podcast Made By Humans

Je cherche des volontaires de tous niveaux pour nos petites conversations entre hobbyistes.

Accès aux salles secrètes

 


#3 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 786 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 décembre 2017 - 08:59

First : Welcome ! ( do not hesitate to present you here : http://www.robot-maker.com/forum/27-et-si-vous-vous-presentiez/ )

 

 

 

 

Another thing that I notice was that the motor would not move for duty cycle below 20%. And it seems like a universal problem with PWM control of DC brush motors... or at least I have not find any methods to overcome this behavior yet.

 

 

This is a standard behaviour due to the fact that a motor need a minimum voltage in order to start runing. This minimum voltage depend on your motor. It's not a problem. =)
The PID control will correct this ;)

 

Ceci est un comportement standard du au fait qu'un moteur a besoin d'un minimum de tension à ses bornes pour commencer à tourner. C'est la physique du moteur. Ce minimum dépend du moteur utilisé. Mais ce n'est pas un problème. Le contrôle PID va corriger cet effet. 

 

 

 

 I have also tried to compensate for the difference in speed by monitoring the encoder value on each motor. Unfortunately, the compensation logic seems to contradict the PWM control needed to balance the robot and causes it to oscillate quite a lot.

 

 

 

You should work the reversed way. Forget the balance controle, start to tune the PID controle for the wheel speed and position. 
When you have a perfectly well PID tuned  for speed and position then add the balance control on the bot ;) 
 

Il faut procéder de la façon inverse : il faut mettre de côté l'asservissement lié à l'équilibre et se concentrer sur l'asservissement en vitesse et position de la roue. 
Une fois que le contrôle de la roue est ok, tu pourras ajouter le contrôle de l'équilibre ! 



 


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 ! 

 

Les réalisations de Mike118  

 

 

 




Répondre à ce sujet



  



Aussi étiqueté avec au moins un de ces mots-clés : equilibre, balancing

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

0 members, 0 guests, 0 anonymous users