Skip to Content

Come controllare un motore passo-passo con Arduino Motor Shield Rev3

Come controllare un motore passo-passo con Arduino Motor Shield Rev3

In questo tutorial imparerai come controllare un motore passo-passo con il Arduino Motor Shield Rev3. Ho incluso uno schema di collegamento e molti codici di esempio.

Per prima cosa diamo un’occhiata a un esempio che utilizza la libreria Arduino Stepper. Questa libreria è ottima per il controllo base dei motori passo-passo ma non offre molte funzionalità extra.

Consiglio vivamente di dare un’occhiata anche ai codici di esempio per la libreria AccelStepper alla fine di questo tutorial. Questa libreria è abbastanza facile da usare e può migliorare notevolmente le prestazioni del tuo hardware.

Materiale necessario

Componenti hardware

arduino-motor-shield-rev3Arduino Motor Shield Rev3 × 1 Amazon
Stepper MotorNEMA 17 stepper motor * × 1 Amazon
Arduino Uno Rev 3Arduino Uno Rev3 × 1 Amazon
Power supply (5-12 V) × 1 Amazon
USB cable type A/B × 1 Amazon

In questo tutorial ho usato un motore passo-passo bipolare a 4 fili. Cerca un motore passo-passo che possa funzionare a 5-12 V e che non superi il limite di corrente di 2 A. Questo  Stepper motor  di Adafruit funziona bene a 12 V e non assorbe troppa corrente (350 mA).

Software

Arduino IDEArduino IDE

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Informazioni sull’Arduino Motor Shield Rev3

Il  Arduino Motor Shield Rev3  è basato sul driver L298 dual full-bridge, prodotto da STMicroelectronics. Con lo shield puoi pilotare motori DC, un motore passo-passo, relè e solenoidi. Dispone di due canali separati, chiamati A e B, che puoi usare per pilotare 2 motori DC o 1 motore passo-passo combinando i canali.

Una cosa molto importante da ricordare è che l’L298 è un driver a tensione costante. Questo significa che l’assorbimento di corrente dipende dal rapporto tra induttanza e resistenza (L/R) del motore collegato.

Questo significa che devi fare attenzione nella scelta del motore passo-passo e dell’alimentazione da usare con questo shield.  Non tutti i motori passo-passo funzioneranno!  La tensione operativa dello shield è tra 5 e 12 volt. Poiché lo shield può fornire un massimo di 2 ampere per canale, devi trovare un motore passo-passo che possa essere usato in questo intervallo di tensione e che non superi la corrente massima. Il motore che ho usato in questo tutorial assorbe circa 1A a 5V.

Se il motore che vuoi pilotare non funziona con questo shield, ti consiglio di usare un driver chopper. Ho scritto un tutorial per il  A4988  e il  DRV8825  driver che funzionano bene con molti motori passo-passo.

Specifiche Arduino Motor Shield Rev3

Tensione operativa 5 V a 12 V
Controller motore L298P, pilota 2 motori DC o 1 motore passo-passo
Corrente massima 2A per canale o 4A max (con alimentazione esterna)
Rilevamento corrente 1.65V/A
Funzioni Rotazione libera, stop e freno
Costo Check price

Per maggiori informazioni puoi consultare i datasheet qui.

Ingressi e Uscite

Funzione Pin Canale A Pin Canale B
Direzione D12 D13
PWM D3 D11
Freno D9 D8
Rilevamento corrente A0 A1

Collegamenti – Collegare un motore passo-passo all’Arduino Motor Shield Rev3

Lo schema elettrico qui sotto mostra come collegare un motore passo-passo e l’alimentazione allo shield Arduino.

Arduino-Motor-Shield-Rev3-with-Stepper-Motor-Wiring-Diagram-Schematic-Pinout-Fritzing
Schema di collegamento per Arduino Motor Shield Rev3 con motore passo-passo.

I collegamenti sono anche riportati nella tabella sottostante.

Collegamenti Arduino Motor Shield Rev3

