Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:projects:3pi:programming [2015/09/25 11:47] raivo.sellet:projects:3pi:programming [2020/07/20 12:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +===== Roboti programmeerimine =====
 +
 +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.   
 +
 +{{ :et:projects:3pi:3pi_programming.jpg?350 |}}
 +
 +Programmi kompileerimiseks valida ülevalt //Build//->//Build Solution//. Seejärel võtta lahti programmeerimisaken //Tools//-> //Device Programming//  ja teha järgmised valikud: 
 +  * Tool: STK500 COMx
 +  * Device: ATmega328p
 +  * Interface: ISP
 +//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.
 +
 +
 +
 +===== 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:projects:3pi:library|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.
 +
 +==== Test ====
 +Proovida antud programmi, et veenduda roboti töökorras.
 +<code c>
 +#include <pololu/3pi.h>
 +
 +int main()
 +{
 +
 + play_from_program_space(PSTR(">g32>>c32"));  // Play welcoming notes.
 +
 + while(1)
 + {
 + // Print battery voltage (in mV) on the LCD.
 + clear();
 + print_long(read_battery_millivolts_3pi());
 +
 + red_led(1);     // Turn on the red LED.
 + delay_ms(200);  // Wait for 200 ms.
 + red_led(0);     // Turn off the red LED.
 + delay_ms(200);  // Wait for 200 ms.
 + }
 +}
 +</code>
 +
 +==== Näide 1 ====
 +
 +Ühe mootori juhtimise programm ilma Pololu teegita
 +<code c>
 +
 +#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
 +   }
 +}
 +</code>
 +
 +==== Näide 2 ====
 +
 +Mootori juhtimise näide Pololu teeke kasutades
 +<code c>
 +// 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
 + }
 +}
 +</code>
 +
 +==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 ====
 +
 +Analooganduri lugemine ja 8x2 tähemärgilisel LCD-l kuvamine
 +<code c>
 +// 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
 +  }
 +}
 +
 +</code>
 +
 +==Harjutus 3.1==
 +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.
 +==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.
 +
 +
 +<pagebreak>
 +==== Näide 4 ====
 +
 +Nuppude ja piezo heligeneraatori kasutamine
 +<code c>
 +// 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);
 +    }
 +  }
 +}
 +</code>
 +
 +==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 "play(const char* sequence)" teegi funktsiooni.
 +
 +==== Näide 5 ====
 +
 +Jooneandurite kalibreerimine ja lugemine
 +<code c>
 +
 +//Teegi lisamine
 +#include <pololu/3pi.h>
 +
 +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); //viide 1 sekund
 + print("Calibrat"); //Kirjuta LCD peale, et käimas on kalibreerimine
 + //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,IR_EMITTERS_ON);
 +
 + // 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);
 + }
 +}
 +
 +</code>
 +
 +==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.
 +
 +
  
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0