mercoledì 12 novembre 2025

Stepper NEMA17 e driver A4988

Mi sono comprato una scheda per pilotare un NEMA 17 dalla Cina ed e' arrivata senza istruzioni. Per fortuna dopo un po' di ricerca ho trovato lo schema di connessione che peraltro abbastanza semplice

I motori stepper si dividono in closed loop e open loop: nel primo caso nel motore c'e' un encoder ottico che verifica il corretto posizionamento del motore anche in presenza di carichi che limitino il motore non perdendo passi 

Il modulo A4988 non arriva montato ...deve essere inserito facendo coincidere il pin VIN (ultimo in basso fila di sinistra del connettore rosso centrale) 

 

 

https://docs.google.com/document/d/e/2PACX-1vTyiIMFXQ1cY5TMhOh_0EjdznmC3Nw6CplW7Xx8F61ogOaUpHVyuaXsqrWhIiuE8SjpbON_VzB-rk3R/pub

Il Nema17 ha 200 steps per 360 gradi (quindi ogni step vale 1.8 gradi).  Agendo sui microswitch si puo' impostare 1/2,1/4,1/8,1/16 dello step di base ...si ha quindi una rotazione minima di circa 0.11 gradi (su questa scheda non sembra che si possa impostare tale valore da software, su altre schede MS1,MS2 ed MS3 possono essere collegati ai pin digitali)

 


 Per fare una rotazione di 90 gradi usando lo step base si devono inviare 50 impulsi

 

Nello sketch che segue viene eseguita anche una accelerazione e decelerazione in partenza ed arrivo (valore di ramp), usando il delayMin viene gestita la velocita' (in pratica l'intervallo tra gli impulsi) 

/*
 * Stepper motor control with A4988 driver
 * Includes acceleration/deceleration ramp
 * Speed controlled by potentiometer on A0
 */

#define enablePin  6  // Enable (LOW = ON)
#define dirPin     4  // Direction
#define stepPin    5  // Step
#define potPin     A0 // Potentiometer input

const int stepsPerRevolution = 200; // 1.8° per step motor

// Motion control variables
int delayMin;       // Minimum delay between steps (fastest speed)
int delayMax = 2000; // Maximum delay (slowest speed)
int rampSteps = 50;  // Number of steps to accelerate/decelerate

void setup() {
  pinMode(enablePin, OUTPUT);
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(potPin, INPUT);

  digitalWrite(enablePin, LOW); // Enable driver
  digitalWrite(dirPin, HIGH);   // Initial direction
}

void loop() {
  // Read potentiometer to set minimum delay (speed)
  int potValue = analogRead(potPin);
  delayMin = map(potValue, 0, 1023, 2000, 200); // slower -> faster

  // Rotate forward
  digitalWrite(dirPin, HIGH);
  moveStepper(stepsPerRevolution, delayMin);

  delay(500); // pause

  // Rotate backward
  digitalWrite(dirPin, LOW);
  moveStepper(stepsPerRevolution, delayMin);

  delay(500);
}

//--------------------------------------------
// Function to move stepper with accel/decel
//--------------------------------------------
void moveStepper(int steps, int delayMin) {
  for (int i = 0; i < steps; i++) {
    int currentDelay;

    // Acceleration phase
    if (i < rampSteps)
      currentDelay = map(i, 0, rampSteps, delayMax, delayMin);
    // Deceleration phase
    else if (i > steps - rampSteps)
      currentDelay = map(i, steps - rampSteps, steps, delayMin, delayMax);
    // Constant speed
    else
      currentDelay = delayMin;

    // Step pulse
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(currentDelay);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(currentDelay);
  }
}

 

Nessun commento:

Posta un commento

Algoritmo Reed Solomon

 Sto progettando una trasmissione radio di immagini ed uno dei vincoli e' che non e' garantita la perfetta qualita' della trasmi...