Arduino Motor Shield Rev3 Collegamento
Vin 5 – 12 V
GND Massa alimentazione
A- Bobina 1 del motore passo-passo
A+ Bobina 1 del motore passo-passo
B- Bobina 2 del motore passo-passo
B+ Bobina 2 del motore passo-passo

Avvertenza

È possibile alimentare direttamente lo shield dall’Arduino, ma non è consigliato. Se il motore passo-passo assorbe troppa corrente, potresti danneggiare sia lo shield che l’Arduino. Perciò consiglio di usare un’alimentazione esterna per i motori.

Per fare questo devi tagliare il jumper Vin Connect sul retro dello shield. Dopo averlo fatto puoi alimentare l’Arduino separatamente con un cavo USB o tramite il connettore DC da 5,5 mm.

Arduino-Motor-Shield-Rev3-Cutting-the-Vin-Connect-jumper
Taglio del jumper Vin Connect.

Come determinare il cablaggio del motore passo-passo?

Se non riesci a trovare il datasheet del tuo motore passo-passo, può essere difficile capire quale filo va dove. Io uso questo trucco per identificare come collegare motori passo-passo bipolari a 4 fili:

L’unica cosa che devi identificare sono le due coppie di fili collegati alle due bobine del motore. I fili di una bobina si collegano a A- e A+, quelli dell’altra a B- e B+, la polarità non importa.

Per trovare i due fili di una bobina, fai così con il motore scollegato:

  1. Prova a far girare l’albero del motore passo-passo a mano e nota quanto è difficile ruotarlo.
  2. Ora prendi una coppia casuale di fili del motore e tocca insieme le estremità scoperte.
  3. Poi, tenendo insieme le estremità, prova di nuovo a far girare l’albero del motore passo-passo.

Se senti molta resistenza, hai trovato una coppia di fili della stessa bobina.  Se l’albero gira ancora liberamente, prova un’altra coppia di fili. Ora collega le due bobine ai pin indicati nello schema di collegamento sopra.

Codice esempio base Arduino per motore passo-passo e Arduino Motor Shield con libreria Stepper.h

Puoi caricare il seguente codice esempio sul tuo Arduino usando il  Arduino IDE.

Questo esempio usa la libreria Stepper.h, che dovrebbe essere preinstallata nell’IDE Arduino. Questo sketch fa ruotare il motore passo-passo di 1 giro in una direzione, si ferma, poi ruota di 1 giro nell’altra direzione.

/* Example sketch to control a stepper motor with 
   Arduino Motor Shield Rev3, Arduino UNO and Stepper.h library. 
   https://www.makerguides.com */

#include "Stepper.h"

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define brakeA 9
#define brakeB 8
#define dirA 12
#define dirB 13

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);

  // Set the motor speed (RPMs):
  myStepper.setSpeed(60);
}


void loop() {
  // Step one revolution in one direction:
  myStepper.step(200);

  delay(2000);

  //Step on revolution in the other direction:
  myStepper.step(-200);

  delay(2000);
}

Spiegazione del codice:

Lo sketch inizia includendo la libreria Arduino Stepper.h. Maggiori informazioni su questa libreria si trovano su  Arduino website.

#include "Stepper.h"

Poi definisco quanti passi il motore compie per ruotare di 1 giro. In questo esempio useremo il motore in modalità full-step. Questo significa che servono 200 passi per ruotare di 360 gradi. Puoi cambiare questo valore se usi un tipo diverso di motore passo-passo o configurazione.

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

Dopo, definiamo i collegamenti del motore (vedi specifiche e schema sopra).

L’istruzione  #define  serve per dare un nome a un valore costante. Il compilatore sostituirà ogni riferimento a questa costante con il valore definito quando il programma viene compilato. Quindi ovunque menzioni  pwmA, il compilatore lo sostituirà con il valore 3 durante la compilazione.

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define brakeA 9
#define brakeB 8
#define dirA 12
#define dirB 13

