Controllo motore Nema17

 

Contenuti:

1

Come controllare il motore passo-passo con il driver DRV8825 e Arduino

2

 

3  
4  

 

Vorrei pilotare con arduino un motore Nema17. Un potenziometro per regolare la velocità, un interruttore a leva a tre posizioni on off on per la direzione sinistra e destra e spento al centro, Inizialmente il motore è fermo, leva al centro dell'interruttore, leva a sinistra rotazione antioraria, leva a destra rotazione oraria, con il potenziometro regolo la velocità, se porto la leva al centro sull'interruttore il motore si ferma.

 

Materiale necessario:

  • Arduino Nano
  • Batteria 9V per alimentare Arduino
  • Motore passo-passo Nema 17 (1,7 A, 0,59 Nm)
  • Drive DRV8825
  • Condensatori: un 100µF elettrolitico, un ceramico da 100nF (0.1µF)
  • Potenziometro (per regolare la velocità)
  • Un interruttore a leva a tre posizioni on off on
  • Un alimentatore a 24V per alimentare il motore

Schema di collegamento:

 

DRV8825

  • ENABLE non utilizzato, rimane libero
  • MS1 (Microstep mode 1): Pin 13
  • MS2 (Microstep mode 2): Pin 12
  • MS3 (Microstep mode 3): Pin 11
  • SLP e RESET sono uniti insieme per mantenerli in stato HIGH
  • STP al Pin 2 per gli step
  • DIR al Pin 3 per la direzione
  • VMOT al positiivo dell'alimentatore a 24 V
  • GND al negativo dell'alimentatore a 24 V
  • 2A, 1A, 1b, 2B ai poli del motore Stepper
  • FAULT non utilizzato, rimane libero
  • GND al ground do Arduino per alimentazione logica 5V

Interruttore On Off On

  • Leva sinistra  Pin A1 senso di rotazione antiorario
  • Leva destra Pin 4 senso di rotazione orario
  • Leva centrale GND

Interruttore rotativo

  • Collegato ai pin 5-10 di Arduino per gestire i passi.

Potenziometro

  • Connettore centrale al pin A0 di Arduino per la regolazione della velocità.
  • Gli altri due uno a +5V el'altrro al GND di Arduino

Collegamenti cavi motore al driver:

  • Avvolgimento 1: Nero – Verde

  • Avvolgimento 2: Rosso – Blu

E il driver DRV8825 (guardandolo dal lato del trimmer, quindi con il trimmer in alto e i pin motore a destra) ha questi pin in ordine dall'alto verso il basso:

  • B2

  • B1

  • A1

  • A2

Il DRV8825 ha due uscite per i due avvolgimenti del motore:

  • A1 e A2 vanno a un avvolgimento

  • B1 e B2 vanno all’altro

Puoi collegare così:

  • Nero → A1

  • Verde → A2

  • Rosso → B1

  • Blu → B2.+

Microstepping:

 

M1

M2

M3

Microstepping

LOW LOW LOW Full Step
LOW LOW HIGH 1/2 Step
LOW HIGH LOW 1/4 Step
LOW HIGH HIGH 1/8 Step
HIGH LOW LOW 1/16 Step
HIGH LOW HIGH 1/32 Step

 

Condensatori

Stabilizzano la tensione: i motori stepper assorbono corrente in modo impulsivo, e un condensatore aiuta a ridurre i cali di tensione.
Riducono i disturbi elettrici: evita picchi di tensione che potrebbero danneggiare il DRV8825 o altri componenti.
Proteggono da accensioni/spegnimenti improvvisi: aiuta a gestire la corrente di spunto quando il motore parte.

  • 100 µF - 470 µF, 35V o superiore (elettrolitico)
  • 100nF (0,1 µF) ceramico → filtra meglio i disturbi ad alta frequenza

Alimentazione Arduino:

  • VIN: 9V (positivo della batteria)
  • GND: 9V (negativo della batteria)

 

 

 

 

 

Utilizzando un approccio semplice con digitalWrite per il controllo del motore, non è facile gestire la decelerazione graduale, e potremmo incorrere in perdita di passi quando fermiamo il motore improvvisamente. Per risolvere questo problema e ottenere una fermata più fluida, possiamo utilizzare una libreria per il controllo del motore passo-passo che permette la gestione della velocità, dell'accelerazione e della decelerazione, come AccelStepper

 

Utilizzare la libreria AccelStepper

