Ovládanie robota KitiBot 2WD na diaľku
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.