Pilotare Relè e Motori CC Prof.ri Ponte Vincenzo Ovazza Sergio MAKER-INO Lezione 7°
RELE’ In sostanza, il relè è un deviatore che non viene azionato a mano, ma da un elettromagnete. Serve a collegare un circuito a bassa potenza (ingresso:bobina) ad un circuito di potenza (uscita:contatti NA o NC).
RELE’:contatti e pilotaggio con transistor .
Transistor ON-OFF Si comporta come un interruttore aperto o chiuso comandato dalla corrente e dalla tensione sulla sua base; Agendo sulla corrente si fa passare più o meno segnale (Amplifica). Agendo sulla tensione si comporta come un interruttore.
Transistor ON-OFF
MOTORI ELETTRICI vengono definiti MOTORI ELETTRICI le macchine che convertono energia elettrica in energia meccanica. Le macchine elettriche hanno la particolarità di essere reversibili, cioè una stessa macchina può funzionare sia da motore che da generatore. generatori in corrente continua vengono detti DINAMO, quelli in corrente alternata ALTERNATORI
Il Motore In Corrente Continua
Il Motore in Corrente Continua Alimentato in CC ha un verso di rotazione, invertendolo si inverte la rotazione. Alla sua alimentazione ha una velocità di rotazione fissa che varia con il voltaggio. La velocità Arduino la gestisce con PWM.
Motori CC Arduino
Variare la velocità motore con potenziometro int PinMotore = 5; //PIN PWM int PotPin = A0; //pin potenziometro int lettura = 0; //variabile per la lettura int velocita = 0; //variabile per la velocità
Variare velocità del motore con potenziometro void setup() { pinMode(PinMotore, OUTPUT); } void loop() lettura = analogRead(PotPin); //Leggo il valore del potenziometro velocita = map(lettura, 0, 1023, 0, 255); //mappo i valori da 1024 a 255 analogWrite(PinMotore, velocita); //faccio girare il motore in base alla lettura
Come variare il verso motore Utilizzando due uscite PWM collegate al motore,il listato quindi diventa: int PinMotoreA = 5; //PIN PWM ad un terminale del motorino int PinMotoreB = 6; //PIN PWM all’altro terminale del motorino int PotPin = A0; //pin potenziometro int lettura = 0; //variabile per la lettura int velocita = 0; //variabile per la velocità void avanti() { analogWrite(PinMotoreA, velocita); //faccio girare il motore in base alla lettura digitalWrite(PinMotoreB, LOW); } void indietro() analogWrite(PinMotoreB, velocita); //faccio girare il motore in base alla lettura digitalWrite(PinMotoreA, LOW);
Come variare il verso motore void loop() { lettura = analogRead(PotPin); //Leggo il valore del potenziometro velocita = map(lettura, 0, 1023, 0, 255); //mappo i valori da 1024 a 255 avanti(); delay(2000); indietro(); }
il ponte H (Full Bridge) Il ponte H è un componente fondamentale per il controllo dei motori DC. Questo componente ci permette di controllare la velocità e il senso di rotazione del motore, a differenza di un semplice interruttore che ci permetterebbe solamente di lavorare in modalità ON/OFF.
il ponte H con interruttori
il ponte H con transistors
modulo L298 per la gestione di due motori Specifiche Driver: L298N (Dual H-bridge) Tensione logica: 5V Corrente logica: 0mA~36mA Tensione operativa: 5V~35V Corrente operativa (picco per canale): 2A Potenza (Max): 25W
Schema di montaggio
Scheda per piccoli motori DC
Programmiamo Arduino per gestire due motori DC int ENA=11; //connesso alla porta 11 (output pwm) int IN1=10; //connesso alla porta 10 int IN2=9; // connesso alla porta 9 int IN3=8; // connesso alla porta 8 int IN4=7; // connesso alla porta 7 int ENB=6; // connesso alla porta 6(output pwm) Int vel=0;//velocità motori min 120 max 255 int gap = 20; // valore utilizzato nell'istruzione AnalogWrite //per compensare il gap prestazionale del motore meno //efficiente int tempo = 0; // tempo di attivita' dei motori: con velocita' 120 e gap 20 due rotazioni complete necessitano di un tempo pari a 1985 mSec
routine di attivazione dei due motori void attiva () { analogWrite(ENA, vel); // Attiva il motore A analogWrite(ENB, vel + gap); //Attiva il motore B delay (tempo); // tempo di attivazione dei motori analogWrite(ENA,0); // blocca il motore A analogWrite(ENB,0); // blocca il motore B }
Procedura AccelleraRetro Void AccR() digitalWrite(IN1,0); digitalWrite(IN2,1); digitalWrite(IN3,0); digitalWrite(IN4,1); For (int i=0;i<vel;i++) { analogWrite(ENA,i); analogWrite(ENB,i); Delay(20); }
Procedura Accellerazione Void Acc() digitalWrite(IN1,1); digitalWrite(IN2,0); digitalWrite(IN3,1); digitalWrite(IN4,0); For (int i=0;i<vel;i++) { analogWrite(ENA,i); analogWrite(ENB,i); Delay(20); }
Procedere in modo autonomo Codificare le seguenti procedure: Decellera Fermo (IN1.....LOW ) Gira a destra(IN3 e IN4 LOW) Gira a sinistra (IN1 e IN2 LOW) Avanti (ENA e ENB = vel) Retro Aggiungere qualche LED nelle procedure
Setup: INPUT e OUTPUT void setup() { pinMode(ENA,OUTPUT); pinMode(ENB,OUTPUT); pinMode(IN1,OUTPUT); pinMode(IN2,OUTPUT); pinMode(IN3,OUTPUT); pinMode(IN4,OUTPUT); analogWrite(ENA,0); //vel=0 motore fermo analogWrite(ENB,0); }
ServoMotore Il servomotore è un dispositivo capace di eseguire dei movimenti meccanici in funzione del segnale applicato al suo ingresso. Sostanzialmente un servo è composto da un motore elettrico, un motoriduttore ed un circuito di feedback per la gestione della posizione.
Servomotore 9G I comuni servomotori hanno un angolo di rotazione di circa 180°. Qualunque sia il servo scelto, ci troveremo davanti sempre 3 contatti di cui due servono per l’alimentazione (Red 5V,Brown GND) mentre il terzo (Orange)è il pin di controllo che nel nostro caso andrà collegato in un pin di arduino.
Servomotore - 9g (sg90) . Il Servo è un motore in grado di effettuare rotazioni di massimo 270° ed è molto utilizzato nella robotica e nella modellistica. Per usarlo è necessaria una libreria ( <Servo.h> ) che troverete già installata sul software IDE di Arduino
servomotore - 9g (sg90) Per pilotare dei servo è necessario utilizzare un duty-cycle per impartire comandi a questi oggetti. Il modo più semplice per pilotare i servomotori è utilizzare una libreria, che traduca angoli in segnali ed eviti di dover impazzire con i duty-cycle e i calcoli dei tempi; la libreria in questione è la Servo.h
servomotore - 9g (sg90) Questa libreria mette a disposizione alcuni metodi che semplificano di molto l’obiettivo: attach(): permette di specificare su quale pin è connesso il nostro servo e legarlo all’oggetto Servo; attached(): controlla che un oggetto di tipo Servo sia collegata ad un pin; detach(): rimuove il collegamento tra l’oggetto Servo e il pin a cui era legata; read(): legge la posizione angolare del nostro servo, restituisce l’ultimo valore passato con write(); write(): impartisce al servo l’angolo a cui posizionarsi, su servo a rotazione continua imposta la velocità di rotazione 0=velocità massima in un senso, 90=fermo, 180=velocià massima nella direzione inversa; writeMicroseconds(): imposta la velocità di rotazione del servo, in un servo standard il valore va da 1000 a 2000, in un servo a rotazione continua si comporta allo stesso modo della write().
servomotore - 9g (sg90) Il servomotore microservo 9g (sg90) puo’ far ruotare il perno centrale di 180 gradi partendo dalla sua posizione zero. Viste le dimensioni e’ dotato di un discreto momento torcente (1.2 kg/cm) e viene venduto insieme ad alcuni bracci forati mediante i quali e’ possibile azionare il dispositivo che si intende pilotare. Arduino gestisce il servomotore tramite una specifica libreria mediante la quale si possono impartire ordini di spostamento fornendo il numero dei gradi che si intende raggiungere mantenendo sempre come riferimento la posizione 0.
servomotore - 9g (sg90) Non e’ quindi importante conoscere la posizione del perno per impartire un ordine, ma solo sapere (in termini di gradi angolari) la posizione finale che deve essere assunta dal perno stesso In questo esercizio arduino pilotera’ il servomotore facendogli fare due rotazioni di 180 gradi nelle due direzioni e poi posizionera’ per un secondo il perno sui gradi: 45, 90,135 e 180.
servomotore - 9g (sg90) Programma #include <Servo.h> // richiama la libreria di gestione dei servomotori Servo pippo; // crea il servo oggetto “pippo” da utilizzare nel programma. // in un programma possono essere creati, al massimo otto servo oggetti int pos = 0; // variabile per la memorizzazione della posizione (in gradi angolari) del perno void setup() { pippo.attach(9); // assegna il servo oggetto “pippo” al pin 9 }
servomotore - 9g (sg90) void loop() { pippo.write(0); // indirizza il perno alla posizione 0 delay (1000); // attende 1 secondo for(pos = 0; pos <= 180; pos += 1) // sposta di un grado per volta, da //0 a 180 l’angolazione desiderata pippo.write(pos); // indirizza il perno alla posizione desiderata, memorizzata in 'pos' delay(15); // attende 15ms per consentire al servomotore di raggiungere la posizione }
servomotore - 9g (sg90) for(pos = 180; pos>=1; pos-=1) // diminuisce di un grado per volta, //da 180 a 0, la posizione desiderata { pippo.write(pos); // indirizza il perno alla posizione desiderata, memorizzata in 'pos' delay(15); // attende 15ms per consentire al servomotore di //raggiungere la posizione } delay (1000); pippo.write(0); // indirizza il perno alla posizione 0 delay(1000); // attende 1 secondo prima di iniziare la nuova sequenza
servomotore - 9g (sg90) for (pos =0; pos <= 180; pos = pos + 45) // seleziona le posizioni 45, 90, 135 e 180 { pippo.write(pos); // indirizza il perno alla posizione desiderata, memorizzata in 'pos' delay(1000); // attende 1 secondo prima di andare alla successiva posizione } delay (3000); // attende 3 secondi prima di ricominciare il ciclo
Esercitazioni Completare la gestione dei motori in CC Utilizzando i sensori di presenza visti nelle precedenti lezioni, abbinarli al servo o ai motori per realizzare un prototipo di auto robot. Buon lavoro! Prof. Ponte Vincenzo & Ovazza Sergio