Poi devi creare una nuova istanza della classe Stepper, che rappresenta un motore passo-passo collegato all’Arduino. Per questo usiamo la funzione  Stepper(steps, pin1, pin2)  dove steps è il numero di passi per rivoluzione e pin1 e pin2 sono i pin usati per pilotare il motore passo-passo. Nel nostro caso sono dirA e dirB.

// Initialize the stepper library on the motor shield:
Stepper myStepper = Stepper(stepsPerRevolution, dirA, dirB);

In questo caso ho chiamato il motore passo-passo ‘myStepper’ ma puoi usare altri nomi, come ‘z_motor’ o ‘liftmotor’ ecc.  Stepper liftmotor = Stepper(stepsPerRevolution, dirA, dirB);.

Nel setup, iniziamo impostando i pin di freno e PWM come output con la funzione  pinMode(). I pin PWM devono essere impostati HIGH e i pin freno LOW con la funzione  digitalWrite().

  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);

Puoi impostare la velocità del motore in rpm con la funzione  setSpeed(rpm). L’ho impostata a 60, quindi dovremmo vedere 1 giro al secondo.

  // Set the motor speed (RPMs):
  myStepper.setSpeed(60);

Loop

Nella sezione loop del codice, chiamiamo semplicemente la funzione  step(steps)  che fa ruotare il motore di un numero specifico di passi a una velocità determinata dalla funzione  setSpeed(rpm)  . Passare un numero negativo a questa funzione inverte la direzione di rotazione del motore.

void loop() {
  // Step one revolution in one direction:
  myStepper.step(200);

  delay(2000);

  //Step on revolution in the other direction:
  myStepper.step(-200);

  delay(2000);
}

Nota che la funzione step(steps) è bloccante, cioè aspetta che il motore finisca di muoversi prima di passare alla riga successiva dello sketch.

Codici di esempio per Arduino Motor Shield e libreria AccelStepper

Nei seguenti tre esempi ti mostrerò come controllare velocità, direzione e numero di passi che il motore passo-passo deve compiere. In questi esempi userò la libreria AccelStepper.

La libreria AccelStepper scritta da Mike McCauley è una libreria fantastica per il tuo progetto. Uno dei vantaggi è che supporta accelerazione e decelerazione, ma ha anche molte altre funzioni utili.

Puoi scaricare l’ultima versione di questa libreria qui:

Puoi installare la libreria andando su Sketch > Include Library > Add .ZIP Library… nell’IDE Arduino.

Un’altra opzione è andare su Tools > Manage Libraries… o premere Ctrl + Shift + I su Windows. Si aprirà il Library Manager che aggiornerà la lista delle librerie installate.

Installing an Arduino library step 1 open Library Manager
Library Manager

Puoi cercare ‘accelstepper‘ e trovare la libreria di Mike McCauley. Seleziona l’ultima versione e clicca su Install.

Installing an Arduino library step 2 AccelStepper
Installazione della libreria AccelStepper

1. Codice esempio per rotazione continua

Il seguente sketch può essere usato per far girare uno o più motori passo-passo continuamente a velocità costante. (Non si usa accelerazione o decelerazione).

Puoi copiare il codice cliccando sul pulsante in alto a destra nel campo del codice.

/* Example sketch to control a stepper motor with
   Arduino Motor Shield Rev3, Arduino UNO and AccelStepper.h library: 
   continuous rotation. More info: https://www.makerguides.com */

// Include the AccelStepper library:
#include "AccelStepper.h"

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define brakeA 9
#define brakeB 8
#define dirA 12
#define dirB 13

// Define the AccelStepper interface type:
#define MotorInterfaceType 2

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);

  // Set the maximum steps per second:
  stepper.setMaxSpeed(600);
}

void loop() {
  // Set the speed of the motor in steps per second:
  stepper.setSpeed(500);
  // Step the motor with constant speed as set by setSpeed():
  stepper.runSpeed();
}

Come funziona il codice:

Ancora una volta il primo passo è includere la libreria con  #include <AccelStepper.h>.

#include "AccelStepper.h"

