Aller au contenu


Photo
- - - - -

Gestion de PID pour projet artistique


25 réponses à ce sujet

#21 bvking

bvking

    Membre

  • Membres
  • 98 messages

Posté 11 février 2019 - 09:17

Avant en assignant les mêmes vitesses à mes deux moteurs, ils se décalaient de 45° au bout de deux minutes,

 

maintenant en compliquant mon programme (avec le calcul de la moyenne de la vitesse par moteur), j'ai un décalage de 720° donc je vais essayer de

 

"doubler le code déjà présent ".

 

Ok, mais en plus de doubler la resolution, il faudrait que je puisse garder la fonction qui  detecte la direction de la roue. 

Voila le code, je vais essayer donc de doubler

volatile byte LstateA = digitalRead(encoderApinA);

avec

volatile byte LstateB = digitalRead(encoderApinB);

....

void EncoderInitA()
{
  DirectionA = true;//default -> Forward  
  pinMode(encoderApinB,INPUT);  
  attachInterrupt(3, wheelSpeedA, CHANGE);
}
 
void wheelSpeedA()
{
volatile byte LstateA = digitalRead(encoderApinA);  
  if((encoderAPinALast == LOW) && LstateA==HIGH)
  {
 volatile byte valA = digitalRead(encoderApinB);
    if(valA == LOW && DirectionA)
    {
      DirectionA = false; //Reverse
    }
    else if(valA == HIGH && !DirectionA)
    {
      DirectionA = true;  //Forward
    }
  }
  encoderAPinALast = LstateA; 
  
 
  if(!DirectionA)  durationA++;
  else  durationA--;

}


#22 bvking

bvking

    Membre

  • Membres
  • 98 messages

Posté 11 février 2019 - 10:40

voilà , j'ai changé comme ceci

 

la roue A avec l'encodeur A

void EncoderInitA()

{
  DirectionA = true;//default -> Forward  
  pinMode(encoderApinB,INPUT);  
  pinMode(encoderApinA,INPUT);  
  attachInterrupt(3, wheelSpeedA, CHANGE);
   attachInterrupt(7, wheelSpeedA, CHANGE);
}


void wheelSpeedA()
{
volatile byte LstateA = digitalRead(encoderApinA);  
volatile byte LstateAB = digitalRead(encoderApinB);  

  if(encoderAPinALast == LOW && LstateA==HIGH && encoderAPinBLast == HIGH && LstateAB==LOW)
  
  
  {
 volatile byte valA = digitalRead(encoderApinB);

    if(valA == LOW && DirectionA)
    {
      DirectionA = false; //Reverse
    }
    else if(valA == HIGH && !DirectionA)
    {
      DirectionA = true;  //Forward
    }
  }
  encoderAPinALast = LstateA; 
  encoderAPinBLast = LstateAB; 
  

  if(!DirectionA)  durationA++;
  else  durationA--;

}

 

 

et pareil avec la roue B

oid EncoderInitB()
{
  DirectionB = true;//default -> Forward  
  pinMode(encoderBpinB,INPUT); 
  pinMode(encoderBpinA,INPUT); 
  attachInterrupt(2, wheelSpeedB, CHANGE);
  attachInterrupt(4, wheelSpeedB, CHANGE);
}
 
void wheelSpeedB()
{
  volatile byte LstateB = digitalRead(encoderBpinA); 
  volatile byte LstateBB = digitalRead(encoderBpinA); 

  
  if(encoderBPinALast == LOW && LstateB==HIGH && encoderBPinBLast == HIGH && LstateBB==LOW)
  {
   volatile byte valB = digitalRead(encoderBpinB);
    if(valB == LOW && DirectionB)
    {
      DirectionB = false; //Reverse
    }
    else if(valB == HIGH && !DirectionB)
    {
      DirectionB = true;  //Forward
    }
  }
  encoderBPinALast = LstateB;
  encoderBPinBLast = LstateBB;
 
  if(!DirectionB)  durationB++;
  else  durationB--;

}

en n'oubliant pas ceci dans le setup

volatile byte encoderAPinBLast;
volatile byte encoderBPinBLast;

et bizarrement j'ai la roue A qui va plus doucement que la roue B .

La vitesse détectée pour la roue A est instable alors qu'elle ne saccade pas( à l'oeil nu)

