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.