This is an old revision of the document!
Enne programmeerimist tuleb laadida alla vajalik tarkvara. Atmel Studio on saadaval Atmel kodulehel või Pololu kodulehel. Pololu lingi alt leiab ka Pololu AVR Development Bundle lisapaki, mis sisaldab programmatori draivereid ja teeke 3pi roboti programmeerimiseks. Esimesena tuleb paigaldada Atmel Studio 6 ja seejärel Pololu AVR Development Bundle. Vales järjekorras tarkvara paigaldamisel ei hakka 3pi teegid toimima. Lisainfo tarkvara paigaldamise osas erinevatele operatsioonisüsteemidele Pololu kodulehel. Enne kasutamist tuleb tarkvara seadistada. Esmalt tuleb avada Atmel Studio 6 ja teha uus 3pi projekt (ATmega328p mikrokontroller). Seejärel ülevalt menüüribast valida Build→Build Solution. Kui kõik oli korrektselt seadistaud, siis peaks paremal Solution Explorer aknas Dependencies kausta alla tekkima teekide loetelu. Edasi tuleb seadistada programmaator, et see töötaks Atmel Studio-ga. Selleks eelnevalt programmaator ühendada arvutiga ja avada ülevalt menüüribast Tools→Add Target. Avanevas aknas tuleb valida:
Kui saadaval on mitu COM port-i, siis tuleb Windows Device Manager→Ports(COM & LPT) alt uurida, milline on “Pololu USB AVR Programmer Programming” port. Programmaator on pärast Apply nupu vajutamist seadistatud.
Peale tarkvara seadistamist saab hakata robotit programmeerima. Selleks tuleb esmalt kirjutada roboti programm, see kompileerida ja laadida robotile. Testimiseks võib kasutada allolevaid näiteid, mis on veavabad ja peaks programmeerimiskeskkonna korrektse seadistuse korral probleemivabalt kompilleeruma. Programmi laadimiseks robotile tuleb ühendada programmaator ühelt poolt roboti ISP pistikuga ja teiselt poolt arvuti USB pesaga. Ühenduse saamiseks peab olema 3pi robotil korralikult laetud akud või patareid sees ja robot sisse lülitatud olekus (kasuta Power nuppu). Seejärel hakkab programmaatoril vilkuma oranž LED, mis näitab, et ühendus arvuti ja roboti vahel on olemas.
Programmi kompileerimiseks valida ülevalt Build→Build Solution. Seejärel võtta lahti programmeerimisaken Tools→ Device Programming ja teha järgmised valikud:
Apply vajutamisel kinnitab seadete valikut. Roboti ja arvuti vahelise ühenduse kontrollimiseks vajutada Atmel Studio Device signature nuppu, mis loeb kiibi tunnusnumbrit ja õnnestumise korral näitab all „Reading device ID…OK“. Kui viimast OK sõnumit ei saadud, siis tuleb kontrollida ühendust ja 3pi töölolekut. Programmi laadimiseks tuleb valida Memories ja seal kontrollida Flash lahtris olevat viita. Loodud 3pi projekt peaks asuma „C:\Users\User_name\Documents\Atmel Studio\6.2\Projekti_nimi“ kaustas. Kompilleerimisel tekitab Atmel Studio „.elf“ ja „.hex“ faili, millest üks tuleb laadida roboti mikrokontrollerisse. Need failid asuvad projekti kaustas Projekti_nimi →Debug. Veenduda, et Flash lahtris on õige viit failile ja edasi vajutada Program nuppu Flash lahtri all. Tulemusena laaditakse programm 3pi roboti mikrokontrolleri mällu. Programm hakkab kohe pärast laadimist robotis tööle. Tuleb olla ettevaatlik, kui tehtud programm kasutab suuri mootorite kiirusi.
Kõik programmid peale esimese on koostatud Pololu teeki kasutades. Täpsema info saamiseks on soovituslik põhjalikumalt teeki uurida, et paremini 3pi roboti funktsionaalsust ära kasutada. Teegi kirjeldus on saadaval siit. Harjutuste puhul tuleb lisaks näiteprogrammidele rakendada loogilist mõtlemist, et lahenduseni jõuda. näiteprogrammid ei sisalda kõiki harjutustes vajaminevaid teegi funktsioone.
Ühe mootori juhtimise programm ilma Pololu teegita
#define F_CPU 20000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Taimerite seadistamine TCCR0A |= 0b11000000; TCCR0A |= 0b00110000; TCCR0A |= 0b00000011; TCCR0B |= 0b00000010; // Võrdlusregistrite nullimine OCR0A = OCR0B = 0; // Viikude D6 ja D5 seadmine väljundiks DDRD |= 0b01100000; // Viikude D6 ja D5 algväärtustamine PORTD &= ~0b01100000; while(1) { OCR0B = 30; // Ühe draiveri sisendi PWM signaal OCR0A = 0; // Draiveri sisendi kõrgeks seadmine _delay_ms(1000); // Viide 1000ms OCR0B = 0; // Draiveri sisendi kõrgeks seadmine OCR0A = 30; // Teise draiveri sisendi PWM signaal _delay_ms(1000); // Viide 1000ms } }
Mootori juhtimise näide Pololu teeke kasutades
// Pololu teekide lisamine #include <pololu/3pi.h> int main() { while(1) { set_m1_speed(30); // Vasak mootor edaspidi tööle delay_ms(1000); // Viide 1000ms set_m1_speed(-30); // Vasak mootor tagurpidi tööle delay_ms(1000); // Viide 1000ms } }
Koosta programm, mis paneb roboti tsükliliselt ruudukujulist trajektoori sõitma.
Lahendamisel tuleb esmalt panna robot sõitma otse ja seejärel leida 90 kraadise pöörde tegemiseks kuluv viide (delay_ms väärtus). Ülesande lahendus tuleneb mõlema liikumisviisi kombineerimisest.
Koosta programm, mis paneb roboti tsükliliselt kaheksakujulist trajektoori sõitma.
Ülesande lahendamisel saab osaliselt kasutada eelmise harjutuse koodi. Ülesande kontrollimiseks võib roboti külge kinnitada markeri, mis paberil sõites joonestab liikumistrajektoori.
Analooganduri lugemine ja 8×2 tähemärgilisel LCD-l kuvamine
// Pololu teekide lisamine #include <pololu/3pi.h> int main() { while(1) { //Analoog-digitaal muunduri (ADC) seadistamine 10bit resolutsioonile ehk tagastab väärtusi 0-1023 set_analog_mode(MODE_10_BIT); // Potentsiomeetri (TRIMPOT) väärtuse lugemine ja kirjutamine muutujasse uint16_t analogValue = analog_read(TRIMPOT); clear(); // LCD ekraani puhastamine print(" Tere"); // LCD-le tekst "Tere" kirjutamine lcd_goto_xy(0, 1); // LCD-l kursor järgmisele reale liigutamine print(" Maailm"); // LCD-le teksti "Maailm" kirjutamine //print_long(analogValue); // LCD-le numbrilise väärtuse kirjutamine delay(300); // Viide 1000ms } }
Koostadaa programm, mis kuvab LCD-le post (“|”) sümboleid proportsionaalselt analoog sisendile ehk 0 korral mitte ühtegi ja vääärtuse kasvades kuni LCD ühe rea lõpuni.
Lahendamisel alustada ühe post sümboli kuvamise harjutamisest. Seejärel leida maksimaalne postide arv ühele real ning konverteerida ADC väärtus vastavalt saadud arvule.Proportsionaalseks kuvamiseks on soovitav koostada “for” lause.
Koostada programm, mis kuvab LCD-l vasakult paremale lõpmatult liikuvat teksti. Paremal ära kadunud sümbolid tekivad uuesti vasakule algusesse. Lahendamisel kombineerida erinevaid tsüklilisi lauseid.
Nuppude ja piezo heligeneraatori kasutamine
// Pololu teekide lisamine #include <pololu/3pi.h> int main() { while(1) { // Programm ootab kuni vajutatakse nuppu B while(!button_is_pressed(BUTTON_B)); play_frequency(6000, 250, 15); // Programm ootab kuni vajutatakse nuppu A (TEINE MEETOD) wait_for_button_press(BUTTON_A); play_frequency(3000, 250, 15); // Programm ootab nupu A lahti laskmist wait_for_button_release(BUTTON_A); play_frequency(1000, 250, 15); while(1) { // tagastab mitte nullise väärtuse, kui ühte kolmest nupust on vajutatud unsigned char button = get_single_debounced_button_press(ANY_BUTTON); // kõrgsagedusliku heli tekitamine, kui on vajutatud ülemist nuppu if (button & TOP_BUTTON) play_frequency(6000, 200, 15); // kesksagedusliku heli tekitamine, kui keskmist nuppu on vajutatud if (button & MIDDLE_BUTTON) play_frequency(3000, 200, 15); // kõrgsagedusliku heli tekitamine, kui on vajutatud ülemist nuppu if (button & BOTTOM_BUTTON) play_frequency(1000, 200, 15); } } }
Koostada programm, mis mängib robotil oleva piezo heligeneraatoriga meloodia.
Lahendamisel on soovitav kasutada “play(const char* sequence)” või play_from_program_space(const char* sequence).