Go Down

Topic: Avis de recherche (Read 2667 times) previous topic - next topic

icare

Bonjour,
J'ai fait quelques essais avec d'autres cartes.

- Uno ou Mega (16 MHz) -> 4000 pas/sec max
- Arduino M0 (48 MHz) -> 4000 pas/sec max
- TM4C123 (80 MHz) -> 4500 pas/sec max
- TM4C129 (120 MHz) -> 16000 pas/sec

Il faut croire que le port GPIO de la dernière carte est plus rapide que les 2 précédentes.
J'attends une autre carte (80 MHz) avec ports directes pour d'autres essais.
@+
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

_pepe_

#16
Sep 17, 2015, 01:07 pm Last Edit: Aug 19, 2018, 07:14 pm by _pepe_
Supprimé

icare

Re,
La vitesse des GPIO n'a rien à voir dans l'affaire (vu qu'il est par ailleurs tout-à-fait possible de leur faire produire des signaux dépassant le MHz). C'est plutôt la méthode retenue pour calculer et générer les signaux qui est en cause.
_pepe_, tu as tout à fait raison et ce qui est concernant c'est que je n'ai pas tort. Il faut rester dans le contexte de cette librairie.
Les cartes Arduino M0, TM4C123 ainsi que la Raspberry Pi ont une puissance de calcul suffisante pour générer des signaux plus rapides mais le pilotage des sorties ne suit pas.

En fait, pour atteindre de bien meilleures performances que celles que tu annonces, il ne faut pas se tourner vers des bibliothèques, dont la vocation est d'être relativement universelle et indépendante du reste de l'application.
Le but n'était pas de ré-écrire un soft pour tester une chaine cinématique mais utiliser de l'existant. Le pilotage d'un moteur pas à pas via un driver (pul et dir) et en soi très simple.
Faire du x = vt + vi est simple.
Mais dans le cas précis, il faut également traiter l'accélération et la décélération du moteur.
Faire du x = 1/2gt2 + vi1t + xi1 + v2t + xi2 - 1/2gt2 - vi3t - xi3 est autre chose.
Certes le problème de résolution mathématique numérique n'est pas insurmontable, par contre, le développement de ce type de routines sont loin de mon objectif de test.
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

_pepe_

#18
Sep 17, 2015, 04:20 pm Last Edit: Aug 19, 2018, 07:13 pm by _pepe_
Supprimé

Scoob

#19
Sep 17, 2015, 04:27 pm Last Edit: Sep 17, 2015, 04:29 pm by Scoob
Quote
Bonjour,
J'ai fait quelques essais avec d'autres cartes.

- Uno ou Mega (16 MHz) -> 4000 pas/sec max
- Arduino M0 (48 MHz) -> 4000 pas/sec max
- TM4C123 (80 MHz) -> 4500 pas/sec max
- TM4C129 (120 MHz) -> 16000 pas/sec

Il faut croire que le port GPIO de la dernière carte est plus rapide que les 2 précédentes.
J'attends une autre carte (80 MHz) avec ports directes pour d'autres essais.
@+
Bonjours,
Sur le wiki Reprap, on voit des chiffres bien plus encourageant. Maintenant reste a savoir le code convient et est recupérable pour ton projet..

icare

Re,
Résultats des tests entrepris :

- Uno ou Mega (16 MHz) -> 4000 pas/sec max
- Arduino M0 (48 MHz) -> 4000 pas/sec max
- TM4C123 (80 MHz) -> 4500 pas/sec max
- TM4C129 (120 MHz) -> 16000 pas/sec
- UNO32 (80 MHz) -> 21000 pas/sec

Dans mon cas, 21000 pas/sec me donne un déplacement linéaire de 6300 mm/min
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

icare

Re,
Sur le wiki Reprap, on voit des chiffres bien plus encourageant. Maintenant reste a savoir le code convient et est recupérable pour ton projet..
Merci pour l'information, je connais les différents logiciels Marlin et autres utilisés en impression 3D. Le dispositif de pilotage n'est pas compatible avec l'interface de puissance de mes moteurs pas à pas (Imax PAP 8.5 A).
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

B@tto

Quote
- TM4C123 (80 MHz) -> 4500 pas/sec max
- TM4C129 (120 MHz) -> 16000 pas/sec
C'est quand même très louche vue la proximité des deux proc ...
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

icare

Re,
C'est quand même très louche vue la proximité des deux proc ...
Tous les tests (augmentation de la vitesse jusqu'au plafonnement des pulses) sont faits avec le même soft et contrôle des pulses à l'oscilloscope.
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

B@tto

Y'a forcément une cou***e quelque part, c'est pas logique : soit la lib, soit une sous-lib, soit le compilo.

Tu peux poster ton code de test ? Je vais essayer de trouver la faille ...
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

icare

Bonjour
@B@tto : Voici le soft utilisé
Code: [Select]
//Test vitesse et accélération avec AccelStepper
//version AccelStepper = 1.48
// /!\la librairie doit être dans le même répertoire que le programme
//la vitesse peut être contrôler en mesurant la fréquence sur
//la pin STEPPER_PUL_PIN (F = nb step/sec
#include "AccelStepper.h"
//Pins moteur PAP Y et accessoires
#define STEPPER_DIR_PIN 3               //driver
#define STEPPER_PUL_PIN 2               //driver
#define STEPPER_ENA_PIN 4               //driver
//cible TM4C129
//#define CTRL PN_1                       //visu activité
//cible TM4C123
#define CTRL RED_LED                    //visu activité
//cible Arduino M0, UNO32, UNO ou MEGA
//si Arduino M0, il faut modifier dans AccelStepper.cpp
// _cn = max(_cn, _cmin);
//par
//    if(_cn >= _cmin){
//      _cn = _cn;
//    }else{
//      _cn = _cmin;
//    }
//#define CTRL 13                         //visu activité
//définitions moteur PAP
#define PAS 2                           //pas de la vis
#define DRIV_Y 2                        //nbre micro-pas
#define PAP 200                         //nbre pas moteur
#define STEP_PER_MM_Y (PAP * DRIV_Y / PAS)
                                        //nbre pas / mm
//variables
//unités utilisées pour la CNC
//déplacement en mm
//vitesse en mm/min
//accélération en mm/sec2
float y = 0.0;                          //en mm
float vit_y = 1.0;                      //en mm/min
float acc_y = 1.0;                      //en mm/sec2
//unités utilisées pour la commande des moteurs pas à pas
//déplacement en step
//vitesse en step/sec
//accélération en step/sec2
long depl_y_pap = 0L;                   //en step
float vit_y_pap = 1.0;                  //en step/sec
float acc_y_pap = 1.0;                  //en step/sec2

//Définition moteur
AccelStepper StepperY(AccelStepper::DRIVER, STEPPER_PUL_PIN, STEPPER_DIR_PIN);
/******************************************************************************
setup
*******************************************************************************/
void setup(){
  Serial.begin(115200);
  pinMode(CTRL, OUTPUT);                //led de contrôle
  digitalWrite(CTRL, LOW);              //led off
  StepperY.setMinPulseWidth(10);        //durée pulse driver 10 us
//vitesse du moteur en mm/min
  vit_y = 1200.0;
//accélération en mm/sec2
  acc_y = 20.0;

  vit_y_pap = mmMinToStepSec(vit_y);    //mm/min en step/sec
  acc_y_pap = mmSec2ToStepSec2(acc_y);  //mm/sec2 en step/sec2

  StepperY.setMaxSpeed(vit_y_pap);      //valeur vitesse
  StepperY.setAcceleration(acc_y_pap);  //valeur accélération
}
/******************************************************************************
loop
*******************************************************************************/
void loop(){
  digitalWrite(CTRL, HIGH);             //led on
  y = 2000.0;                           //mm - déplacement absolu
  depl_y_pap = mmToStep(y);             //convertit les mm en pas
  StepperY.moveTo(depl_y_pap);          //valeur déplacement
  while(StepperY.distanceToGo() != 0){  //distance non atteinte
    StepperY.run();                     //rotation moteur
  }
  delay(2000);
  digitalWrite(CTRL, LOW);              //led off
  y = 0.0;                              //mm - déplacement absolu
  depl_y_pap = mmToStep(y);             //convertit les mm en pas
  StepperY.moveTo(depl_y_pap);          //valeur déplacement
  while(StepperY.distanceToGo() != 0){  //distance non atteinte
    StepperY.run();                     //rotation moteur
  }
  delay(2000);
}
/******************************************************************************
Conversion mm/sec2 en step/sec2
*******************************************************************************/
float mmSec2ToStepSec2(float acceleration){
  return acceleration * STEP_PER_MM_Y;
}
/******************************************************************************
Conversion mm/min en step/sec
*******************************************************************************/
float mmMinToStepSec(float vitesse){
  return vitesse * STEP_PER_MM_Y / 60;
}
/******************************************************************************
Conversion mm en pas
*******************************************************************************/
long mmToStep(float distance){
  return long(distance * STEP_PER_MM_Y + 0.5);
}
/******************************************************************************
Conversion pas en mm
*******************************************************************************/
float stepToMm(long distance){
  return float(float(distance) / STEP_PER_MM_Y);
}
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

Laurent6012

Bonjour,
Malgré de nombreuses recherches, je ne trouve pas la perle rare.
Je recherche une librairie pour moteur pas à pas qui permette un pilotage à plus de 4000 pas/sec.
La librairie doit pouvoir gérer les accélérations, les décélérations, la vitesse et le pilotage des drivers via steps et dir.
Si vous avez croisé la perle rare, je suis preneur.
Merci et @+
Salut,

Dis voir tu ne serais pas en train d'essayer de piloter une CN directement depuis Android..... ?
Pour compenser les couts d'une commande propriétaire par exemple.
Si c'est ça, intéressant comme projet.

@+

B@tto

Re,

@icare : j'ai pas eu le temps de faire des tests, mais j'ai une piste peut-être intéréssante pour toi. J'ai un ami du fablab qui bosse sur un robot pendulaire (comme un segway quoi). Il avait justement des problématiques un peu (beaucoup) comme toi :)

De son propre aveu c'est du tout un pro d'Arduino mais il se dépatouille comme il peut et je lui file la main dès que je peux. On a fait quelques essais en essayant les méthodes "simples", c'est à dire sans trifouiller aucun registre puisqu'il sait à peine ce que c'est. Donc au final il a un peu rendu les armes et est passé à un firmware déjà fonctionnel (il voulait faire le sien à la base) : https://github.com/JJulio/b-robot/blob/master/B_ROBOT/B_ROBOT.ino

Et donc la gestion par timer direct c'est clairement beaucoup, beaucoup, beaucoup plus efficace ... en même temps je suis pas surpris, c'était prévisible, cependant j'avais bidouillé les lib Timer1 et Timer3 et elles partaient complètement en cacahuète. Mais comme je connais pas trop bien les registres sur Atmel et j'avais pas envie de m'y mettre ...

Bref le code ci joint, une fois épurée est quand même pas du tout complexe et deux moteurs tournent clairement très vite même en 1/16 ème de pas. Je lui ai pas demandé au tachymètre combien ça donnait mais je pense qu'on est clairement à la limite des moteurs.
Blog électronique : battomicro.wordpress.com
Photographie : www.interactive-celebration.fr
Fablab de Montpellier : www.labsud.org

icare

Bonjour B@tto,
Je vais voir cela. Merci
2B OR NOT(2B) = FF
Arduino 1.0.5 à 1.8.5 + gEdit + Ubuntu 18.04 LTS

Go Up