This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:projects:3pi:programming [2015/09/25 08:26] – veberairi | et:projects:3pi:programming [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== 3pi roboti programmeerimine ====== | ||
- | |||
- | ===== Vajalik tarkvara ===== | ||
- | |||
- | * Atmel Studio 6 | ||
- | * Pololu AVR Development Bundle | ||
- | |||
- | {{: | ||
- | |||
- | ~~PB~~ | ||
- | ===== Tarkvara paigaldamine ja seadistamine ===== | ||
- | |||
- | /*{{ : | ||
- | Enne programmeerimist tuleb laadida alla vajalik tarkvara. Atmel Studio on saadaval [[http:// | ||
- | Enne kasutamist tuleb tarkvara seadistada. Esmalt tuleb avada Atmel Studio 6 ja teha uus 3pi projekt (ATmega328p mikrokontroller). Seejärel ülevalt menüüribast valida // | ||
- | * Select Tool-> | ||
- | * Select Serial Port-> | ||
- | Kui saadaval on mitu COM port-i, siis tuleb Windows //Device Manager-> | ||
- | Programmaator on pärast //Apply// nupu vajutamist seadistatud. | ||
- | |||
===== Roboti programmeerimine ===== | ===== Roboti programmeerimine ===== | ||
Line 37: | Line 17: | ||
===== Programmi koostamine ===== | ===== Programmi koostamine ===== | ||
+ | |||
+ | 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 [[et: | ||
+ | |||
+ | ==== Test ==== | ||
+ | Proovida antud programmi, et veenduda roboti töökorras. | ||
+ | <code c> | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | |||
+ | play_from_program_space(PSTR("> | ||
+ | |||
+ | while(1) | ||
+ | { | ||
+ | // Print battery voltage (in mV) on the LCD. | ||
+ | clear(); | ||
+ | print_long(read_battery_millivolts_3pi()); | ||
+ | |||
+ | red_led(1); | ||
+ | delay_ms(200); | ||
+ | red_led(0); | ||
+ | delay_ms(200); | ||
+ | } | ||
+ | } | ||
+ | </ | ||
==== Näide 1 ==== | ==== Näide 1 ==== | ||
Line 94: | Line 100: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | ==Harjutus 2.1== | ||
+ | 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. | ||
+ | ==Harjutus 2.2== | ||
+ | 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. | ||
==== Näide 3 ==== | ==== Näide 3 ==== | ||
Line 106: | Line 119: | ||
while(1) | while(1) | ||
{ | { | ||
- | // Potentsiomeetri (TRIMPOT) väärtuse lugemine ja kirjutamine muutujasse | + | // |
+ | set_analog_mode(MODE_10_BIT); | ||
+ | | ||
uint16_t analogValue = analog_read(TRIMPOT); | uint16_t analogValue = analog_read(TRIMPOT); | ||
clear(); // LCD ekraani puhastamine | clear(); // LCD ekraani puhastamine | ||
Line 118: | Line 133: | ||
</ | </ | ||
- | ~~PB~~ | + | |
+ | ==Harjutus 3.1== | ||
+ | Koostadaa programm, mis kuvab LCD-le post (" | ||
+ | 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 " | ||
+ | ==Harjutus 3.2== | ||
+ | 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. | ||
+ | |||
+ | |||
+ | < | ||
==== Näide 4 ==== | ==== Näide 4 ==== | ||
- | Nuppude ja valjuhääldi | + | Nuppude ja piezo heligeneraatori |
<code c> | <code c> | ||
// Pololu teekide lisamine | // Pololu teekide lisamine | ||
Line 133: | Line 157: | ||
while(!button_is_pressed(BUTTON_B)); | while(!button_is_pressed(BUTTON_B)); | ||
play_frequency(6000, | play_frequency(6000, | ||
- | // Programm ootab kuni vajutatakse nuppu a (TEINE MEETOD) | + | // Programm ootab kuni vajutatakse nuppu A (TEINE MEETOD) |
wait_for_button_press(BUTTON_A); | wait_for_button_press(BUTTON_A); | ||
play_frequency(3000, | play_frequency(3000, | ||
- | // pROGRAMM | + | // Programm |
wait_for_button_release(BUTTON_A); | wait_for_button_release(BUTTON_A); | ||
play_frequency(1000, | play_frequency(1000, | ||
Line 142: | Line 166: | ||
while(1) | while(1) | ||
{ | { | ||
- | // tagastab mitte nullise väärtuse kui ühte kolmest nupust on vajutatud | + | // tagastab mitte nullise väärtuse, kui ühte kolmest nupust on vajutatud |
| | ||
// kõrgsagedusliku heli tekitamine, kui on vajutatud ülemist nuppu | // kõrgsagedusliku heli tekitamine, kui on vajutatud ülemist nuppu | ||
Line 154: | Line 178: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | ==Harjutus 4.1== | ||
+ | Koostada programm, mis loendab kõigi kolme nupu vajutusi ja kuvab need LCD peale. Proovida erinevaid nupu lugemise funktsioone. Mis eripära on debounce-iga nupu lugemise funktsioonil ja miks see hea/halb on?\\ | ||
+ | Nuppudel on kaks olekut: alla vajutatud (pressed) ja lahti lastud (released). Teegi funktsioonidel on kasutatud mõlemaid olekuid. Seega funktsiooni kasutamisel tuleb põhjalikult enne loogika läbi mõelda. | ||
+ | ==Harjutus 4.2== | ||
+ | Koostada programm, mis mängib robotil oleva piezo heligeneraatoriga meloodiat. Meloodia hakkab mängima pärast nupu A vajutamist ja nupu C vajutamisel lõpetab mängimise\\ | ||
+ | Lahendamisel on soovitav kasutada " | ||
+ | |||
+ | ==== Näide 5 ==== | ||
+ | |||
+ | Jooneandurite kalibreerimine ja lugemine | ||
+ | <code c> | ||
+ | |||
+ | //Teegi lisamine | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | //Andurite väärtuste salvestamiseks täisarvude massiv | ||
+ | unsigned int sensors[5]; | ||
+ | |||
+ | // 3pi roboti andurite lugemise seadistamine | ||
+ | // Kasutab väärtust 2000, mis määrab aja, mille jooksul võetakse üks lugem | ||
+ | // Vastavalt 2000*0.4 us = 0.8 ms, 20 MHz juures töötaval mikrokontrolleril | ||
+ | pololu_3pi_init(2000); | ||
+ | |||
+ | // Ootab nupu vajutamist | ||
+ | wait_for_button_press(BUTTON_A); | ||
+ | delay_ms(1000); | ||
+ | print(" | ||
+ | //Võtab kalibratsioonimõõtmise iga 100 millisekundi tagant | ||
+ | while(!button_is_pressed(BUTTON_C)){ | ||
+ | calibrate_line_sensors(IR_EMITTERS_ON); | ||
+ | delay_ms(100); | ||
+ | } | ||
+ | |||
+ | while(1) | ||
+ | { | ||
+ | // Loeb andurite väärtused massiivi ja arvutab välja positsiooni | ||
+ | unsigned int position = read_line(sensors, | ||
+ | |||
+ | // Kuvab arvutatud positsiooni väärtuse, mis jääb vahemikku 0 - 4000 | ||
+ | // Väärtus on 0 kui ainult kõige vasakpoolsem andur näeb joont | ||
+ | // Väärtus on 4000 kui ainult kõige parempoolsem andur näeb joont | ||
+ | clear(); | ||
+ | print_long(position); | ||
+ | delay_ms(100); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==Harjutus 5.1== | ||
+ | Koostada programm, mis kalibreerib roboti iseseisvalt. Iseseisev kalibreerimine annab stabiilsema tulemuse. | ||
+ | ==Harjutus 5.2== | ||
+ | Koostada programm, milles kontrollitakse piezo heligeneraatori sagedust jooneanduriga. | ||
+ | |||
+ | |||
+ |