La libreria AccelStepper è perfetta per questo scopo, poiché gestisce in modo ottimale la velocità e la decelerazione del motore, permettendo di fermarlo senza perdere passi.

Modifica il codice con AccelStepper

  1. Installazione della libreria : Prima di tutto, assicurati di avere la libreria AccelStepper installata. Puoi farlo dal Library Manager di Arduino IDE:

    • Vai su SketchIncludi libreriaGestisci librerie...
    • Cerca AccelStepper e installala.

codeContN17.txt:

#include <AccelStepper.h>

// Pin di controllo
#define STEP_PIN 2           // Pin 2 per il controllo del passo
#define DIR_PIN 3            // Pin 3 per la direzione
#define MS1_PIN 13           // Pin 13 per MS1 (Microstep mode 1)
#define MS2_PIN 12           // Pin 12 per MS2 (Microstep mode 2)
#define MS3_PIN 11           // Pin 11 per MS3 (Microstep mode 3)

#define DIR_SWITCH_LEFT 4    // Pin 4 per la leva sinistra (antiorario)
#define DIR_SWITCH_RIGHT A1  // Pin A1 per la leva destra (orario)

#define ROTARY_PIN_1 5       // Pin 5 per il primo contatto rotativo
#define ROTARY_PIN_2 6       // Pin 6 per il secondo contatto rotativo
#define ROTARY_PIN_3 7       // Pin 7 per il terzo contatto rotativo
#define ROTARY_PIN_4 8       // Pin 8 per il quarto contatto rotativo
#define ROTARY_PIN_5 9       // Pin 9 per il quinto contatto rotativo
#define ROTARY_PIN_6 10      // Pin 10 per il sesto contatto rotativo

#define POT_PIN A0           // Pin A0 per il potenziometro (regolazione velocità)

// Impostazioni motore
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);

// Variabili di configurazione
int microsteps = 16;           // Passi iniziali (1/16)
int motorSpeed = 500;          // Velocità iniziale (500 passi al secondo)
int motorAcceleration = 500;   // Accelerazione iniziale (500 passi per secondo^2)
int potentiometerValue = 0;    // Valore letto dal potenziometro
int rotaryValue = 0;           // Valore dell'interruttore rotativo

void setup() {
  // Imposta i pin
  pinMode(DIR_SWITCH_LEFT, INPUT_PULLUP);   // Leva sinistra (antiorario)
  pinMode(DIR_SWITCH_RIGHT, INPUT_PULLUP);  // Leva destra (orario)

  pinMode(MS1_PIN, OUTPUT); // Impostazione microstep mode
  pinMode(MS2_PIN, OUTPUT); // Impostazione microstep mode
  pinMode(MS3_PIN, OUTPUT); // Impostazione microstep mode

  // Disabilita ENABLE e FAULT
  // Non sono utilizzati, quindi non li inizializziamo

  // Configurazione microstep
  setMicrosteps();

  // Imposta la velocità e accelerazione iniziali
  stepper.setMaxSpeed(motorSpeed);
  stepper.setAcceleration(motorAcceleration);

  // Imposta il pin per leggere il valore del potenziometro
  analogReference(DEFAULT);
}

void loop() {
  // Leggi il valore del potenziometro per regolare la velocità
  potentiometerValue = analogRead(POT_PIN);
  motorSpeed = map(potentiometerValue, 0, 1023, 1, 1000); // Regola la velocità da 1 a 1000 passi al secondo
  stepper.setMaxSpeed(motorSpeed);

  // Leggi il valore dell'interruttore rotativo
  rotaryValue = readRotarySwitch();

  // Imposta il microstep in base al valore dell'interruttore rotativo
  setMicrosteps();

  // Controlla la direzione tramite gli interruttori
  if (digitalRead(DIR_SWITCH_LEFT) == LOW) {
    stepper.setSpeed(-motorSpeed);  // Rotazione antioraria
  } 
  else if (digitalRead(DIR_SWITCH_RIGHT) == LOW) {
    stepper.setSpeed(motorSpeed);   // Rotazione oraria
  } 
  else {
    stepper.setSpeed(0);            // Fermo
  }

  // Esegui il passo
  stepper.runSpeed();
}

