• Rezultati Niso Bili Najdeni

Pravilnostna preglednica multiplekserja ADG408

A2 A1 A0 EN D namenjena odpiranju/zapiranju led diod z IR svetlobo. Izbrani modul, omogoča več različnih stanj (poleg zaprtja vseh ledic), ki so prikazana na sliki 3.10:

‐ prižig vseh IR diod (a),

‐ prižig lihih IR diod (b),

‐ prižig sodih IR diod (c).

Metodologija raziskave

35 Slika 3.10: Kombinacije prižiganja IR diod

Iz slike 3.10 je razvidno delovanje preklapljanja diod, ki ga izvedemo z nastavljanjem napetosti (3,3 V ali 0 V) na priključkih za soda in liha števila.

3.2.4 Preverjanje delovanja DC motorjev

Izbrani elektromotorji imajo reduktor. Prestavno razmerje med izhodno in vhodno gredjo je 1:29,86.

DC motorja lahko napajamo preko krmilnika ali preko baterije. Napetostni vir ima lahko vrednost do 6V. V naštem primeru je največja vrednost 3,7 V, t.j. napetost baterije, ki zadošča našim potrebam. Hkrati s preverjanjem delovanja elektromotorjev, preverjamo tudi dvojni H-mostič, preko katerega preklapljamo smeri vrtenja gredi in nastavljamo hitrosti na izhodu.

Čeprav programiramo v platformi Arduino IDE, je za zapisovanje analognih vrednosti na krmilniku ESP32 S2 postopek nekoliko drugačen. Analognega zapisa na priključkih elektromotorjev ne izvajamo s funkcijo AnalogWrite( ), temveč z uporabo sledečih funkcij:

‐ ledcSetup (spremenljivka, frekvenca, ločljivost),

‐ ledcAttachPin(priključek, spremenljivka),

‐ ledcWrite(spremenljivka, vrednost).

Pri tem je spremenljivka lahko poljubno celo število, priključek pa mora biti ustrezno izbran glede na električno shemo. Frekvenca vpliva na zveznost delovanja motorja. Za naš primer je ustrezno število 30 kHz. Ločljivost predstavlja bitno število, ki ga zapišemo na motor in lahko izbiramo od 8 do 12-bitega števila. V našem primeru je pri 8-bitnem številu najnižja napetost 0 (0 V), najvišja pa 255 (3,7 V, oziroma maksimalna napetost iz baterije). Ukaz zapisa napetosti na motorju prožimo s funkcijo ledcWrite( ), kjer prvi argument določa spremenljivko, na katero je vezan priključek motorja, drugi argument pa predstavlja 8-bitno vrednost napetosti.

Metodologija raziskave

36

3.2.4.1 Merjenje maksimalne kotne hitrosti koles

Na podlagi lastnosti kodirnikov in prestavnega razmerja DC motorjev, lahko štejemo obrate koles in posledično računamo kotne hitrosti izhodnih gredi motorjev. Z uporabo funkcije digitalRead(priključek_motorja, HIGH) lahko enostavno nastavimo največjo napetost na elektromotor. Preko izhodnih podatkov iz kodirnikov pa preračunamo kotno hitrost.

Dobimo, da znaša največja kotna hitrost koles približno 25 rad/s. Ta podatek upoštevamo pri programiranju uporabniškega vmesnika.

3.3 Razvoj robota v simulatorju Webots

Na podlagi razvitega mobilnega robota smo v simulatorju sestavili podobno napravo z enakimi lastnostmi.

3.3.1 Sestavljanje okolja in mobilnega robota v simulatorju

V simulaciji izberemo eno izmed obstoječih tem okolja. Dimenzije prostora lahko spreminjamo glede na potrebe. Robove okolja obdajajo zidovi. Na ta način se bo lahko robot premikal le znotraj našega prostora. Tla imajo obliko šahovnice, kar nam omogoča lažje zaznavanje gibanja robota.

Po nastavljanju parametrov okolja, smo se lotili sestavljanja mobilnega robota. Sestavili smo ga iz preprostih geometrijskih teles. V simulatorju je struktura mobilnega robota hierarhična in se deli na 4 glavne sklope:

‐ trup, ki je sestavljen iz vseh mirujočih elementov (IR senzorjev, baterije, krmilnika, modula za zaznavanje talne črte, DC motorjev, multiplekserjev in H-mostiča),

‐ kolesi (levo in desno),

‐ ležajna kroglica.

Glavni del trupa predstavlja PCB plošča, ki ima obliko kvadra. Na to smo dodali 2 kolesi.

Ti imata obliko cilindra, ki ju definiramo kot rotirajoča telesa (angl. HingeJoint). Za tretjo oporno točko smo dodali kroglo, ki se kotali v vse smeri. V realnem primeru bi krogla predstavljala ležajno kroglico.

Posplošen prikaz drevesne strukture naprave je prikazan na sliki 3.11. Vsaki komponenti določimo geometrijsko obliko in estetske lastnosti. V primeru, da nastopa več enakih komponent, nam program Webots omogoča definiranje oblike prve komponente. Pri ostalih pa lahko uporabimo isto obliko, ki je shranjena v programu.

