Motori passo-passo bipolari comandati da interruttori – terza parte

Applica le tue conoscenze al tuo progetto! Se hai letto la prima e la seconda parte di questa serie di articoli avrai certamente raggiunto il livello di conoscenza adeguata alla realizzazione del tuo progetto.

Con due semplici pulsanti puoi far ruotare il motore in senso orario o antiorario fino al raggiungimento del punto desiderato, questo movimento applicato ad esempio ad un ingranaggio che traduce il movimento rotatorio in movimento lineare, ad esempio mediante delle viti trapezie in una cnc, ti consente di posizionare l’utensile della CNC nel punto desiderato.

Lo sketch che ho utilizzato per realizzare il video dimostrativo è:

#define LED 13
#define ORARIO 2
#define ANTIOR 3

int motorPinx[] = {8, 9, 10, 11};
int sequenza[] = {1,3,2,4};
int countX  = 0;
int count2X = 0;
int ora = 0;
int ant = 0;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(ORARIO, INPUT);
  pinMode(ANTIOR, INPUT);
  for (countX=0; countX<4; countX++)
  {
    pinMode(motorPinx[countX], OUTPUT);
  }
}  

void loop() {
  ora = digitalRead(ORARIO);
  ant = digitalRead(ANTIOR);

  if (ora == HIGH) {
    orario();
  }  

  if (ant == HIGH) {
    antiorario();
  }
}

void orario()
{
  int val = LOW;
  for (countX=0; countX<4; countX++)
  {
    if (countX == sequenza[count2X]) val = HIGH;
    else                             val = LOW;

    digitalWrite(motorPinx[countX], val);
  }
  count2X++;
  if (count2X == 4) count2X = 0;
}

void antiorario()
{
  int val = LOW;
  for (countX=3; countX>=0; countX--)
  {
    if (countX == sequenza[count2X]) val = HIGH;
    else                             val = LOW;

    digitalWrite(motorPinx[countX], val);
  }
  count2X--;
  if (count2X < 0) count2X = 3;
}

Avrai sicuramente notato che non differisce molto da quello già illustrato nella seconda parte di questa serie di articoli, la differenza principali sono:

linea 03: definisci una nuova variabile di tipo array int ossia un array di valori tutti di tipo integer, a ciascuna posizione di questo array assegna uno dei pin a cui hai collegato il driver SN754410NE;

linea 04: definisci un altro array di tipo integer questa volta dovrai assegnare a ciascuna posizione dell’array la corrispondente fase da portare a livello HIGH; questa linea è fondamentale per comprendere il funzionamento di tutto lo sketch, se lo confronti con lo sketch proposto nell’articolo noterai che la sequenza di eccitazione delle bobine del motore passo passo porta a livello alto in successione la fase 1, poi la 3, poi la 2 ed infine la 4. Se al posto del motore bipolare avessimo avuto un motore unipolare la sequenza sarebbe stata 1,2,3 e 4;

linea 05-06: definisci due variabili di tipo integer che utilizzerai in seguito;

nella funzione setup() aggiungi le linee necessarie a impostare il corretto funzionamento dei pin a cui è connesso il motore mediante il driver SN754410NE;

linee 16-19: esegui un ciclo basato sulla variabile countX che ad ogni passaggio si incrementa di un pinto fino al numero 3, ricorda che gli array partono dall’indice 0, per cui un array di 4 elementi avrà un indice che parte da 0 fino a 3 (4-1); All’interno del ciclo per ciascun pin definito nella variabile motorPin assegna la funzione di OUTPUT al pin selezionato;

la funzione loop è identica a quella descritta in questo articolo, cambiano le due funzioni accessorie orario() e antior():

linea 37: definisci una variabile di tipo integer a cui assegni il valore LOW, a prima vista potrebbe sembrare un errore, devi ricordare che per Arduino LOW e HIGH sono in realtà la trasposizione di due valori 0 e 255 rispettivamente.

linea 38: definisci un ciclo for che partendo dal valore 0 di countX fino al raggiungimento del valore 3 (vedi linea 16) incrementa il valore di countX ad ogni nuovo passaggio;

linea 40: è un altro passaggio chiave dello sketch, confronta il valore assunto ad ogni passaggio dalla variabile countX con il valore del pin da portare a livello HIGH, per farlo ti occorre sapere a quale fase della sequenza è arrivata la rotazione del motore; puoi servirti di un indice count2X che incrementi ogni volta che viene richiamata la funzione orario(), vedi linea 45; in pratica la prima volta che chiami la funzione orario() il valore di count2X è 0 (impostato alla linea 08) la sequenza all’indice 0 è 1; la seconda volta che chiami la funzione orario il valore di count2X sarà 2, incrementato dalla prima chiamata e la sequenza ( sequenza ) all’indice 1 è 3; tutto questo si traduce nel valore HIGH invito al pin motorPinx alla posizione countX;

linea 41: è l’alternativa alla verifica eseguita alla linea 40, in pratica per tutti i pin che non soddisfano la condizione descritta nella linea 40 imposti a LOW il valore da inviare;

linea 43: mediante la funzione digitaWrite(pin,valore) invii il valore impostato (val) al pin di Arduino corrispondente a motorPinx[countX];

linea 45: incrementa di 1 il valore della variabile count2X in modo che alla successiva chiamata della funzione orario() la sequenza proceda eccitando la fase successiva;

linea 46: esegui un contollo in cui verifichi che la variabile count2X non sia arrivata a 4, limite superiore dell’array sequenza[] in tal caso la reimposti a 0 per ricominciare il ciclo di rotazione.

linee 49-61: esegui le stesse operazioni viste per la fnzione orario() ma in verso opposto per cui sia la variabile countX sia la variabile count2X, invece di incrementarsi ad ogni ciclo for ed ad ogni chiamata, si decrementano producendo la rotazione antioraria.

Se qualche passaggio non ti è chiaro, commenta questo articolo ed io ti chiarirò i passaggi poco chiari, non è semplice quello che hai letto, potrebbe essere necessatio un approfondimento.

Buon divertimento.

Prima di inserire un commento, per favore, leggi il regolamento

Permanent link to this article: https://www.mauroalfieri.it/elettronica/motori-passo-passo-bipolari-comandati-da-interruttori-terza-parte.html

53 pings

Skip to comment form

  1. […] Motori passo-passo bipolari comandati da interruttori – terza parte […]

  2. […] questo articolo prendo spunto dal commento alla terza parte di questa serie di articoli da parte di un appassionato come te e me. Il problema di cui mi ha reso […]

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.