// Funzione per leggere il valore dell'interruttore rotativo
int readRotarySwitch() {
  int value = 0;

  if (digitalRead(ROTARY_PIN_1) == LOW) value |= 1;
  if (digitalRead(ROTARY_PIN_2) == LOW) value |= 2;
  if (digitalRead(ROTARY_PIN_3) == LOW) value |= 4;
  if (digitalRead(ROTARY_PIN_4) == LOW) value |= 8;
  if (digitalRead(ROTARY_PIN_5) == LOW) value |= 16;
  if (digitalRead(ROTARY_PIN_6) == LOW) value |= 32;

  return value;
}

// Funzione per impostare il microstep in base all'interruttore rotativo
void setMicrosteps() {
  switch (rotaryValue) {
    case 1:  // 1 passo
      digitalWrite(MS1_PIN, LOW);
      digitalWrite(MS2_PIN, LOW);
      digitalWrite(MS3_PIN, LOW);
      stepper.setMaxSpeed(motorSpeed);
      break;
    case 2:  // 1/2 passo
      digitalWrite(MS1_PIN, HIGH);
      digitalWrite(MS2_PIN, LOW);
      digitalWrite(MS3_PIN, LOW);
      break;
    case 3:  // 1/4 passo
      digitalWrite(MS1_PIN, LOW);
      digitalWrite(MS2_PIN, HIGH);
      digitalWrite(MS3_PIN, LOW);
      break;
    case 4:  // 1/8 passo
      digitalWrite(MS1_PIN, HIGH);
      digitalWrite(MS2_PIN, HIGH);
      digitalWrite(MS3_PIN, LOW);
      break;
    case 5:  // 1/16 passo
      digitalWrite(MS1_PIN, LOW);
      digitalWrite(MS2_PIN, LOW);
      digitalWrite(MS3_PIN, HIGH);
      break;
    case 6:  // 1/32 passo
      digitalWrite(MS1_PIN, HIGH);
      digitalWrite(MS2_PIN, LOW);
      digitalWrite(MS3_PIN, HIGH);
      break;
    default:
      // Caso di default (1/16 passo)
      digitalWrite(MS1_PIN, LOW);
      digitalWrite(MS2_PIN, LOW);
      digitalWrite(MS3_PIN, HIGH);
      break;
  }
}

 

Funzionamento:

  • Interruttori direzionali: Con il pin centrale dell'interruttore ON-OFF-ON collegato a GND, il pin di sinistra a Pin 4 (antiorario) e il pin di destra a Pin A1 (orario), entrambi sono impostati come INPUT_PULLUP. Quando la leva è in posizione sinistra, il motore gira in senso antiorario. Quando la leva è in posizione destra, il motore gira in senso orario. Quando è al centro, il motore è fermo.
  • Potenziometro: Regola la velocità del motore, con un range di velocità da 1 a 1000 passi al secondo.
  • Interruttore rotativo: Determina la modalità di microstepping. Ogni posizione dell'interruttore corrisponde a un diverso valore di microstepping (1, 1/2, 1/4, 1/8, 1/16, 1/32).
  • AccelStepper: Gestisce il movimento del motore stepper, utilizzando velocità e accelerazione dinamiche in base al valore del potenziometro e al valore del rotativo.

Controllo dell'inversione di direzione e della velocità tramite la libreria AccelStepper

  • Utilizzo di setMaxSpeed() e setAcceleration(): Queste funzioni ti permettono di definire la velocità massima e l'accelerazione del motore. Questi parametri sono fondamentali per evitare che il motore cambi direzione troppo bruscamente e per garantire transizioni più fluide.

  • Controllo delle direzioni: Quando la leva cambia posizione, il motore inizia a decelerare prima di invertire la direzione e accelera gradualmente verso la nuova direzione.

  • setMaxSpeed(MAX_SPEED): Limita la velocità massima del motore a 1000 passi al secondo, che puoi regolare tramite la costante MAX_SPEED.
  • setAcceleration(ACCELERATION): Imposta un'accelerazione di 500 passi al secondo quadrato. Questo consente di invertire la direzione senza che il motore acceleri o deceleri troppo bruscamente.
  • stepper.setSpeed(): La velocità viene settata in base alla posizione dell'interruttore. Se l'interruttore è a sinistra, la velocità è negativa (direzione antioraria), se è a destra, la velocità è positiva (direzione oraria).
  • stepper.runSpeed(): Questa funzione gestisce il movimento effettivo del motore, mantenendo la velocità attuale impostata.

Cosa fa AccelStepper in questo codice:

  • Quando cambi la direzione, il motore decelererà gradualmente fino a fermarsi e poi accelererà nella nuova direzione, evitando transizioni violente.
  • Se la leva è al centro, il motore si fermerà dolcemente senza vibrazioni.

