| Line 11... |
Line 11... |
| 11 |
// regulator |
11 |
// regulator |
| 12 |
#define CONP 2 // konstanta pro proporcionalni regulator (2) |
12 |
#define CONP 2 // konstanta pro proporcionalni regulator (2) |
| 13 |
#define CONI 45 // konstanta pro integracni regulator *0,01 (45) |
13 |
#define CONI 45 // konstanta pro integracni regulator *0,01 (45) |
| 14 |
#define COND 20 // konstanta pro derivacni regulator *0,01 (20) |
14 |
#define COND 20 // konstanta pro derivacni regulator *0,01 (20) |
| 15 |
|
15 |
|
| 16 |
#define SPD_LO 255 // zaklad pro vypocet rychlosti pomalejsiho motoru (130) |
16 |
#define SPD_LO 250 // zaklad pro vypocet rychlosti pomalejsiho motoru (130) |
| 17 |
#define SPD_HI 255 // zaklad pro vypocetrychlosti rychlejsiho motoru (155) |
17 |
#define SPD_HI 250 // zaklad pro vypocetrychlosti rychlejsiho motoru (155) |
| 18 |
#define SPD_MAX 255 // rychlost po rovince (240) |
18 |
#define SPD_MAX 255 // rychlost po rovince (240) |
| 19 |
|
19 |
|
| 20 |
int8 reg_out; |
20 |
int8 reg_out; |
| 21 |
int8 err1; // odchylka prvni hodnoty |
21 |
int8 err1; // odchylka prvni hodnoty |
| 22 |
int8 err2; |
22 |
int8 err2; |
| Line 24... |
Line 24... |
| 24 |
int8 err4; |
24 |
int8 err4; |
| 25 |
int8 err5; // odchylka posledni hodnoty |
25 |
int8 err5; // odchylka posledni hodnoty |
| 26 |
int8 errp; // prumer chyb |
26 |
int8 errp; // prumer chyb |
| 27 |
|
27 |
|
| 28 |
// mezera |
28 |
// mezera |
| 29 |
#define SPACE 8 // jak dlouho robot smi nic nevidet (8) |
29 |
#define SPACE 10 // jak dlouho robot smi nic nevidet (8) |
| 30 |
#define CONT 20 // kontrast, kdy nic nevidime |
30 |
#define CONT 15 // kontrast, kdy nic nevidime |
| 31 |
|
31 |
|
| 32 |
// univerzalni LED diody |
32 |
// univerzalni LED diody |
| 33 |
#define LED1 PIN_E1 |
33 |
#define LED1 PIN_E1 |
| 34 |
#define LED2 PIN_E0 |
34 |
#define LED2 PIN_E0 |
| 35 |
|
35 |
|
| Line 42... |
Line 42... |
| 42 |
// radkovy senzor |
42 |
// radkovy senzor |
| 43 |
#define SDIN PIN_D4 // seriovy vstup |
43 |
#define SDIN PIN_D4 // seriovy vstup |
| 44 |
#define SDOUT input(PIN_C5) // seriovy vystup |
44 |
#define SDOUT input(PIN_C5) // seriovy vystup |
| 45 |
#define SCLK PIN_D5 // takt |
45 |
#define SCLK PIN_D5 // takt |
| 46 |
|
46 |
|
| 47 |
#define LINE_PX 4 // pocet pixelu pro jiste urceni cary (4) |
- |
|
| 48 |
#define OLSA_LEV 0x60 // rozhodovaci uroven (cca 10 odpovida cerne) (0x10 nebo 0x60) |
- |
|
| 49 |
|
- |
|
| 50 |
// pro komunikaci s OLSA, prvni se posila LSB |
47 |
// pro komunikaci s OLSA, prvni se posila LSB |
| 51 |
int MAIN_RESET[8]={1,1,0,1,1,0,0,0}; // hlavni reset 0x1B |
48 |
int MAIN_RESET[8]={1,1,0,1,1,0,0,0}; // hlavni reset 0x1B |
| 52 |
int SET_MODE_RG[8]={1,1,1,1,1,0,1,0}; // zapis do MODE registru 0x5F |
49 |
int SET_MODE_RG[8]={1,1,1,1,1,0,1,0}; // zapis do MODE registru 0x5F |
| 53 |
int CLEAR_MODE_RG[8]={0,0,0,0,0,0,0,0}; // nulovani MODE registru 0x00 |
50 |
int CLEAR_MODE_RG[8]={0,0,0,0,0,0,0,0}; // nulovani MODE registru 0x00 |
| 54 |
|
51 |
|
| Line 69... |
Line 66... |
| 69 |
int olsa_lseg[51]={0}; // leva cast radky (pixely 0 - 50) |
66 |
int olsa_lseg[51]={0}; // leva cast radky (pixely 0 - 50) |
| 70 |
int olsa_rseg[51]={0}; // prava cast radky (pixely 51 - 101) |
67 |
int olsa_rseg[51]={0}; // prava cast radky (pixely 51 - 101) |
| 71 |
int8 *lp; // ukazatel pro levou polovinu radky |
68 |
int8 *lp; // ukazatel pro levou polovinu radky |
| 72 |
int8 *rp; // ukazatel pro levou polovinu radky |
69 |
int8 *rp; // ukazatel pro levou polovinu radky |
| 73 |
|
70 |
|
| 74 |
int8 contrast; |
71 |
int8 contrast; // rozdil mezi nejsvetlejsim a nejtmavsi mistem |
| 75 |
int8 position; // ulozeni pozice cary |
72 |
int8 position; // ulozeni pozice cary |
| 76 |
int8 old_position; // ulozeni predchozi pozice cary |
73 |
int8 old_position; // ulozeni predchozi pozice cary |
| 77 |
int1 line_sector; // cara je vlevo/vpravo |
74 |
int1 line_sector; // cara je vlevo/vpravo |
| 78 |
int8 gap; // pocita, jak dlouho neni videt cara |
75 |
int8 gap; // pocita, jak dlouho neni videt cara |
| 79 |
|
76 |
|
| Line 82... |
Line 79... |
| 82 |
#define BUMPR input(PIN_D7) |
79 |
#define BUMPR input(PIN_D7) |
| 83 |
|
80 |
|
| 84 |
// ============================= NOUZOVE SENZORY =============================== |
81 |
// ============================= NOUZOVE SENZORY =============================== |
| 85 |
#define LINEL 0 // analogovy kanal pro levy senzor |
82 |
#define LINEL 0 // analogovy kanal pro levy senzor |
| 86 |
#define LINER 1 // analogovy kanal pro pravy senzor |
83 |
#define LINER 1 // analogovy kanal pro pravy senzor |
| 87 |
#define WHITE 100 // rozhodovaci uroven pro nouzove senzory |
84 |
#define WHITE 30 // rozhodovaci uroven pro nouzove senzory |
| 88 |
|
85 |
|
| 89 |
int8 line_l; // uklada hodnotu leveho senzoru |
86 |
int8 line_l; // uklada hodnotu leveho senzoru |
| 90 |
int8 line_r; // uklada hodnotu praveho senzoru |
87 |
int8 line_r; // uklada hodnotu praveho senzoru |
| 91 |
|
88 |
|
| 92 |
// ================================ DALKOMER =================================== |
89 |
// ================================ DALKOMER =================================== |
| Line 468... |
Line 465... |
| 468 |
l_motor_fwd(255); // jed rovne |
465 |
l_motor_fwd(255); // jed rovne |
| 469 |
delay_ms(1000); |
466 |
delay_ms(1000); |
| 470 |
r_motor_bwd(255); // zatoc doprava |
467 |
r_motor_bwd(255); // zatoc doprava |
| 471 |
delay_ms(350); |
468 |
delay_ms(350); |
| 472 |
r_motor_fwd(255); // jed rovne |
469 |
r_motor_fwd(255); // jed rovne |
| 473 |
delay_ms(1500); |
470 |
delay_ms(1000); |
| 474 |
r_motor_bwd(255); // zatoc doprava |
471 |
r_motor_bwd(255); // zatoc doprava |
| 475 |
delay_ms(300); |
472 |
delay_ms(300); |
| 476 |
r_motor_fwd(255); // jed rovne |
473 |
r_motor_fwd(255); // jed rovne |
| 477 |
delay_ms(200); |
474 |
delay_ms(800); |
| 478 |
position=40; |
475 |
position=40; |
| 479 |
} |
476 |
} |
| 480 |
// ================================ DIAGNOSTIKA ================================ |
477 |
// ================================ DIAGNOSTIKA ================================ |
| 481 |
|
478 |
|
| 482 |
void diag() // diagnostika - vypis senzoru s moznosti prepnuti na test motoru |
479 |
void diag() // diagnostika - vypis senzoru s moznosti prepnuti na test motoru |
| Line 604... |
Line 601... |
| 604 |
} |
601 |
} |
| 605 |
else // pokud je videt |
602 |
else // pokud je videt |
| 606 |
{ |
603 |
{ |
| 607 |
gap=0; // gap je roven nule |
604 |
gap=0; // gap je roven nule |
| 608 |
} |
605 |
} |
| - |
|
606 |
if(line_l<WHITE) // cara videna levym modrym senzorem |
| - |
|
607 |
{ |
| - |
|
608 |
position=1; |
| - |
|
609 |
line_sector=LEFT; |
| - |
|
610 |
} |
| 609 |
if(gap>space) // cara neni urcite videt |
611 |
if(line_r<WHITE) // cara videna pravym modrym senzorem |
| - |
|
612 |
{ |
| - |
|
613 |
position=99; |
| - |
|
614 |
line_sector=RIGHT; |
| - |
|
615 |
} |
| - |
|
616 |
if(gap>SPACE) |
| 610 |
{ |
617 |
{ |
| 611 |
if(line_l<WHITE) // cara videna levym modrym senzorem |
618 |
if(line_sector==LEFT) |
| 612 |
{ |
619 |
{ |
| 613 |
position=1; |
620 |
position=1; |
| 614 |
} |
621 |
} |
| 615 |
if(line_r<WHITE) // cara videna pravym modrym senzorem |
622 |
if(line_sector==RIGHT) |
| 616 |
{ |
623 |
{ |
| 617 |
position=99; |
624 |
position=99; |
| 618 |
} |
625 |
} |
| 619 |
} |
626 |
} |
| 620 |
calc_error(); |
627 |
calc_error(); |
| Line 622... |
Line 629... |
| 622 |
//printf("regulator: %u\r\n",reg_out); |
629 |
//printf("regulator: %u\r\n",reg_out); |
| 623 |
if(position<50) // prepocet regulatoru pro motory, pokud je cara vlevo |
630 |
if(position<50) // prepocet regulatoru pro motory, pokud je cara vlevo |
| 624 |
{ |
631 |
{ |
| 625 |
lm_speed=SPD_LO-(2*reg_out); |
632 |
lm_speed=SPD_LO-(2*reg_out); |
| 626 |
rm_speed=SPD_HI; |
633 |
rm_speed=SPD_HI; |
| - |
|
634 |
line_sector=LEFT; |
| 627 |
} |
635 |
} |
| 628 |
if(position==50) // nastaveni rychlosti, pokud je cara uprostred |
636 |
if(position==50) // nastaveni rychlosti, pokud je cara uprostred |
| 629 |
{ |
637 |
{ |
| 630 |
lm_speed=SPD_MAX; |
638 |
lm_speed=SPD_MAX; |
| 631 |
rm_speed=SPD_MAX; |
639 |
rm_speed=SPD_MAX; |
| 632 |
} |
640 |
} |
| 633 |
if(position>50) // prepocet regulatoru pro motory, pokud je cara vpravo |
641 |
if(position>50) // prepocet regulatoru pro motory, pokud je cara vpravo |
| 634 |
{ |
642 |
{ |
| 635 |
lm_speed=SPD_HI; |
643 |
lm_speed=SPD_HI; |
| 636 |
rm_speed=SPD_LO-(2*reg_out); |
644 |
rm_speed=SPD_LO-(2*reg_out); |
| - |
|
645 |
line_sector=RIGHT; |
| 637 |
} |
646 |
} |
| 638 |
if((sharp_lev>PROBLEM)&&(DET_EN)) // zachycen odraz na dalkomeru |
647 |
if((sharp_lev>PROBLEM)&&(DET_EN)) // zachycen odraz na dalkomeru |
| 639 |
{ |
648 |
{ |
| 640 |
p_count++; // pocita, jak dlouho je videt |
649 |
p_count++; // pocita, jak dlouho je videt |
| 641 |
output_low(LED1); |
650 |
output_low(LED1); |