Aller au contenu


Photo
* * * * * 2 note(s)

Arduino due, Moteurs CC et asservissement PID

Arduino Due Codeurs PID Asservissement

  • Veuillez vous connecter pour répondre
33 réponses à ce sujet

#21 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 924 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é 20 septembre 2019 - 06:37

Juste pour être sur tu peux toujours poster le code exacte utilisé pour chaque vidéo avec la vidéo ? 
Pour être sûr des petits ajustement que tu fais / vérifier comment tu les fais. 

En fait l'hélice du milieu c'est celle qui reçoit la consigne de vitesse demandée ... Donc c'est peut être pour cela que c'est sur elle que tu vois le problème... 

Je peux éventuellement te proposer une micro modif dans le code que tu vas poster correspondant à cette vidéo pour que tu me dise si ça te corrige ton problème...


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  

 

 

 


#22 bvking

bvking

    Membre occasionnel

  • Membres
  • Pip
  • 98 messages

Posté 21 septembre 2019 - 02:08

Dans les deux dernières videos, c'est le même code. Celui que j'ai mis en pièce-jointe.

Je le remets ici une plus propre.

 

Fichier joint  max_ardui0.1_12V.ino   17,06 Ko   1 téléchargement(s)



#23 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 924 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é 22 septembre 2019 - 01:54

void yoyo1(double rpm, int16_t temps) {   // temps en secondes
  static uint8_t etat = 0;
  static uint32_t reftemps = 0;
  
   switch (etat) {
     case 0: 
      if(millis() - reftemps > temps * 1000 ) {// 5-->15 accelere les cycles de repetions  // 1000 car comparaison de secondes avec ms et 4 car quart de tour  
       mode = POSITION;
       for(uint8_t i = 0; i < 5; i++) { 
        setConsigneMoteur(i, rpm - (i* 60) / (float)(5 * temps)); // 5(2 bizarre--> 5, 10  l'ecart inter phase est plus lissé (moins grand)
       } 
       reftemps = millis();    
       etat = 1;
      
      }
    break;
     case 1:
      if(millis() - reftemps > temps * 1000) { // 1000 car comparaison de secondes avec ms et 4 car quart de tour
       mode = POSITION;
       for(uint8_t i = 0; i < 5; i++) { 
        setConsigneMoteur(i, rpm  - ((4-i) * 60) / (float)(5* temps)); //(0-->5, 10 ok 15= pas de vitesse qui accelere ou decelèrer entre etat
       }
       reftemps = millis();  
       etat = 0; 
    
      }
    break;
   }
}

Micro modif sur la fonction yoyo1
=> La vitesse mise en paramètre est désormais la vitesse maximale du moteur qui tourne le plus vite
=> Le temps que tu mets en paramètre indique maintenant le temps entre les changements de cycles. 

 

Les deux cycles sont : 
Cycle 1 : Le moteur 0 tourne le plus vite et les autres sont ralentis de manière à faire un joli escalier à la fin du cycle.
Cycle 2 : L'escalier se referme, le moteur 4 tourne le plus vite. 

Si besoin on peut mettre en place un cycle intermédiaire où les moteurs restent synchronisés , et un état intermédiaire où l'escalier reste stable ...
 


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 occasionnel

  • Membres
  • Pip
  • 98 messages

Posté 23 septembre 2019 - 05:17

Là ça commence bien au debut, puis on voit le moteur 2 prendre du retard et se synchroniser sur le moteur 1.

 

Je crois qu'avec mon autre config et avec le void yoyo1 à 50 bpm, j'avais un problème avec l'execution de la 3ème ou 4ème fois que la void yoyo1 se lançait.

 

Mais la c'est autre chose, c'est avant même qu'elle se replie.

Si t'as un ensemble de test à me faire faire, n'hésite pas.

 

Fichier(s) joint(s)



#25 bvking

bvking

    Membre occasionnel

  • Membres
  • Pip
  • 98 messages