In questo modo, non solo puoi passare dalla direzione oraria a quella antioraria senza danneggiare il motore, ma anche evitare il problema delle vibrazioni o della perdita di passi.

 

Come regolare il valore dell'accelerazione per evitare la perdita di passi

 

Il valore di accelerazione necessario per evitare la perdita di passi dipende da vari fattori, tra cui:

  1. La velocità massima che desideri raggiungere.
  2. Le caratteristiche del motore stepper, come la coppia disponibile.
  3. L'alimentazione e la capacità del driver, che determinano quanta potenza può essere fornita al motore.
  4. Il carico collegato al motore, se presente (ad esempio, un meccanismo che il motore deve muovere).
  5. La resistenza meccanica del sistema in cui è montato il motore (ad esempio, attrito nei cuscinetti, resistenza del meccanismo, ecc.).

Cosa può succedere con un'accelerazione troppo alta:

 

Se l'accelerazione è troppo alta, il motore potrebbe non riuscire a mantenere il passo in tempo con il cambiamento di velocità, portando alla perdita di passi. La perdita di passi si verifica quando il motore non riesce a compiere il numero di passi corretti per ogni ciclo, a causa di una velocità o accelerazione troppo elevata rispetto alla sua capacità di erogare coppia.

Cosa succede con un'accelerazione troppo bassa:

Se l'accelerazione è troppo bassa, il motore potrebbe sembrare meno reattivo e impiegare più tempo per raggiungere la velocità desiderata, ma è meno probabile che perda passi, perché sta aumentando la velocità in modo più graduale.

 

Calcolare l'accelerazione corretta:

 

Per trovare il valore di accelerazione che non provoca la perdita di passi, il modo migliore è eseguire dei test pratici. Tuttavia, ci sono alcune linee guida generali che possono aiutarti a iniziare:

  1. Velocità massima: Inizia impostando una velocità massima che sia realistico per il tuo motore. Se il motore è un NEMA 17, di solito la velocità massima è di circa 1000 passi al secondo, ma dipende dal modello specifico e dalla coppia disponibile.
  2. Test di accelerazione: Imposta un'accelerazione relativamente bassa, come 100 o 200 passi per secondo², e aumenta gradualmente l'accelerazione mentre osservi il comportamento del motore. Se il motore non perde passi o non fa rumori strani, puoi provare a incrementare l'accelerazione ulteriormente.
  3. Test di inversione della direzione: Durante il cambio improvviso di direzione (ad esempio, da orario a antiorario), fai attenzione che il motore non salti o faccia rumori insoliti. Se accade, prova a diminuire l'accelerazione.

Raccomandazioni:

  1. Imposta un'accelerazione moderata (ad esempio 200-500 passi al secondo²) e verifica se il motore riesce a invertire la direzione senza perdere passi.
  2. Se il motore perde passi, riduci l'accelerazione fino a trovare un valore che consenta al motore di funzionare correttamente senza vibrazioni e senza perdita di passi.
  3. Non forzare accelerazioni troppo alte se il motore non è in grado di gestirle, soprattutto a velocità elevate. Un'accelerazione di 1000 passi al secondo² è generalmente troppo alta per un NEMA 17 a velocità elevate senza un buon driver e alimentazione.

Una possibile procedura di test:

  1. Imposta una velocità massima (ad esempio, 1000 passi al secondo).
  2. Inizia con un'accelerazione di 100 passi al secondo² e osserva il comportamento del motore. Aumenta gradualmente l'accelerazione, monitorando sempre se il motore perde passi o vibra eccessivamente.
  3. Riduci l'accelerazione se il motore non riesce a tenere il passo.

Conclusione:

 

L'accelerazione ottimale dipende molto dal sistema in cui stai lavorando, ma una buona regola empirica è di iniziare con valori più bassi (100-500 passi al secondo²) e aumentare gradualmente fino a trovare il punto in cui il motore non perde passi e riesce a cambiare direzione senza problemi.

 

Come faccio a capire se il motore sta perdendo passi

ci sono diversi segni che possono indicare che il motore stepper sta perdendo passi. I motori stepper perdono passi quando non riescono a completare il numero di passi richiesti dal controller, generalmente a causa di una velocità o accelerazione troppo elevata, mancanza di coppia o resistenza meccanica troppo alta. Ecco alcuni segni che possono aiutarti a capire se il motore sta perdendo passi:

