Controllare un motore DC con Arduino

In questo articolo vedremo come far funzionare un motore DC. Verranno utilizzati alcuni elementi presenti in SparkFun Inventor’s Kit for Arduino UNO:

  • 1 INTERRUTTORE (SWITCH): apre/chiude un circuito; se l’interruttore è chiuso il circuito si attiverà;
  • 2 MOTORI DC, 2 RUOTE e 1 CHIP MOTOR DRIVER (TB6612FNG) : tale chip
  • 1 BREADBOARD
  • 1 ARDUINO UNO R3
  • 1 TAVOLETTA NERA
  • 1 CAVO USB
componenti per muovere un modore DC

Avvitare arduino ed incollare la breadboard sulla tavoletta nera

Se Arduino è alimentato tramite porta usb, il piedino Vin avrà una tensione di circa 5 V; se la scheda è alimentata con una batteria esterna da 9 V (tramite un jack), allora Vin sarà di 9 V (cioè Vin riflette la tensione di ingresso). Non superare 15 V!

I collegamenti da fare sono i seguenti:

  • posizionare l’interruttore sulla breadboard; il pin centrale va collegato con un filo nero a terra (sul segno – della breadboard) e un piedino va collegato con un filo (ad es. blu e comunque NON di colore nero) sul pin 7 di arduino;

