Alunni: Classe: Armellin Fabio Gava Alberto 5aA e.t. A.s. 2012/2013 DiscoRobot 2 Con la parola “automazione” s’intende la tecnologia che attraverso sistemi di controllo gestisce macchine riducendo l’intervento dell’uomo. Fin dai tempi della rivoluzione industriale l’uomo ha cercato di semplificare il proprio lavoro, per esempio con l’introduzione di telai automatici o della macchina a vapore. Ma solo nel 1940 negli Stati Uniti fu coniata la parola “automazione” per designare alcuni procedimenti al tempo molto avanzati introdotti particolarmente nell’industria automobilistica. Da allora la parola “automazione” si è largamente diffusa con il significato di impiego di macchine per gestire altre macchine. Lo sviluppo tecnologico raggiunge così un ulteriore stadio: oltre che a sostituire l’uomo come erogatore dell’energia necessaria per le lavorazioni, come esecutore di programmi di gestione secondo cicli ripetitivi. Ora con l’automazione si riesce a gestire “intelligentemente” caso per caso prendendo le decisioni in base alle situazioni determinatesi. Con il nostro progetto abbiamo cercato di realizzare un semplice sistema automatico. In particolare un dispositivo capace di spostarsi autonomamente in una superficie piana (per esempio un tavolo) ed essere in grado di muoversi entro il suo perimetro, percependo quindi la fine di essa e di cambiare direzione. 3 Schema elettrico: Specifiche: • • • • • Alimentazione: batteria ricaricabile al piombo da 12V Movimento tramite motori a corrente continua con incorporato un riduttore di giri da 7giri/min. Controllo tramite un PIC18F4520. Tre sensori riflettivi ad infrarossi. Ponte H per l’azionamento dei motori. Nel circuito, la maggior parte dei componenti deve essere alimentata a 5V. Per questo abbiamo utilizzato l’integrato LM7805 con la seguente configurazione: Batteria SW1 Vbatteria U6 1A 2A IN OUT VCC 3 GND SW 2 J3A 1 LM7805C/TO + C1 100uF + C2 10uF C3 100nF C4 100nF + C5 10uF Lo schema permette di ottenere una tensione di 5V in uscita, fornendone in ingresso una compresa tra 5V e circa 35V (nel nostro caso 12V). i condensatori servono a compensare sbalzi di tensione, mantenendola stabile. 4 Sensori: VCC Sensore destro U1 10K 4 3 2 R1 220 1 TS117 R4 Per rilevare la fine della superficie usiamo dei sensori riflettevi a luce infrarossa. Abbiamo scelto questo tipo perché sono molto sensibili e non sono influenzati dalla luce dell’ambiente. Il sensore ha quattro terminali due del LED infrarosso e due del fototransistor. Alimentando il LED con 5V si nasce un corrente limitata dalla R4 che alimenta il diodo il quale emette luce infrarossa. Il fototransistor invece emette corrente dall’emettitore solo se viene colpito dai fotoni infrarossi riflessi dalla superficie che attraversando la resistenza R1 genera una caduta di tensione. Il potenziale nel punto 4 infatti corrisponde all’uscita del sensore. Grazie alla convergenza tra il LED e il fototransistor il sensore risponde in maniera diversa a seconda se è presente o meno una superficie in grado di riflettere la luce. Calcoli: Utilizziamo una tensione di alimentazione VCC = 5V Impostiamo la corrente che dovrà attraversare il LED: ILED = 22mA Quindi la resistenza R4 sarà: R4 = VCC / ILED = 5 / 0,022 = 227Ω → [220Ω] della serie E12 Se colpito dalla luce il fototransistor invece emette una corrente che attraversa R1. Se il transistor riceve la luce ai capi di R1 ci sarà: VR1 ≈ 2V Se il transistor non riceve la luce ai capi di R1 ci sarà: VR1 ≈ 0V La distanza ottimale tra il sensore e la superficie è di 5mm Abbiamo utilizzato tre sensori per avere un controllo adeguato in qualsiasi posizione si trovi la macchina. In particolare i due sensori laterali, posti oltre le ruote, evitano che quest’ultime raggiungano il bordo provocando la caduta del robot. 5 Attuatori: Per muovere il nostro robot abbiamo scelto 2 motori che funzionano in corrente continua. La tensione di alimentazione massima è di 12V che corrisponde a 7giri/min di velocità angolare di uscita, noi alimenteremo i motori proprio a 12V per ottenere la coppia e velocità massima. Ovviamente il PIC che utilizziamo non è in grado di fornire in uscita una corrente capace di azionare i motori per questo abbiamo usato un ponte H integrato, l’SN754410. VCC VCC D1 D3 J1A 1A 2A D2 D4 Motore sinistro U5 2 7 10 15 1 9 16 V motore 8 1A 2A 3A 4A 1Y 2Y 3Y 4Y 1/2EN 3/4EN GND GND VCC1 VCC2 GND GND 3 6 11 14 4 5 12 13 VCC VCC D5 D7 J2A 1A 2A SN754410 D6 D8 Motore destro In questo modo i motori possono assorbire fino a 500mA (nel nostro caso ne utilizzeremo molti meno). Come si vede dallo schema,l’integrato non presenta i diodi interni per questo abbiamo provveduto a metterli esternamente e sono di tipo schottky, cioè diodi veloci. I transistor presenti nello schema funzionano in modalità on-off, si attivano a coppie rispettivamente T1 con T3 e T2 conT4. 6 Telaio: Il telaio e le ruote sono in alluminio di spessore 4mm Il telaio: La ruota: Dopo aver fatto il disegno a computer abbiamo realizzato i pezzi utilizzando il metodo del taglio laser. Eventuali sbavature sono state rimosse con carta vetrata. Controllo: 7 Il controllo è stato effettuato tramite PIC18F4520. Presenta 40pin, funziona con un alimentazione di 5V ed ha in oscillatore interno, nel nostro caso lo abbiamo scelto da 1Mhz. VCC U4 31 VSS MCLR/Vpp/RE3 RB7/KBI3/PGD RA0/AN0 RB6/KBI2/PGC RA1/AN1 RB5/KBI1/PGM RA2/AN2/VREF-/CVREF RB4/KBI0/AN11 RA3/AN3/VREF+ RB3/AN9/CCP2 RA4/TOCKI/C1OUT RB2/INT2/AN8 RA5/AN4/SS/HLVDIN/C2OUT RB1/INT1/AN10 RE0/RD/AN5 RB0/INT0/FLT0/AN12 RE1/WR/AN6 RD7/PSP7/P1D RE2/CS/AN7 RD6/PSP6/P1C OSC1/CLKI/RA7 RD5/PSP5/P1B OSC2/CLKO/RA6 RD4/PSP4 RC0/T1OSO/T13CKI RC7/RX/DT RC1/T1OSI/CCP2 RC6/TX/CK RC2/CCP1/P1A RC5/SD0 RC3/SCK/SCL RC4/SDI/SDA RD0/OSP0 RD3/PSP3 RD1/PSP1 RD2/PSP2 12 1 2 3 4 5 6 7 8 9 10 13 14 15 16 17 18 19 20 VDD Ldx LED 32 VCC 11 Lsx LED 1K R8 VDD 1K R7 VSS VCC 40 39 38 37 36 35 34 33 30 29 28 27 26 25 24 23 22 21 PIC18F4520 Impostazione Ingressi/Uscite: RA0 = LED destro RA1 = LED sinistro RB0/RB1 = motore avanti RB2/RB3 = motore indietro RB5 = ingresso sensore sinistro RB6 = ingresso sensore centrale RB7 = ingresso sensore destro RC1 = enable 1 RC2 = enable 2 8 L=α*R L = LI αI * RI = α * R LI = αI * RI αI = α * (R / RI) Per ottenere la distanza in giri: G [giri] = αI / (2 * π) Il numero di giri al secondo è dato dalla formula: Gs = 7/60 = 0,12 giri/s Per trovare il tempo necessario per compiere un determinato angolo: T = G / Gs Moltiplicando il tempo trovato per 25 otteniamo il valore del vettore per avere la rotazione desiderata: Vett = T * 25 Il numero 25 corrisponde al numero di impulsi che il PIC che compie in un secondo. Il vettore, ad ogni rotazione, assume in ordine i 6 valori diversi; in questo modo segue un percorso casuale. Angolo di rotazione 90° 135° 22,5° 180° 45° 270° Valore vettore 52 78 13 104 26 156 Numero vettore 0 1 2 3 4 5 Esempio con α = π / 2: G = (π / 2) / (2 * π) = 0,25 giri Gs = 7/60 = 0,12 giri/s T = 0,25 / 0,12 = 2,08 s Vett = 2,08 * 25 = 52 9 Programma: *************************************************************** * DISCOROBOT * * Tre sensori collegati a RB5,RB6,RB7 in ingresso * RB0,RB1,RB2,RB3 in uscita per controllo motori * 2 LED collegati a PORTA * RC1 e RC2 collegati agli enable del ponte H * *************************************************************** */ #include <p18cxxx.h> #include <p18f4520.h> #include <stdio.h> #include <delays.h> //Prototipo funzione gestione interrupt void ISR(void); //Prototipi funzioni programma principale void LedAvanti(void); void LedIndietro(void); void LedSinistra(void); void LedDestra(void); void Avanti(void); void Indietro(void); void Destra(int ritardo); void Sinistra(int ritardo); void Ferma(void); int Tempo(void); int vett_tempi[6]={52,78,13,104,26,156}; int i=0; //variabile per l'angolo di rotazione della macchina #pragma code ISR=0x08 void high_interrupt (void){ _asm GOTO ISR _endasm } #pragma code #pragma interrupt ISR void ISR(void){ 10 //Programma per la gestione dell'interrupt INTCONbits.RBIE=0; //se uno dei tre sensori va a 0 la macchina si ferma e chiama le varie funzioni a seconda del caso if(PORTBbits.RB7==0 || PORTBbits.RB6==0 || PORTBbits.RB5==0){ Ferma(); if(PORTBbits.RB7==0){ Indietro(); Sinistra(Tempo()); } else{ if(PORTBbits.RB6==0){ Indietro(); Sinistra(Tempo()); } else{ if(PORTBbits.RB5==0){ Indietro(); Destra(Tempo()); } } } } Ferma(); Avanti(); INTCONbits.RBIF=0; INTCONbits.RBIE=1; } void main(void) { //Imposto frequenza oscillatore ad 1 MHz OSCCONbits.IRCF2=1; OSCCONbits.IRCF1=0; OSCCONbits.IRCF0=0; //Abilito modalità di interruzione RCONbits.IPEN=0; //Abilito interrupt INTCONbits.GIE=1; INTCONbits.PEIE=1; 11 TRISB = 0xF0; TRISA = 0x00; TRISC = 0x00; LATA = 0x00; Avanti(); //RB0-RB3 -> uscite , RB4-RB7 -> ingressi //PORTA in uscita //PORTC in uscita //Abilito interrupt su PORTB INTCONbits.RBIE=1; ripeti: //ciclo attesa interrupt Nop(); goto ripeti; } void Avanti(void){ LedAvanti(); LATC=0x06; //enable del ponte H attivi LATB=0b00001001; //motore destro e sinistro avanti } void Ferma(void){ LATB=LATB^LATB; //Fermo i motori LATC=LATC^LATC; //Stacco gli ENABLE del SN754410 Delay10KTCYx(13); //Aspetto 0.5 secondi } void Destra(int ritardo){ LedDestra(); LATB=0b00001010; //motore destro -> indietro , motore sinistro -> avanti LATC=0x06; //enable del ponte H attivi Delay10KTCYx(ritardo); } void Sinistra(int ritardo){ LedSinistra(); LATB=0b00000101; //motore destro -> avanti , motore sinistro -> indietro LATC=0x06; //enable del ponte H attivi Delay10KTCYx(ritardo); } void Indietro(void){ LedIndietro(); LATB=0b00000110; //motore destro e sinistro indietro LATC=0x06; //enable del ponte H attivi 12 //Continua ad andare indietro finchè tutti i sensori non sono attivi do{ Nop(); }while(PORTBbits.RB7==0 || PORTBbits.RB6==0 || PORTBbits.RB5==0); Ferma(); } void LedAvanti(void){ LATAbits.LATA0=0; // movimento avanti --> LED spenti LATAbits.LATA1=0; } void LedIndietro(void){ LATAbits.LATA0=1; // movimento indietro --> LED accesi LATAbits.LATA1=1; } void LedDestra(void){ LATAbits.LATA0=0; // movimento a destra --> LED destro acceso LATAbits.LATA1=1; } void LedSinistra(void){ LATAbits.LATA0=1; // movimento a sinistra --> LED sinistro acceso LATAbits.LATA1=0; } //funzione che permette di cambiare l'angolo di rotazione del robot int Tempo(void){ int a; a=vett_tempi[i]; if(i==5) i=0; else i++; return a; } 13 Conclusioni: Nel complesso il progetto è stato abbastanza impegnativo, infatti ci ha impegnato per buona parte dell’anno. Tuttavia ci riteniamo soddisfatti in quanto siamo riusciti a portare a termine il progetto come l’avevamo concepito inizialmente. Bibliografia Libri: • E. AMBROSINI, I. PERLASCA, “L’elettronica Applicazioni” - Tramontana Siti Internet: • • https://it.wikipedia.org/wiki/Automazione http://www.dei.unipd.it/corsi/automazione/storia.html Appunti: Inoltre abbiamo consultato anche gli appunti presi durante le lezioni. 14