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
31 réponses à ce sujet

#21 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 252 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 ! 

 

Les réalisations de Mike118  

 

 

 


#22 bvking

bvking

    Nouveau membre

  • Membres
  • 30 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
  • 8 252 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 ! 

 

Les réalisations de Mike118  

 

 

 


#24 bvking

bvking

    Nouveau membre

  • Membres
  • 30 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

    Nouveau membre

  • Membres
  • 30 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
  • 8 252 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 ! 

 

Les réalisations de Mike118  

 

 

 


#27 bvking

bvking

    Nouveau membre

  • Membres
  • 30 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
  • 8 252 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 ! 

 

Les réalisations de Mike118  

 

 

 


#29 bvking

bvking

    Nouveau membre

  • Membres
  • 30 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
  • 8 252 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 ! 

 

Les réalisations de Mike118  

 

 

 


#31 bvking

bvking

    Nouveau membre

  • Membres
  • 30 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
  • 8 252 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 ! 

 

Les réalisations de Mike118  

 

 

 






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

0 members, 0 guests, 0 anonymous users