Poiché i motori DC richiedono molta corrente, non si usa direttamente un pin digitale di arduino ma si utilizza il chip MOTOR DRIVER. Ha due canali (A e B) e quindi consente di pilotare due motori.

  • Collegare, nella parte alta della breadboard, il chip MOTOR DRIVER e 1 motore DC sul canale A (come nelle sottostanti figure) e l’altro motore sul canale B; poiché il chip è dotato di molti piedini, nel caso si volesse rimuovere dalla breadboard, conviene utilizzare un cacciavite piatto. Vediamo a cosa servono i vari PIN che mette a disposizione questo driver e dove collegarli:
  • VM (power) in alto a sinistra: va collegato al Vin (riceve l’alimentazione da arduino (2,2 V – 13,5 V) per fornirla al motore;
  • VCC (power): va collegato a 5 V (al morsetto + della breadboard che poi va collegato a 5 V) e serve a far funzionare il microcontrollore (motor drive) che funzione con una tensione compresa tra 2,7 e 5,5 V;
  • GND (power): messa a terra (morsetto – della breadboard che poi va collegato al GND di Arduino con un filo nero);
  • AO1 (output): va collegato al morsetto + del motore con un filo rosso(canale A);
  • AO2 (output): va collegato al morsetto – del motore con un filo nero (canale A);
  • BO1 (output): va collegato al morsetto + del motore con un filo rosso (canale B);
  • BO2 (output): va collegato al morsetto – del motore con un filo nero (canale B);
  • AI1 (input) è sul lato destro : va collegato al pin 13 (canale A);
  • AI2 (input) è sul lato destro: va collegato al pin 12 (canale A);
  • BI1 (input) è sul lato destro: va collegato al pin 8 (canale B);
  • BI2 (input) è sul lato destro : va collegato al pin 9 (canale B);
  • PWMA (input) è in alto a destra: va collegato al pin 11 e serve a controllare la velocità del motore (canale A);
  • PWMB (input) è in basso a destra: va collegato al pin 10 e serve a controllare la velocità del motore (canale B);
  • STBY (input): va collegato a 5 V (consente al ponte H di lavorare);

Il motore DC ruota in un verso o in un altro a seconda del verso della corrente; invertendo il verso della corrente si inverte il verso di rotazione del motore (e quindi della ruota); come indicato nella descrizione precedente, si utilizzano 3 fili: 2 fili per il controllo del verso di rotazione (AI1 e AI2) ed un filo per il controllo della velocità (PWMA). Il codice per far ruotare un motore collegato al canale A è:
digitalWrite(AIN1, HIGH);  //set pin 1 to high
digitalWrite(AIN2, LOW);   //set pin 2 to low
spinMotor(numero compreso tra 0 e 255) // avvia il motore con una certa velocità indicata tra parentesi.
Se si vuole cambiare verso di rotazione ci sono due possibilità:
– scambiare HIGH e LOW
– scrivere un numero negativo (tra -255 e 0) in spinMotor.

Con il codice seguente, è sufficiente inserire un numero (tra -255 e 255) per testare i due motori:
/*SparkFun Inventor’s Kit
Circuit 5A – Motor Basics
Scopri come controllare un motore con il motor driver.*/

//PIN VARIABLES
const int AIN1 = 13;         // pin1 di controllo del motore A
const int AIN2 = 12;         // pin2 di controllo del motore A
const int PWMA = 11;     // controlla la velocità del motore A
const int BIN1 = 8;           // pin1 di controllo del motore B
const int BIN2 = 9;           // pin1 di controllo del motore B
const int PWMB = 10;      // controlla la velocità del motore B
int switchPin = 7;             // interruttore per accendere e spegnere il motore

//VARIABLES
int motorSpeed = 0;       //inizializzazione della variabile motorSpeed
void setup() {
//set this as a pullup to sense whether the switch is flipped
pinMode(switchPin, INPUT_PULLUP);
  //set the motor control pins as outputs
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
pinMode(PWMA, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
  pinMode(PWMB, OUTPUT);

// inizializza la comunicazione con la porta seriale
Serial.begin(9600);
// Visualizza la richiesta di inserire un numero (positivo fa ruotare in un verso, negativo in verso opposto)
Serial.println(“Scrivi la velocità del motore (0..255 o -255..0)… “);
}

void loop() {
// se l’utente ha inserito qualcosa nel monitor serale
if (Serial.available() > 0){         
    motorSpeed = Serial.parseInt();     // setta la variabile motorSpeed a quel numero
    Serial.print(“Motor Speed: “);      // visualizza la velocità settata
    Serial.println(motorSpeed);
  }
// legge l’interruttore sullo switchPin e se è basso (interruttore chiuso)
if(digitalRead(switchPin) == LOW){   
     spinMotor(motorSpeed); // accende il motore alla velocità indicata dall’utente
  } else{                               // altrimenti
      spinMotor(0);                     // spegne il motore
}
}

/*************************/

void spinMotor(int motorSpeed)                       //funzione per pilotare il motore
{
// se la velocità del motore è positiva
if (motorSpeed > 0 and motorSpeed < 266)
  {
    digitalWrite(AIN1, HIGH);                         //set pin 1 to high
    digitalWrite(AIN2, LOW);                          //set pin 2 to low
    digitalWrite(BIN1, HIGH);                         //set pin 1 to high
    digitalWrite(BIN2, LOW);                          //set pin 2 to low
}
// se la velocità è negativa, inverte il verso di rotazione
else if (motorSpeed < 0 and motorSpeed > -266)     
  {
   digitalWrite(AIN1, LOW);      //set pin 1 to low
   digitalWrite(AIN2, HIGH);    //set pin 2 to high
   digitalWrite(BIN1, LOW);      //set pin 1 to low
   digitalWrite(BIN2, HIGH);    //set pin 2 to high
  } 
analogWrite(PWMA, abs(motorSpeed));                 // avvia il motore A
analogWrite(PWMB, abs(motorSpeed));                 // avvia il motore B
}

Prof. Vito Egidio Mosca
Imparare la Fisica

Pubblicato da impararelafisica

Come è bello conoscere tante cose e non saperne altre, ma è ancora più bello scoprirne delle nuove anche se già scoperte da altri. Mosca Vito Egidio, Docente di Matematica e Fisica, Liceo Scientifico. Vincitore del Premio Antonella Bastai Prat 2009 dell'AIF. Vincitore del Premio Antonella Bastai Prat 2016 dell'AIF.