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