top of page

Motorisation d'un pont tournant échelle N : 1/160
Avec un Ustepper S-Lite

@Laurent Jamin & Philippe Aubertin


Voici la première étage de notre projet. La motorisation va être assurée par un moteur pas à pas NEMA17 qui est fixé directement à l'axe du pont. Co moteur est piloté par une carte Ustepper S-Lite qui permet de démultiplier les nombre de pas à 4000 sans vibration entre les pas. Le mouvement du pont s'en trouve nettement amélioré. Le programme renvoi la position du pont au 100è de degré sur 360°

​

Prochaine étape, le boitier de commande qui sera réalisé avec un écran, un joystick pour les commandes et un bouton reset en cas de décalage

​

​

Descriptions :

Carte de commande de moteurs pas-à-pas Nema 17 permettant le suivi de la position absolue de l'arbre du moteur (détection d'éventuelles pertes de pas).

https://www.gotronic.fr/art-module-ustepper-s-lite-29689.htm#complte_desc

L'uStepper S-lite est une carte de commande de moteurs pas-à-pas ultra-compacte compatible Arduino, avec driver intégré et encodeur rotatif. L'encodeur rotatif à 12 bits garantit le suivi de la position absolue de l'arbre du moteur, ce qui permet à l'uStepper S-lite de détecter d'éventuelles pertes de pas.

L'uStepper S-lite se fixe directement à l'arrière de votre moteur pas à pas NEMA 17. Cela permet de développer des applications utilisant un moteur pas à pas, sans qu'il soit nécessaire de réaliser un câblage long et compliqué sur un blindage Arduino / stepper externe.

Le module uStepper S-Lite est basé sur un microcontrôleur ATmega328PB compatible Arduino et sur un driver de moteur pas-à-pas TMC2208. Ce driver permet plusieurs modes de fonctionnement: pas complet, demi-pas, 1/4 pas, 1/8 pas, 1/16 pas, 1/32 pas, 1/64 pas, 1/128 de pas et 1/256 de pas.

​

Le lien vers les informations concernant le Ustepper S-Lite :
https://www.gotronic.fr/art-module-ustepper-s-lite-29689.htm#complte_desc
https://github.com/uStepper/uStepper-S-lite
http://ustepper.com/docs/ustepperslite/html/index.html

Le code du petit programme à mettre dans le Ustepper S-Lite

#include <uStepperSLite.h>

 

#define MAXACCELERATION 70// 1500         //Max acceleration = 1500 Steps/s^2       // PA: il faut un multiple de 32 !?!

#define MAXVELOCITY 25      //100         //Max velocity = 1100 steps/s             // PA: il faut un multiple de 32 !?!

 

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

// ATTENTION: limiter le ratio entre MAXACCELERATION et MAXVELOCITY à 1/10e

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 

uStepperSLite stepper(MAXACCELERATION, MAXVELOCITY);

 

#define ACCEL_ERR 0.7  //Correction de la décélération

 

  char cmd = 0;

  char mystate = 0;

  int val;

  float pos = 0;

  float angle;

 

 

void setup() {

  // put your setup code here, to run once:

 

  //stepper.setup();

/*-------- default initialisation: --------------

    void setup( uint8_t mode = NORMAL,

        float stepsPerRevolution = 3200.0,

        float pTerm = 0.75,

        float iTerm = 3.0,

        float dTerm = 0.0,

        bool setHome = true,

        uint8_t invert = 0,

        uint8_t runCurrent = 50,

        uint8_t holdCurrent = 30);  

------------------------------------------------*/

  stepper.setup(  NORMAL, 64.0, 0.75, 3.0, 0.0, true, 0, 50, 30);

 

  //stepper.setup(PID,3200.0,20,0.5,0.0,true);  

  //Initiate the stepper object to use closed loop PID control

  //The behaviour of the controller can be adjusted by tuning

  //the P, I and D paramenters in this initiation (the three two parameters).

  //check out the documentation:

  //http://ustepper.com/docs/html/index.html

 

  //stepper.runContinous(CCW);

  stepper.softStop(SOFT);

 

  Serial.begin(4800);

  Serial.setTimeout(10);    // 10ms

 

  mystate = 0;

  pos = 0;

  cmd = 0;

}

 

