Motori passo-passo bipolari comandati da interruttori – quarta parte

In questi giorni ho fatto numerosi esperimenti con i motori passo-passo bipolari per porter scrivere nuovi articoli e sto preparando una sorpresa che, spero, troverai interessante.

Motori passo-passo bipolari con Arduino e SN754410NE

In 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 partecipe è che collegando il motore e caricato lo sketch esso emette un sibilo e non si muove.

Il sibilo emesso dal motore mi ha fatto subito pensare che il mancato movimento fosse un effetto collaterale dell’elevata velocità di rotazione, sembra un controsenso, in realtà il motivo per cui il motore non fa ruotare l’albero è che la sequenza dei segnali che si alternano per la rotazione sono talmente veloci che l’albero motore non riesce a spostarsi di uno step prima che l’avvolgimento precedente sia eccitato e lo forzi a restare fermo.

Te ne puoi rendere conto utilizzando lo sketch presentato in questo articolo e impostando il delayTime a 0, anche il tuo motore resterà fermo ed emetteva un sibilo.

Ed ecco quindi la soluzione, o almeno un primo rimedio, che puoi apportare allo sketch per regolare quello che chiamerei “tempo di rotazione” ossia il delayTime.

In questo articolo lo imposterai fisso a 100 millisecondi o potrai variarlo da codice, in un prossimo articolo potrai regolarlo con  l’aiuto di un potenziometro.

Ecco lo sketch, modificato:

#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;
int delayTime = 100;

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();
  }
  delay(delayTime);
}

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;
}

La modifica che devi apportare è semplicissima, definisci una variabile di tipo integer denominata delayTime dal valore fisso di 100, equivalente a 100 millisecondi: linea 11;

aggiungi quind la line a di codice 34: delay(delayTime); con questa definizione ad ogni ciclo di loop(), sia esso orario o antiorario tra uno step ed il successivo hai impostato un tempo di attesa di 100millisecondi che danno tempo all’alberino di posizionarsi al nuovo step prima di eccitare la bobina successiva e così fino a completare il giro.

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-quarta-parte.html

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.