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

logo

A cura di Davide Munaretto

Per il controllo dei motori è possibile utilizzare alcuni dispositivi in grado di leggere le posizioni angolari dell’albero durante la sua rotazione.

Questi dispositivi sono gli Encoder, che come abbiamo visto possono essere integrati sul corpo del motore leggendo quindi in continuo le variazioni angolari e controllandole tramite l’elettronica di controllo nei Servomotori, oppure possono essere collegati esternamente e utilizzati per gestire il posizionamento dell’albero in modo continuo manualmente.

Questo tipo di controllo può essere molto utile nel caso in cui si intenda realizzare ad esempio un manipolatore a distanza con braccio robotico oppure semplicemente per gestire la rotazione di un mandrino.

Gli Encoder si possono dividere oltre che per il tipo di lettura, incrementale o assoluta, anche per la loro risoluzione che in genere si quantifica in numero di impulsi/giro o linee.

E’ superfluo dire che maggiore sarà la precisione e la risoluzione del dispositivo maggiore sara la precisione e la resa del motore.

Il codice che ci permette di muovere un motore con Encoder è quello che segue e vale sia per i motori Passo_Passo che per i servomotori.

Nel caso mostrato abbiamo utilizzato un piccolo Encoder da 24 impulsi/giro e quindi con tutte le limitazioni che questo porta con se.

/* Codice che permette di controllare un Motore Passo_Passo o un ServoMotore
* con l’ausilio di un Encoder.
*/

#include <AccelStepper.h>

// Definizione dei pin di connessione dell’Encoder e inizializzazione delle variabili:
#define encoder_pin_A 8
#define encoder_pin_B 9
int encoder_pin_A_last = LOW;
int encoder_pos = 0;
int n = LOW;
// Definizione dei pin di connessione del motore:
#define stepper_pin_step 3
#define stepper_pin_dir 2

// Calcolo degli impulsi da assegnare all’Encoer per la rotazione
// Enc usato ha 24 steps per giro
// Il Motore fa 800 steps per giro
// Volendo: 1 giro encoder = 1 giro del Motore
// 800 / 24 = 33.3333333333

float steps_per_pulse = 8.3333333333;
// Crea l’istanza AccelStepper:
AccelStepper stepper(AccelStepper::DRIVER, stepper_pin_step, stepper_pin_dir);

void setup() {
// Setta la massima velocità e Accelerazione:
stepper.setMaxSpeed(800.0);
stepper.setAcceleration(300.0);

pinMode(encoder_pin_A, INPUT_PULLUP);
pinMode(encoder_pin_B, INPUT_PULLUP);
}

void loop() {
// Legge la posizione dell’ Encoder
n = digitalRead(encoder_pin_A);

if ((encoder_pin_A_last == LOW) && (n == HIGH)) {
if (digitalRead(encoder_pin_B) == LOW) {
encoder_pos–;
} else {
encoder_pos++;
}

// Posiziona il Motore sulla nuova posizione calcolata
stepper.moveTo((long) round(encoder_pos*steps_per_pulse));
}

encoder_pin_A_last = n;

stepper.run();
}