Posté 02 octobre 2019 - 04:57

Salut Jonathan,

 

J'ai refait des tests avec le programme précédent la dernière retouche que t'avais faite.

Avec les consignes pour void yoyo1

 

setConsigneMoteur(i, (rpm * temps  + (i+2 )* 60) / (float)temps); //   puis

setConsigneMoteur(i, (rpm * temps  + (i-2 )* 60) / (float)temps); // 

 

Je me suis aperçu qu'en fonction des paramètres de vitesses et de répétions cycles, le programme et donc les pâles ne buggait pas pareillement

 

Avec yoyo (15,120) le monitor n'affiche plus rien au debut du 3ème cycle. Au bout 1 min 36 sec. On dirait donc qu'elle bugge exactement en debut de cycle

 
 Avec yoyo (15,60) le moteur 0 se decalle (prend du retard) un peu avant deux min, et le monitor continue d'afficher, donc l'Arduino ne bugge pas.
C'est autre chose.
C'est ce qu'on voit dans la vidéo.
 
J'ai fait d'autres essaies avec ce programme "0_12Vbugi-2" , que j'appelle i-2 , et on peut lire les commentaires directement dans void loop (si ça peut aider!)
 
*************************
 
J'ai aussi fait des test avec le programme avec la dernière retouche que j'appelle 4-i
 
setConsigneMoteur(i, rpm  - ((4-i) * 60) / (float)(5* temps))
 
J'ai observé ce genre de résultat:
                 // Avec 4-i--> 15,120 le programme n'affiche plus rien exactement au bout de quatre min.
                // Exactement, à la fin d'un cycle entier, exactement quand les pâles sont alignées, le programme ne relance pas la boucle void yoyo1.
                // Par contre ce qui est bien c'est q'on ne resent pas la vitesse changé entre deux état
                // Avec 4-i --> 15,75 le programme n'affiche plus rien exactement au debut d'un deuxième cycle, exactement quand elles avaient fini de s'aligner.
                // Donc même probleme entre les parametres 15,120 et 17,75. ???
                
                // Avec 4-i--> 15,60 moteur 2 se synchronise au moteur 1 avant la fin du cycle (après le debut du demi-cyle), donc avant deux minutes
                // Par contre le programme continue d'afficher les états
                // Avec i-2--> 15,60 moteur 0 se decalle en premier, mais le monitor continue d'afficher
 
Voilà, espérant ne pas t'avoir trop embrouillé. 
 
S'il est plus simple de faire un déphasage plus petit 120° (par exemple) au lieu de 180°avant que les pales ne se replie, on peut changer de choix esthétiques.
Ce qui compte pour moi, ce sera plus la partie interactive que le motif ouverture repli, bien qu'il faille bien commencer par le debut.
:mr47_05:

Fichier(s) joint(s)



#26 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 924 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é 02 octobre 2019 - 05:42

Je reconnais que je suis plutôt embrouillé x) 


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  

 

 

 


#27 bvking

bvking

    Membre occasionnel

  • Membres
  • Pip
  • 98 messages

Posté 08 novembre 2019 - 06:21

Yep.

 

Concernant le décalage de temps que mets la Arduino (un peu trop long de 250 ms) pour avoir le bon nombre de rotation selon le temps réelle. J'ai fait des test à 30, 45,60, 75 et 90 rpm.

 

Avec toutes ces vitesses, il me faut 15750 ms pour que les moteurs aient fait le bon nombre de rotations. Alors qu'il aurait fallu 16 sec.

Pour faire 4 * plus de tours, j'ai fait 4* 15750 ms = 63000 ms, mais il manquait 30° à tous les moteurs.

Le bon temps, pour le bon nombre de rotation souhaité est de 63250 ms. Alors qu'en théorie il aurait fallu 64 sec.

Donc plus on avance dans le temps, et plus l'Arduino décompte le temps rapidement. Avec une erreur de 750 ms au bout de 64 sec.

 

