Ovládanie robota KitiBot 2WD na diaľku

Zdravím kamarátov robotiky a programovania, ktorí by radi ovládali robot KitiBot 2WD na diaľku. Neodmysliteľnou súčasťou tohto robota je výučbový mikropočítač micro:bit, ktorý je jeho riadiacou jednotkou, disponujúcou technológiou Bluetooth a rádiovou komunikáciou. Spomenutý mikropočítač teda umožňuje diaľkovo ovládať uvedený robot týmito dvomi spôsobmi.

KitiBot 2WD a rádiová komunikácia

Rádiová komunikácia prebieha minimálne medzi dvomi mikropočítačmi micro:bit, pričom prvý mikropočítač sa nazýva vysielač a druhý zase prijímač. Pre uľahčenie ovládania robota KitiBot 2WD som použil joystick Yahboom.

Joystick Yahboom je ľahko programovateľný ovládač (obsahujúci aj vibračný motorček a bzučiak), s rozsiahlou škálou programov a hier poskytnutých jeho výrobcom, preto jeho kúpu považujem za zmysluplné vynaloženie peňažných prostriedkov.

Po zvážení vybavenia spomínaného robota, som sa rozhodol rádiovo ovládať jeho pohyb, bzučiak (pin P0), snímač vzdialenosti (piny P1 a P2), štyri RGB LED diódy (piny P8 a P12) a servomotor (pin P16).

Program pre vysielač a prijímač

Samotný program som vytvoril v platforme Microsoft MakeCode, pričom som využil štandardné aj rozširujúce Bloky Radio, KitiBot, APA102 a GHBit.

Zamyslel som sa ešte nad funkciou tlačidiel joysticku Yahboom, a tak som dostal nasledovný ‚layout‘ signálov vysielaných osadeným mikropočítačom micro:bit v tomto joysticku:

  • páka vľavo – otočenie vľavo
  • páka vpravo – otočenie vpravo
  • páka hore – pohyb dopredu
  • páka dole – pohyb dozadu
  • tlačidlo B1 – pohyb servomotora
  • tlačidlo B2 – zapnutie RGB LED diód a rotácia ich farieb
  • tlačidlo B3 – postupné vypnutie RGB LED diód
  • tlačidlo B4 – prehranie melódie, zobrazenie hodnoty zo snímača vzdialenosti a obrázku na displeji mikropočítača

Programovaním a testovaním som nakoniec dospel k finálnej verzii programu vysielača:

Program JavaScript – program vysielača

led.setBrightness(4)
basic.showLeds(`
    # . # . #
    # . # # .
    # # # . .
    # . # # .
    # . # . #
    `)
radio.setGroup(3)
basic.forever(function () {
    if (GHBit.Rocker(GHBit.enRocker.Up)) {
        radio.sendNumber(1)
    } else if (GHBit.Rocker(GHBit.enRocker.Down)) {
        radio.sendNumber(2)
    } else if (GHBit.Rocker(GHBit.enRocker.Left)) {
        radio.sendNumber(3)
    } else if (GHBit.Rocker(GHBit.enRocker.Right)) {
        radio.sendNumber(4)
    } else if (GHBit.Button(GHBit.enButton.B2, GHBit.enButtonState.Press)) {
        radio.sendNumber(5)
        basic.pause(200)
    } else if (GHBit.Button(GHBit.enButton.B1, GHBit.enButtonState.Press)) {
        radio.sendNumber(6)
        basic.pause(200)
    } else if (GHBit.Button(GHBit.enButton.B4, GHBit.enButtonState.Press)) {
        radio.sendNumber(7)
        basic.pause(200)
    } else if (GHBit.Button(GHBit.enButton.B3, GHBit.enButtonState.Press)) {
        radio.sendNumber(8)
        basic.pause(200)
    } else {
        radio.sendNumber(0)
    }
})