1. Rumori anomali

  • Rumore di "click" o "scatti" irregolari: Quando il motore perde passi, può emettere rumori di clic o scatti non regolari, che indicano che non sta girando in modo uniforme. Questi rumori sono solitamente causati da un passo che viene saltato o dal fatto che il motore sta cercando di avanzare ma non riesce a farlo a causa della resistenza.
  • Vibrazioni eccessive: Un motore che perde passi può anche vibrare più del normale, poiché sta cercando di muoversi rapidamente ma non è in grado di mantenere il passo. Se senti vibrazioni insolite o esagerate, potrebbe essere un segno di perdita di passi.

2. Comportamento del motore (incertezza nel movimento)

  • Movimento irregolare: Il motore potrebbe non muoversi in modo fluido e regolare. Potresti notare che il movimento è "scattoso" o che il motore non risponde in modo preciso ai comandi.
  • Difficoltà nell'inversione di direzione: Se stai invertendo la direzione del motore (ad esempio, da orario a antiorario), il motore potrebbe non essere in grado di farlo correttamente se sta perdendo passi, risultando in movimenti lenti o imprecisi.

3. Rallentamento o arresto del movimento

  • Il motore si ferma o rallenta improvvisamente: Se il motore rallenta o si ferma improvvisamente durante il movimento (senza essere comandato a fermarsi), potrebbe essere dovuto alla perdita di passi, in quanto non è in grado di completare il movimento richiesto a causa della velocità e accelerazione troppo elevate.

4. Comportamento del sistema meccanico

  • Errore nei movimenti finali: Se il motore è collegato a un meccanismo (ad esempio, un estrusore o un sistema di trasmissione) e il movimento finale del meccanismo non corrisponde al comando, è un segno che il motore sta perdendo passi. Ad esempio, se un carrello non arriva alla posizione desiderata, potrebbe essere dovuto alla perdita di passi.

5. Misurazioni o monitoraggio del movimento

  • Monitoraggio del numero di passi: Se hai la possibilità di monitorare il numero di passi eseguiti dal motore tramite il tuo codice (ad esempio, tenendo traccia di un contatore di passi), potresti notare che il contatore non corrisponde alla posizione reale del motore.
  • Monitoraggio della coppia e della corrente: Se il driver supporta la lettura della corrente o della coppia, puoi monitorare questi valori per vedere se il motore sta cercando di erogare più coppia di quella che riesce a gestire, il che potrebbe causare la perdita di passi.

Come verificare se il motore sta perdendo passi:

  • Ispezione visiva: Puoi verificare visivamente se il motore sta perdendo passi, ad esempio, controllando il movimento di un meccanismo collegato al motore. Se vedi che il movimento è disallineato o se c'è un errore nel posizionamento, è probabile che il motore stia perdendo passi.
  • Test di precisione: Fai eseguire al motore un movimento preciso (ad esempio, una rotazione di 360°) e confronta la posizione finale con la posizione teorica. Se ci sono discrepanze, è segno che il motore sta perdendo passi.

Cosa fare se il motore perde passi:

  1. Riduci la velocità e l'accelerazione: Abbassando la velocità e l'accelerazione del motore, gli consenti di muoversi più lentamente, riducendo il rischio di perdita di passi.
  2. Aumenta l'alimentazione del motore: Se possibile, prova ad aumentare la corrente o la tensione per garantire che il motore abbia abbastanza energia per mantenere il passo.
  3. Migliora il raffreddamento: Se il driver o il motore si surriscaldano, potrebbero non funzionare correttamente. Assicurati che siano sufficientemente raffreddati.
  4. Controlla il carico e la resistenza meccanica: Verifica che il sistema non abbia troppa resistenza meccanica o attrito che possa impedire al motore di muoversi correttamente.
  5. Utilizza una libreria che gestisce l'accelerazione e la decelerazione: Le librerie come AccelStepper possono gestire l'accelerazione e la decelerazione in modo che il motore non subisca cambiamenti bruschi e quindi eviti di perdere passi.

In sintesi:

I segni che il motore sta perdendo passi includono rumori irregolari, vibrazioni, movimento irregolare e arresto improvviso del movimento. Se noti questi segni, è consigliabile ridurre la velocità e l'accelerazione o migliorare la potenza fornita al motore per evitare che perda passi e per garantire un movimento più preciso e stabile.