Izobraževanje‎ > ‎Arduino‎ > ‎Robotika v tehniki‎ > ‎

FreeWheely-RobDuino

  1. Priključitev vmesnika

  2. Sestavite krmilnik tako, da močnostni dodatek priključite na Arduino UNO in ga priključite na računalnik kot je to prikazano na spodnji shemi.
     https://sites.google.com/site/drtirobotika/izobrazevanje/arduino/robotika-v-tehniki/free-wheely/DSC08948.JPG    Priključite vmesnik RobDuino na krmilnik Arduino.    
         Nato ga z USB kablom priključite na računalni.    Preveri, če na krmilniku sveti lučka pri napisu [+5V].
             

    Preverite naslednje nastavitve na krmilniku RobDuino:
    1. Ali sveti LED (lučka) z oznako +5V ? Ta lučka indicira ali ima mikrokrmilnik na Arduino vmesniku primerno napajanje.
    2. Ali sveti LED lučka z oznako Vin? Ta indicira ali ima krmilnik primerno napajanje za močnostne izhode (naprimer za poganjanje motorjev).
    3. Ali je kratkostičnik (jumper) glavnega napajanja na mestu tako, da povezuje pin z oznako +5V in srednji pin?
    4. Ali so vsi ostali kratkostičniki v položaju "EN" (Enable)? V tem položaju omogočajo delovanje močnostnih izhodov.

    [odgovori...]    [na vrh strani]


  3. Dodajanje knjižnice s primeri

  4. Sledite naslednjim korakom:
    1. Pripravite si programsko okolje Arduino IDE.
    2. Presnemite si naslednjo knjižnico z dodatnimi funkcijami, testnimi programi in programi, ki so uporabljeni v tej vaji:
      1. RobDuino-master.zip [ download link ]
      2. Datoteko RobDuino-master.zip preimenujte v RobDuino.zip
    3. Dodajte knjižnico v Arduino IDE:
      1. Izberite [ Sketch ],
      2. nato [ Include Library    >],
      3. ter [ Add .ZIP Library... ].
      4. Nato izberete knjižnico, ki ste jo presneli
        1. RobDuino.ZIP
          (najverjetneje ste jo shranili v mapo .../Download/)
        2. terk kliknete [ Open ].
      5. Opazujte statusno vrstico v Arduino IDE okolju...
        1. ojaviti se mora napis:
          Library added to your library. Check "Include libraries".

    [odgovori...]   [na vrh strani]


  5. Programske nastavitve okolja ArduinoIDE

  6. V programskem okolju Arduino IDE moramo nastaviti:
    1. Komunikacijska vrata:
      --> Tools --> Port --> COMx (ali USBx)
    2. Kateri vmesnik imamo priključen:
      --> Tools --> Board --> Arduino/Geniuno UNO

    [odgovori...]  [na vrh strani]


  7. Izbira programa in programiranje

  8. Že pripravljene programe lahko najdete v :
    --> File --> Examples --> ...
    V namen testiranja vmesnika RobDuino smo pripravili program za testiranje. Odprete ga tako, da izberete v menu-ju:
    --> File --> Examples --> RobDuino --> FreeWheely --> r00o_Test_vmesnika.ino

    Ko želimo program presneti na krmilnik, lahko:
    1. Kliknemo na okroglo ikono s puščico ali,
    2. izberemo preko menu-ja:
      --> Sketch --> Uploade
    3. ali na tipkovnici pritisnemo [Ctrl] + [ U ]

    [odgovori...]   [na vrh strani]


  9. Moj prvi program

  10. Vključili boste prvo svetlečo diodo na digitalnem izhodu.
    V programskem okolju Arduino IDE odprite naslednji program :

    Primeri > RobDuino > FreeWheely > r010_moj_prvi_program  #include "RobDuino.h"              
    void setup()
    {// nastavitve
      
    }
    
    void loop()
    {// glavni program
      PORTD = 1;
    }

    Preveri naslednje:
    1. Program, ki ste ga napisali, prekopirali ali odprli morate najprej "poslati" mokrokrmilniku. Rečemo, da mikrokrmilnik sprogramiramo.
    2. Med programiranjem bosta najverjetneje utripali LED (lučki) PD0 in PD1, saj komunikacija med računalnikom in mikrokrmilnikom poteka prav po teh dveh povezavah.
    3. Ko je programiranje končano, se program začne izvajati. Preverite kaj se na krmilniku dogaja ali če opazite kaj novega ...


    Rešite naslednje naloge:
    Kateri programski stavek določi, da sveti le 1. lučka?

    Spremenite program tako, da bo zasvetila 2. LED lučka.



    Kaj se zgodi, če v program napišete ukaz:
    PORTD = 1;

    V program dodajte programske komentarje tako, da boste programsko kodo ustrezno komentirali in opisali čemu služi posamezna vrstica v programski kodi. Komentarje lahko pišete tako, da začnete besedilo z dvema poševnicama // v vsaki vrstici ali pa da komentirate cel blok besedila tako, da blok besedila začnete z /* in ga končate z */. Naprimer kot je prikazano v naslednjem programu:

    /*  Knjiznica RobDuino se nahaja na:
        https://github.com/davidrihtarsic/RobDuino
        V njej so shranjene nekatere funkcije za:
        - smiselno poimenovenje priključkov [primer: pD3]
        - uporabo funkcije tipk [primer: If Tipka.down = True...]
        - krmiljenje izhodnih prikljuckov [priemr: Motor.run(GOR)]
        - možnost krmiljenja moci motorja [primer: Motor.run(GOR, 125)]
        - enostavna uporaba ultrazv. sen. [primer: UZ.dstanceRead()]
    */   
    #include "RobDuino.h"   // vkljucitev te knjiznice           
    void setup()
    {                       // nastavitve
     
    }
    void loop()
    {                       // glavni program
     PORTD = 1;
    }

    Desetiške vrednosti v dvojiški obliki
    Vsi podatki v mikrokrmilniku so zapisani v digitalni obliki (v dvojiškem sistemu). Zato na izhodu Porta D vidimo številko (prikazana z "lučkami" v digitalni obliki), ki smo jo pripisali tem vratom v desetiški obliki. Te vrednosti lahko preverite tudi z računalom.

     bit7  bit6  bit5  bit4  bit3  bit2  bit1  bit0
     27  26  25  24  23  22  21  20
     128  64  32  16  8  4  2  1

    Zgornja tabela prikazuje vrednosti posameznih bitov, ki prispevajo vsoti desetiške številke, ki smo jo pripisali Portu D. Poglejmo si še en primer, če želimo, da bi na Portu D svetile le vsake druge diode [1 0 1 0 1 0 1 0] moramo na PortD postaviti številko 128+0+32+0+16+0+4+0+2+0 = 170.

    [odgovori...]   [na vrh strani]


  11. Krmiljenje digitalnih izhodov

  12. Vrednost digitalnih izhodov lahko enostavno krmilimo tako, da nastavljamo "nastavitvene celice" (registre) mikrokrmilnika. 

    Sedaj poskusite programu dodati še tri programske vrstice, tako da bo glavni program vseboval naslednje ukaze:
    void loop()
    { // glavni program
      PORTD = 1;
      delay(3000);
      PORTD = 0;
      delay(3000);
    }
    Kaj ugotovite?
    Programske ukaze, ki se nahajajo v "glavnem programu" premaknite v podprogram "nastavitve". Preskusite program in ugotovite v čem je razlika glede na prejšnjo ureditev programa?
    void setup()
    { // nastavitve
      PORTD = 1;
      delay(3000);
      PORTD = 0;
      delay(3000);
    }
    
    void loop()
    { // glavni program
    
    }

    PROGRAMSKE FUNKCIJE
    Programske ukaze, ki so namenjeni določenemu procesu je smiselno združevati v funkcije. S tem bomo izboljšali preglednost programske kode in prihranili nekaj prostora v krmilniku, če te iste ukaze izvajamo večkrat na različnih mestih programa. Funkcija v c++ programskem jeziku lahko vrne nek rezultat, ali pa le izvrši nek niz ukazov. V ta namen imamo v Arduino programih že pripravljena dve taki funkciji, ki le izvršita neke programske ukaze:

      void setup(- funkcija se izvrši na začetku zagona mikrokrmlnika. V tem delu lahko nastavimo določene vrednosti spremenljivk ali izvršimo potrebne programske ukaze za pravilno delovanje naprav.
      void loop() - ta funkcija vsebuje glavne programske ukaze, ki se bodo stalno ponavljali in zagotavljali
      nenehno delovanje mikrokrmilnika.
    UPORABA FUNKCIJ
    Nove funkcije pišemo izven že obstoječih funkcij. Dogovorjeni smo, da imena funkcij začnejamo z malo črko, vse nadaljne začetnice besed pa so velike.

     Primer funkcije:

    void mojaNovaFunkcija()
    {
      PORTD = 1;
      delay(3000);
      PORTD = 0;
      delay(3000);
    }
    Uporaba funkcije

    void setup()
    { //nastavitve
      mojaNovaFunkcija();
    }

    NAPREDNEJŠA UPORABA FUNKCIJ
    Pravo uporabnost funkcij pa lahko izkoristimo tedaj, ko funkcija lahko pri svojem delovanju upošteva neke parametre.

     Primer funkcije:
    void mojaNovaFunkcija(int cas_v_ms)
    {
      PORTD = 1;
      delay(cas_v_ms);
      PORTD = 0;
      delay(cas_v_ms);
    }
     Uporaba funkcije:
    void setup()
    { //nastavitve
      mojaNovaFunkcija(3000);
    }

    Ali pa celo, da neka funkcija vrne rezultat (več na tej strani https://www.arduino.cc/en/Reference/FunctionDeclaration).

    [odgovori...]   [na vrh strani]


  13. Programske zanke

  14. Preskusite naslednje dva programa, ki se razlikujeta v programski zanki.
    Obe zanki ponavljata enako zaporedje ukazov, vendar se nekoliko razlikujeta. Ugotovite kako!


    Program: Primeri > RobDuino > FreeWheely >r020_Prog_zanka_While.ino 

    #include "RobDuino.h"
    void setup()
    { // nastavitve
      while (1 == 1) {
        PORTD = 1;
        delay(3000);
        PORTD = 0;
        delay(3000);
      }
    }
    
    void loop()
    { // glavni program
    
    }
    Program: Primeri > RobDuino > FreeWheely > r021_Prog_zanka_For.ino  

    #include "RobDuino.h"
    void setup()
    { // nastavitve
      for (int i = 1; i<255; i++) {
        PORTD = i;
        delay(10);
      }
    }
    
    void loop()
    { // glavni program
    
    }

    PROGRAMSKE ZANKE
    Programske zanke uporabljamo kadar čelimo, da se nekateri programski ukazi izvršijo večkrat. Največkrat uporabljamo dve programski zanki:
            --> while () in
            --> for ()

    Programska zanka WHILE
    V tej zanki se programski ukazi izvajajo toliko časa dokler je pogoj, ki je zapisan v oklepaju () izpolnjen. Če se pogoj v oklepaju ne spremeni, naprimer (1 == 1) , se ta zanka ponavlja v neskončnost.
    Primer:
            while (prdigitalRead(pC0) == 0) {
              // do something
              var++;
              println(var);
            }
    Programska zanka FOR
    Programsko zanko FOR uporabimo takrat, kadar želimo neke ukaze ponoviti točno določeno-krat, saj je v njenem sestavu predviden nek števec, ki se vsakič poveča za 1 (lahko tudi drugače, vendar ostanimo pri 1). Ta zanka nam pride prav, kadar moramo shraniti določeno količino podatkov.
    Primer:

            for (int i = 0; i <= 9; i++) {
              println(i);
              delay(100);
            }

    [odgovori...]    [na vrh strani]


  15. Različne možnosti krmiljenja digitalnih ukazov

  16. Digitalni izhod lahko nastavite na več različnih načinov, preskusite naslednje različice programa:
    Primeri > RobDuino > FreeWheely > r030_Digitalni_izhod.ino

    V DESETIŠKI OBLIKI:
    void setup()
    { // nastavitve
      PORTD = 80;
      delay(3000);
      PORTD = 0;
    }
    V DVOJIŠKI OBLIKI:
    void setup()
    { // nastavitve
      PORTD = 0b11001100;
      delay(3000);
      PORTD = 0;
    }
    Z ArduinoIDE funkcijami:
    void setup()
    { // nastavitve
      digitalWrite(pD7, HIGH);
      delay(3000);
      PORTD = 0;
    }

    DOLOČANJE DIGITALNEGA STANJA 
    Za nastavitev digitalnega izhodnega stanja nastavljamo z nastavitvenimi spomnimskimi celicami v mikrokrmilniku - imenujemo jih tudi registri. Za priključke, ki so povezani na vrata D je to odvisno od registra PORTD. Kot smo lahko videli lahko nastavino vse (8) priključke vrat D naenkrat tako, da v PORTD vpišemo določeno številko.

    Če želimo nastavljati le en posamezen bit (nožico) teh vrat, pa je enostavneje, da se poslužujeno funkcije
            digitalWrite(pin, STATE);
                pin --> številka nožice (glej shemo)
                STATE --> določimo izhodno stanje priključka. Možnosti so HIGH/LOW ali 1/0.

    --> Če priključek nastavimo v logično stanje 1 ali HIGH, se bo na njem pojavil napetostni potencial +5V. V kolikor uporabljate vmesnik RobDuino, pa bona močnostnih izhodih v tem primeru napetostni potencial, s kakršnim napajamo krmilnik (npr.: 9V).
    --> Če pa priključek postavimo v logično
    0 ali LOW, pa bo na tem priključku napetostni potencial 0V oz. GND.

    [odgovori...]   [na vrh strani]


  17. Kako deluje motor

  18. Priključite motor na baterijo tako kot prikazuje sosednja slika.

    En priključek motorja povežite z žico na
    višji napetostni potencial, navadno je označen z znakom "+" ali "+5V".

    Drugega pa povežite z žico na
    nižji napetostni potencial, ki je označen z "-" ali "GND".


    Ugotovi kako se motor vrti, če žici zamenjate tako, kot prikazuje 2. slika (Slide 2) na desni strani.

    Nariši smer toka za obe električni shemi

    [odgovori...]   [na vrh strani]


  19. Reduktor

  20. Če na tako gred motorja pritrdite kolo robota, se kolo prehitro vrti in zagotavlja premalo sile vrtenja (premalo navora). Zato morate uporabiti polžasti reduktor. Ta zmanjša hitrost vrtenja gredi in poveča navor (ali silo vrtenja).

    Sestavite motor in polžasto gonilo (reduktor) kot prikazujejo naslednja zaporedja slikovnih navodil.

    Priključite motor na baterijo in preizkusite hitrost in silo vrtenja.

    Preizkusite lahko tudi, da je polžasto gonilo samozaporno. Če motor miruje, kolesa ne moremo zavrteti ročno, saj polžasto gonilo preprečuje vrtenje.

    PRESTAVNO RAZMERJE REDUKTORJA
    Prestavno razmerje reduktorjev nam pove razmerje med vrtilno hitrostjo pogonjske in gnane gredi - vrtilna hitrost gnane gredi je manjša. Pri čemer se za (pribljižno) isti faktor poveča tudi navor (sila vrtenja) gnane gredi.

    Poglejmo, kako je z našim reduktorjem. Reduktor je sestavljen iz štirih zobnikov, od katerega prvi zobnik tvori polžasto gonilo z gredjo motorja (slika 1) ...  


    Izračunaj prestavno razmerje desnega prenosa na zgornji sliki.

    [odgovori...]   [na vrh strani]


  21. Sestavljanje mobilnega robota

  22. Sestavite mobilnega robota kot prikazuje sosednji video.


    Bodite 
    pozorni, da uporabite prave kocke in jih obrnete kot je prikazano.

    [odgovori...]   [na vrh strani]


  23. Krmiljenje močnostnih digitalnih izhodov

  24. V tej vaji bomo ročno krmilili po dva digitalna izhoda.
    Ko boste pritisnili:

    *  tipko C4, bomo v logično "1" postavili izhod D7.
    *  tipko C5, pa bomo v logično "1" postavili izhod D6.

    V ta namen preskusite program:
    Primeri > RobDuino > FreeWheely > r040_Krmiljenje_izhodov.ino 

    Nato povežite MOTOR LEVEGA KOLESA z dvema žičkama na digitalna izhoda D7 in D6, kot je to prikazano na levi sliki.

    https://sites.google.com/site/drtirobotika/izobrazevanje/arduino/robotika-v-tehniki/free-wheely/r0900%20TestOdbijacTipka.hex?attredirects=0&d=1Preverite, če se motor giblje tako, kot je opisano v spodnji tabeli prezentacije. Če temu ni tako, popravite vezavo tako, kot je to predlagano v prezentaciji...

    Nato naložite naslednji program:

    Primeri > RobDuino > FreeWheely > r041_Krmili_desni_motor.ino 

    Nato priključimo še DESNI MOTOR na D5 in D4, kot prikazujejo slike na desni zgornji prezentaciji.

    https://sites.google.com/site/drtirobotika/izobrazevanje/arduino/robotika-v-tehniki/free-wheely/r0900%20TestOdbijacTipka.hex?attredirects=0&d=1Preverite, če se motor giblje tako, kot je opisano v levi prezentaciji na listu 3. Če temu ni tako, popravite vezavo motorja.

    Motor potrebuje dva priključka, saj le tako lahko tok vanj priteče in po drugem priključki odteka. Smer vrtenja pogonske gredi motorja pa je odvisna od smeri toka skozi motor:

    -> če tok teče od enega priključka proti drugemu, se bo gred motorja vrtela v eno smer,
    -> če pa tok teče v drugo smer, pa se bo gred vrtela v nasprotni smeri od prejšnje.

    Smer vrtenja pogonske gredi pa lahko spreminjamo na več načinov:
    -> Motorju lahko zamenjamo priključni žici, s tem bomo spremenili smer toka skozi motor in posledično tudi vrtenje gredi.
    -> Programsko lahko zamenjamo stanje digitalnih izhodov in tako spremenimo smer toka skozi motor.
    -> Pogonski gredi bi lahko dodali zobnik, ki bi poganjal naslednji zobnik na drugi pogonski gredi in ta bi se vrtela v nasprotni smeri od prve gredi.

    [odgovori...]   [na vrh strani]


  25. Zaporedje programskih ukazov - program

  26. V nadaljevanju ne bomo več krmilili posameznih izhodnjih priključkov, ampak bomo v ta namen uporabljali za ta namen pripravljene funkcije... Pripravite si program:
    Primeri > RobDuino > FreeWheely > r050_Krmiljenje_motorjev.ino 

    Z nadgradnjo naslednjega programa sestavite tako zaporedje ukazov, da bo vaš robot zaplesal.

    Naj gre nekaj sekund naprej, ... pomiga levo, desno, se premakne nazaj...

    Določene "plesne korake" lahko izvedete v zankah, ki smo se jih naučili v poglavju "Porgranke zanke", tako vam nekaterih ukazov ne bo potrebno ponavljati...

    Ne pozabite, vaš program je sedaj napisan v funkciji void setup() in se izvrši le enkrat.
    Če želite, da bi "plesne korake" ponavljal, prestavite program v funkcijo 
    void loop().

    Ne pozabite programsko kodo tudi komentirati tako, da bo branje programske kode bolj razumljivo.

    #include "RobDuino.h"
    DOutDir LevoKolo(pD6, pD7);
    DOutDir DesnoKolo(pD4, pD5);
    
    void setup()
    { // nastavitve
      LevoKolo.run(NAPREJ);
      DesnoKolo.run(NAPREJ);
      delay(2000);
      LevoKolo.stop();
      DesnoKolo.stop();
    }
    
    void loop()
    { // glavni program
    
    }

    OBJEKTNO PROGRAMIRANJE:
    V zgornjem programu smo uporabljali dva objekta (LevoKolo in DesnoKolo), ki pripadata razredu
    DOutDir. Ta razred je deklariran v knjižnici RobDuino.h in brez nje tega razreda ne moremo uporabljati. Z uporabo objektov si lahko poenostavimo programiranje saj lahko na bolj enostaven način uporabljamo funkcionalnosti objekta in nastavljamo njegove lastnosti. Poleg tega je programska koda tudi bolj pregledna. Vse funkcije in lastnosti, ki pripadajo nekemu objektu pišemo ločeno s piko "." od imena objeka.
    Primer:
    ->  ImeObjekta.njegovaFunkcija(parametri_funkcije)

    DEKLARACIJA OBJEKTA
    Objekte, ki pripadajo razredu DOutDir, uporabljamo za krmiljenje motorjev ali drugih porabnikov, ki za krmiljenje potrebujejo dve žici. Tako moramo ob deklaraciji objekta navesti tudi priključke na kate smo motor priključili.
    Primer:
    ->  DOutDir LevoKolo(pD6, pD7);

        DOutDir - je ime razreda, ki vključuje vse funkcionalnosti in lastnosti našega objekta.
        LevoKolo - je ime našega objekta. Ime lahko izberete poljubno, dogovorjeni pa smo, da imena objektov pišemo z veliko začetnico. Z veliko začetnico pišemo tudi vse naslednje besede, če jih ime vsebuje.
        (pD6, pD7) - priključki na ketere smo priključili motor. Namesto pD6 bi lahko vpisali tudi številko 6 (glej shemo). Če v oklepajih priključka zamenjamo, se bo motor vrtel v drugo smer.

    UPORABA FUNKCIJ OBJEKTA IZ RAZREDA DOUTDIR
    Razred DOutDir omogoča objektom uporabo dveh funkcij: stop() in run(definiraj_smer).

        .stop() - Motor se ne vrti. Oba priključka, na katerih je priključen porabnik se nastavita v digitalno stanje 0.
        .run(definiraj_smer) - Motor se bo vrtel v smeri, ki jo navedemo v oklepaju. Možne nastavitve smeri so:
            NAPREJ - Motor se vrti v eno smer. Prvi priključek se nastavi v log. "0", drugi pa v log."1". Namesto besede NAPREJ, bi lahko zapisali tudi številko 1.
            NAZAJ - Motor se vrti v drugo smer. Prvi priključek se nastavi v log. "1", drugi pa v log."0". Namesto besede NAZAJ, bi lahko zapisali tudi številko 2.
            STOP - Motor se ne vrti. Pdobno kot .stop(). Namesto besede STOP, bi lahko zapisali tudi številko 0.
            GOR - Enako kot NAPREJ. Morda bolj primerno v primeru dvigala.
            DOL - Enako kot DOL. Morda bolj primerno v primeru dvigala.
        .run(definiraj_smer,moc_motorja) - Če funkciji .run() dodamo še podatek o moči motorja, lahko krmilimo tudi povprečno moč motorja. Namesto parametra moc_motorja moramo vpisati številko med 0 in 255. Pri čemer 0 pomeni 0% moči in 255 pomeni 100% moči.
        Primer:
            LevoKolo(NAPREJ,128);

    [odgovori...]   [na vrh strani]


  27. Uporaba tipk na plošči RobDuino

  28. Dogodki so programski ukazi, ki se izvršijo LE ob izpolnjenem pogoju. Naprimer, da naj naš robotek zapleše LE, če bo uporabnik pritisnil tipko. Pripravite si naslednji program:
    Primeri > RobDuino > FreeWheely > r060_Dogodek_IF_stavek.ino 

    Ugotovite katero tipko morate pritisniti, da se bo dogodek "vožnje naprej" izvršil.

    Morda še nekaj idej za dopolnitev programa:

    Dodajte podobne programske ukaze še za drugo tipko C5 tako, da se bo robotek peljal nazaj za 3 sekunde. Ne pozabite, da morate dodati porgramski objekt:

            Button TipkaC5(pC5);

    Preskusite kdaj se začne program izvajati, če namesto pogoja (TipkaC4.down()) vpišemo:
            if (TipkaC4.wasPressed()) {
              ...
              ...
            }
    #include "RobDuino.h"
    Button TipkaC4(pC4);
    DOutDir LevoKolo(pD6, pD7);
    DOutDir DesnoKolo(pD4, pD5);
    
    void setup()
    { // nastavitve
    
    }
    
    void loop()
    { // glavni program
      if (TipkaC4.down()) {
        LevoKolo.run(NAPREJ);
        DesnoKolo.run(NAPREJ);
        delay(2000);
        LevoKolo.stop();
        DesnoKolo.stop();
      }
    }

    RAZRED BUTTOB
    uporaba splošno:

    DEKLARACIJA
    Button ime (priključek)
    Button ime (priključek, pull_up)
    Button ime (priključek. pull_up, debounce_time_ms)

    UPORABA FUNKCIJ
    .on()
    .off()
    .down()

    .up()
    .wasPressed()

    [odgovori...]   [na vrh strani]


  29. Priključitev tipke na robotu

  30. V nadaljevanju opremite robota, da zaznava ovire.

    Namestite odbijač, ki ob stiku s predmetom sklene tipko. Tako robot zazna, da ima pred seboj nek predmet in se lahko ustavi
    Priključitev tipke (glej desno prezentacijo) ->


    Tipka ima tri priključke (označeni so z 1 , 2 in 3). Priključki so označeni s številkami! Na vmesnik jih moramo priključiti takole:
    1. priključek moramo priključiti na C0,
    2. priključek pričvrstimo na GND in
    3. priključek povežemo na +5V

    https://sites.google.com/site/drtirobotika/izobrazevanje/arduino/robotika-v-tehniki/free-wheely/r0900%20TestOdbijacTipka.hex?attredirects=0&d=1Pripravite si program:
    Primeri > RobDuino > FreeWheely > r070_Test_tipke.ino
    Preverite ali ste pravilno povezali tipko z vmesnikom. Odziv lahko opazujete prejo Serijskega Okna v Arduino IDE programu.

    Bodite pozorni, da je lučka, ki ponazarja napajanje +5 V ves čas vključena. Če ta lučka ne sveti ko je stikalo SKLENJENO ali RAZKLENJENO, nemudoma izključite USB kabel.

    [odgovori...]   [na vrh strani]


  31. Branje digitalnega vhoda

  32. Kadarkoli morate sprejemati neke odločitve na podlagi nekih podatkov, se največkrat poslužujete t.i. IF-stavkov. Vendar je z njimi potrebno premišljeno ravnati.

    Preskusite sosednji program:
    Primeri > RobDuino > FreeWheely > r080_Zaznavanje_ovire.ino
    in preverite, če deluje pravilno! Robotek naj bi se ob dotiku z oviro ustavil...

    Če bo šlo kaj narobe, ne pozabite, da lahko krmilnik tudi resetirate s tipko RST na krmilniku.

    Raziščite, zakaj predlagan program ne deluje. Namig - uporabiti je potrebno programsko zanko s povratnim delovanjem. Ali povedano drugače, odziv senzorjev moramo stano opazovati, saj le tako lahko ustrezno odreagiramo...

    D
    opolnite program, da bo robotek oviro obšel.


    #include "RobDuino.h"
    Button TipkaC4(pC4);
    DOutDir LevoKolo(pD6, pD7);
    DOutDir DesnoKolo(pD4, pD5);
    
    void setup()
    { // nastavitve
      while (TipkaC4.up()) {
        // Čakamo, da uporabnik pritisne tipko
        // in izvajanje programa se ne nadaljuje.
      }
      // nato se začne robot premikati NAPREJ...
      LevoKolo.run(NAPREJ);
      DesnoKolo.run(NAPREJ);
      // Če se dotakne ovire, se bo stikalo sklenilo in
      // na dig. vhodu C0 bomo zaznali log. "0".
      // Tedaj ustavimo robota.
      if (digitalRead(pC0)==1) {
        LevoKolo.stop();
        DesnoKolo.stop();
      }
    }
    
    void loop()
    { // glavni program
    
    }

    IF - STAVEK
    bomo velikokrat uporabljali. Napišemo ga lahko v dveh oblikah: enostavni in sestavljeni.

    Enostavni if-stavek vsebuje pogoj in en sam programski ukaz, ki se izvrši, če je pogoj izpolnjen.
    Primer:

            if (digitalRead(pC0) == 1) digitalWrite(pD7,HIGH);
    Sestavljeni if-stavek vsebuje več programskih ukazev, ki se izvršijo, če je pogoj izpolnjen. Vsi ti ukazi morajo biti vpeti v zavite oklepaje { in }. Poleg teh mu lahko dodamo tudi ukaze, ki se bodo izvršili,  če ta pogoj ni izpolnjen.
    Primer:
            if (digitalRead(pC0) == 1) {
                LevoKolo.stop();
                DesnoKolo.stop();
            }else{
                LevoKolo.run(NAPREJ);
                DesnoKolo.run(NAPREJ);
            }

    [odgovori...]   [na vrh strani]


  33. Branje analognih vhodov


  34. Precej nerodno bi bilo, če bi morali avtomobili zaznavati predmete le z dotikom... Zato je bolje, če lahko predmete v okolici zaznavamo brez-kontaktno, na primer z infra-rdečim senzorjem razdalje.
    Namestite IR senzor razdalje na sprednji del robota kot prikazuje shema na desni in ga priključite na 3-pinski priključek.

    https://sites.google.com/site/drtirobotika/izobrazevanje/arduino/robotika-v-tehniki/free-wheely/r0900%20TestOdbijacTipka.hex?attredirects=0&d=1Nato pripravite program:

    Primeri > RobDuino > FreeWheely > r090_Test_IR_razdalja_C0.ino 
    Ter preverite:
    -->  Kakšen/Kolikšen je odziv senzorja?>
    Odziv senzorja je v obliki anlogne napetosti med 0 in +5 V.
    -->  Na kakšen način lehko krmilnik zazna ta signal>
    Krmilnik lahko s pomočjo analogno-digitalnega pretvornika (ADC) pretvori analogno napetost od 0.0V do +5.0V v številke od 0 do 1023.
    -->  In kolikšne so te številke?>
    V našem primeru se številke ADC pretvornika gibljejo od 0 do 1023, saj je ADC pretvorba 10-bitna. To pomeni, da največjo napetost, ki jo še lahko izmerimo z našim krmilnikom zapišemo z 10-imi biti (1111111111B = 1023D).


    Senzorji
    S senzorji lahko pretvarjamo neko fizikalno količino (osvetljenost, temperaturo, vlago ...) v neko električno količino (največkrat napetost). Dva senzorja smo že spoznali (senzor dotika in senzor razdalje), poglejmo si še nekaj senzorjev...

    [odgovori...]   [na vrh strani]


  35. Svetlobni senzor

  36. Za vožnjo po črti bomo potrebovali:
    --> 
    LUČKO, ki bo osvetljevala talno površino in
    -->  
    SVETLOBNI SENZOR, s katerim bomo lahko zaznavali osvetljenost površine.

    LUČKO potrebujete zato, da je robotek manj odvisen od okoliške svetlobe.Tako lahko sam osvetljuje tla pod sabo in zato bolje loči temno in svetlo podlago. LUČKO priključite na D3 in GND tako, kot prikazuje sosednja prezentacija.

    Phttps://sites.google.com/site/drtirobotika/izobrazevanje/arduino/robotika-v-tehniki/free-wheely/r0900%20TestOdbijacTipka.hex?attredirects=0&d=1ripravite si program:
    Primeri > RobDuino > FreeWheely > r110_Test_lucke_in_senzorja.ino 
    Nato stestirajte delovanje lučke tako, da pritisnete tipko C4. Lučko lahko izključite s ponovnim pritiskom na tipko C4.
    Sestavite SVETLOBNI SENZOR, kjer uporabite foto-tranzistor in upor, ki ju vežete zaporedno v delilnik napetosti. Kako lahko sestavite svetlobni senzor, si oglejte s pomočjo slik na desni.

    Fototranzistor (rumena kocka) ima dva priključka:
    -->  eden je označen z rdečo barvo. Tega povežite na +5 V in
    -->  drugi priključek fototranzistorja povežite na analogni vhod C1.

    Nato dodate še upor z upornostjo med 100 kOhmi in 1 MOhmov. Upor vežete med analogni vhod C1 in GND. Temu uporu rečemo tudi - referenčni upor.

    https://sites.google.com/site/drtirobotika/izobrazevanje/arduino/robotika-v-tehniki/free-wheely/r0900%20TestOdbijacTipka.hex?attredirects=0&d=1
    Nato preverite delovanje senzorja tako, da z istim programom:
    Primeri > RobDuino > FreeWheely >  r110_Test_lucke_in_senzorja.ino 
    Preverite odziv senzorja v "Serijskem Oknu" v Arduino IDE okolju.

    Tak senzor bo najbolj odziven, če se bo njegova izhodna napetost spreminjala okoli polovice njegove napajalne napetosti. Torej, ker v našem primeru napajamo senzor z napetostjo +5,0 V, bi se morala njegova izhodna napetost morala spreminjati nekoliko nad in pod 2,5 V. Take pogoje delovanja lahko dosežemo s pravilno izbranim referenčnim uporom.

    SENZORJI
    Senzorje pogosto lahko izdelamo sami tako, da v delilnik napetosti vežemo dva elementa. En element je običajen upor s konstantno upornostjo. Drugemu pa se mora upornost spreminjati v odvisnosti od neke fizikalne spremenljivke. Takrat se bo tudi izhodna napetost tega senzorja spreminjala.

    [odgovori...]   [na vrh strani]


  37. Vožnja po črti

  38. Pripravite si program:
    Primeri > RobDuino > FreeWheely >  r120_Voznja_po_crti.ino 

    Pravzaprav bo robot vozil po robu črte. Program napišete tako, da v glavnem podprogramu void loop() stalno preverjal odziv svetlobnega senzorja in ustrezno odreagiral:

    -->  
    Če je robot na črni površini, naj zavije LEVO, a le z enim kolesom.
    -->  Če je robot na beli površini, naj zavije DESNO, a le z enim kolesom.
    Poleg tega ne pozabite, da mora biti ves čas vožnje vključena tudi lučka na digitalnem izhodu D3.
    Tako bo robot "racal" po robu črte...

    [odgovori...]   [na vrh strani]


  39. Obrat na koncu črte

  40. Bi znali program dopolniti tako, da se robot na koncu črte obrne in se pelje po njej nazaj...

    Morda nekaj napotkov:
    1. Meriti/šteti morate čas, ko se robot zadržuje na beli in/ali črni površini.
    2. Če dlje časa ne najde črne površine, se je najverjetneje le-ta končala.
    3. Robot naj naredi primeren obrat.
    4. In nadaljuje naravnost, dokler zopet ne naleti na črto.
    5. Nato nadaljuje po začetnem programu.

    SPREMENLJIVKE
    Z uporabo spremenljivk lahko shranjujemo podatke v spominska mesta. Program bo te podatke lahko kasneje tudi uporabil. Najpogosteje tako shranjujemo vrednosti senzorjev ali vmesnih rezultatov pri izračunih.

    Predno take podatke lahko shranimo, moramo ime spremenljjjivke "deklarirati". To pomeni, da moramo določiti ime in tip spremenljivke. Dogovorjeni smo, da imena spremenljivk pišemo s prvo malo začetnico. Ime spremenljivke naj ne bo prekratko (naprimer x) in naj jedrnato opisuje njen namen.
    Primer:
            int svetlobniSenzor;

    Kadar spremenljivki priredimo neko vrednost = da shranimo podatek, to naredimo takole:

           
    svetlobniSenzor = 123;    //ali
            svetlobniSenzor = analogRead(1);

    Kadar pa jo uporabimo v IF stavkih za primerjavo, pa to storimo z dvojnim enačajem:

        
        if (svetlobniSenzor == 512){

    Tipi spremenljivk a so lahko različni in jih določamo glede na namen spremenljivke:
        char -
        byte -
        int -
        unsigned int -
        long -
        unsigned long -
        float
        double

    [odgovori...]   [na vrh strani]


  41. Vožnja ob predmetu

  42. Na robota namestite IR senzor razdalje. Senzor naj bo nameščen podobno kot v vaji Izogib oviram, le da je v tem primeru obrnjen na desno in ne naravnost naprej.

    [odgovori...]   [na vrh strani]


  43. Vožnja po črti s PWM regulacijo moči

  44. Preučite program, s katerim robot prav tako lahko zavija ali celo vozi po črti. Le da v tem primeru premika obe kolesi sočasno. Kako? Program najdete v:
    Primeri > RobDuino > FreeWheely >  r130_Voznja_po_crti_pwm.ino 

    [odgovori...]   [na vrh strani]


  45. Priključitev LCDja

  46. Na robota lahko namestimo tudi LCD. Nanj lahko izpisujemo informacije za uporabnika, trenutne podatke ali pa preprosto naredimo robota bolj zanimivega, kot smo to storili z nasledjnim programom. Preskusite ga:
    Primeri > RobDuino > FreeWheely >  r140_LCD.ino 

    [odgovori...]   [na vrh strani]


Comments