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