Image
4.7.2019 0 Comments

Konštrukcia a programovanie robotov 2 – diaľkové ovládanie pomocou Micro:bitu

V prvej časti seriálu sme ukázali návod na postavenie jednoduchého robotického podvozku riadeného populárnou doskou Micro:bit, vrátane kódov na otestovanie regulácie otáčok a zmenu smeru otáčania motorčekov. Micro:bit umožňuje vytvorenie rádiového prepojenia medzi dvomi, prípadne viacerými doskami, takže jedna doska môže riadiť hardvér robotického podvozku a pomocou druhej dosky môžete robotické vodidlo ovládať. Buď pomocou dvojice tlačidiel, prípadne potrasením, naklápaním, či natáčaním dosky, ktorá má zabudovaný akcelerometer a náklonomer.  

Fungovanie kódu z príkladov je ukázané vo videu

Najskôr vysvetlíme princíp pohybu robotického podvozku s dvoma kolesami, pričom každé poháňa samostatný motor. Ak sa kolieska robotického podvozku otáčajú rovnakou rýchlosťou jedným, alebo druhým smerom, podvozok sa pohybuje priamo dopredu, alebo dozadu. Ak sa kolieska otáčajú rôznou rýchlosťou, robot zatáča do tej strany, na ktorej sa koliesko pohybuje pomalšie. Ak jedno z kolies úplne zastane a druhé sa otáča, tak robot sa začne otáčať na mieste, pričom stredom otáčania je koleso, ktoré sa nepohybuje a polomer otáčania je daný vzdialenosťou medzi kolesami. Ak potrebujete robotický podvozok otočiť na mieste ale na menšom priemere, tak kolieska sa musia otáčať opačným smerom. Vtedy bude polomer otáčania rovný polovičke vzdialenosti medzi kolesami a os otáčania bude v strede pomyslenej spojnice kolies.

 Najjednoduchší, aj keď nie najintuitívnejší spôsob ovládania je pomocou tlačidiel A a B. Tlačidlá sú len dva a sú umiestnené tak, že sa pomocou nich bude dobre ovládať pohyb doprava, alebo doľava.  Potrebovali by ste ešte ďalšie dva tlačidlá. Jedno na aktivovanie pohybu dopredu, prípadne zrýchľovanie a druhé na pohyb dozadu, prípadne zabrzdenie. Dá sa to vyriešiť napríklad tak, že súčasným zatlačením tlačidiel A + B sa aktivuje pohyb dopredu, tlačidlami A a B sa ovláda smer pohybu a robota zastavíte potrasením ovládacej dosky. Aktivovaný smer pohybu môžete indikovať šípkou zobrazenou na displeji, v našom kóde je z dôvodu úspory miesta len úvodné zobrazenie smerového kríža.

Kód pre dosku Micro:bit, ktorá bude fungovať ako diaľkový ovládač využívajúci tlačidlá A a B a akcelerometer indikujúci potrasenie. Stavy sú indikované ikonami:

JavaScript
basic.showIcon(IconNames.Target)
radio.setGroup(1)
radio.sendNumber(0)
 
input.onGesture(Gesture.Shake, function () {
   basic.showString("x")
   radio.sendNumber(0)
})
input.onButtonPressed(Button.A, function () {
   basic.showString("<")
   radio.sendNumber(1)
})
input.onButtonPressed(Button.B, function () {
   basic.showString(">")
   radio.sendNumber(2)
 
})
input.onButtonPressed(Button.AB, function () {
   basic.showIcon(IconNames.Triangle)
   radio.sendNumber(3)
})

Kód pre dosku Micro:bit, ktorá bude prijímať povely od ovládača a riadiť motory robotického podvozku pri ovládaní pomocou tlačidiel A a B

JavaScript

basic.showIcon(IconNames.Target)
radio.setGroup(1)
 
radio.onReceivedNumberDeprecated(function (receivedNumber) {
    if (receivedNumber == 0) {
       basic.showString("x")
       motorbit.brake()
    }
 
    if (receivedNumber == 1) {
       basic.showString("<")
       motorbit.turnright(40)
    }
 
    if (receivedNumber == 2) {
       basic.showString(">")
       motorbit.turnleft(40)
    }
 
    if (receivedNumber == 3) {
       basic.showIcon(IconNames.Triangle)
       motorbit.forward(40)
    }
})

Druhý, pohodlnejší a presnejší spôsob ovládania je, že robot budete ovládať naklápaním dosky v ruke a do riadiacej dosky robota sa budú 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é 1. Aby ste vedeli, že inicializácia bola úspešná, odporúčame zobraziť na maticovom displeji vhodnú ikonu.

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, prípadne od -50 do 50. Cyklus posielania hodnôt sa opakuje každých 100 ms. 

JavaScript

basic.showIcon(IconNames.Sword)
radio.setGroup(1)
basic.forever(() => {
   radio.sendValue("x", input.acceleration(Dimension.X) / 10)
   basic.pause(100)
   radio.sendValue("y", 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, 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. Na ovládanie pohybu robota do strán sa použije hodnota naklonenia ovládača v osi X. 

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. Možno vás prekvapí, že v tomto cvičnom kóde sa využíva len pohyb doľava a doprava, čiže reakcia na naklonenie ovládacej dosky v osi x. 

JavaScript

let xPovel = 0

let yPovel = 0
 
radio.onDataPacketReceived(({ receivedString: name, receivedNumber: value }) => {
    if (name == "x") {
       xPovel = value
    } else {
       if (name == "y") {
           yPovel = value
        }
    }
})
 
basic.showIcon(IconNames.House)
radio.setGroup(1)
xPovel = 0
yPovel = 0
 
basic.forever(() => {
    if (xPovel > 0) {
        motorbit.turnleft(xPovel)
    } else {
       motorbit.turnright(Math.abs(xPovel))
    }
 
})

Ak by totiž kód obsahoval aj logiku pre pohyb dopredu a dozadu .

...
basic.forever(() => {
    if (xPovel > 0) {
       motorbit.turnleft(xPovel)
    } else {
       motorbit.turnright(Math.abs(xPovel))
    }
 
    if (yPovel > 0) {
       motorbit.forward(yPovel)
    } else {
       motorbit.back(Math.abs(yPovel))
    }
 
 
})

nefungovalo by to, pretože povely reagujúce na naklonenie v osi Y by zrušili povely na zatáčanie do strán. Preto použijeme funkciu freestyle, ktorá umožňuje zadať parametre pre obidva kolesá

JavaScript

let praveKoleso = 0
let laveKoleso = 0
let yPovel = 0
let xPovel = 0
basic.showIcon(IconNames.House)
radio.setGroup(1)
xPovel = 0
yPovel = 0
 
radio.onDataPacketReceived(function ({ receivedString: name, receivedNumber: value }) {
    if (name == "x") {
       xPovel = value
    } else {
       if (name == "y") {
            yPovel = value
        }
    }
})
 
 
basic.forever(function () {
   laveKoleso = yPovel + xPovel
   praveKoleso = yPovel - xPovel
   motorbit.freestyle(praveKoleso, laveKoleso)
})

V budúcom pokračovaní ukážeme originál robotický podvozok pre dosku BBC Micro:bit

 

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Žiadne komentáre

Vyhľadávanie

ACER_122019

Najnovšie videá