void loop() {

 

  // put your main code here, to run repeatedly:

  //while(!Serial.available());

  //Serial.println("ACK!");

 

  if(Serial.available() > 0)

  {

    if((cmd == '9') || (cmd == '7'))

    {

      val = 0;

      while(Serial.available() > 0)

      {

        val = val * 10;

        val += Serial.parseInt();

 

        if(Serial.read() == '\n')

        {

          Serial.print("\n\rPosition = ");

          Serial.print(val, DEC);

          pos = val;

 

          delay(500);

 

          if(cmd == '9')

          {

              stepper.runContinous(CW);    // turn cloclwise

              mystate = 1;

              //cmd = '1';

              cmd = 0;

          }

          else

          {

              stepper.runContinous(CCW);    // turn counter clockwise

              mystate = 2;

              //cmd = '2';          

              cmd = 0;

          }

        }

      }

    }

 

    else

    {

      cmd = Serial.read();

      if(cmd == 'S')                 //Stop without deceleration and block motor

        {

        Serial.print("\nHARD STOP : **************************************************************************************************");

        stepper.softStop(HARD);

        delay(200);

        }

      else if(cmd == 's')                 //Stop without deceleration and block motor

        {

        Serial.print("\nSOFT STOP: ===================================================================================================");

        stepper.softStop(SOFT);

        delay(200);

        }

        if(cmd == '9')                 //Stop without deceleration and block motor

        {

        Serial.print("\nEntrer Position CW : **************************************************************************************************");

        delay(200);

        }

      else if(cmd == '7')                 //Stop without deceleration and block motor

        {

        Serial.print("\nEnter Position CCW: ===================================================================================================");

        delay(200);

        }

      else if(cmd == '1')                 //Run continous clockwise

        {

        stepper.runContinous(CW);

        mystate = 1;

        }

     

      else if(cmd == '2')                 //Run continous counter clockwise

        {

        stepper.runContinous(CCW);

        mystate = 2;

        }

     

      else if(cmd == '3')                 //Stop without deceleration and block motor

        {

        stepper.hardStop(HARD);

        }

     

      else if(cmd == '4')                 //Stop without deceleration and don't block motor

        {

        stepper.hardStop(SOFT);

        }

     

      else if(cmd == '5')                 //Stop with deceleration and block motor

        {

        stepper.softStop(HARD);

        }

     

      else if(cmd == '6')                 //Stop with deceleration and don't block motor

        {

        stepper.softStop(SOFT);

        Serial.print("-------------------------------- > SOFT STOP -------------------");

        }

   

    }

  }

  if(mystate > 0)

  {

    Serial.print("\nAngle: ");

    angle = stepper.encoder.getAngle();

    Serial.print(angle);

    Serial.print("   pos; ");

    Serial.print(pos);    

 

    if(((angle > pos) && (cmd == '9'))

      || ((angle < pos) && (cmd == '7')))    // 6° for deceleration

    {

      stepper.hardStop(HARD);

    }  

 

    if((angle > (pos - ACCEL_ERR)) && (angle < (pos + ACCEL_ERR)))    // 6° for deceleration

    {

     stepper.softStop(HARD);

 

      Serial.print("\nSTOP");

 

      mystate = 0;

     

      delay(1000);              // Need to wait for deceleration

 

          Serial.print("\nHARD STOP: Angle: ");

          angle = stepper.encoder.getAngle();

          Serial.print(angle);

          Serial.print("   pos; ");

          Serial.print(pos);  

/*

      stepper.softStop(SOFT);

 

      delay(100);

 

        Serial.print("\nSOFT STOP: Angle: ");

        angle = stepper.encoder.getAngle();

        Serial.print(angle);

        Serial.print("   pos; ");

        Serial.print(pos);

*/  

    }

  }

 

  else

  {

    Serial.print("\nAngle: ");

    angle = stepper.encoder.getAngle();

    Serial.print(angle);

    Serial.print("   pos; ");

    Serial.print(pos);

  }

}

 

/*=========================================================================

** '1' or '2' -> 0.6A @ 7.0v

** angle == pos -> HARD stop -> 0.6A

** Disconnect 7V supply, reconnect

** '1' or '2' -> 1.0A @ 7.0V

** Disconnect USB & power, reconnect power first and USB after:

** '1' or '2' -> 0.6A @ 7.0v

**************************************************************************/

bottom of page