Zaujímavé projekty zázračnej stavebnice
Mikropočítač aj zázračnú stavebnicu som podrobne opísal v predošlých článkoch, preto je načase, aby som vám odprezentoval niektoré vlastné projekty, ktoré som zrealizoval pri oboznamovaní sa s jednotlivými technickými dielikmi stavebnice. Projekty som nazval The Dancer (v preklade tanečník) a The Quadricycle (v preklade štvorkolka).
Projekt The Dancer
Prvý projekt The Dancer je celkom jednoduchý na zostavenie, pričom jeho pohybový prejav zabezpečuje sivý servomotor (Geekservo 2kg 360° kompatibilný s Lego) a o svetelné efekty sa stará rozširujúca doska Wukong s batériou. Pre úplnosť je potrebné ešte uviesť, že servomotor je pripojený na servopin S0 spomenutej dosky.
Neodmysliteľnou súčasťou projektu je výučbový mikropočítač micro:bit, ktorý so správnym programom tanečníkovi doslova vdýchne život. Tento mikropočítač je ľahko programovateľný pomocou bezplatnej platformy Microsoft MakeCode umožňujúcej programovanie pomocou blokov (bez nutnosti ovládania programovacieho jazyka), ktoré je vhodné pre školákov.
Program pre tanečníka počíta aj s použitím rozširujúcich Blokov Wukong a Neopixel zmienenej platformy, pričom jeho finálna verzia je nasledovná:
Program JavaScript
input.onButtonPressed(Button.A, function () {
count1 += 1
if (count1 == 1) {
strip.setPixelColor(0, neopixel.colors(NeoPixelColors.White))
strip.setPixelColor(1, neopixel.colors(NeoPixelColors.Black))
strip.setPixelColor(2, neopixel.colors(NeoPixelColors.White))
strip.setPixelColor(3, neopixel.colors(NeoPixelColors.Black))
strip.show()
basic.showLeds(`
. . # . #
. # # # .
# . # . .
. . # # .
. # . # .
`)
for (let index = 0; index < 40; index++) {
angle += 1
wuKong.setServoAngle(wuKong.ServoList.S0, angle)
strip.rotate(1)
strip.show()
basic.pause(100)
}
strip.clear()
strip.show()
basic.showLeds(`
. . # . .
. # # # .
. . # . .
. # . # .
. # . # .
`)
} else if (count1 == 2) {
strip.setPixelColor(0, neopixel.colors(NeoPixelColors.White))
strip.setPixelColor(1, neopixel.colors(NeoPixelColors.White))
strip.setPixelColor(2, neopixel.colors(NeoPixelColors.Black))
strip.setPixelColor(3, neopixel.colors(NeoPixelColors.Black))
strip.show()
basic.showLeds(`
# . # . .
. # # # .
. . # . #
. # # . .
. # . # .
`)
for (let index = 0; index < 40; index++) {
angle += -1
wuKong.setServoAngle(wuKong.ServoList.S0, angle)
strip.rotate(2)
strip.show()
basic.pause(100)
}
strip.clear()
strip.show()
basic.showLeds(`
. . # . .
. # # # .
. . # . .
. # . # .
. # . # .
`)
count1 = 0
}
})
input.onButtonPressed(Button.B, function () {
count2 += 1
if (count2 == 1) {
basic.showLeds(`
# . # . .
. # # # .
. . # . #
. # # . .
. # . # .
`)
for (let index = 0; index < 20; index++) {
angle += -2
wuKong.setServoAngle(wuKong.ServoList.S0, angle)
wuKong.setLightMode(wuKong.LightMode.BREATH)
strip.showColor(neopixel.colors(NeoPixelColors.Blue))
basic.pause(100)
wuKong.setLightMode(wuKong.LightMode.OFF)
strip.showColor(neopixel.colors(NeoPixelColors.Black))
}
strip.clear()
strip.show()
basic.showLeds(`
. . # . .
. # # # .
. . # . .
. # . # .
. # . # .
`)
} else if (count2 == 2) {
basic.showLeds(`
. . # . #
. # # # .
# . # . .
. . # # .
. # . # .
`)
for (let index = 0; index < 20; index++) {
angle += 2
wuKong.setServoAngle(wuKong.ServoList.S0, angle)
wuKong.setLightMode(wuKong.LightMode.BREATH)
strip.showColor(neopixel.colors(NeoPixelColors.Black))
basic.pause(100)
wuKong.setLightMode(wuKong.LightMode.OFF)
strip.showColor(neopixel.colors(NeoPixelColors.Blue))
}
strip.clear()
strip.show()
basic.showLeds(`
. . # . .
. # # # .
. . # . .
. # . # .
. # . # .
`)
count2 = 0
}
})
let count2 = 0
let count1 = 0
let strip: neopixel.Strip = null
let angle = 0
angle = 90
wuKong.setServoAngle(wuKong.ServoList.S0, angle)
led.setBrightness(10)
basic.showString("W")
wuKong.lightIntensity(10)
wuKong.setLightMode(wuKong.LightMode.BREATH)
strip = neopixel.create(DigitalPin.P16, 4, NeoPixelMode.RGB)
strip.setBrightness(20)
strip.showRainbow(1, 360)
basic.pause(1000)
basic.showLeds(`
# . # . .
. # # # .
. . # . #
. # # . .
. # . # .
`)
strip.shift(1)
strip.show()
basic.pause(1000)
basic.showLeds(`
. . # . #
. # # # .
# . # . .
. . # # .
. # . # .
`)
strip.shift(1)
strip.show()
basic.pause(1000)
basic.showLeds(`
# . # . #
. # # # .
. . # . .
. . # . .
. # . # .
`)
strip.shift(1)
strip.show()
basic.pause(1000)
basic.showLeds(`
. . # . .
. # # # .
. . # . .
. # . # .
. # . # .
`)
strip.shift(1)
strip.show()
basic.pause(1000)
wuKong.setLightMode(wuKong.LightMode.OFF)
count1 = 0
count2 = 0
Program MakeCode
Program uvedeného projektu spolu s návodom na postavenie je možné stiahnuť po kliknutí na zelené tlačidlo.
Video
Ako ste si určite všimli, dve tlačidlá mikropočítača vyvolajú až štyri rozdielne reakcie, čo zvyšuje variabilitu samotného programu. Je to spôsob ako pri limitnom počte tlačidiel docieliť bezlimitnosť variácií.
Projekt The Quadricycle
Druhý projekt The Quadricycle nie je tiež náročný z pohľadu zostavy, avšak jeho pohyb umožňujú dva červené servomotory (Geekservo Motor 2kg kompatibilný s Lego) a za využitia prevodov ozubených kolies. Nezávislým otáčaním kolies na ľavej strane od kolies na pravej strane je dosiahnutý pohyb do strán.
Štyri RGB LED diódy rozširujúcej dosky Wukong vylepšujú dojem z prevádzky štvorkolky a slúžia podobne ako svietidlá automobilu.
Mikropočítač micro:bit naprogramovaný cez platformu Microsoft MakeCode (rozšírená o Bloky Wukong a Neopixel) dokáže uviesť do chodu štvorkolku všetkými možnými smermi:
Program JavaScript
input.onButtonPressed(Button.A, function () {
count1 += 1
if (count1 == 1) {
wuKong.setLightMode(wuKong.LightMode.BREATH)
basic.showLeds(`
. . . . .
. . # . .
. # # # .
# # # # #
. . . . .
`)
wuKong.setMotorSpeed(wuKong.MotorList.M1, 50)
wuKong.setMotorSpeed(wuKong.MotorList.M2, -50)
strip.setPixelColor(0, neopixel.colors(NeoPixelColors.White))
strip.setPixelColor(1, neopixel.colors(NeoPixelColors.White))
strip.show()
basic.pause(2000)
wuKong.stopAllMotor()
strip.clear()
strip.show()
wuKong.setLightMode(wuKong.LightMode.OFF)
basic.showString("W")
} else if (count1 == 2) {
wuKong.setLightMode(wuKong.LightMode.BREATH)
basic.showLeds(`
. . . . .
# # # # #
. # # # .
. . # . .
. . . . .
`)
wuKong.setMotorSpeed(wuKong.MotorList.M1, -50)
wuKong.setMotorSpeed(wuKong.MotorList.M2, 50)
strip.setPixelColor(2, neopixel.colors(NeoPixelColors.Red))
strip.setPixelColor(3, neopixel.colors(NeoPixelColors.Red))
strip.show()
basic.pause(2000)
wuKong.stopAllMotor()
strip.clear()
strip.show()
wuKong.setLightMode(wuKong.LightMode.OFF)
basic.showString("W")
count1 = 0
}
})
input.onButtonPressed(Button.B, function () {
count2 += 1
if (count2 == 1) {
wuKong.setLightMode(wuKong.LightMode.BREATH)
basic.showLeds(`
. . . # .
. . # # .
. # # # .
. . # # .
. . . # .
`)
wuKong.setMotorSpeed(wuKong.MotorList.M1, -50)
wuKong.setMotorSpeed(wuKong.MotorList.M2, -50)
strip.setPixelColor(0, neopixel.colors(NeoPixelColors.Orange))
strip.setPixelColor(3, neopixel.colors(NeoPixelColors.Orange))
strip.show()
basic.pause(3000)
wuKong.stopAllMotor()
strip.clear()
strip.show()
wuKong.setLightMode(wuKong.LightMode.OFF)
basic.showString("W")
} else if (count2 == 2) {
wuKong.setLightMode(wuKong.LightMode.BREATH)
basic.showLeds(`
. # . . .
. # # . .
. # # # .
. # # . .
. # . . .
`)
wuKong.setMotorSpeed(wuKong.MotorList.M1, 50)
wuKong.setMotorSpeed(wuKong.MotorList.M2, 50)
strip.setPixelColor(1, neopixel.colors(NeoPixelColors.Orange))
strip.setPixelColor(2, neopixel.colors(NeoPixelColors.Orange))
strip.show()
basic.pause(3000)
wuKong.stopAllMotor()
strip.clear()
strip.show()
wuKong.setLightMode(wuKong.LightMode.OFF)
basic.showString("W")
count2 = 0
}
})
let count2 = 0
let count1 = 0
let strip: neopixel.Strip = null
led.setBrightness(10)
wuKong.lightIntensity(10)
wuKong.setLightMode(wuKong.LightMode.BREATH)
basic.showString("W")
strip = neopixel.create(DigitalPin.P16, 4, NeoPixelMode.RGB)
strip.showRainbow(1, 360)
basic.pause(1000)
for (let index = 0; index < 4; index++) {
strip.shift(1)
strip.show()
basic.pause(1000)
}
wuKong.setLightMode(wuKong.LightMode.OFF)
count1 = 0
count2 = 0
music.playTone(440, music.beat(BeatFraction.Quarter))
basic.showString("Z")
basic.clearScreen()
} else if (smerovanie == 315) {
music.playTone(392, music.beat(BeatFraction.Quarter))
basic.showString("SZ")
basic.clearScreen()
} else {
basic.showLeds(`
. . . . .
. . # . .
. # . # .
. . # . .
. . . . .
`)
}
})
Program MakeCode
Návod na postavenie opísaného projektu spolu s programom sa dá stiahnuť po kliknutí na zelené tlačidlo.
Video
Pohyb dopredu alebo dozadu sa uskutoční po stlačení tlačidla A, otočenie vpravo alebo vľavo zase pri stlačení tlačidla B. V prípade, že štvorkolka sa pohybuje inak, stačí zameniť pripojenie motorov na piny M1 a M2 rozširujúcej dosky.
Záver
So záverom prichádza vyjadrenie vďaky za čitateľskú priazeň a za snahu ukázať vašim deťom (prostredníctvom stavebnice Wonder Building Kit) cestu do budúcnosti, ktorou je programovanie spolu s robotikou. Stačí sa len zamyslieť nad tým, akým tempom napreduje veda a technika. Prejaví sa to nielen zmenou doby, ale aj zmenou ponímania príslovia ‚Kolik (programovacích) jazyků umíš, tolikrát jsi člověkem‘.
E-shop
Elecfreaks Micro:bit Wonder Building Kit (bez micro:bitu)
Interaktivní stavebnice (400+ dílků), elektronické senzory a 20 projektů, které obohatí vaše hrátky s micro:bitem o nové výzvy a spoustu zábavy.
BBC micro:bit V2
Nekonečně programovatelný a rozšiřitelný vzdělávací počítač do kapsy.
Jeden komentář