Je sais pas comment réglé la machine pour que le temps programmé, soit le vrai temps.

J'ai trouvé sur le forum Arduino, un programme qui recalle le temps, mais je sais pas si c'est assez pour faire tourner la machine une demie heure par exemple sans perdre 1/10 de sec.

J'ai teste le programme ci dessous et j'ai perdu 1/10 de sec  en 2h15. La difference entre le temps affiché dans le serial monitor avec celui de l'horodatage.

// Déclaration des variables et constantes horloge

unsigned long refTemps;              // echeance placee dans le futur

int jour=19;                // Jour de l'horloge
int heure = 18;             // Heures de l'horloge
int minute = 6;            // Minutes de l'horloge
int seconde = 30;            // Secondes de l'horloge


void setup() {

  // Initialise la liaison série
  Serial.begin(19200);

}


void loop() {

  if (millis()>= refTemps){          // si millis est egal ou plus grand que l'echeance

    refTemps+=1000;                   //la derniere echeance + 1 seconde
    seconde++;                      // on additionne 1 seconde

    if(seconde>=60){                // lorsque les secondes arrivent a 60
      minute++;                     // on additionne 1 minute
      seconde=0;                    // et on remet les seconde a zero
      if(minute>=60){               // lorsque les minutes arrivent a 60
        heure++;                    // on additionne 1 heure
        minute=0;                   // et on remet .... etc, etc
        if(heure>=24){
          jour++;
          heure=0;

        }
      }
    }
  }

  // on envoie dans le moniteur serie le jour, l'heure, les minutes et les secondes....
  Serial.print(jour);
  Serial.print("     ");  
  Serial.print(heure);
  Serial.print("     ");  
  Serial.print(minute);
  Serial.print("     ");  
  Serial.println(seconde);
  delay(100);
}

Est ce une solution ? 

 

Merci



#28 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 924 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é 08 novembre 2019 - 09:18

il ne faut pas mettre le delay ... 

Pendant le delay ça " freeze" ton programme. 

 

essaye : 

// Déclaration des variables et constantes horloge

unsigned long refTemps;              // echeance placee dans le futur

int jour=19;                // Jour de l'horloge
int heure = 18;             // Heures de l'horloge
int minute = 6;            // Minutes de l'horloge
int seconde = 30;            // Secondes de l'horloge


void setup() {

  // Initialise la liaison série
  Serial.begin(19200);

}


void loop() {

  if (millis()>= refTemps){          // si millis est egal ou plus grand que l'echeance

    refTemps+=1000;                   //la derniere echeance + 1 seconde
    seconde++;                      // on additionne 1 seconde

    if(seconde>=60){                // lorsque les secondes arrivent a 60
      minute++;                     // on additionne 1 minute
      seconde=0;                    // et on remet les seconde a zero
      if(minute>=60){               // lorsque les minutes arrivent a 60
        heure++;                    // on additionne 1 heure
        minute=0;                   // et on remet .... etc, etc
        if(heure>=24){
          jour++;
          heure=0;

        }
      }
    }
    Serial.print(jour);
    Serial.print("     ");  
    Serial.print(heure);
    Serial.print("     ");  
    Serial.print(minute);
    Serial.print("     ");  
    Serial.println(seconde);
  }
}

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  

 

 

 


#29 bvking

bvking

    Membre occasionnel

  • Membres
  • Pip
  • 98 messages

Posté 09 novembre 2019 - 08:32

J'ai testé le programme et il n'y a pas de problème de décalage entre le temps indiqué et le temps réelle.

 

Par contre je viens de réaliser en traçant les positions de 5 moteurs, que si je mets 63250 ms pour qu'ils fassent bien le bon nombre de tours à l'oeil,  les postions données par le graphique n'étaient pas à 0.

Par contre en mettant 64000, les positions sont toutes à 0.

Du coup, c'est un problème avec les constantes du nombre de tick par tours.

 

