Subversion Repositories svnkaklik

Rev

Rev 2 | Blame | Last modification | View Log | Download

#include "D:\@KAKLIK\programy\PIC_C\robot\tank\main.h"

//motory
#define FR         output_high(PIN_B4);output_low(PIN_B5)  // Vpred
#define FL         output_high(PIN_B6);output_low(PIN_B7)
#define BR         output_high(PIN_B5);output_low(PIN_B4)  // Vzad
#define BL         output_high(PIN_B7);output_low(PIN_B6)
#define STOPR      output_low(PIN_B4);output_low(PIN_B5)
#define STOPL      output_low(PIN_B6);output_low(PIN_B7)

//cidla
#define RSENSOR    1   // Senzory na caru
#define LSENSOR    0
//#define BUMPER     SENSOR_2   // Senzor na cihlu

//human interface
#DEFINE LED        PIN_A2
#DEFINE SOUND_HI   PIN_B2
#DEFINE SOUND_LO   PIN_B3
#include "sound.c"

//program
#define MEZERA     38         // jak se muze jet dlouho bez cary
#define COUVEJ     700         // kolik se ma couvat po detekci diry
#define CIKCAK     40         // kolik se ma jet cik/cak
#define PRES_DIRU  350         // jak predpokladame velkou diru
#define TRESHOLD   50

#define L 0  // left
#define R 1  // right
#define S 2  // straight

int movement;     // smer minuleho pohybu
int line;         // na ktere strane byla detekovana cara
int dira;         // pocitadlo pro nalezeni preruseni cary
int n;            // pomocna promena pro cyklus FOR

void cik_cak()   // Hledani cary
{
  n=CIKCAK/2;       // poprve hned zatoc opacne, nez se jelo pred detekci diry
  switch(movement)  // zmenime smer zataceni
  {
   case L:
        FL;STOPR;          // doprava
        movement=R;        // poznamenej kam jedem
        line=L;            // kdyz prejedem, tak bude cara vlevo
     break;
   case R:
        FR;STOPL;           // doleva
        movement=L;        // poznamenej kam jedem
        line=R;            // kdyz prejedem, tak bude cara vpravo
     break;
  }

  while(true)   // jed cik-cak, dokud nenajdes caru
  {
    set_adc_channel(RSENSOR);
    if (TRESHOLD > read_adc())   // je cara ?
    {
         STOPL;
         STOPR;
         break;
    };
    if (CIKCAK < n++)  // Jedeme uz dost dlouho cik? Pak jed cak.
    {
       n=0;
       STOPL;
       STOPR;
       switch(movement)     // zmenime smer zataceni
       {
         case L:
              FL;          // doprava
              movement=R;        // poznamenej kam jedem
              line=L;            // kdyz prejedem, tak bude cara vlevo
           break;
         case R:
              FR;           // doleva
              movement=L;        // poznamenej kam jedem
              line=R;            // kdyz prejedem, tak bude cara vpravo
           break;
       }
    }
  }
}
void diagnostika()
{
   STOPL;                     //zastav vse
   STOPR;

   FR;                        //pravy pas
   Delay_ms(1000);
   STOPR;
   Delay_ms(1000);
   BR;
   Delay_ms(1000);
   STOPR;
   Delay_ms(1000);

   FL;                        //levy pas
   Delay_ms(1000);
   STOPL;
   Delay_ms(1000);
   BL;
   Delay_ms(1000);
   STOPL;
   Delay_ms(1000);

   FL;                        //oba pasy
   FR;
   Delay_ms(1000);
   STOPL;
   STOPR;
   Delay_ms(1000);
   BL;
   BR;
   Delay_ms(1000);
   STOPL;
   STOPR;
   Delay_ms(1000);

}

void main()
{
  SoundBeep(640,200);                        //beep
  Delay_ms(50);
  SoundBeep(640,200);

  setup_adc_ports(RA0_RA1_RA3_ANALOG);
  setup_adc(ADC_CLOCK_DIV_2);
  Delay_ms(1000); // 1s

  movement=R;
  line=S;
  dira=0;

  //cik_cak();    // toc se, abys nasel caru
  FL; FR;         // vpred

                                                   // Sledovani cary
  while(true)
  {
snimani:
    set_adc_channel(RSENSOR);
    Delay_us(10);
    if (TRESHOLD > read_adc())    // Cara pod pravym senzorem
    {
      dira=0;    // nuluj pocitadlo diry, protoze jsme videli caru
      line=R;    // zaznamenej, kdes videl caru
      FL;FR;
      goto snimani;
    }

    set_adc_channel(LSENSOR);
    Delay_us(10);
    if (TRESHOLD > read_adc())    // Cara pod levym senzorem
    {
      dira=0;    // nuluj pocitadlo diry, protoze jsme videli caru
      line=L;    // zaznamenej, kdes videl caru
      FL;FR;
      goto snimani;
    }

    // oba senzory mimo caru
    if (0==dira) // v prvnim cyklu po ztrate cary zacneme zahybat
                 // v ostatnich cyklech nedelame nic (pro urychleni snimani)
    {
      STOPL;
      STOPR;
      Delay_ms(100);
                           // kdyz nevidis caru, tak jed tam, kdes ji videl naposled
      if(line==L)
      {
        // doleva
        FR;
        movement=L;    // poznamenej kam jedes
      }
      if(line==R)
      {
        // doprava
        FL;
        movement=R;    // poznamenej kam jedes
      }
      dira++;   // zvets pocitadlo diry, aby to pristi cyklus tudy neslo
      goto snimani; // co nejrychleji se vrat na snimani cary
    }

    /*if (MEZERA < dira++)  // nejedeme uz moc dlouho bez cary?
    {
      dira=0;
      switch(movement)  // kam se jelo ?
      {
       case L:
            BR;      // couvej doprava
            Delay_ms(COUVEJ);
            movement=R;
         break;
       case R:
            BL;       // couvej doleva
            Delay_ms(COUVEJ);
            movement=L;
         break;
      }
      STOP();                    // konec couvani
      FL; FR;                  // rovne pres diru
      Delay_ms(PRES_DIRU);
      STOP();
      cik_cak();                // najdi caru
      FR; FL;                  // vpred
    } // dira*/

  } // while(true)

}

/*void objizdka()
{
  BL; BR;                 // zacouvej
  Delay_ms(150);
  STOP();

  cik_cak();               // vyrovnej se na caru
  cik_cak();               // radeji 3x, aby se vyrovnaly setrvacne sily
  cik_cak();

  BL; FR; Delay_ms(220);               // vlevo
  STOP();
  FL; FR; Delay_ms(650);               // rovne
  STOP();
  FL; BR; Delay_ms(220);               // vpravo
  STOP();
  FL; FR; Delay_ms(770);               // rovne
  STOP();
  FL; BR; Delay_ms(210);               // vpravo
  STOP();
  FL; FR;
  Delay_ms(200);                       // kousek rovne
  // rovne, dokud nenarazis na caru
  while(input(RSENSOR));     // pravej senzor, protoze cihla je vpravo
  STOP();
  BL; FR;                         // toc se doleva, dokud nenarazis na caru
  while(input(LSENSOR));     // levej senzor, protoze cara je urcite vlevo
  STOP();
  line=R;      // caru predpokladame vpravo, kdybysme ji prejeli
  dira=0;
  FL; FR;                         // vpred
}*/