Zaujímavé projekty zázračnej stavebnice

Milí rodičia žiakov, ktorých zaujali stavebnice LEGO Technic! Dovoľte mi, aby som Vám predstavil cenovo dostupnú stavebnicu s rovnakými dielikmi, ktorá je dokonca kompatibilná s výučbovým mikropočítačom micro:bit (treba prikúpiť). Spojenie týchto dvoch unikátov sa dá považovať za malý zázrak, z čoho je aj takpovediac odvodený anglický názov stavebnice Wonder Building Kit.

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.





Další příslušenství

Podobné příspěvky

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Jeden komentář