viernes, 2 de marzo de 2012

MINISUMO


Definición:

- Este proyecto es un robot cuyo objetivo es localizar al robot oponente, ir a por el y tirarlo del tatami.

- Para localizar al otro robot hemos utilizado los sensores CNY70 controlados por unos servo motores. Hemos utilizado el chip L293, según lo que detecten los sensores este integrado va ha hacer que los motores giren adelante o hacia atrás.

- Nuestro proyecto esta controlado por el PIC16F876.

- Hemos utilizado dos sensores para detectar al robot oponente, los GP2D12 que miden la distancia, así vamos ha poder atacar al robot oponente y echarlo del tatami.






#include <16F876A.H>
#device adc=10
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPROTECT
//#include "lcd.c"
#define botoia_1 input(PIN_C6)
#define botoia_2 input(PIN_C7)
#define MI_1 PIN_C0
#define MI_2 PIN_C1
#define MD_1 PIN_C2
#define MD_2 PIN_C3
#define CNY_1 PIN_C4
#define CNY_2 PIN_C5

void ezkerrera (void);
void eskubira (void);
void aurrera (void);
void atzera(void);
void sentsoreak (void);
void geldi (void);

int16 toke_1, toke_2; //1 - ezkerra

/**********************************************************************
EZKERRERA FUNTZIOA: Funtzio honetan sartzen bada, robotak ezkerrera
giratu behar du beste robota aurkitu arte. Aurkitzerakoan ezkerreko
funtziotik aterako da eta aurrera funtzian sartu beharko du.
**********************************************************************/
void ezkerrera (void)
{
   output_high(MI_1); //motorI aurrera 
   output_low(MI_2);  
   output_high(MD_1); //motorD geldi egon
   output_low(MD_2);
}

/*********************************************************************
EZKUBIRA FUNTZIOA: Funtzio honetan sartzen bada, robotak eskubira
giratu behar du beste robota aurkitu arte. Aurkitzerakoan eskubiko
funtziotik aterako da eta aurrera funtzian sartu beharko du.
*********************************************************************/
void eskubira (void)
{
   output_low(MI_1); //motorI aurrera 
   output_high(MI_2); 
   output_low(MD_1); //motorD geldi egon
   output_high(MD_2);   //motor_2_atzera geldi egon
 
 
}

/********************************************************************
AURRERA FUNTZIOA: Funtzio honetan sartzen bada, horrek esan nahi du
beste robota lokalizatu duela. Orduan gure minisumoak aurrera egingo du
bestea bultzatuz. Bestea bistaz galdu badu azkena galdu duen sensorea
dagoen lekuan(ezkerrean edo eskubian) norantza hori artuko du aurkitu arte.
********************************************************************/
void aurrera (void)
{
/*   output_high(MI_1); //motorI aurrera 
   output_low(MI_2); 
   output_low(MD_1); //motorD geldi egon
   output_high(MD_2);   //motor_2_atzera geldi egon
   */
   output_low(MI_1); //motorI aurrera 
   output_high(MI_2); 
   output_high(MD_1); //motorD geldi egon
   output_low(MD_2);
}

/********************************************************************
ATZERA FUNTZIOA: Funtzio honetan sartzen bada, minisumoak tatamiko
zona txuria ikutu duela esan nahi du eta atzera joango da tatamitik ez
ateratzeko.
********************************************************************/
void atzera (void)
{
/*   output_low(MI_1); //motorI aurrera 
   output_high(MI_2); 
   output_high(MD_1); //motorD geldi egon
   output_low(MD_2);
   */
   output_high(MI_1); //motorI aurrera 
   output_low(MI_2); 
   output_low(MD_1); //motorD geldi egon
   output_high(MD_2);   //motor_2_atzera geldi egon
}

/*********************************************************************
GELDI FUNTZIOA: Funtzio honetan sartzen bada, robotak geldirik egon
beharko du, 5 segundu pasa arte. Funtzio hau robota piztu eta jarraian
sartuko da.
*********************************************************************/
void geldi (void)
{
   output_low(MI_1); //motorI aurrera 
   output_low(MI_2); 
   output_low(MD_1); //motorD geldi egon
   output_low(MD_2);
}
/*********************************************************************
FUNTZIO NAGUSIA:
*********************************************************************/
void main (void)
{
   int1 t1=0,t2=0;   //gogoratzeko sentsoreen azken detekzioa
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports (AN0_AN1_AN3);//Configura el PIN_A0 en analogico
//   set_rtcc(0);
 
   geldi();
   delay_ms(5000);   //5 segundu itxaron behar du zerbait egin baino lehen
   if(botoia_1==1)
      ezkerrera();   //ezkerrera funtziora joan
   else
      eskubira();    //eskubira funtziora joan

   while(1)
   {
      set_adc_channel(0);//Especifica que utilizara el canal A0
      delay_us(20);
      toke_1=read_adc();
      delay_us(20);
      set_adc_channel(1);//Especifica que utilizara el canal A1
      delay_us(20);
      toke_2=read_adc();
 
      if(((toke_1>80)&&(toke_2>80))&&((input(CNY_1)==0)&&(input(CNY_2)==0))) //biak detektatu
      {
         aurrera();  // Aurrera funtzioan sartuko da.
         t1=1; t2=1;
      } 
      else if(((toke_1>80)&&(toke_2<80))&&((input(CNY_1)==0)&&(input(CNY_2)==0)))
      {
         ezkerrera();   // Ezkerrera funtzioan sartuko da.
         t1=1; t2=0;
      } 
      else if(((toke_1<80)&&(toke_2>80))&&((input(CNY_1)==0)&&(input(CNY_2)==0)))
      {
         eskubira(); // Eskubira funtzioan sartuko da.
         t1=0; t2=1;
      } 

      else if(((toke_1<80)&&(toke_2<80))&&((input(CNY_1)==0)&&(input(CNY_2)==0)))
      {
            ezkerrera();   // Ezkerrera funtzioan sartuko da.
      }
/*         if((t1==1)&&(t2==0))
            ezkerrera();   // Ezkerrera funtzioan sartuko da.
         else if((t1==0)&&(t2==1))
            eskubira();    // Eskubira funtzioan sartuko da.
      }
*/
      else if((input(CNY_1)==1)||(input(CNY_2)==1))
         atzera();
   }
}

1 comentario: