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
**************************************************************************/