miércoles, 3 de junio de 2015

Eco-clutch, Shell Eco-Marathonen lehiaketarako enbragearen kontrola

Proiektu hau, Don Bosco ikastetxeko Automozio departamentuari, urtero parte hartu ohi duen Shell Eco-Marathon lehiaketan laguntzeko asmoz sorturikoa da.



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 4116R


Eskema 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