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

logo

A cura di Davide Munaretto

Il sistema più semplice per gestire in modo molto flessibile un motore Passo_Passo o un Servo Motore è rappresentato da Arduino, un’elettronica programmabile in linguaggio C dalle enormi potenzialità.

Il sistema completo è rappresentato dall’elettronica di controllo (Arduino), dal Driver del Motore e dal motore.

Questi tre elementi ci permettono di sviluppare sistemi di automazione che possono incontrare le necessità che si presentano nella pratica dell’orologeria come ad esempio la realizzazione di un divisore elettronico universale per il taglio delle ruote dentate fino ad arrivare a sistemi di posizionamento o controllo per torni e fresatrici.

Cominciamo quindi a vedere come sia possibile controllare un motore o un servo facendolo posizionare in base alle nostre necessità e facendoli compiere dei percorsi stabiliti.

La programmazione può essere eseguita in vari modi, partendo da un codice di base oppure sfruttando alcune librerie pensate appositamente per gestire queste apparecchiature che di fatto rivestono una grande importanza sia nell’automazione industriale che nelle robotica.

Partiamo quindi con una libreria chiamata “Accelstepper”  che nasce specificatamente per il controllo semplificato dei motori Passo_Passo e Servomotori, dandoci modo, oltre che controllare lo spostamento angolare, anche di stabilire la velocità di rotazione e introdurre rampe di accelerazione e decelerazione che risultano particolarmente utili nel caso in cui vi siano inerzie importanti da gestire.

Per quanto il codice sia il medesimo per i Motori Passo_Passo che per i Servo Motori, la risposta di queste due tipologie di attuatori è notevolmente differente in termini di precisione di posizionamento e velocità.

Per loro natura i Passo_Passo lavorano con un numero di giri inferiore rispetto ai Servo e quindi i tempi di reazione, le rampe di accelerazione/decelerazione e la velocità massima ammissibile risulta talvolta molto più bassa.

Di questi fattori si deve tenerne conto all’atto della programmazione in quanto si devono avere ben chiari i valori massimi, pena il malfunzionamento del sistema.

Cominciamo ad analizzare un codice base che ci permette un primo controllo di posizionamento.

Nel Codice che segue sono stati inseriti i dati necessari alla gestione di un motore Passo_Passo da 200 step/giro, 1.8 gradi/step.

/* Codice che permette di controllare un Motore Passo_Passo 
* facendolo ruotare in senso orario/antiorario e con velocità diverse.
* Motore Passo_Passo da 200 Step/giro 
 */

// 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() {
// Stabilisce la massima velocità in steps per secondi:
stepper.setMaxSpeed(1500);
}

void loop() {
// Setta la posizione corrente al punto Zero:
stepper.setCurrentPosition(0);

// Fa ruotare il motore a 1500 steps/secondo fino al raggiungimento di 400 steps (2 giri):
while(stepper.currentPosition() != 400)
{
stepper.setSpeed(1500);
stepper.runSpeed();
}

delay(2000);

// Resetta la posizone al punto Zero:
stepper.setCurrentPosition(0);

// Fa ruotare il motore in senso opposto a 400 steps/secondo fino al raggiungimento di -200 steps (1 giro):
while(stepper.currentPosition() != -200)
{
stepper.setSpeed(-400);
stepper.runSpeed();
}

delay(2000);

// Resetta la posizone al punto Zero:
stepper.setCurrentPosition(0);

// Fa ruotare il motore in senso opposto a 100 steps/secondo fino al raggiungimento di 600 steps (3 gir1):
while(stepper.currentPosition() != 600)
{
stepper.setSpeed(100);
stepper.runSpeed();
}

delay(3000);
}

Nel Codice che segue sono stati inseriti i dati necessari alla gestione di un Servomotore da 800 step/giro e dotato di un Encoder da 1000 linee.

/* Codice che permette di controllare un ServoMotore
* facendolo ruotare in senso orario/antiorario e con velocità diverse.
* ServoMotore da 800 Step/giro con Encoder 1000 linee
 */

// 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() {
// Stabilisce la massima velocità in steps per secondi:
stepper.setMaxSpeed(10000);
}

void loop() {
// Setta la posizione corrente al punto Zero:
stepper.setCurrentPosition(0);

// Fa ruotare il motore a 10000 steps/secondo fino al raggiungimento di 400 steps (1/2 giro):
while(stepper.currentPosition() != 400)
{
stepper.setSpeed(10000);
stepper.runSpeed();
}

delay(2000);

// Resetta la posizone al punto Zero:
stepper.setCurrentPosition(0);

// Fa ruotare il motore in senso opposto a 800 steps/secondo fino al raggiungimento di -200 steps (1/4 di giro):
while(stepper.currentPosition() != -200)
{
stepper.setSpeed(-800);
stepper.runSpeed();
}

delay(2000);

// Resetta la posizone al punto Zero:
stepper.setCurrentPosition(0);

// Fa ruotare il motore in senso opposto a 400 steps/secondo fino al raggiungimento di 600 steps (3/4 di giro):
while(stepper.currentPosition() != 600)
{
stepper.setSpeed(400);
stepper.runSpeed();
}

delay(3000);
}

Il programma prevede come esempio, tre posizionamenti consecutivi al termine dei quali il ciclo viene ripetuto.

Il codice è commentato ed è facile comprendere quali siano i parametri che determinano gli spostamenti.

In questo primo esempio non sono state introdotte rampe di accelerazione o decelerazione che vedremo in seguito.

Nel video che segue è possibile vedere la risposta di un motore Passo_Passo e di un Servomotore controllati da questo codice, si noti la differenza di rumorosità dovuta al tipo di impulso generato dalle rispettive elettroniche.