J'ai testé 99 et 100 pour le GEARRATIO

const uint8_t GEARRATIO = 99 ;//100;

Avec 99, il y a 2772 position,/tour. Avec 100, il y a 2800

 

J'ai testé  et mesuré pour avoir 100 tours exactement à 85rpm. Il faut 70,588 sec.

 

 Avec 99  il y a 45° à 70° en trop. Les moteurs sont à leur bonne position sur le graphique..

Avec 100 il y a 3/4 de tour en trop; les moteurs apparaissent  à 1600 sur le graphique.

 

Donc 99 c'est mieux, mais c'est encore un peu trop. 

J'avais sur une fiche technique, qu'il 198.6 impulse/tour . Qu'est ce que çà veut dire?

Sinon, peut -on améliorer la precision avec un nombredetick / tour calculé à la main?

Merci pour ton aide



#30 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 924 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é 09 novembre 2019 - 10:07

198.6 ? Dans ce cas là il faut mettre un float et pas un entier pour le nombre de tick / tour et mettre la valeurs avec une virgule

 

Par contre il y a quand même un facteur d'environ 2 entre 100/99 et  198.6 ... As  tu le lien de ta doc technique? 

 

La bonne valeurs est peut être 99.3 dans un float.



 


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  

 

 

 


#31 bvking

bvking

    Membre occasionnel

  • Membres
  • Pip
  • 98 messages

Posté 14 novembre 2019 - 03:42

Yep.

 

Voila le programme pour tester le bon calibrage de Nombre de tick / Tour.

Et donc, il faut *100 pour bien les positions (absolue ou relative ) pour avoir le bon nombre de tick / tour.

Puis gérer les autres variables en amont, j'imagine.

 

Merci à toi.

 

Fichier(s) joint(s)



#32 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 924 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é 15 novembre 2019 - 01:21

du coup pour prendre en compte la virgule il faut modifier le for ainsi : 

 

  for(uint8_t i = 0; i < NBMOTEURS; i++) {
    vitesse[i] = compteur[i];
    compteur[i] = 0;
    position[i] += vitesse[i] * 100;
    positionAbsolue[i] += vitesse[i];
    
    while(position[i] >= NBTICKSPARTOURSSORTIE * 100) {
      position[i] -= NBTICKSPARTOURSSORTIE * 100; 
       passeParZero = 1;
    }
     while(position[i] < 0) { 
      position[i] += NBTICKSPARTOURSSORTIE * 100; 
      passeParZero = 1;
    }

    if(passeParZero) {
      actionX(i);
      passeParZero = 0;
      
    }

  }

En multipliant par 100 ainsi tu gères jusqu'à deux chiffres après la virgules dans ta variable " position " =) 


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  

 

 

 


#33 bvking

bvking

    Membre occasionnel

  • Membres
  • Pip
  • 98 messages

Posté 08 janvier 2020 - 10:05

Voilà les vidéos avec des bpm de 20+ (1*i) et 20+ (4*i) sur 30 secondes

et la vidéo de 20+ ( 1*i) sur 2 min.

 

1er cas:  20+(4*i) : Avec des vitesses de 4 bpm  de différence (20, 24, 28...).

Au bout de 30 sec, Les 5 helices s'arrêtent aux bons nombres de tours et donc dans le même axe de départ.

Elles ont fait 10, 12, 14... tours.

Pour être bien calé sur le bon nombre de tours, j'ai rajouté une demi seconde. Sinon,

elles ne se sauraient pas remises sur l'axe de départ, elles seraient un peu en arrière, mais quasi alignées.

 

2 ème cas: 20+(1*i) : Avec des vitesses de 1 bpm de difference (20, 21, 22...).

Au bout de 30 sec+ 1/2 sec comme rajouté ci dessus, elles ne sont pas alignées, alors qu'elles auraient du faire

10, 10.5, 11, 11.5 et 12 tours. Et donc être calés d'un demi-tour.

