Automazione: Programmare e pilotare i Motori Passo_Passo e i Servomotori (Seconda parte)

logo

A cura di Davide Munaretto

In questa seconda parte, vediamo come sia possibile introdurre delle rampe fisse di accelerazione o decelerazione che diventano particolarmente utili nel caso in cui si debbano muovere carichi inerziali particolarmente gravosi.

Anche in questo caso vedremo come i motori Passo_Passo risultino meno performanti dei Servomotori soprattutto nelle rampe dove è possibile che si manifestino delle perdite di passo principalmente dovute alle risonanze.

(Vedi : http://www.dmorologeria.com/automazione-i-motori-passo_passo/).

Partiamo con il Codice dedicato ai Motori Passo_Passo, che nel suo insieme risulta molto semplice e simile al precedente, questo sempre grazie all’utilizzo della specifica libreria “Accelstepper”.

/* Codice che permette di controllare un Motore Passo_Passo o un ServoMotore
 * facendolo ruotare in senso orario/antiorario e con velocità diverse e
 * con rampe fisse di accelerazione e decelerazione.
 * Motore Passo_Passo da 200 step/giro, 1.8 gradi/step
 */

// Include la libreria AccelStepper:
#include <AccelStepper.h>

// Definizione dei pin di connessione del motore e delle interfacce motore nel caso vi fossero più di un motore:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1

// Crea l’istanza AccelStepper:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
// Setta la massima velocità e Accelerazione:
stepper.setMaxSpeed(1500);
stepper.setAcceleration(90);
}

void loop() {
// Setta la posizione di fine corsa, facciamo compiere 80 giri:
stepper.moveTo(16000);
// Muove fino alla posizione di fine corsa attivando una accelerazione/decelerazione:
stepper.runToPosition();

delay(2000);

// Torna al punto di partenza:
stepper.moveTo(0);
stepper.runToPosition();

delay(1000);
}

Nel caso in cui si volesse utilizzare un Servomotore, è possibile variare i parametri sia di velocità che di rampa con una resa nettamente superiore in termini di rumorosità, vibrazioni e la totale assenza di fenomeni di risonanza.

/* Codice che permette di controllare un Motore Passo_Passo o un ServoMotore
 * facendolo ruotare in senso orario/antiorario e con velocità diverse e
 * con rampe fisse di accelerazione e decelerazione.
 * Servomotore da 800 step/giro, 1.8 gradi/step
 */

// Include la libreria AccelStepper:
#include <AccelStepper.h>

// Definizione dei pin di connessione del motore e delle interfacce motore nel caso vi fossero più di un motore:
#define dirPin 2
#define stepPin 3
#define motorInterfaceType 1

// Crea l’istanza AccelStepper:
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);

void setup() {
// Setta la massima velocità e Accelerazione:
stepper.setMaxSpeed(10000);
stepper.setAcceleration(90);      // Seconda rampa (1000)
}

void loop() {
// Setta la posizione di fine corsa, facciamo compiere 40 giri:
stepper.moveTo(32000);
// Muove fino alla posizione di fine corsa attivando una accelerazione/decelerazione:
stepper.runToPosition();

delay(2000);

// Torna al punto di partenza:
stepper.moveTo(0);
stepper.runToPosition();

delay(1000);
}

Nel filmato che segue possiamo apprezzare il comportamento dei due Motori controllati dal codice di cui sopra.