Shell Eco-Marathon lehiaketa, urtero ospatu ohi den norgehiagoka bat da eta bertan mundu guztiko ikastetxe eta unibertsitatetako ikaslee hartu ohi dute parte, urte guztian zehar diseinatu eta hobetu duten prototipoarekin. Gure proiektuaren helburua, Automizokoekin batera lan egitea eta beraien zailtasunetan laguntzea izan da, lehiaketan emaitza hobeak lortzeko asmoz.
Shell Eco-Marathon lehiaketaren helburua, litro bat erregairekin ahalik eta kilometro gehien egitean datza eta honetarako autoek ahalik eta arinenak eta aerodinamikoenak izan behar dute. Hau dela eta, auto hauek honela funtzionatzen dute: motorraren bidez komeni zaien abiadura hartzen dute (30-40 km/h) eta ondoren motorra gelditu eta inertziaren bidez jarraitzen dute. Jakina den bezala autoak pixkanaka abiadura galtzen du, eta abiadura hori oso mantxoa denean (10-15 km/h) berriro motorra martxan jartzen dute abiadura egokia hartu arte ondoren berriro ere motorra geldituz.
Hau guztia jakiñik, gure proiektuak bi helburu ditu: autoaren abiaduraren eta motorraren RPM-en arabera enbrage elektromagnetiko bat aktibatu edo desaktibatu eta gidariari autoaren abidura adierazi. Honetarako bi PCB sortu ditugu: PCB nagusia eta PCB erakuslea.
PCB nagusia
PCB erakuslea
Erabilitako materiala
Ondorengo hauek izan dira erabili ditugun materialak. Informazio zabalagoa jasotzeko, egin klik bakoitzaren gainean.
1x PIC 18F2550
2x Display kontrolagailuak 74LS47
2x 7 segmentuko display-ak 7segm
1x Tentsio erreguladorea 7805
2x Array erresistentziak 4116REskema Simulagarria
Lehenik eta behin eskema simulagarri bat egin zen, bertan konponenteen arteko konexioak egin ziren eta honen funtzionamendu egokia egiaztatu zen.
Isis-eko zirkuitu simulagarriaren artxiboak deskargatzeko egin klik hemen.
Simulaziorako eskema egin eta probatu ondoren, bi PCB-en diseinuak egiten hasi ginen. Honetarako, bi eskema desberdin egin behar izan genituen, PCB bakoitzarentzat bat.
PCB nagusiaren diseinurako eskema
PCB nagusiaren diseinurako eskema deskargatzeko egin klik hemen.
PCB erakuslearen diseinurako eskema
PCB erakuslearen diseinurako eskema deskargatzeko egin klik hemen.
Ondoren eskema hauen arabera, PCB-en diseinuak egiteari ekin genion. PCB nagusia bi aurpegikoa egin behar izan zen, izan ere, ez ziren pista guztiak alde batean sartzen, eta aldiz PCB erakuslea simpleagoa zenez, aurpegi batekoa egin genuen. Azpiko irudietan agertzen dira gure PCB-en diseinuak.
PCB nagusiaren diseinua
PCB erakuslearen diseinua
Programazioa
18F2550 PIC-a programatzeko software-a PIC C Compiller izenekoa da eta bertan C lenguaia erabiliz programatzen da. Azpian agertzen da guk erabilitako programa.
#include "D:\ECO SHELL\Firmware\Firm_V3\Eco-clutch.h"
int32 temp1=0, t1; //Buelta baten denbora
int32 temp2=0, t2; //Buelta baten denbora
int16 rpmMotor; //Abiadura RPM-tan MOTORRA
int16 rpmGurpil; //Abiadura RPM-tan GURPILA
float32 a=0; //Hortzetik hortzera dagoen denbora segunduetan, hau da t1-etik t2-ra
float32 b=0; //Hortzetik hortzera dagoen denbora segunduetan, hau da t3-etik t4-ra
float aux_rpm1=0; //Abiadura RPM-tan dezimalekin MOTORRA
float aux_rpm2=0; //Abiadura RPM-tan dezimalekin GURPILA
float aux_abiadura=0;
unsigned int16 Abiadura_be=0,Abiadura_za=0 ; //Abiadura berria eta abiadura zaharra
int8 dec, uni; //Dezenen display-a eta unitarioen display-a
void abiad_kalkulo(void);
void Belozimetroa(void);
#int_EXT
void GurpilBirak(void) //Gurpilaren biren kontagailuaren funtzioa
{
temp1=get_timer1(); //Buelta baten denbora jaso
set_timer1(0); //Timer1 Hasieratu, momentu honetan timer-a kontatzen hasiko da
}
#int_EXT2
void MotorBirak(void) //Motorraren biren kontagailuaren funtzioa
{
temp2=get_timer0(); //Buelta baten denbora
set_timer0(0); //Timer2 Hasieratu, momentu honetan timer-a kontatzen hasiko da
}
void Test(void) //Plaka elikatzean, display-ek ongi funtzionatzen dutela jakiteko funtzioa
{
int i;
for(i=0; i<3; i++) //Display-en segmentu guztiak piztu segundu erdi batez eta denak itzali beste segundu erdi batez. Hau hiru aldiz egingo dugu.
{
int test1 = 8; //Segmentu guztiak pizteko aldagaia
int test2 = 15; //Segmentu guztiak itzaltzeko aldagaia
output_A(test1);//A portutik unitarioko display-aren segmentu guztiak piztu
output_bit(PIN_B4,shift_right(&test1,1,0)); //B portuko 4. pinetik dezenen display-a piztu
output_bit(PIN_B5,shift_right(&test1,1,0)); //B portuko 5. pinetik dezenen display-a piztu
output_bit(PIN_B6,shift_right(&test1,1,0)); //B portuko 6. pinetik dezenen display-a piztu
output_bit(PIN_B7,shift_right(&test1,1,0)); //B portuko 7. pinetik dezenen display-a piztu
delay_ms(500); //Segundu erdiz segmentuak piztuta eduki
output_A(test2);//A portutik unitarioko display-aren segmentu guztiak itzali
output_bit(PIN_B4,shift_right(&test2,1,0));//B portuko 4. pinetik dezenen display-a itzali
output_bit(PIN_B5,shift_right(&test2,1,0));//B portuko 5. pinetik dezenen display-a itzali
output_bit(PIN_B6,shift_right(&test2,1,0));//B portuko 6. pinetik dezenen display-a itzali
output_bit(PIN_B7,shift_right(&test2,1,0));//B portuko 7. pinetik dezenen display-a itzali
delay_ms(500);//Segundu erdiz segmentuak itzalita eduki
}
}
void Belozimetroa(void) //Abiadura display-etan azaltzeko funtzioa
{
dec = Abiadura_be / 10; //Autoaren abiaduraren zenbaki dezena kalkulatu
uni = Abiadura_be % 10; //Autoaren abiaduraren zenbaki unitarioa kalkulatu
output_A(uni); //A portutik zenbaki unitarioa atera, modu binarioan
output_bit(PIN_B4,shift_right(&dec,1,0)); //B portuko 4. pinetik zenbaki dezena atera, binarioan
output_bit(PIN_B5,shift_right(&dec,1,0)); //B portuko 5. pinetik zenbaki dezena atera, binarioan
output_bit(PIN_B6,shift_right(&dec,1,0)); //B portuko 6. pinetik zenbaki dezena atera, binarioan
output_bit(PIN_B7,shift_right(&dec,1,0)); //B portuko 7. pinetik zenbaki dezena atera, binarioan
}
void abiad_kalkulo() //Gurpilaren biren arabera, autoaren abiadura kalkulatzeko funtzioa
{
t1=temp1*8;
b=((t1/1000.0)/1000.0); //Hortzetik hortzerako denbora microsegundutatik segundutara pasatu //3300uS = 0,0033s
aux_rpm2=60.0/b; //Bira kopurua minutuko RPM //60/0,2=300rpm
rpmGurpil=aux_rpm2; //Emaitzari koma kendu eta zenbaki oso bihurtu
aux_abiadura= rpmGurpil*0.075396; //Lortutako RPM-en emaitza, guk aurrez sortutako konstante batekin biderkatu (gurpilaren zirkunferentzia...)
Abiadura_be=aux_abiadura; //Emaitzari koma kendu eta zenbaki oso bihurtu
if( Abiadura_be!=Abiadura_za) //Abiadura berria eta abiadura zaharra desberdinak badira....
{
if (((Abiadura_be - Abiadura_za)<3)||((Abiadura_za - Abiadura_be)<3)) /* Abiadura berria eta zaharraren arteko aldea 3 km/h-ko baino txikiagoa bada...
{ //8 km/h-tik behera arazoak ematen dituenez, abiadura honetatik behera
//Display-ak zeroan jarriko ditugu*/
Belozimetroa(); //Abiadura display-etan azaldu
Abiadura_za=Abiadura_be; //Abiadura zaharrari abiadura berriaren aurreko denbora eman
}
/*else //Else honetan 8km/h baino mantsoago goanez, display-ak zeroan jarriko ditugu
{
Abiadura_za=Abiadura_be; //Abiadura zaharrari abiadura berriaren aurreko denbora eman
Abiadura_be=0; //Display-ak zeroan jartzeko, abiadura zeroan jarri
Belozimetroa(); //Abiadura display-etan azaldu, kasu honetan zero
}*/
}
//}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_8);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT2);
enable_interrupts(GLOBAL);
setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);
Test();
Belozimetroa();
while(TRUE) // TODO: USER CODE!!
{
while(input(PIN_B1)==1) // Etengailua Manuala
{
output_high(PIN_C0);//Enbragea aktibatu
abiad_kalkulo();//Abiadura kalkulatu
printf("Abiadura: %Lu Km/h.\n\r",Abiadura_be);
}
while(input(PIN_B1)==0) // Etengailua automatikoa
{
if(input(PIN_C1)) //Itxaron rpmak 200tik pasa arte (Timerrak gaizki ez neurtzeko)
{
delay_ms(1000);
}
t2=temp2*8;
a=((t2/1000.0)/1000.0); //Hortzetik hortzera dagoen denbora microsegundutatik segundutara pasatu //3300uS = 0,0033s
aux_rpm1=60.0/a; //Bira kopurua minutuko RPM //60/0,2=300rpm
rpmMotor=aux_rpm1; //aux_rpm:float/rpm:int16
abiad_kalkulo();//Abiadura kalkulatu
if ((rpmMotor-rpmGurpil<15)||(rpmGurpil-rpmMotor<15)) // 15 aztertzekoa da
{
output_high(PIN_C0); //Enbragatu
}
else
{
output_low(PIN_C0); //Desenbragatu
}
if(input(PIN_B3))
{
output_low(PIN_C0); //Desenbragatu
// delay_ms(500);
}
printf("Abiadura: %Lu K/h.\n\r",Abiadura_be);
}
}
}
Proiektua osatzeko material eta artxibo guztiak HEMEN eta Tutoriala beheko bideoan.
No hay comentarios:
Publicar un comentario