Line 4... |
Line 4... |
4 |
// BAUD RATE = 9600 |
4 |
// BAUD RATE = 9600 |
5 |
// ========================== PRIPRAVA DAT A VYSTUPU =========================== |
5 |
// ========================== PRIPRAVA DAT A VYSTUPU =========================== |
6 |
// pomocne konstanty |
6 |
// pomocne konstanty |
7 |
#define LEFT 0 |
7 |
#define LEFT 0 |
8 |
#define RIGHT 1 |
8 |
#define RIGHT 1 |
9 |
#define BLACK 0 |
- |
|
10 |
#define WHITE 255 |
- |
|
11 |
|
9 |
|
12 |
// regulator |
10 |
// regulator |
13 |
#define CONP 2 // konstanta pro proporcionalni regulator (2) |
11 |
#define CONP 2 // konstanta pro proporcionalni regulator (2) |
14 |
#define CONI 45 // konstanta pro integracni regulator *0,01 (45) |
12 |
#define CONI 45 // konstanta pro integracni regulator *0,01 (45) |
15 |
#define COND 20 // konstanta pro derivacni regulator *0,01 (20) |
13 |
#define COND 20 // konstanta pro derivacni regulator *0,01 (20) |
Line 81... |
Line 79... |
81 |
#define BUMPR input(PIN_D7) |
79 |
#define BUMPR input(PIN_D7) |
82 |
|
80 |
|
83 |
// ============================= NOUZOVE SENZORY =============================== |
81 |
// ============================= NOUZOVE SENZORY =============================== |
84 |
#define LINEL 0 // analogovy kanal pro levy senzor |
82 |
#define LINEL 0 // analogovy kanal pro levy senzor |
85 |
#define LINER 1 // analogovy kanal pro pravy senzor |
83 |
#define LINER 1 // analogovy kanal pro pravy senzor |
86 |
#define BLUE_LEV 200 // rozhodovaci uroven (zmereno 0 - cerna, 255 cerna) |
84 |
#define WHITE 100 // rozhodovaci uroven pro nouzove senzory |
- |
|
85 |
|
87 |
int8 line_l; // uklada hodnotu leveho senzoru |
86 |
int8 line_l; // uklada hodnotu leveho senzoru |
88 |
int8 line_r; // uklada hodnotu praveho senzoru |
87 |
int8 line_r; // uklada hodnotu praveho senzoru |
89 |
|
88 |
|
90 |
// ================================ DALKOMER =================================== |
89 |
// ================================ DALKOMER =================================== |
91 |
#define SHARP 2 // analogovy kanal pro SHARP |
90 |
#define SHARP 2 // analogovy kanal pro SHARP |
- |
|
91 |
#define PROBLEM 40 // rozhodovaci uroven, kdy hrozi prekazka |
92 |
#define BLOCK 300 // rozhodovaci uroven, kdy je prekazka |
92 |
#define BLOCK 70 // rozhodovaci uroven, kdy je jiste prekazka |
- |
|
93 |
#define DANGER 200 // je urcite prekazka? |
93 |
|
94 |
|
- |
|
95 |
int8 p_count; |
94 |
int8 sharp_lev; // uklada hodnotu sharp |
96 |
int8 sharp_lev; // uklada hodnotu sharp |
95 |
|
97 |
|
96 |
// ================================== MOTORY =================================== |
98 |
// ================================== MOTORY =================================== |
97 |
#define LMF PIN_D0 |
99 |
#define LMF PIN_D0 |
98 |
#define LMB PIN_D1 |
100 |
#define LMB PIN_D1 |
Line 284... |
Line 286... |
284 |
line_l=read_adc(); |
286 |
line_l=read_adc(); |
285 |
set_adc_channel(LINER); // cti pravy nouzovy senzor |
287 |
set_adc_channel(LINER); // cti pravy nouzovy senzor |
286 |
delay_us(10); |
288 |
delay_us(10); |
287 |
line_r=read_adc(); |
289 |
line_r=read_adc(); |
288 |
} |
290 |
} |
- |
|
291 |
|
- |
|
292 |
// ================================= DALKOMER ================================= |
- |
|
293 |
|
- |
|
294 |
void read_sharp() // cteni z dalkomeru |
- |
|
295 |
{ |
- |
|
296 |
set_adc_channel(SHARP); // cteni z dalkomeru |
- |
|
297 |
delay_us(10); |
- |
|
298 |
sharp_lev=read_adc(); // ulozeni hodnoty |
- |
|
299 |
} |
289 |
|
300 |
|
290 |
// ================================== PIPAK ==================================== |
301 |
// ================================== PIPAK ==================================== |
291 |
|
302 |
|
292 |
void beep(int16 period,int16 length) |
303 |
void beep(int16 period,int16 length) |
293 |
{ |
304 |
{ |
Line 453... |
Line 464... |
453 |
|
464 |
|
454 |
// ================================ DIAGNOSTIKA ================================ |
465 |
// ================================ DIAGNOSTIKA ================================ |
455 |
|
466 |
|
456 |
void diag() // diagnostika - vypis senzoru s moznosti prepnuti na test motoru |
467 |
void diag() // diagnostika - vypis senzoru s moznosti prepnuti na test motoru |
457 |
{ |
468 |
{ |
458 |
read_blue_sensors(); |
469 |
read_blue_sensors(); // cteni nouzovych senzoru |
459 |
read_olsa(); |
470 |
read_sharp(); // cteni dalkomeru |
- |
|
471 |
read_olsa(); // cteni z optickeho radkoveho senzoru |
460 |
olsa_position(); |
472 |
olsa_position(); |
461 |
printf("LEVA: %u \t",line_l); // tiskne z leveho senzoru |
473 |
printf("LEVA: %u \t",line_l); // tiskne z leveho senzoru |
462 |
printf("PRAVA: %u \t",line_r); // tiskne z praveho senzoru |
474 |
printf("PRAVA: %u \t",line_r); // tiskne z praveho senzoru |
- |
|
475 |
printf("SHARP: %u \t",sharp_lev); // tiskne z dalkomeru |
463 |
printf("POLOHA: %u\t",position); // tiskne pozici OLSA |
476 |
printf("POLOHA: %u\t",position); // tiskne pozici OLSA |
464 |
printf("L_NARAZ: %u \t",BUMPL); // leve tlacitko narazniku |
477 |
printf("L_NARAZ: %u \t",BUMPL); // leve tlacitko narazniku |
465 |
printf("P_NARAZ: %u \r\n",BUMPR); // prave tlacitko narazniku |
478 |
printf("P_NARAZ: %u \r\n",BUMPR); // prave tlacitko narazniku |
466 |
if(BUMPL&&BUMPR) // po zmacknuti stran narazniku spusti test motoru |
479 |
if(BUMPL&&BUMPR) // po zmacknuti stran narazniku spusti test motoru |
467 |
{ |
480 |
{ |
Line 505... |
Line 518... |
505 |
// ============================== HLAVNI SMYCKA ================================ |
518 |
// ============================== HLAVNI SMYCKA ================================ |
506 |
|
519 |
|
507 |
void main() |
520 |
void main() |
508 |
{ |
521 |
{ |
509 |
printf("POWER ON \r\n"); |
522 |
printf("POWER ON \r\n"); |
510 |
// NASTAVENI > provede se pouze pri zapnuti |
523 |
// NASTAVENI > provede se pouze pri zapnuti |
511 |
setup_adc_ports(sAN0-sAN1-sAN2); // aktivní analogové vstupy RA0, RA1 a RA2 |
- |
|
512 |
setup_adc(ADC_CLOCK_INTERNAL); // interni hodniny pro AD prevodnik |
524 |
setup_adc(ADC_CLOCK_INTERNAL); // interni hodniny pro AD prevodnik |
- |
|
525 |
setup_adc_ports(ALL_ANALOG); // aktivní analogové vstupy RA0, RA1 a RA2 |
513 |
setup_spi(SPI_SS_DISABLED); |
526 |
setup_spi(SPI_SS_DISABLED); |
514 |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); |
527 |
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); |
515 |
setup_timer_1(T1_DISABLED); |
528 |
setup_timer_1(T1_DISABLED); |
516 |
setup_timer_2(T2_DIV_BY_16,255,1); // casovac pro PWM |
529 |
setup_timer_2(T2_DIV_BY_16,255,1); // casovac pro PWM |
517 |
setup_ccp1(CCP_PWM); // povoli PWM na pinu RC2 |
530 |
setup_ccp1(CCP_PWM); // povoli PWM na pinu RC2 |
Line 520... |
Line 533... |
520 |
setup_vref(FALSE); |
533 |
setup_vref(FALSE); |
521 |
l_motor_off(); // vypne levy motor |
534 |
l_motor_off(); // vypne levy motor |
522 |
r_motor_off(); // vypne pravy motor |
535 |
r_motor_off(); // vypne pravy motor |
523 |
olsa_reset(); |
536 |
olsa_reset(); |
524 |
olsa_setup(); |
537 |
olsa_setup(); |
525 |
beep(100,500); // pipni pri startu |
538 |
beep(350,300); // pipni pri startu |
526 |
printf("OK! \r\n"); |
539 |
printf("OK! \r\n"); |
527 |
delay_ms(500); |
540 |
delay_ms(500); |
528 |
printf("VYBRAT MOD... \r\n"); |
541 |
printf("VYBRAT MOD... \r\n"); |
529 |
// ============================ HLAVNI CAST PROGRAMU =========================== |
542 |
// ============================ HLAVNI CAST PROGRAMU =========================== |
530 |
while(true) |
543 |
while(true) |
Line 547... |
Line 560... |
547 |
// ================================ DIAGNOSTIKA ================================ |
560 |
// ================================ DIAGNOSTIKA ================================ |
548 |
if(BUMPL) |
561 |
if(BUMPL) |
549 |
{ |
562 |
{ |
550 |
output_low(LED1); |
563 |
output_low(LED1); |
551 |
output_high(LED2); |
564 |
output_high(LED2); |
552 |
beep(100,500); |
565 |
beep(200,500); |
553 |
while(true) |
566 |
while(true) |
554 |
{ |
567 |
{ |
555 |
diag(); |
568 |
diag(); |
556 |
} |
569 |
} |
557 |
} |
570 |
} |
558 |
// =============================== SLEDOVANI CARY ============================== |
571 |
// =============================== SLEDOVANI CARY ============================== |
559 |
if(BUMPR) // spusteni hledani pravym naraznikem |
572 |
if(BUMPR) // spusteni hledani pravym naraznikem |
560 |
{ |
573 |
{ |
561 |
output_low(LED2); |
574 |
output_low(LED2); |
562 |
output_high(LED1); |
575 |
output_high(LED1); |
563 |
beep(100,500); |
576 |
beep(300,500); |
564 |
while(true) |
577 |
while(true) |
565 |
{ |
578 |
{ |
566 |
old_position=position; // zaznamena predhozi polohu cary |
579 |
old_position=position; // zaznamena predhozi polohu cary |
567 |
read_olsa(); // precte a ulozi hodnoty z olsa |
580 |
read_olsa(); // precte a ulozi hodnoty z olsa |
568 |
olsa_position(); // vyhodnoti pozici cary |
581 |
olsa_position(); // vyhodnoti pozici cary |
569 |
read_blue_sensors(); // cte nouzove senzory |
582 |
read_blue_sensors(); // cte nouzove senzory |
- |
|
583 |
read_sharp(); // cte dalkomer |
570 |
if(position==0) // pokud neni videt cara |
584 |
if(position==0) // pokud neni videt cara |
571 |
{ |
585 |
{ |
572 |
position=old_position; // nastav predchozi pozici |
586 |
position=old_position; // nastav predchozi pozici |
573 |
gap++; // pocita, jak dlouho neni videt cara |
587 |
gap++; // pocita, jak dlouho neni videt cara |
574 |
} |
588 |
} |
Line 576... |
Line 590... |
576 |
{ |
590 |
{ |
577 |
gap=0; // gap je roven nule |
591 |
gap=0; // gap je roven nule |
578 |
} |
592 |
} |
579 |
if(gap>space) // cara neni urcite videt |
593 |
if(gap>space) // cara neni urcite videt |
580 |
{ |
594 |
{ |
581 |
if(line_l==BLACK) // cara videna levym modrym senzorem |
595 |
if(line_l<WHITE) // cara videna levym modrym senzorem |
582 |
{ |
596 |
{ |
583 |
position=1; |
597 |
position=1; |
584 |
} |
598 |
} |
585 |
if(line_r==BLACK) // cara videna pravym modrym senzorem |
599 |
if(line_r<WHITE) // cara videna pravym modrym senzorem |
586 |
{ |
600 |
{ |
587 |
position=99; |
601 |
position=99; |
588 |
} |
602 |
} |
589 |
} |
603 |
} |
590 |
calc_error(); |
604 |
calc_error(); |
591 |
calc_regulator(); |
605 |
calc_regulator(); |
592 |
//printf("regulator: %u\r\n",reg_out); |
606 |
//printf("regulator: %u\r\n",reg_out); |
593 |
if(position<50) |
607 |
if(position<50) // prepocet regulatoru pro motory, pokud je cara vlevo |
594 |
{ |
608 |
{ |
595 |
lm_speed=SPD_LO-reg_out; |
609 |
lm_speed=SPD_LO-reg_out; |
596 |
rm_speed=SPD_HI+reg_out; |
610 |
rm_speed=SPD_HI+reg_out; |
597 |
} |
611 |
} |
598 |
if(position==50) |
612 |
if(position==50) // nastaveni rychlosti, pokud je cara uprostred |
599 |
{ |
613 |
{ |
600 |
lm_speed=SPD_MAX; |
614 |
lm_speed=SPD_MAX; |
601 |
rm_speed=SPD_MAX; |
615 |
rm_speed=SPD_MAX; |
602 |
} |
616 |
} |
603 |
if(position>50) |
617 |
if(position>50) // prepocet regulatoru pro motory, pokud je cara vpravo |
604 |
{ |
618 |
{ |
605 |
lm_speed=SPD_HI+reg_out; |
619 |
lm_speed=SPD_HI+reg_out; |
606 |
rm_speed=SPD_LO-reg_out; |
620 |
rm_speed=SPD_LO-reg_out; |
607 |
} |
621 |
} |
- |
|
622 |
if(sharp_lev>PROBLEM) // zachycen odraz na dalkomeru |
- |
|
623 |
{ |
- |
|
624 |
p_count++; // pocitej, jak dlouho vidis odraz |
- |
|
625 |
if(sharp_lev>BLOCK) // odraz je nebezpecne blizko |
- |
|
626 |
{ |
- |
|
627 |
lm_speed=0; |
- |
|
628 |
rm_speed=0; |
- |
|
629 |
} |
- |
|
630 |
if(p_count>DANGER) // zjistuje, zda se nejedna o nahodny odraz |
- |
|
631 |
{ |
- |
|
632 |
lm_speed=0; |
- |
|
633 |
rm_speed=0; |
- |
|
634 |
} |
- |
|
635 |
} |
- |
|
636 |
else // pokud jiz neni detekoven odraz, vynuluj pocitadlo |
- |
|
637 |
{ |
- |
|
638 |
p_count=0; |
- |
|
639 |
} |
608 |
l_motor_fwd(lm_speed); |
640 |
l_motor_fwd(lm_speed); |
609 |
r_motor_fwd(rm_speed); |
641 |
r_motor_fwd(rm_speed); |
610 |
} |
642 |
} |
611 |
} |
643 |
} |
612 |
} |
644 |
} |
613 |
} |
645 |
} |
614 |
|
646 |
|