Úvod › Diskusné Fóra › Fórum › Riešenia od užívateľov
- This topic has 2 odpovede, 3 hlasy, and was last updated pred 7 years by
kenshin.
-
AutorPríspevky
-
-
21. októbra 2014 o 21:15 #407
YrobotZ
KeymasterNávody a zdrojové kódy vytvorené užívateľmi
-
30. decembra 2014 o 14:18 #438
Martin Piala
Účastník (Participant)Dobrý deň,
chcel som si trochu osvojiť použitie ultrazvukového senzoru, ovládanie motorov a použitie tlačítok. Preto som vytvoril pomerne jednoduchý program, v ktorom sa robot vždy “drží” v určitej vzdialenosti od prekážky pred ním. Túto vzdialenosť môžeme meniť pomocou SW2 a SW3. Program funguje tak, že robot si vždy oderia vzdialenosť k objektu pred ním použitím supersonic senzora a na základe toho buď ide dopredu alebo cúva. Ak je v požadovanej vzdialenosti, tak stojí. Na senzor som použil 8-bitový Timer (motory už používali 16-bitový), preto je tam istá nepresnosť pár cm v meraní (cca 4,41 cm).
Tu je kód 🙂#define F_CPU 1000000 #include <avr/io.h> #include <util/delay.h> #include <int_def.h> int Time=0; int distance=30; int Pressed2=0; int Pressed3=0; void init(void) { DDRA|=1<<4|1<<5|1<<6; DDRB|= 1<<6| 1<<7 | 1<<2 | 1<<3; PORTB |= (1<<2)|(1<<3); PORTA|=(1<<5); PORTA|=(1<<6); DDRD = (1<<PD5)|(1<<PD6) | (1<<PD4)|(1<<PD7); //z MOTOR_Tutorial PORTD&=~(1<<PD5)|(1<<PD6) | (1<<PD4)|(1<<PD7); TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<WGM10); TCCR1B = (1<<CS11); OCR1AH = 0; OCR1AL = 0; OCR1BH = 0; OCR1BL = 0; TCCR2|= 1<<CS22|1<<CS21; TCNT2=0; } void echo(void) { _delay_ms(60); PORTA|=1<<4; _delay_us(10); PORTA&=~(1<<4); while (!(PINA & (1<<PA3))); TCNT2 = 0; while (PINA & (1<<PA3)); Time=(256*TCNT2)/58; /*prescaling 256 (presnosť je preto iba na cca 4,41cm, pretože 16bitový Timer je použitý na motory*/ } void motorvpred(int R, int L) { OCR1AL=L; OCR1BL=R; PORTD&=~(1<<6); PORTD|=1<<7; } void motorvzad(int R, int L) { OCR1AL=L; OCR1BL=R; PORTD&=~(1<<7); PORTD|=1<<6; } motorstop() { OCR1AL=0; OCR1BL=0; } void main(void) { init(); while (1) { echo(); if (Time>(distance+20)) { PORTA|=(1<<5); PORTA&=~(1<<6); motorvpred(255,255); } else if (Time>distance) { PORTA|=(1<<5); PORTA&=~(1<<6); motorvpred(90,90); } else if (Time<(distance-10)) { PORTA|=(1<<5); PORTA&=~(1<<6); motorvzad(90,90); //dozadu sa nemôže veľmi rozbiehať, pretože si strhne senzory vpredu :D } else { PORTA|=(1<<6); PORTA&=~(1<<5); motorstop(); } if (bit_is_clear(PINB,2)) { if (distance<200) { distance=distance+10; //zväčšíme vzdialenosť } while (bit_is_clear(PINB,2)); _delay_ms(50); } if (bit_is_clear(PINB,3)) { if (distance>15) { distance=distance-10; //zmenšíme vzdialenosť } while (bit_is_clear(PINB,3)); _delay_ms(50); } } }
-
6. mája 2016 o 21:19 #538
kenshin
Účastník (Participant)frcnul som na svoj git ukazku ako na yrobota v c++ :
https://github.com/michalnand/other_projects/tree/master/yrobot_cpp_demo
treba mat nainstalovane avr-g++
-
-
AutorPríspevky
- Musíte byť prihlásený any ste mohli odpovedať na túto tému