Percorsi Abilitanti Speciali A.A. 2013/2014 classe abilitazione C320 LABORATORIO MECCANICO TECNOLOGICO Esercitazione Controllo di un motore DC mediante Arduino YUN
Pag. 2 SOMMARIO Presentazione delle caratteristiche di Arduino YUN... 3 Descrizione del sistema... 5 Descrizione delle prove... 6 Prova 1 Controllo ad anello aperto... 6 Prova 2 Controllo proporzionale... 7 Prova 3 Controllo Proporzionale e Integrale (PI)... 7 Sketch arduino... 7
Pag. 3 Presentazione delle caratteristiche di Arduino YUN L Arduino Yún unisce alle caratteristiche dell Arduino Leonardo (Atmega32U4) il SoC (System on a Chip) Atheros AR9331 con preinstallata una distribuzione Linux (Linino) derivata da OpenWRT. La nuova Arduino Yún (Yún in cinese significa nuvola o meglio in linguaggio informatico Cloud ) è già dotata di connessione WiFi ed una porta USB Host (Standard-A) oltre allo slot per la microsd.
Pag. 4 Sul sito ufficiale arcuino.cc puoi trovare la scheda tecnica con le principali caratteristiche della Arduino Yún tra cui le principali sono: ATmega32u4 SoC Atheros AR9331 WiFi IEEE 802.11 b/g/n Ethernet IEEE 802.10 10/100Mbit/s USB Type-A 2.0 MicroSD Card reader 64Mb di RAM DDR2 16Mb di Flash 14 input/output digitali di cui 7 utilizzabili come PWM 12 input analogici a 10Bit ( 0-1023 valori ) e integra sia la parte Arduino sia quella Linux based senza la necessità di cablaggi esterni o di adattare il segnale della porta seriale tra l ATmega32u4 e il Soc AR9331.
Pag. 5 Descrizione del sistema Il sistema consiste in: un motore DC collegato ad una dinamo tachimetrica per la misura della velocità una scheda di comando motore (POLOLU 18V7) Collegato al motore secondo il seguente schema
Pag. 6 Lo schema complessivo è il seguente: Pot. ADC Algoritmo controllo PWM out Ponte H Motore DC Dinamo Yùn ADC Interfaccia elettrica Descrizione delle prove Prova 1 Controllo ad anello aperto Il controllo ad anello aperto è effettuato calcolando la variabile di controllo (Tensione del motore) proporzionale al segnale di riferimento. Si può notare che dopo opportuna taratura la velocità finale segue bene il riferimento e il transitorio è quello tipico del motore. La sensibilità del sistema di controllo ai disturbi è eccessiva. Il sistema di controllo non reagisce ai disturbi di coppia applicata all albero dall esterno.
Pag. 7 Prova 2 Controllo proporzionale Benché il sistema di controllo presenti un errore finale non nullo (circa k/(1+k) dove k è il guadagno d anello), il sistema di controllo reagisce ai disturbi di coppia applicata all albero dall esterno riducendo l errore rispetto al caso precedente. Prova 3 Controllo Proporzionale e Integrale (PI) Il sistema di controllo presenta un errore finale nullo e, inoltre, reagisce ai disturbi di coppia applicata all albero dall esterno riportando l errore a zero. Commento finale: provare ad utilizzare metodi misti (anello aperto e chiuso) Sketch arduino /* luglio 2014 Percorsi Abilitanti Speciali A.A. 2013/2014 AUTOMAZIONE E CONTROLLO DI DISPOSITIVI BASATI SU MICROCONTROLLORE classe abilitazione C320 LABORATORIO MECCANICO TECNOLOGICO Esercitazione Controllo di un motore DC mediante Arduino YUN */ int ref = 0; int refpin=a0; int out = 0; // value read from the pot // value output to the PWM (analog out)
Pag. 8 int outpin = 10; int vel = 0; int velpin = A4; int SInPin = 8; int SOutPin = 9; // pin lettura wait() //pin scrittura wait() int inte=0; unsigned long t2 = micros(); unsigned long t1 = 0; void setup() Serial.begin(115200); pinmode(a1, OUTPUT); pinmode(a2, OUTPUT); pinmode(soutpin, OUTPUT); // sets the pin SoutPin as output analogwrite(soutpin, 150); pinmode(sinpin, INPUT); // sets the pin SinPin as input digitalwrite(a1, HIGH); digitalwrite(a2, LOW); void wait(void) do while (!digitalread(sinpin)); do while (digitalread(sinpin));
Pag. 9 int controllo(int ref, int vel) int contr; int err; int cout; int k1 = 5; int k2 = 1; int ki = 1; err = ref - vel; cout = k1 *err + k2 * ref + ki * inte; inte += err; cout = sat(cout,0,1023); contr = map(cout, 0, 1023, 126, 253); return contr; int sat(int in, int m, int M) int out; if (in > M) out=m; else if (in < m) out=m; else out=in; return out; void loop() wait(); t1=t2;
Pag. 10 t2=micros(); ref = analogread(refpin); ref=map(ref,2,1022,0,1024); vel = analogread(velpin); vel = vel * 2; out=controllo(ref,vel); analogwrite(outpin, out); // print the results to the serial monitor: Serial.print("ref = " ); Serial.print(ref); Serial.print("\t\t vel = "); Serial.print(vel); Serial.print("\t\t err = "); Serial.print((int) (ref-vel)); Serial.print("\t\t integrale = "); Serial.print(inte); Serial.print("\t\t out = "); Serial.print(out); Serial.print("\t\t dt = "); Serial.println((int)(t2-t1));