On voit bien que la premiere et la cinquième sont à leur place (un peu en avant / à l'axe de départ),

mais pas les autres. C'est bizarre.

 

Dans le 2 ème cas, quand on généralise a d'autres vitesses comme 18+ (1*i) ou 16+ (1*i),  ce qui est étrange c'est que les premiere et cinquième helices sont toujours alignés!!! Elles arrivent dans la même position, alors que c'est pourtant celles qui ont le plus de différence de vitesse !   :Alvarin_07:

 

Avec les mêmes vitesses que ci dessus sur deux minutes, on observe qu'elles ne sont pas calés du tout.

J'ai multiplié par 4, les 30,5 secondes de ci-dessus, on a donc deux minutes et deux secondes.

On voit que la premiere et cinquième sont bien en haut, sur leur axe, mais pas les autres. 

La cinquième hélice a fait 48 tours et la premiere 40. Comme demandé par leur programme (auquel, j'ai du rajouté 2 secondes quand même!!).

Mais les autres ont fait:

la 4eme a fait 45.25 au lieu de 46.

la 3eme a fait  43.25 au lieu de 44

la 2 eme a fait 41.6 au lieu de 42

 

Le 1er et 2 ème cas sont vrais sur 30 secondes, en remplaçant 20 par 40 ou 60.

 

 

 

Malheureusement si je généralise le premier cas, où les moteurs ont des differences de 4 bpm entre elles,  elles  n'arrivent pas toujours toutes alignées au bout de 30 secondes.

 

Avec par exemple: 10+(4*i), 18+(4*i), ça ne fonctionne pas.  :lazy:

 

Alors qu'elles arrivent alignées avec: 9+ (4*i), 15+ (4*i), 16+ (4*i).  Rappel dans le 2 ème cas, 16+ (1*i), elles ne sont pas alignées, sauf la premiere et cinquième.

 

Pour 30 secondes, pourquoi,  est-ce plus compliqué de faire 16+ (1*i) que 16+ (4*i)?

Ou alors pourquoi 8 + (1*i) ou 8 + (2*i), les helices ne sont pas alignées,  alors qu'avec 8 + (4+i) elles le sont parfaitement?

 

Voila, c'est mystérieux et donc pas simple pour moi, de profiter du mouvement simplement..

 

Bises et bonne année.

Fichier(s) joint(s)



#34 bvking

bvking

    Membre occasionnel

  • Membres
  • Pip
  • 98 messages

Posté 09 janvier 2020 - 04:51

Hello Jo,

 

Je viens de faire un test avec des differences de 4+i avec une vitesse de 26 pour le moteur 0.

En théorie au bout d'une minute les moteurs devraient avoir fait 26, 30, 34, 38 et 42 tour en une minute.

 

Au bout de 30 secondes exactement(sans rajouter  une 1/2 seconde) , elles sont bien toutes sur leur point de départ, donc bien alignées. (si on chipote pas).

 

Mais au bout d'une minute exactement, celle du  moteur 0 est parfaitement sur son point de départ , celle du moteur 1 quasiment sur axe de départ, mais la 2, 3 et 4 ont respectivement 0.08, 0.16 et 0.25 tour de retard.

 

Au bout de deux minutes exactement, l'écart se creuse encore plus entre les helices.

Bien que le moteur 0 a exactement fait 52 tours, alors qu'on aurait pu croire qu'il aurait eu du retard, si on se base par rapport au test d'avant, ou le moteur 4 n'a pas réussi a faire ses 42 tours exactement!! :crazy: .

Les moteurs 1, 2, 3 et 4 ont respectivement 0.08, 0.25, 0.32 et 0.5 tour de retard. (à peu près)

 

J'espere que ça t'éclaire, il doit y avoir un truc simple, mais je sais pas où.

 

Merci à toi







Aussi étiqueté avec au moins un de ces mots-clés : Arduino Due, Codeurs, PID, Asservissement

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

0 members, 0 guests, 0 anonymous users