MOTORE PASSO-PASSO CON VELOCITÀ REGOLABILE Realizzazione di un programma, per il microcontrollore Arduino, che permette di regolare la velocità di un motore passo-passo attraverso un potenziometro Mattia Mamini, Tommaso Buzzi, Niccolò Laghi 5ªBEN ITTS G. Marconi - Forlì Febbraio 2019
INTRODUZIONE In questa esercitazione viene presentato un software per il microcontrollore Arduino che consente di regolare la velocità di rotazione di un motore passo-passo attraverso un potenziometro e di gestirne anche il senso di marcia attraverso l ausilio di due pulsanti. COMPONENTI E MATERIALI Per realizzare il circuito occorrono i seguenti componenti e materiali. Arduino Uno x 1 Resistenze 10KΩ x 2 Cavi di collegamento Breadboard (ci servirà per fare i collegamenti elettrici) x 1 Pulsante (N.A.) x 2 Motorino Passo-passo (28BYJ-48) x 1 Driver per il motore (ULN2003) x 1 Potenziometro (10KΩ) x 1 PRINCIPI TEORICI Il motore al suo interno contiene vari avvolgimenti di rame (nel nostro caso sono 4), disposti in sequenza, che hanno un capo in comune connesso a +Vcc. Collegando un avvolgimento a una massa inizia a scorrere una corrente ed essendo un elettromagnete attira verso di esso il polo opposto del rotore. Per poter compiere una rotazione completa è necessario eseguire la sequenza riportata in figura 1, generati dall accensione e spegnimento delle varie bobine in sequenza. Questa tipologia di motori è particolarmente utilizzata in ambiti che richiedono molta precisione (ad esempio le stampanti 3D), proprio per questa loro caratteristica di produrre una rotazione che è in realtà la somma di più scatti in sequenza. Ovviamente ciò implica che questa somma di scatti sia eseguita con una logica, ovvero azionando le bobine una alla volta e seguendo l ordine originario riferito alla loro posizione: naturalmente, quando si passa alla successiva, bisogna spegnere quella precedente, per consentire al rotore di eseguire lo scatto. Nasce poi un problema relativo alle potenze in gioco: a causa del principio di funzionamento del motore, gli ingressi/uscite di Arduino, verrebbero usate Pagina 1
Figura 1 come massa per chiudere il circuito, ma queste ultime non sarebbero in grado di fornire la corrente necessaria per l eccitamento degli elettromagneti. Per ovviare al problema viene usato un driver specifico per questa tipologia di motore, l ULN2003, che funziona come un transistor, dando la possibilità di controllare con una piccola corrente fornita dal microcontrollore, quella necessaria al motore per ruotare. Arduino si collega al driver (che ha una sua alimentazione) con 4 cavi e il collegamento deve essere fatto come illustrato nello schema di seguito. Pagina 2
DESCRIZIONE DEL SOFTWARE Il software è relativamente semplice e opera la rotazione del motore in un verso quando si preme un pulsante e nel verso opposto se si preme l altro. Per poter regolare la velocità di rotazione si varia il tempo che intercorre tra uno scatto e l altro del rotore, facendo quindi cambiare il tempo totale richiesto per una rotazione completa e di conseguenza il numero di giri. Per fare ciò è stato inserito un potenziometro di cui il programma leggerà costantemente il valore. Una effettuata la lettura il valore letto lo si associa alla variabile potenziometro che è stata impostata come riferimento per il ritardo (delay). Questa viene divisa per 100 per ottenere valori in un intervallo più contenuto e aumentata di 2 per evitare di avere 0 e quindi provocare l arresto del motore. Il valore 2, non è stato scelto casualmente, questo è infatti il valore minimo per il quale il motore riesce a compiere una rotazione. CODICE ARDUINO //Definisco i Pin e le variabili int pulsante_1 = 2; int pulsante_2 = 3; int regolatore = A5; int val1 ; int val2 ; int potenziometro; //Definisco i pin di controllo delle 4 bobine del motore int pinmotore1 = 8; int pinmotore2 = 9; int pinmotore3 = 10; int pinmotore4 = 11; //Definisco gli OUTPUT e INPUT di Arduino void setup() { Serial.begin(9600); pinmode(pulsante_1, INPUT); pinmode(pulsante_2, INPUT); pinmode(pinmotore1, OUTPUT); pinmode(pinmotore2, OUTPUT); pinmode(pinmotore3, OUTPUT); pinmode(pinmotore4, OUTPUT); void loop() { val1 = digitalread(pulsante_1); //Leggo il pulsante_1 collegato al Pin 2 if (val1 == HIGH) //Finchè è premuto il pulsate, il motorino avanza in senso orario { potenziometro=analogread(a0)/100+2; //Leggo il valore analogico del potenziometro e lo associo alla variabile "potenziometro" digitalwrite(pinmotore1, HIGH); digitalwrite (pinmotore2, LOW); Pagina 3
//Imposto come delay(ms) il valore letto dal potenziometro digitalwrite(pinmotore2, HIGH); digitalwrite(pinmotore3, HIGH); digitalwrite(pinmotore4, HIGH); val2 = analogread(pulsante_2); //Leggo il pulsante_2 collegato al Pin 3 if (val2 == HIGH); //Finchè è premuto il pulsate, il motorino avanza in senso antiorario { potenziometro=analogread(a0)/100+2; //Leggo il valore analogico del potenziometro e lo associo alla variabile digitalwrite(pinmotore4, HIGH); //Imposto come delay il valore letto dal potenziometro digitalwrite(pinmotore3, HIGH); digitalwrite(pinmotore2, HIGH); digitalwrite(pinmotore1, HIGH); Pagina 4