Joonejälgimise robotAutor: Raivo Sell Käesolev õpiobjekt tutvustab joonejälgimise robotit, mida saab ehitada Robootika Kodulabori baasil.
Joonejälgija robot on tüüpiline robootika rakendus õpilastele, kes soovivad rakendada oma oskusi integreeritud süsteemi loomiseks. Joonejälgimise roboti ehitamiseks on vaja liikuvat alusplatvormi, jooneandurite komplekti ja mikrokontrollersüsteemi, milleks antud juhul on Robootika Kodulabor. ![]() Õpiobjekti nimi: Joonejälgimise robotÕpiväljundid:Pärast mooduli läbimist õpilane:
Kasutusjuhend:
Õpetatav osa: Lugeda teoreetilist ülevaadet enne riistvara reaalset ühendamist ja pingestamist. Vaadata juhendeid korrektse riistvara käsitlemise tagamiseks. Õpitu kinnistamiseks tuleb praktilised näited reaalselt läbi teha. Seoste loomine: Läbi õppejuhendite ja sõnalise selgituse järgimise. Kinnistav osa: Iseseisev praktika reaalse riistvarakomplekti baasil. TEOREETILINE OSA
Järgnev näide põhineb lihtsal platvormil MRB ja Robootika Kodulabori moodulitel. Vajalikud komponendid:
JooneandurJoone tuvastamiseks kasutatakse andurit, millel on ühes korpuses infrapuna ehk IR LED ja infrapuna valgust läbilaskva filtriga fototransistor. Anduri tööpõhimõte seisneb IR valguse peegeldumises fototransistori valgelt ja selle neeldumises mustalt pinnalt. Antud projektis kasutame infrapuna andurkomplekti QTR-8A, millel on kokku 8 joonejälgimise andurit. Andurikomplektilt on võimalik mehaaniliselt eraldada 7. ja 8. andur nii, et tekib kaks toimivat andurplaati - üks kahe anduriga ja teine kuue anduriga. Antud näites kasutamegi kuue anduriga andurikomplekti. Andurplaadi toitepinge on 5 V ja optimaaalne töö kõrgus 3 mm. Anduri väljundpinge suureneb, mida suurem on IR valguse neelduvus. Seda pinget mõõdetakse kontrolleri analoog-digitaal muunduriga. Eraldada lõiketangide abil joonejälgimise andur komplektilt 2 viimast ehk 7 ja 8 andurid mööda punktiirjoont. Jooda piikriba anduri külge. Valmista kaablid, mis ühendaksid andurit ja Kodulabori moodulit. Valmista CNC pingi abil robotplatvormile sobiv vaheplaat. Muuda roboti põhja anduri ava selliselt nagu näidatud joonisel. KoostamineKinnita robotplatvormi komplektis olevate lühemate kruvidega mootorid põhja külge, nii et mootorite toitejuhtmed jääksid üles. Kinnita andur M2 poltide ja mutritega nii, et anduripaat jääks roboti põhja alla, vajadusel kasutada seibe. Soovitatav on kasutades isoleerteipi või selle puudumisel paberit isolatsioonikihina trükkplaadi ja roboti kere vahel, et vältida juhuslikke lühiseid ning anduriplaadi vigastamist. Kinnita valged puksid robotiplatvormis olevate pikemate poltidega. Vaheplaadi ja roboti platvormi vahele mahub kergelt surudes 2×3 AA akupakk. Ühenda juhtmed. Oled edukalt lõpetanud roboti koostamise. Joonejälgija üks võimalikest tarkvaralistest lahendustest on andurplaadil olevate andurite parema ja vasaku poole võrdlemine ning selle järgi otsustada roboti käitumine. Robot peab keerama sinnapoole, mille anduri poole väärtus on suurem. Kui anduri pooled on võrdsed siis robot sõidab otse. Juhul, kui kumbki andur ei näe joont, peab jätma meelde, millise anduriga nähti joont enne selle kaotamist (andur 1 või 6). NÄITEKOOD#define F_CPU 14745600 #define PAREM_MT 0 #define VASAK_MT 1 #include <homelab/pin.h> #include <homelab/delay.h> #include <homelab/module/lcd_gfx.h> #include <homelab/module/motors.h> #include <homelab/adc.h> #include <stdio.h> #include <avr/io.h> pin led_red = PIN(C, 5); pin led_yellow = PIN(C, 4); pin led_green = PIN(C, 3); static inline void Init(); int main(void) { uint16_t line = 0; //Joone asukoha muutuja uint16_t threshold = 500; //Väärtus, mille järgi otsustatakse, kas on joon char text[100]; const uint8_t speed = 100; //Maksimaalne sõidukiirus Init(); while(1) { // Kirjutab ekraanile teksti ning ADC väärtused lcd_gfx_clear (); sprintf(text, "line: %d",line); lcd_gfx_write_string (text); lcd_gfx_goto_char_xy (0,1); sprintf(text, "ADC0: %d",adc_get_value (0)); lcd_gfx_write_string (text); lcd_gfx_goto_char_xy (0,2); sprintf(text, "ADC1: %d",adc_get_value (1)); lcd_gfx_write_string (text); lcd_gfx_goto_char_xy (0,3); sprintf(text, "ADC2: %d",adc_get_value (2)); lcd_gfx_write_string (text); lcd_gfx_goto_char_xy (0,4); sprintf(text, "ADC3: %d",adc_get_value (3)); lcd_gfx_write_string (text); // Loe jooneandureid for(uint8_t sensor = 0; sensor < 4;sensor++) { if(adc_get_value(sensor) > threshold) bit_set(line,sensor); else bit_clear(line,sensor); } // Kas joon on all? if(line) { pin_set (led_green); pin_set (led_red); pin_set (led_yellow); //Joon on keskmiste andurite all if(bit_is_set(line,1) && bit_is_set(line,2)) { dcmotor_drive_pwm(PAREM_MT, 1,speed); dcmotor_drive_pwm(VASAK_MT,-1,speed); pin_clear(led_yellow); } //Joon on paremate andurite all else if (bit_is_set(line,2) || bit_is_set(line,3)) { dcmotor_drive_pwm(PAREM_MT,-1,speed); dcmotor_drive_pwm(VASAK_MT,-1,speed); pin_clear(led_red); } //Joon on vasakute andurite all else if (bit_is_set(line,0) || bit_is_set(line,1)) { dcmotor_drive_pwm(PAREM_MT, 1,speed); dcmotor_drive_pwm(VASAK_MT, 1,speed); pin_clear(led_green); } } } } static inline void Init() { // Seab LEDid töökorda pin_setup_output(led_red); pin_setup_output(led_yellow); pin_setup_output(led_green); // Lülitab LEDid välja pin_set(led_green); pin_set(led_yellow); pin_set(led_red); // Seab nupud töökorda pin_setup_input_with_pullup(S1); pin_setup_input_with_pullup(S2); pin_setup_input_with_pullup(S3); adc_init(ADC_REF_AVCC, ADC_PRESCALE_8); lcd_gfx_init (); //Mootori seadistamine dcmotor_drive_pwm_init(0, TIMER2_NO_PRESCALE); dcmotor_drive_pwm_init(1, TIMER2_NO_PRESCALE); } LISAMATERJAL
Teoreetilise osa algtekstide autor: Raivo Sell ja Rain Ellermaa |