Metodologija raziskave

37 Slika 3.11: Drevesna struktura komponent mobilnega robota

Vsaki komponenti smo določili položaj v našem okolju. Ta je določen glede na kartezični koordinatni sistem našega simulatorja. Izhodišče se nahaja točno v sredini prostora. Vsak lik ima v svojem središču tudi lasten koordinatni sistem. To nam pomaga pri diagnosticiranju napak. Med izvajanjem simulacije lahko označimo kolo in opazimo vrtenje njegovega koordinatnega sistema (kolesa). Preko tega ugotovimo smer vrtenja kolesa.

Slika 3.12 prikazuje model zasnovanega robota in njegov položaj glede na globalni koordinatni sistem. Gibanje robota poteka po ravni površini, zato bo njegova y- koordinata (višina) vedno enaka. Spreminjali pa se mu bosta koordinati z in x. Z- koordinata je predstavljena z modro puščico, x- koordinata pa z rdečo.

S primerjavo oblik med fizičnim in virtualnim modelom robota opazimo mnogo podobnosti.

Razdalja med kolesoma je v obeh primerih enaka. Ta je ključna za programiranje in primerjanje značilnosti robotov. Ostale komponente v simulatorju so poenostavljene s preprostimi geometrijskimi oblikami.

Slika 3.12: Mobilni robot v simulatorju

Metodologija raziskave

38

3.4 Programiranje uporabniškega vmesnika

Iz programskega okolja Arduino smo si izbrali nabor najbolj uporabljenih funkcij za krmiljenje mobilnega robota. Vsako izmed teh smo v Webots programu (angl. Controller) definirali in ji priredili ukaze iz simulatorja. S tem omogočimo uporabniku, da se za programiranje poslužuje zgolj Arduinovih funkcij. S kompleksnejšimi funkcijami iz okolja Webots ne bo imel stika, saj smo te pretvorili v enostavnejše.

3.4.1 Razvoj Arduinovih funkcij

Vse funkcije smo definirali v programskem okolju Webots. Programirali smo v programskem jeziku C++, ker iz tega izhajajo tudi Arduinove funkcije.

V Webots simulatorju ne vidimo električnih povezav med elementi, npr. povezave med krmilnikom in DC motorjem. Zaradi tega smo že vnaprej definirali priključke (angl. Pins) na katerih naj bi bili povezani motorji/senzorji.

Funkcije za izpisovanje podatkov na konzoli:

Serial.begin (baudRate): funkcija omogoča komunikacijo s konzolo iz simulatorja Webots. Argument funkcije je celo število, ki v našem primeru nima vpliva na hitrost komunikacije.

‐ Serial.print/ln (argument): funkciji sta namenjeni izpisu podatkov. Argument je lahko besedilo (navajamo ga med navednicami) ali pa katerakoli vrsta števila. Po ukazu println se bo naslednji argument izpisal v novo vrstico.

Časovne funkcije:

delay (milisekunde): funkcija predstavlja zakasnitev. V navedenem času, ki je v milisekundah bo program Webots miroval, oziroma ne bo izvajal ukazov.

millis/micros( ): funkciji vračata čas, ki je pretekel od zagona simulacije v Webots-u.

Funkcija millis vrača čas v milisekundah, medtem ko micros vrača mikrosekunde.

Funkcije za zapisovanje vrednosti:

analogWrite (številka_pina, vrednost): ena izmed najpomembnejših funkcij, saj preko te nastavljamo napetosti na motorjih. V prvem argumentu povemo funkciji na kateri priključek želimo dati napetost. V drugem argumentu pa povemo vrednost napetosti, ki se giblje med številoma 0 in 255. Ti dve števili predstavljata minimalno in maksimalno napetost, ki lahko prenesemo na motor. Razpon predstavlja 256 možnih vrednosti, po zgledu Arduinove 8 bitne kartice. V našem primeru vrednost 0 predstavlja mirovanje kolesa, vrednost 255 pa največjo kotno hitrost kolesa, ki znaša 25 rad/s.

digitalWrite (številka_pina, HIGH/LOW): fuknkcija, ki je skoraj enaka predhodno opisani analogWrite, samo da namesto 8-bitne vrednosti lahko pišemo le stanji HIGH (maksimalna napetost) ali LOW (ni napetosti). S to funkcijo določamo smer vrtenja posameznega kolesa.

Prekinitvene funkcije:

digitalPinToInterrupt (številka_pina): funkcija zajema le en argument: priključek, ki omogoča branje prekinitev.

attachInterrupt(digitalPinToInterrupt(številka_pina), funkcija_štetja, način_štetja): s to funkcijo lahko zajemamo število obratov posameznega kolesa. Funkcija sprejema 3 argumente. Prvi je klicanje priključka. Drugi kliče funkcijo štetja, ki se bo vklopila vsakič,