Pre úplnosť ešte uvádzam finálnu verziu programu prijímača:
radio.onReceivedNumber(function (receivedNumber) {
    if (receivedNumber == 1) {
        KitiBot.Run(Dir.forward, 70)
    } else if (receivedNumber == 2) {
        KitiBot.Run(Dir.backward, 70)
    } else if (receivedNumber == 3) {
        KitiBot.Run(Dir.turnLeft, 70)
    } else if (receivedNumber == 4) {
        KitiBot.Run(Dir.turnRight, 70)
    } else if (receivedNumber == 5) {
        if (servo == 0) {
            servo += 90
            KitiBot.Servo(servo)
        } else if (servo == 90) {
            servo += 90
            KitiBot.Servo(servo)
        } else if (servo == 180) {
            servo += -180
            KitiBot.Servo(servo)
            servo = 0
        }
    } else if (receivedNumber == 6) {
        strip.setPixelColor(0, APA102.colors(PixelColors.Blue))
        strip.setPixelColor(1, APA102.colors(PixelColors.Green))
        strip.setPixelColor(2, APA102.colors(PixelColors.Yellow))
        strip.setPixelColor(3, APA102.colors(PixelColors.Purple))
        strip.show()
        basic.pause(500)
        for (let index = 0; index < 4; index++) {
            strip.rotate(1)
            strip.show()
            basic.pause(300)
        }
    } else if (receivedNumber == 7) {
        for (let index = 0; index < 4; index++) {
            strip.shift(1)
            strip.show()
            basic.pause(300)
        }
    } else if (receivedNumber == 8) {
        music.beginMelody(music.builtInMelody(Melodies.JumpDown), MelodyOptions.Once)
        basic.clearScreen()
        basic.showNumber(Math.round(KitiBot.Ultrasonic()))
        basic.clearScreen()
        basic.showLeds(`
            # . # . #
            # . # # .
            # # # . .
            # . # # .
            # . # . #
            `)
    } else if (receivedNumber == 0) {
        KitiBot.Run(Dir.stop, 0)
    }
})
let servo = 0
let strip: APA102.Strip = null
basic.showLeds(`
    # . # . #
    # . # # .
    # # # . .
    # . # # .
    # . # . #
    `)
music.beginMelody(music.builtInMelody(Melodies.JumpUp), MelodyOptions.Once)
strip = APA102.createStrip(4, PixelMode.RGB)
strip.setBrightness(1)
strip.setPixelColor(0, APA102.colors(PixelColors.Purple))
strip.show()
basic.pause(300)
strip.setPixelColor(1, APA102.colors(PixelColors.Yellow))
strip.show()
basic.pause(300)
strip.setPixelColor(2, APA102.colors(PixelColors.Green))
strip.show()
basic.pause(300)
strip.setPixelColor(3, APA102.colors(PixelColors.Blue))
strip.show()
servo = 0
KitiBot.Servo(servo)
radio.setGroup(3)

Program MakeCode – program vysielača

Program JavaScript – program prijímača

radio.onReceivedNumber(function (receivedNumber) {
    if (receivedNumber == 1) {
        KitiBot.Run(Dir.forward, 70)
    } else if (receivedNumber == 2) {
        KitiBot.Run(Dir.backward, 70)
    } else if (receivedNumber == 3) {
        KitiBot.Run(Dir.turnLeft, 70)
    } else if (receivedNumber == 4) {
        KitiBot.Run(Dir.turnRight, 70)
    } else if (receivedNumber == 5) {
        if (servo == 0) {
            servo += 90
            KitiBot.Servo(servo)
        } else if (servo == 90) {
            servo += 90
            KitiBot.Servo(servo)
        } else if (servo == 180) {
            servo += -180
            KitiBot.Servo(servo)
            servo = 0
        }
    } else if (receivedNumber == 6) {
        strip.setPixelColor(0, APA102.colors(PixelColors.Blue))
        strip.setPixelColor(1, APA102.colors(PixelColors.Green))
        strip.setPixelColor(2, APA102.colors(PixelColors.Yellow))
        strip.setPixelColor(3, APA102.colors(PixelColors.Purple))
        strip.show()
        basic.pause(500)
        for (let index = 0; index < 4; index++) {
            strip.rotate(1)
            strip.show()
            basic.pause(300)
        }
    } else if (receivedNumber == 7) {
        for (let index = 0; index < 4; index++) {
            strip.shift(1)
            strip.show()
            basic.pause(300)
        }
    } else if (receivedNumber == 8) {
        music.beginMelody(music.builtInMelody(Melodies.JumpDown), MelodyOptions.Once)
        basic.clearScreen()
        basic.showNumber(Math.round(KitiBot.Ultrasonic()))
        basic.clearScreen()
        basic.showLeds(`
            # . # . #
            # . # # .
            # # # . .
            # . # # .
            # . # . #
            `)
    } else if (receivedNumber == 0) {
        KitiBot.Run(Dir.stop, 0)
    }
})
let servo = 0
let strip: APA102.Strip = null
basic.showLeds(`
    # . # . #
    # . # # .
    # # # . .
    # . # # .
    # . # . #
    `)
music.beginMelody(music.builtInMelody(Melodies.JumpUp), MelodyOptions.Once)
strip = APA102.createStrip(4, PixelMode.RGB)
strip.setBrightness(1)
strip.setPixelColor(0, APA102.colors(PixelColors.Purple))
strip.show()
basic.pause(300)
strip.setPixelColor(1, APA102.colors(PixelColors.Yellow))
strip.show()
basic.pause(300)
strip.setPixelColor(2, APA102.colors(PixelColors.Green))
strip.show()
basic.pause(300)
strip.setPixelColor(3, APA102.colors(PixelColors.Blue))
strip.show()
servo = 0
KitiBot.Servo(servo)
radio.setGroup(3)

Program MakeCode – program prijímača

Video – program vysielača a prijímača