Et la roue A est détecté à une vitesse negative quand l'autre est positive.

 

Mais est-ce que dans le principe c'est bon?

 

Je mets les vitesses perçues pour les moteurs avec LD (dernière vitesse de A) et LDb (dernière vitesse de B)

LDB-50.00Db: -9.00-12.00-16.00Vb92.85
LD49.00D  : 8.0012.0016.00V85.25
LDB-50.00Db: -9.00-13.00-17.00Vb92.85
LD51.00D  : 8.0011.0016.00V73.20
LDB-50.00Db: -9.00-13.00-17.00Vb92.85
LD50.00D  : 8.0011.0014.00V80.20
LDB-51.00Db: -8.00-12.00-16.00Vb89.80
LD50.00D  : 8.0011.0013.00V78.20
LDB-49.00Db: -9.00-13.00-17.00Vb97.85
LD51.00D  : 11.0014.0018.00V75.15
LDB-51.00Db: -9.00-13.00-17.00Vb87.80
LD52.00D  : 9.0012.0014.00V74.05
LDB-50.00Db: -10.00-14.00-18.00Vb94.80
LD54.00D  : 8.0011.0014.00V69.85
LDB-51.00Db: -9.00-13.00-17.00Vb89.75



#23 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é 11 février 2019 - 12:19

Il faut revoir ta façon de traiter les interruptions. 

 

En ne traitant que dans ce cas : 

if((encoderAPinALast == LOW) && LstateA==HIGH)

Tes conditions ne traite qu'un cas sur 2 ... où est le cas où LstateA == LOW ? 
=> tu avais ta résolution divisée par 2.

 

 

il faut que tu fasses : 

Si A change : 

 

A = read(PinA)

sens = A xor (last B )
last A = A

if(sens==directionPositive)
 speed++
else
speed -- 

 

Si B change 

 

B = read(PinB)
sens = !(B xor (last A))

last B = B

if(sens==directionPositive) 
 speed++ 
else 
speed -- 

 

Pourquoi chercher à faire une seule interruption "plus grosse" et faire la distinction des cas dedans quand tu peux faire deux interruptions plus courte avec la distinction déjà effectuée ? =)

 

De plus je te recommande de faire le read(Pin) sans utiliser les digitalRead. Cela sera aussi plus rapide d'exécution => Il faut lire directement le Port et le pin correspondant. 


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  

 

 

 


#24 bvking

bvking

    Membre

  • Membres
  • 98 messages

Posté 11 février 2019 - 12:29

Je vais voir ça!



#25 bvking

bvking

    Membre

  • Membres
  • 98 messages

Posté 11 février 2019 - 02:26

Pardon, 

Mais ça à l'air simple pour toi, mais pas pour moi. Je pense pouvoir y arriver mais j'ai plein d'autres choses à programmer

( les vitesses qu'auront chaque moteur, comment ils devront changer de vitesses, comme l'un ou les uns devront interagir avec les autres, avec quels fonctions de couplages....).

Si tu peux modifier vite fait le code je suis pas contre ton aide.

 

Quant à lire directement sur le Port, là c'est de l'abstraction total. 



#26 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é 11 février 2019 - 03:50

Pardon, 

Mais ça à l'air simple pour toi, mais pas pour moi. Je pense pouvoir y arriver mais j'ai plein d'autres choses à programmer

Si tu peux modifier vite fait le code je suis pas contre ton aide.

 

 

Justement c'est en modifiant le code soit même qu'on apprend. 
Je t'ai volontairement donné que du pseudo code pour que tu tapes toi même le code.
c'est 10 fois plus formateur. 

 

J'aide gratuitement sur le forum =) par contre si c'est pas de l'aide que tu cherches mais que quelqu'un le fasse à ta place je facture mes prestations ... 

Lire directement sur le port :: lien où en on parle http://forum.arduino.cc/index.php?topic=260731.0 

Par contre ça commence à être plus compliqué. Pour le moment garde le digitalRead. Plus tard quand tu souhaiteras tu pourras passer à autre chose !
On pourra ouvrir un sujet dédié à ce topic si tu le souhaites.

 

 


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  

 

 

 




Répondre à ce sujet



  


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

0 members, 1 guests, 0 anonymous users