Metodologija raziskave

39 ko bo nastopila prekinitev. Zadnji argument nam v Arduinovih programih pove kdaj se bo prekinitvena funkcija sprožila. V našem primeru bo funkcija delovala le če zapišemo RISING, FALLING ali CHANGE.

Ostale funkcije:

pinMode (številka_pina, vhod/izhod): vsebuje dva argumenta. Najprej določimo število priključka, nato pa še tip priključka. Lahko je vhod (INPUT) ali izhod (OUTPUT).

constrain (število, spodnja_meja, zgornja_meja): zajema 3 parametre. Funkcijo uporabljamo v primerih, ko moramo omejiti izhodno vrednost z določenimi mejami, npr.

od 0 do 255. Funkcija vrača vneseno število, če to ne presega vrednosti nastavljenih mej, drugače vrne spodnjo ali zgornjo mejno vrednost.

3.4.2 Branje uporabniškega vmesnika v Webots programu

Uporabniški vmesnik deluje kot knjižnica, ki jo dodamo k programskemu okolju Webots.

Slika 3.13 prikazuje okolje v katerem lahko uporabnik programira mobilnega robota iz Webots simulatorja. Uporabniški vmesnik smo poimenovali Arduino.ino.

Slika 3.13: Uporabniški vmesnik

Vmesnik dodamo v Webots program na popolnoma enak način, kot se dodajajo knjižnice.

Program 3.1 prikazuje le glavni del programa, kjer kličemo funkciji setup in loop iz uporabniškega vmesnika. Ko poženemo simulacijo v simulatorju, se bo setup zanka izvedla le enkrat. Loop zanka pa se bo izvajala dokler ne bomo ustavili simulacije. V programu 3.1 imamo tudi dodatne nastavitve, ki se v tem primeru nanašajo na vrtenje koles in na delovanje senzorjev za pomik (kodirnikov) ter IR senzorjev. Uporabnik teh nastavitev ne spreminja, saj programira zgolj v uporabniškem vmesniku.

Metodologija raziskave

40

#include <Arduino.ino> //dodajanje vmesnika v program int main(int argc, char **argv) {

//notranje nastavitve senzorjev in aktuatorjev

right_wheel->setPosition(INFINITY);

left_wheel->setPosition(INFINITY);

right_wheel->setVelocity(0.0);

left_wheel->setVelocity(0.0);

right_encoder->enable(TIME_STEP);

left_encoder->enable(TIME_STEP);

while (my_robot->step(TIME_STEP) != -1) {

Program 3.1: Branje uporabniškega vmesnika v Webots programu

3.5 Mobilni robot in virtualna različica

Namen razvitega mobilnega robota je sposobnost gibanja po prostoru. Glede na ovire, ki se v tem nahajajo, pa naprava prilagaja hitrost in se tem izogiba. Robota lahko postavimo na poljuben položaj v prostoru. V simulatorju se bo robot začel premikati takoj ob zagonu simulacije. Realen primer pa je potrebno najprej prižgati s stikalom. Elektromotorje zaženemo s pritiskom na gumb BOOT, ki se nahaja na mikrokrmilniku. Obe napravi imata že določeno začetno translatorno hitrost: 10 cm/s. Kotna hitrost je nastavljena na ničto vrednost. Ob zaznavanju ovire v bližini, se naprava ustavi, nato izvede zasuk za 60° okoli osi motorjev. V primeru, da senzorji razdalje ne zaznajo več ovir v bližini, se bo naprava spet začela pomikati naravnost z začetno nastavljeno hitrostjo.

Primerjavo gibanja med realnim razvitim robotom in njegovo virtualno različico težko opravimo na primeru avtonomne vožnje po prostoru z ovirami. Zanesljive rezultate dobimo z analizo translatornega in rotacijskega gibanja obeh naprav.

Analiza virtualne različice mobilnega robota je enostavnejša, saj si pri merjenju časov in razdalj pomagamo z že obstoječimi orodji iz simulatorja Webots (beleženje položaja, natančne časovne meritve). Značilnosti realnega primera mobilnega robota preverimo z več preizkusi in meritvami.

Metodologija raziskave

41

3.5.1 Translatorno gibanje

Za preverjanje translatorne hitrosti smo si zamislili poligon z označenimi razdaljami.

Mobilnega robota smo sprogramirali tako, da vozi naravnost s tremi različnimi hitrostmi:

‐ 10 cm/s,

‐ 20 cm/s,

‐ 30 cm/s.

Merili smo čase, pri opravljenih razdaljah: 50 cm, 100 cm in 150 cm. Eksperiment je prikazan na sliki 3.14.

Slika 3.14: Preverjanje translatorne hitrosti robota

Na vsakem označenem mestu smo pri vsaki različni hitrosti izvedli 3 meritve kot prikazuje preglednica 3.3. Iz teh smo izračunali še povprečne čase (tpov).

Metodologija raziskave

42

Preglednica 3.3: Izmerjeni časi fizičnega robota pri vožnji naravnost