KitiBot 2WD a ovládanie mobilom cez Bluetooth

Technológia Bluetooth mikropočítača micro:bit osadeného v robote KitiBot 2WD umožňuje premeniť mobilný telefón (vyrobený firmou Samsung) za pomoci Android aplikácie micro:bit Blue na diaľkový ovládač tohto robota. Samozrejme, predtým je potrebné spárovať uvedený mikropočítač s mobilným telefónom.

Programoval som zase v platforme Microsoft MakeCode s využitím aj rozširujúcich Blokov Blockytalky, KitiBot a APA102, pričom som do hry zapojil to isté vybavenie (okrem snímača vzdialenosti) spomínaného robota ako pri rádiovej komunikácii.

Taktiež som si premyslel ‚layout‘ ôsmich tlačidiel Android aplikácie a dospel som k tomuto záveru:

  • Button A – pohyb dopredu
  • Button B – pohyb dozadu
  • Button C – otočenie vľavo
  • Button D – otočenie vpravo
  • Button 1 – pohyb servomotora
  • Button 2 – zapnutie alebo zmena farieb zapnutých RGB LED diód na bielo
  • Button 3 – vypnutie RGB LED diód a zobrazenie prázdneho displeju mikropočítača
  • Button 4 – zobrazenie obrázku na displeji mikropočítača

Potom som napísal program, ktorý som testovaním vyladil až do jeho finálnej verzie:

Program JavaScript – Ovládanie mobilom cez Bluetooth

control.onEvent(EventBusSource.MES_DPAD_CONTROLLER_ID, EventBusValue.MICROBIT_EVT_ANY, function () {
    if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_A_DOWN) {
        KitiBot.Run(Dir.forward, 70)
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_A_UP) {
        KitiBot.Run(Dir.stop, 0)
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_B_DOWN) {
        KitiBot.Run(Dir.backward, 70)
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_B_UP) {
        KitiBot.Run(Dir.stop, 0)
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_C_DOWN) {
        KitiBot.Run(Dir.turnLeft, 70)
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_C_UP) {
        KitiBot.Run(Dir.stop, 0)
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_D_DOWN) {
        KitiBot.Run(Dir.turnRight, 70)
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_D_UP) {
        KitiBot.Run(Dir.stop, 0)
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_1_DOWN) {
        KitiBot.Servo(90)
        basic.pause(500)
        KitiBot.Servo(180)
        basic.pause(500)
        KitiBot.Servo(0)
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_2_DOWN) {
        strip.showColor(APA102.colors(PixelColors.White))
        strip.show()
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_3_DOWN) {
        strip.clear()
        strip.show()
        basic.clearScreen()
    } else if (control.eventValue() == EventBusValue.MES_DPAD_BUTTON_4_DOWN) {
        basic.showLeds(`
            . . # . #
            . . # # .
            . . # . .
            # . # # .
            . # # . #
            `)
    }
})
bluetooth.onBluetoothConnected(function () {
    basic.showString("C")
    basic.clearScreen()
    basic.showLeds(`
        # . # . #
        # . # # .
        # # # . .
        # . # # .
        # . # . #
        `)
})
bluetooth.onBluetoothDisconnected(function () {
    basic.clearScreen()
    basic.showString("D")
    basic.clearScreen()
    strip.clear()
    strip.show()
})
let strip: APA102.Strip = null
music.beginMelody(music.builtInMelody(Melodies.PowerUp), MelodyOptions.Once)
strip = APA102.createStrip(4, PixelMode.RGB)
strip.setBrightness(1)
strip.setPixelColor(0, APA102.colors(PixelColors.Purple))
strip.show()
basic.pause(500)
strip.setPixelColor(1, APA102.colors(PixelColors.Yellow))
strip.show()
basic.pause(500)
strip.setPixelColor(2, APA102.colors(PixelColors.Green))
strip.show()
basic.pause(500)
strip.setPixelColor(3, APA102.colors(PixelColors.Blue))
strip.show()
KitiBot.Servo(0)

Program MakeCode – Ovládanie mobilom cez Bluetooth

Video – Ovládanie mobilom cez Bluetooth

Záver

V závere sa chcem poďakovať, že ste si prečítali ďalší článok o robote KitiBot 2WD. Nielenže dokážete mať prakticky plnú kontrolu nad robotom, ale dokonca už s ním môže absolvovať aj robotický futbal alebo preteky.

V ďalšom článku sa vydám vlastnou cestou a v praxi vám predstavím tretí spôsob ovládania uvedeného robota infračerveným diaľkovým ovládačom, s ktorým ani výrobca nepočíta.

E-shop

Waveshare KitiBot 2WD kit pro BBC micro:bit

Sestavte si vlastního robota řízeného BBC micro:bitem.

BBC Micro:bit

Nekonečně programovatelný a rozšiřitelný vzdělávací počítač do kapsy.

Doporučené příslušenství

Leave a Reply