Motor Shield FE e motore bipolare – controllare gli step

Nel precedente articolo dedicato alla motor shield FE fornita da robot-domestici.it hai imparato a pilotare un motore bipolare con la motor shield, probabilmente i tuoi progetti non sono quelli di farlo ruotare all’infinito ma di controllare la posizione, i giri e i passi che il tuo motore compie.

Motor Shield FE e Motore Bipolare

In questo articolo vedrai come impostare un numero di passi che vuoi far compiere al motore bipolare ed eseguirli.

int motorPinDirA = 2;
int motorPinDirB = 8;
int motorPinPwmA = 3;
int motorPinPwmB = 9;
int delayTime = 500;
int myStep=10;  // 40 passi ( 10 + 4 )

void setup() {
  pinMode(motorPinDirA, OUTPUT);
  pinMode(motorPinDirB, OUTPUT);
  pinMode(motorPinPwmA, OUTPUT);
  pinMode(motorPinPwmB, OUTPUT);

}

void loop() {
    for (int i=1; i<=myStep; i++)
    {
      orario();
    }

    for (int i=1; i<=myStep; i++)
    {
      antiorario();
    }
}

void orario()
{
  digitalWrite(motorPinDirA, HIGH);
  digitalWrite(motorPinDirB, LOW);
  digitalWrite(motorPinPwmA, HIGH);
  digitalWrite(motorPinPwmB, LOW);
  delay(delayTime);

  digitalWrite(motorPinDirA, LOW);
  digitalWrite(motorPinDirB, HIGH);
  digitalWrite(motorPinPwmA, LOW);
  digitalWrite(motorPinPwmB, HIGH);
  delay(delayTime);

  digitalWrite(motorPinDirA, LOW);
  digitalWrite(motorPinDirB, LOW);
  digitalWrite(motorPinPwmA, HIGH);
  digitalWrite(motorPinPwmB, LOW);
  delay(delayTime);

  digitalWrite(motorPinDirA, LOW);
  digitalWrite(motorPinDirB, LOW);
  digitalWrite(motorPinPwmA, LOW);
  digitalWrite(motorPinPwmB, HIGH);
  delay(delayTime);
}

void antiorario()
{
  digitalWrite(motorPinDirA, LOW);
  digitalWrite(motorPinDirB, LOW);
  digitalWrite(motorPinPwmA, LOW);
  digitalWrite(motorPinPwmB, HIGH);
  delay(delayTime);

  digitalWrite(motorPinDirA, LOW);
  digitalWrite(motorPinDirB, LOW);
  digitalWrite(motorPinPwmA, HIGH);
  digitalWrite(motorPinPwmB, LOW);
  delay(delayTime);

  digitalWrite(motorPinDirA, LOW);
  digitalWrite(motorPinDirB, HIGH);
  digitalWrite(motorPinPwmA, LOW);
  digitalWrite(motorPinPwmB, HIGH);
  delay(delayTime);

  digitalWrite(motorPinDirA, HIGH);
  digitalWrite(motorPinDirB, LOW);
  digitalWrite(motorPinPwmA, HIGH);
  digitalWrite(motorPinPwmB, LOW);
  delay(delayTime);
}

Rispetto al codice del primo articolo devi fare una prima importante variazione: definisci due funzioni di tipo void ossia che non prevendono parametri di input o risposta in output; le due funzioni le ho chiamate orario() e antiorario() perchè la prima fa ruotare il motore in senso orario e la seconda in senso antiorario.

Nella prima funzione ho ricopiato il contenuto della loop() del precedente articolo, la spiegazione di ogni riga di codice puoi leggerla li, nella funzione antiorario() ho invece copiato il contenuto della funzione orari() ma ho invertito le funzioni, ossia la prima è diventata la quarta, la seconda -> la terza, la terza -> la seconda e la quarts -> la prima; il gioco è semplice invertendo l’ordine di eccitazione delle fasi il motore ruota in senso inverso al precedente.

Vediamo cosa modificare della funzione loop(): crea due cicli for identici linee 17 e 22, il primo ciclo ad ogni incremento del valore di i chiama la funzione orario() il secondo chiama la funzione antiorario() l’effetto è che il motore esegue prima un numero definito di step in un senso e poi lo steso numero nel senso opposto.

Come ti accennavo lo sketch è dimostrativo quindi potresti aver bisogno solo della rotazione in un senso o di differenti passi in un senso rispetto al senso opposto.

Per indicare al motore quanti step eseguire ho utilizzato la variabile myStep definita alla linea 06, nota il commento se metto 10 il numero di step realmente eseguito è 10 * 4 = 40 questo accade perchè sia la funzione orario() sia la antiorario() eseguono 4 step ogni volta che le invochiamo.

Ci sono dei trucchetti che puoi utilizzare e delle soluzioni alternative per impostare myStep come l’effettivo numero di step che intendi far compiere al motore, ti suggerisco 2 modi:

Semplice

dividi per 4 il valore di myStep: int newMyStep = (myStep / 4); considerando che myStep è una variabile di tipo integer come newMyStep di conseguenza otterrai un valore approssimato per intero es.: 10/4 = 2,5 => 2;

Avanzato

potresti modificare le funzioni orario e antiorario percè accettino in input il numero di step da compiere da 1 a 4, eseguano solo gli step reali e restituisceano in output ( return ) il passo a cui sono arrivati; nella loop dovrai quindi tener presente che se richiami la funzione orario(3) eseguirà i soli primi 3 passi e restituirà 3 come punto di arrivo, se la richiami con orario(2) dovrà partire dal 4° passo eseguire due passi e restituirà 1 perchè 3 +2 = 5 /4 =1,25 => 1.

Buon divertimento

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

Permanent link to this article: https://www.mauroalfieri.it/elettronica/motor-shield-fe-e-motore-bipolare-controllare-gli-step.html

7 pings

Skip to comment form

  1. […] parte dello sketch è descritto in questo mio precedente articolo, le differenze principali riguardano due nuove funzioni che trovi in fondo, ma parti con […]

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.