Line 25... |
Line 25... |
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 8 // jak dlouho robot smi nic nevidet (8) |
- |
|
30 |
#define CONT 20 // kontrast, kdy nic nevidime |
30 |
|
31 |
|
31 |
// univerzalni LED diody |
32 |
// univerzalni LED diody |
32 |
#define LED1 PIN_E1 |
33 |
#define LED1 PIN_E1 |
33 |
#define LED2 PIN_E0 |
34 |
#define LED2 PIN_E0 |
34 |
|
35 |
|
Line 68... |
Line 69... |
68 |
int olsa_lseg[51]={0}; // leva cast radky (pixely 0 - 50) |
69 |
int olsa_lseg[51]={0}; // leva cast radky (pixely 0 - 50) |
69 |
int olsa_rseg[51]={0}; // prava cast radky (pixely 51 - 101) |
70 |
int olsa_rseg[51]={0}; // prava cast radky (pixely 51 - 101) |
70 |
int8 *lp; // ukazatel pro levou polovinu radky |
71 |
int8 *lp; // ukazatel pro levou polovinu radky |
71 |
int8 *rp; // ukazatel pro levou polovinu radky |
72 |
int8 *rp; // ukazatel pro levou polovinu radky |
72 |
|
73 |
|
- |
|
74 |
int8 contrast; |
73 |
int8 position; // ulozeni pozice cary |
75 |
int8 position; // ulozeni pozice cary |
74 |
int8 old_position; // ulozeni predchozi pozice cary |
76 |
int8 old_position; // ulozeni predchozi pozice cary |
75 |
int1 line_sector; // cara je vlevo/vpravo |
77 |
int1 line_sector; // cara je vlevo/vpravo |
76 |
int8 gap; // pocita, jak dlouho neni videt cara |
78 |
int8 gap; // pocita, jak dlouho neni videt cara |
77 |
|
79 |
|
Line 87... |
Line 89... |
87 |
int8 line_l; // uklada hodnotu leveho senzoru |
89 |
int8 line_l; // uklada hodnotu leveho senzoru |
88 |
int8 line_r; // uklada hodnotu praveho senzoru |
90 |
int8 line_r; // uklada hodnotu praveho senzoru |
89 |
|
91 |
|
90 |
// ================================ DALKOMER =================================== |
92 |
// ================================ DALKOMER =================================== |
91 |
#define SHARP 2 // analogovy kanal pro SHARP |
93 |
#define SHARP 2 // analogovy kanal pro SHARP |
92 |
#define PROBLEM 50 // rozhodovaci uroven, kdy hrozi prekazka |
94 |
#define PROBLEM 55 // rozhodovaci uroven, kdy hrozi prekazka |
93 |
#define BLOCK 70 // rozhodovaci uroven, kdy je jiste prekazka |
95 |
#define BLOCK 65 // rozhodovaci uroven, kdy je jiste prekazka |
94 |
#define DANGER 40 // pocita, jak dlouho je detekovan problem |
96 |
#define DANGER 10 // pocita, jak dlouho je detekovan problem |
95 |
|
97 |
|
96 |
int8 p_count; |
98 |
int8 p_count; |
97 |
int8 sharp_lev; // uklada hodnotu sharp |
99 |
int8 sharp_lev; // uklada hodnotu sharp |
98 |
|
100 |
|
99 |
// ================================== MOTORY =================================== |
101 |
// ================================== MOTORY =================================== |
Line 201... |
Line 203... |
201 |
{ |
203 |
{ |
202 |
pixel=0; |
204 |
pixel=0; |
203 |
for(cbit=0;cbit<8;cbit++) // cte jednotlive bity (8 bitu - 0 az 7) |
205 |
for(cbit=0;cbit<8;cbit++) // cte jednotlive bity (8 bitu - 0 az 7) |
204 |
{ |
206 |
{ |
205 |
olsa_pulse(); // impulz pro generovani dalsiho bitu |
207 |
olsa_pulse(); // impulz pro generovani dalsiho bitu |
- |
|
208 |
|
206 |
if(SDOUT) // zachycena 1 |
209 |
if(SDOUT) // zachycena 1 |
207 |
{ |
210 |
{ |
208 |
pixel|=1; // zapise do bitu pixelu 1 - OR |
211 |
bit_set(pixel,cbit); // zapise do bitu pixelu 1 - OR |
209 |
} |
212 |
} |
210 |
else // zachycena 0 |
- |
|
211 |
{ |
- |
|
212 |
pixel|=0; // zapise do bitu pixelu 0 - OR |
- |
|
213 |
} |
- |
|
214 |
pixel<<=1; // posune pixel |
- |
|
215 |
} |
213 |
} |
216 |
olsa_pulse(); // generuje stop bit |
214 |
olsa_pulse(); // generuje stop bit |
217 |
if(cpixel<52) // ulozeni do pole |
215 |
if(cpixel<52) // ulozeni do pole |
218 |
{ |
216 |
{ |
219 |
olsa_lseg[lp]=pixel; // leva polovina radky - leve pole |
217 |
olsa_lseg[lp]=pixel; // leva polovina radky - leve pole |
Line 236... |
Line 234... |
236 |
|
234 |
|
237 |
void olsa_position() // vyhodnoti pozici cary |
235 |
void olsa_position() // vyhodnoti pozici cary |
238 |
{ |
236 |
{ |
239 |
int8 searchp; // ukazatel na pole |
237 |
int8 searchp; // ukazatel na pole |
240 |
int8 search; // ulozeni prectene hodnoty |
238 |
int8 search; // ulozeni prectene hodnoty |
241 |
int8 protect_count; // opravdu vidime caru |
239 |
int8 dark; // nejtmavsi pixel |
242 |
position=0; // nuluje pozici, pokud cara neni, ulozena 0 |
240 |
int8 bright; // nejsvetlejsi pixel |
- |
|
241 |
dark=0xff; |
- |
|
242 |
bright=0x00; |
243 |
for(searchp=0;searchp<52;searchp++) // prohlizi levou cast cary |
243 |
for(searchp=0;searchp<52;searchp++) // prohlizi levou cast radky |
244 |
{ |
244 |
{ |
245 |
search=olsa_lseg[searchp]; // vybira pixel |
245 |
search=olsa_lseg[searchp]; // vybira pixel |
246 |
if(search==OLSA_LEV) // cerna nebo bila? |
246 |
if((search<dark)&&(search>0x00)) // porovna pixel s doposud nejtmavsim |
247 |
{ |
- |
|
248 |
protect_count++; // pokud nasleduje cerna, pricte 1 k poctu cernych pixelu |
- |
|
249 |
} |
- |
|
250 |
else |
- |
|
251 |
{ |
247 |
{ |
- |
|
248 |
dark=search; // ulozi nejtmavsi pixel |
252 |
protect_count=0; // pokud nasleduje bila, pocet cernych pixelu vynuluje |
249 |
position=searchp; // ulozi polohu nejtmavsiho pixelu |
253 |
} |
250 |
} |
254 |
if(protect_count>LINE_PX) // vidim caru |
251 |
if((search>bright)&&(search<0xff)) |
255 |
{ |
252 |
{ |
256 |
position=searchp; // zapis presnou pozici |
253 |
bright=search; // ulozi nejsvetlejsi pixel |
257 |
line_sector=LEFT; // cara je v leve polovine |
- |
|
258 |
searchp=55; // ukonci hledani |
- |
|
259 |
} |
254 |
} |
260 |
} |
255 |
} |
261 |
for(searchp=0;searchp<52;searchp++) // prohlizi pravou cast cary |
256 |
for(searchp=0;searchp<52;searchp++) // prohlizi pravou cast radky |
262 |
{ |
257 |
{ |
263 |
search=olsa_rseg[searchp]; // vybira pixel |
258 |
search=olsa_rseg[searchp]; // vybira pixel |
264 |
if(search==OLSA_LEV) |
259 |
if((search<dark)&&(search>0x00)) // porovna pixel s doposud nejtmavsim |
265 |
{ |
260 |
{ |
266 |
protect_count++; // pokud nasleduje cerna, pricte 1 k poctu cernych pixelu |
261 |
dark=search; // ulozi nejtmavsi pixel |
- |
|
262 |
position=(searchp+50); // ulozi polohu nejtmavsiho pixelu |
267 |
} |
263 |
} |
268 |
else |
- |
|
269 |
{ |
- |
|
270 |
protect_count=0; // pokud nasleduje bila, pocet cernych pixelu vynuluje |
- |
|
271 |
} |
- |
|
272 |
if(protect_count>LINE_PX) // vidim caru |
264 |
if((search>bright)&&(search<0xff)) |
273 |
{ |
265 |
{ |
274 |
position=(searchp+50); // zapis presnou pozici |
- |
|
275 |
line_sector=RIGHT; // cara je v prave polovine |
- |
|
276 |
searchp=55; // ukonci hledani |
266 |
bright=search; // ulozi nejsvetlejsi pixel |
277 |
} |
267 |
} |
278 |
} |
268 |
} |
- |
|
269 |
contrast=(bright-dark); |
- |
|
270 |
if(contrast<CONT) |
- |
|
271 |
{ |
- |
|
272 |
position=0; |
- |
|
273 |
} |
279 |
} |
274 |
} |
280 |
|
275 |
|
281 |
// ============================ ZACHRANNE SENZORY ============================== |
276 |
// ============================ ZACHRANNE SENZORY ============================== |
282 |
|
277 |
|
283 |
void read_blue_sensors() // cteni nouzovych senzoru |
278 |
void read_blue_sensors() // cteni nouzovych senzoru |
Line 467... |
Line 462... |
467 |
|
462 |
|
468 |
void detour() // po detekci prekazky zacne objizdeni |
463 |
void detour() // po detekci prekazky zacne objizdeni |
469 |
{ |
464 |
{ |
470 |
l_motor_bwd(255); // zatoc doleva |
465 |
l_motor_bwd(255); // zatoc doleva |
471 |
r_motor_fwd(255); |
466 |
r_motor_fwd(255); |
472 |
delay_ms(500); |
467 |
delay_ms(350); |
473 |
l_motor_fwd(255); // jed rovne |
468 |
l_motor_fwd(255); // jed rovne |
474 |
delay_ms(1000); |
469 |
delay_ms(1000); |
475 |
r_motor_bwd(255); // zatoc doprava |
470 |
r_motor_bwd(255); // zatoc doprava |
476 |
delay_ms(450); |
471 |
delay_ms(350); |
477 |
r_motor_fwd(255); // jed rovne |
472 |
r_motor_fwd(255); // jed rovne |
478 |
delay_ms(1500); |
473 |
delay_ms(1500); |
479 |
r_motor_bwd(255); // zatoc doprava |
474 |
r_motor_bwd(255); // zatoc doprava |
480 |
delay_ms(450); |
475 |
delay_ms(300); |
481 |
r_motor_fwd(255); // jed rovne |
476 |
r_motor_fwd(255); // jed rovne |
482 |
delay_ms(500); |
477 |
delay_ms(200); |
- |
|
478 |
position=40; |
483 |
} |
479 |
} |
484 |
// ================================ DIAGNOSTIKA ================================ |
480 |
// ================================ DIAGNOSTIKA ================================ |
485 |
|
481 |
|
486 |
void diag() // diagnostika - vypis senzoru s moznosti prepnuti na test motoru |
482 |
void diag() // diagnostika - vypis senzoru s moznosti prepnuti na test motoru |
487 |
{ |
483 |
{ |
Line 491... |
Line 487... |
491 |
olsa_position(); |
487 |
olsa_position(); |
492 |
printf("LEVA: %u \t",line_l); // tiskne z leveho senzoru |
488 |
printf("LEVA: %u \t",line_l); // tiskne z leveho senzoru |
493 |
printf("PRAVA: %u \t",line_r); // tiskne z praveho senzoru |
489 |
printf("PRAVA: %u \t",line_r); // tiskne z praveho senzoru |
494 |
printf("SHARP: %u \t",sharp_lev); // tiskne z dalkomeru |
490 |
printf("SHARP: %u \t",sharp_lev); // tiskne z dalkomeru |
495 |
printf("POLOHA: %u\t",position); // tiskne pozici OLSA |
491 |
printf("POLOHA: %u\t",position); // tiskne pozici OLSA |
- |
|
492 |
printf("KONTRAST: %u \t", contrast); // tiskne kontrast z OLSA |
496 |
printf("L_NARAZ: %u \t",BUMPL); // leve tlacitko narazniku |
493 |
printf("L_NARAZ: %u \t",BUMPL); // leve tlacitko narazniku |
497 |
printf("P_NARAZ: %u \r\n",BUMPR); // prave tlacitko narazniku |
494 |
printf("P_NARAZ: %u \r\n",BUMPR); // prave tlacitko narazniku |
498 |
if(BUMPL&&BUMPR) // po zmacknuti stran narazniku spusti test motoru |
495 |
if(BUMPL&&BUMPR) // po zmacknuti stran narazniku spusti test motoru |
499 |
{ |
496 |
{ |
500 |
beep(100,1000); |
497 |
beep(100,1000); |