Dopo aver specificato i collegamenti come prima, dobbiamo definire il tipo di interfaccia motore per la libreria AccelStepper. In questo caso piloteremo il motore passo-passo in modalità full step, con due fili, quindi impostiamo la modalità a 2. Puoi trovare gli altri tipi di interfaccia qui (link).

// Define the AccelStepper interface type:
#define MotorInterfaceType 2

Poi devi creare una nuova istanza della classe AccelStepper con il tipo di interfaccia motore e i collegamenti appropriati.

In questo caso ho chiamato il motore passo-passo ‘stepper’ ma puoi usare altri nomi, come ‘z_motor’ o ‘liftmotor’ ecc.  AccelStepper liftmotor = AccelStepper(MotorInterfaceType, dirA, dirB);.

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, dirA, dirB);

La sezione setup del codice è quasi uguale all’esempio precedente, ma ho anche definito la velocità massima in passi/secondo. Velocità superiori a 1000 passi al secondo possono essere inaffidabili, quindi l’ho impostata a 600 (dovrai sperimentare per vedere qual è la velocità massima per il tuo setup). Nota che specifico il nome del motore passo-passo (‘stepper’) per cui voglio definire la velocità massima.

  // Set the maximum steps per second:
  stepper.setMaxSpeed(600);

Loop

Nella sezione loop, prima impostiamo la velocità a cui vogliamo far girare il motore con la funzione  setSpeed(). (puoi anche metterla nella sezione setup del codice).

La funzione  stepper.runSpeed()  controlla il motore e quando è il momento di fare un passo esegue 1 passo. Questo dipende dalla velocità impostata e dal tempo dall’ultimo passo. Se vuoi cambiare la direzione del motore, puoi impostare una velocità negativa:  stepper.setSpeed(-400);  fa girare il motore nell’altra direzione.

void loop() {
  // Set the speed of the motor in steps per second:
  stepper.setSpeed(500);
  // Step the motor with constant speed as set by setSpeed():
  stepper.runSpeed();
}

2. Sketch per controllare il numero di passi o rivoluzioni

Con il seguente sketch puoi controllare velocità, direzione e numero di passi/rivoluzioni. Non si usa accelerazione o decelerazione.

In questo caso, il motore passo-passo compie 1 rivoluzione in senso orario a 400 passi/sec, poi 1 rivoluzione in senso antiorario a 200 passi/sec, e infine 3 rivoluzioni in senso orario a 600 passi/sec.

/* Example sketch to control a stepper motor with 
  Arduino Motor Shield Rev3, Arduino UNO and 
  AccelStepper.h library: number of steps or revolutions. 
  More info: https://www.makerguides.com */

#include "AccelStepper.h"

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define brakeA 9
#define brakeB 8
#define dirA 12
#define dirB 13

// Define the AccelStepper interface type:
#define MotorInterfaceType 2

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);

  // Set the maximum steps per second:
  stepper.setMaxSpeed(600);
}

void loop() {
  // Set the current position to 0:
  stepper.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 200 steps (1 revolution):
  while (stepper.currentPosition() != 200) {
    stepper.setSpeed(400);
    stepper.runSpeed();
  }

  delay(1000);

  // Reset the position to 0:
  stepper.setCurrentPosition(0);

  // Run the motor backwards at 200 steps/second until the motor reaches -200 steps (1 revolution):
  while (stepper.currentPosition() != -200) {
    stepper.setSpeed(-200);
    stepper.runSpeed();
  }

  delay(1000);

  // Reset the position to 0:
  stepper.setCurrentPosition(0);

  // Run the motor forward at 600 steps/second until the motor reaches 600 steps (3 revolutions):
  while (stepper.currentPosition() != 600) {
    stepper.setSpeed(600);
    stepper.runSpeed();
  }

  delay(3000);
}

Spiegazione del codice

La prima parte del codice fino alla sezione loop() è esattamente la stessa dell’esempio precedente.

Nel loop uso un  while loop  in combinazione con la funzione  currentPosition()  . Prima imposto la posizione corrente del motore passo-passo a zero con  stepper.setCurrentPosition(0).

  // Set the current position to 0:
  stepper.setCurrentPosition(0);

