Konštrukcia a programovanie robotov 3 – podvozok Ring:bit pre Micro:bit

Konštrukcia a programovanie robotov 3 – podvozok Ring:bit pre Micro:bit

Stavebnica Ring: bit obsahuje mechanické diely, servomotory a dosku elektroniky pomocou ktorých môžete za niekoľko minút poskladať robotický podvozok, ktorý bude riadiť populárny jednodoskový mikropočítač BBC micro:bit, ktorý sa používa na výučbu programovania aj v mnohých našich školách. Micro:bit sa k doske elektroniky pripevní pomocou piatich skrutiek, ktoré zároveň tvoria elektrické prepojenie pre tri porty P0, P1 a P2, napájacie napätie 3.3 V a elektrickú zem GND. Dva GPIO porty P1 a P2 sú určené na ovládanie servomotorov poháňajúcich kolesá a tretí port P0 sa dá použiť na iný účel, napríklad ultrazvukový senzor a podobne. Na pomocnú dosku elektroniky na ktorej sú aj dve RGB diódy sa dajú umiestniť prídavné senzory, ktoré nie sú súčasťou štandardného balenia stavebnice. 

Video ukazuje, ako fungujú všetky príklady v článku

Servomotor, alebo servo je jednosmerný motorček s prevodovkou snímačom uhla natočenia a riadiacou elektronikou. K riadiacej elektronike sa pripája pomocou troch vodičov, pričom dva vodiče sú napájacie a jeden vodič slúži na prenos riadiaceho signálu. Servo sa riadi impulzmi PWM signálu s periódou 20ms a šírkou pulzu v intervale 1 až 2ms.

Servomotory sa buď otáčajú o definovaný uhol, ktorý zodpovedá aktuálnej šírke impulzu, alebo servá označené ako 360° sa otáčajú kontinuálne dopredu, alebo dozadu. Rýchlosť otáčania závisí od šírky impulzu. Pri 1.5 ms motor stojí, v intervale 1 – 1.5 ms sa otáča na jednu stranu a v intervale 1.5 – 2 ms sa ootáža na druhú stranu.  Aby ste nemuseli programovať generovanie PWM signálu na jednotlivých portoch, môžete využiť pripravené funkcie. V prostredí https://makecode.microbit.org je potrebné do projektu importovať rozšírenie “ringbitcar”.

V prvom najjednoduchšom príklade bude robotické autíčko ovládané tlačidlami na svojej vlastnej riadiacej doske. Tlačidlom A sa bude aktivovať pohyb dopredu a tlačidlom B dozadu. Súčasným zatlačením obidvoch tlačidiel vozidlo zastane

JavaScript

RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
input.onButtonPressed(Button.A, function () {
    RingbitCar.forward()
})
input.onButtonPressed(Button.B, function () {
   RingbitCar.back()
})
input.onButtonPressed(Button.AB, function () {
   RingbitCar.brake()
}).

V ďalšom príklade skúsime nechať robotické autíčko kresliť. Má totiž v zadnej časti držiak, do ktorého sa dá upevniť fixka. Pozrite si vo videu aký obrazec nakreslí tento kód. Predpokladali by ste, že mnohouholník. Je to však skôr niečo pripomínajúce ozubený kotúč. Je to dané kombináciou dvoch faktorov. Jednak tým, ako je implementovaná funkcia RingbitCar.turnright(), kedy robot nezatočí plynule, ale na mieste a tým, že držiak na fixku je umiestený mimo stredu spojnice kolies.  

JavaScript

RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
basic.forever(function () {
   RingbitCar.forward()
   basic.pause(400)
   RingbitCar.turnright()
   basic.pause(100)
})

Naproti tomu kružnicu vykreslí takéto robotické autíčko takmer dokonalú. Stačí zariadiť, aby sa kolesá otáčali rovnakým smerom, avšak rôznou rýchlosťou. Čím je rozdiel medzi rýchlosťou otáčania kolies väčší, tým bude polomer vykreslenej kružnice menší

JavaScript

RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
input.onButtonPressed(Button.A, function () {
   RingbitCar.freestyle(100, 50)
})
input.onButtonPressed(Button.B, function () {
   RingbitCar.brake()
})

Využiť môžete aj dve RGB LED diódy na pomocnej doštičke, ktoré sú nasmerované tak, aby svietili na podložku. Kombináciou modrého a červeného svetla môžete napodobniť maják. Prípadne môžete rozsvietením týchto LED signalizovať nejakú udalosť. 

JavaScript

RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
RingbitCar.forward()
let strip = neopixel.create(DigitalPin.P0, 2, NeoPixelMode.RGB)
basic.forever(function () {
   strip.showColor(neopixel.colors(NeoPixelColors.Red))
   basic.pause(100)
   strip.showColor(neopixel.colors(NeoPixelColors.Blue))
   basic.pause(100)
})