Poi usiamo un ciclo while. Un ciclo while ripete continuamente, e all’infinito, finché l’espressione dentro le parentesi () diventa falsa. Quindi in questo caso controllo se la posizione corrente del motore passo-passo è diversa da 200 passi (!= significa: è diverso da). Finché è così, facciamo girare il motore a velocità costante impostata da  setSpeed().

  // Run the motor forward at 400 steps/second until the motor reaches 200 steps (1 revolution):
  while (stepper.currentPosition() != 200) {
    stepper.setSpeed(400);
    stepper.runSpeed();
  }

Nel resto del loop facciamo esattamente lo stesso, solo con velocità e posizione target diverse.

3. Codice esempio con accelerazione e decelerazione

In questo esempio vedremo una delle principali caratteristiche della libreria AccelStepper: aggiungere accelerazione e decelerazione.

Con il seguente sketch puoi aggiungere accelerazione e decelerazione ai movimenti del motore passo-passo, senza codici complicati. La prima parte di questo sketch è uguale all’esempio 1, ma setup e loop sono diversi.

Il motore farà cinque rivoluzioni avanti e indietro con una velocità di 200 passi al secondo e un’accelerazione di 50 passi/secondo 2 .

/* Example sketch to control a stepper motor with 
  Arduino Motor Shield Rev3, Arduino UNO and 
  AccelStepper.h library: acceleration and deceleration 
  More info: https://www.makerguides.com */

#include <AccelStepper.h>

// Define number of steps per revolution:
const int stepsPerRevolution = 200;

// Give the motor control pins names:
#define pwmA 3
#define pwmB 11
#define brakeA 9
#define brakeB 8
#define dirA 12
#define dirB 13

// Define the AccelStepper interface type:
#define MotorInterfaceType 2

// Create a new instance of the AccelStepper class:
AccelStepper stepper = AccelStepper(MotorInterfaceType, dirA, dirB);

void setup() {
  // Set the PWM and brake pins so that the direction pins can be used to control the motor:
  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);

  // Set the maximum steps per second:
  stepper.setMaxSpeed(200);
  // Set the maximum acceleration in steps per second^2:
  stepper.setAcceleration(50);
}

void loop() {
  // Set target position:
  stepper.moveTo(1000);
  // Run to position with set speed and acceleration:
  stepper.runToPosition();

  delay(1000);

  // Move back to original position:
  stepper.moveTo(0);
  // Run to position with set speed and acceleration:
  stepper.runToPosition();

  delay(1000);
}

Come funziona il codice

Nel setup, oltre alla velocità massima, dobbiamo definire accelerazione e decelerazione. Per questo usiamo la funzione  setAcceleration().

  // Set the maximum steps per second:
  stepper.setMaxSpeed(200);
  // Set the maximum acceleration in steps per second^2:
  stepper.setAcceleration(50);

Nella sezione loop del codice, ho usato un modo diverso per far ruotare il motore di un numero predefinito di passi. Prima imposto la posizione target con la funzione  moveTo(). Poi usiamo semplicemente la funzione  runToPosition()  per far muovere il motore verso la posizione target con la velocità e accelerazione impostate. Il motore decelera prima di raggiungere la posizione target.

  // Set target position:
  stepper.moveTo(1000);
  // Run to position with set speed and acceleration:
  stepper.runToPosition();

Infine, impostiamo la nuova posizione target a zero, così torniamo all’origine.

Conclusione

In questo articolo ti ho mostrato come controllare un motore passo-passo con l’Arduino Motor Shield Rev3. Abbiamo visto 4 esempi, usando sia la libreria Stepper che AccelStepper.

Spero che tu l’abbia trovato utile e informativo. Se vuoi saperne di più su altri driver (microstepping) come il  A4988, dai un’occhiata agli articoli qui sotto.

Altri tutorial sui motori passo-passo:

Se hai altre domande, lascia pure un commento qui sotto.