Intuitívnejší spôsob ovládania je nakláňaním dosky v ruke, pričom sa do riadiacej dosky robota sbudú posielať údaje z akceleometra v osiach X a Y. V inicializačnom bloku je potrebné nastaviť rádiový kanál, konkrétne číslo skupiny. Toto číslo musí byť rovnaké pre obidve dosky, ktoré majú spolu komunikovať. V príklade je pomocou príkazu setGroup() ako číslo skupiny nastavené 90. 

Ovládanie, čiže načítanie údajov z akcelerometra a ich poslanie do druhej dosky sa odohráva v hlavnej slučke programu. Parameter X, ktorým sa ovláda smer pohybu robota sa nastavuje naklonením dosky doľava alebo doprava. Zrýchlenie, alebo spomalenie sa nastavuje naklonením dosky dopredu, alebo dozadu. V kóde je potrebný prepočet rozsahu, pretože akcelerometer poskytuje údaje z intervalu – 1 023 až 1023, avšak knižničné funkcie na ovládanie motorov pracujú s parametrami v rozsahu 0 – 100.  Preto je potrebné hodnotu z akcelerometra vydeliť desiatimi.  Cyklus posielania hodnôt sa opakuje každých 100 ms. 

JavaScript

radio.setGroup(90)
basic.forever(function () {
   radio.sendValue("x", Math.idiv(input.acceleration(Dimension.X), 10))
   basic.pause(100)
   radio.sendValue("y", Math.idiv(input.acceleration(Dimension.Y), 10))
   basic.pause(100)
})

V hlavnej slučke sa spracovávajú povely, ktoré obsahujú informácie o naklonení druhého micro:bitu.

Kód pre dosku Micro:bit, s rozširujúcim modulom motorbit, ktorá bude prijímať povely od ovládača a riadiť motory robotického podvozku. Budeme samostatne nastavovať smer a rýchlosť otáčania pre každý motor. V hlavnej slučke sa na základe prijatých povelov, ktoré obsahujú informácie o naklonení druhého micro:bitu, slúžiaceho ako ovládač vypočítava rýchlosť a smer otáčania obidvoch motorčekov. Pohyb dopredu a dozadu je odvodený od hodnoty akcelerometra v osi Y. Predpokladajme zatiaľ, že naklonenie v druhej osi X je nulové. V takom prípade, ak je doska ovládača naklonená dopredu potrebujete aby sa robot pohyboval dopredu a naopak. Preto ak je hodnota Y kladná budú sa kolesá otáčať takým smerom, aby sa robotický podvozok pohyboval dopredu a pokiaľ je hodnota Y záporná, tak dozadu. V obidvoch prípadoch sa budú kolesá otáčať rovnakou rýchlosťou. Na ovládanie pohybu robota do strán sa použije hodnota naklonenia ovládača v osi X. Vtedy sa budú kolesá otáčať každé iným smerom. Pre ľavé koleso sa použije hodnota nameraná v osi X priamo a pre pravé hodnota s prevráteným znamienkom. 

Z toho vyplývajú vzorce pre otáčky kolies:

laveKoleso = yPovel + xPovel

praveKoleso = yPovel - xPovel

Na základe znamienok hodnôt nameraných akcelerometrom ovládača v jednotlivých osiach sa nastaví smer otáčania motorčekov poháňajúcich kolesá. 

JavaScript

radio.setGroup(90)
radio.onDataPacketReceived(function ({ receivedString: name, receivedNumber: value }) {
    if (name == "x") {
       xValue = value
    } else {
       if (name == "y") {
           yValue = value
        }
    }
})
 
let rightwheel = 0
let leftwheel = 0
let yValue = 0
let xValue = 0
RingbitCar.init_wheel(AnalogPin.P2, AnalogPin.P1)
basic.showIcon(IconNames.Triangle)
xValue = 0
yValue = 0
basic.forever(function () {
   leftwheel = yValue + xValue
   rightwheel = yValue - xValue
   RingbitCar.freestyle(leftwheel, rightwheel)
})

A ešte jedno zaujímavé využitie dosky Micro:bit. LED diódy v maticovom displeji sa dajú využiť aj na meranie intenzity okolitého osvetlenia. Hĺbavejší čitatelia nájdu viac podrobností o tom ako to funguje na https://lancaster-university.github.io/microbit-docs/extras/light-sensing/V najjednoduchšej aplikácii sa bude robotický podvozok pohybovať za svetlom. Po spustení programového kódu sa bude otáčať na mieste a ak nameria intenzitu svetla vyššiu než referenčná hodnota v podmienke, začne sa pohybovať. Takže sa v konečnom dôsledku začne. Pohybovať tým smerom z ktorého zachytil svetlo

JavaScript

RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
basic.forever(function () {
    if (input.lightLevel() > 40) {
       RingbitCar.forward()
    } else {
       RingbitCar.turnleft()
    }
})

Tento kód sa dá jednoducho vylepšiť, aby sa robot pohyboval za svetlom kontinuálne

Zobrazit Galériu

Podobné články

Nedávne články

Obľúbené články