micro:bit → MakeCode → Akcelerometar na micro:bit-u: nagib, tresenje i pokreti
Akcelerometar na micro:bit-u: nagib, tresenje i pokreti
Lekcija 8 od 14 · micro:bit
Na poleđini micro:bit-a nalazi se akcelerometar – senzor koji meri ubrzanje u tri pravca. Pošto na uređaj uvek deluje Zemljina teža, akcelerometar „zna“ kako je micro:bit nagnut. Zato može da prepozna tresenje, okretanje ekrana nagore ili nadole i naginjanje levo-desno. U ovoj lekciji pravimo kockicu za igru, libelu (merač nagiba) i brojač koraka.
Pre nego što počneš: potrebno predznanje – petlje, grananje i Logic paleta. Kako da učiš: svaki primer složi u MakeCode-u i isprobaj u simulatoru (ili na uređaju), a zadatke na kraju prvo reši sam/a; uputstvo i rešenje otvori tek posle toga. Programi su dati blokovima (opis) i u JavaScript-u iz MakeCode-a: u editoru klikni na JavaScript, nalepi kod i vrati se na Blocks – dobićeš iste blokove.
Tri ose: x, y i z
Akcelerometar meri ubrzanje duž tri ose. Vrednost se daje u mili-g (mg): 1000 mg je ubrzanje Zemljine teže.
Osa
Pravac
Kada je vrednost velika
x
levo – desno
micro:bit nagnut udesno (pozitivno) ili ulevo (negativno)
y
napred – nazad
nagnut ka sebi ili od sebe
z
gore – dole
leži na stolu: oko −1000 (ekran nagore)
strength
ukupna jačina
oko 1000 u mirovanju, više kad se trese
Blok acceleration (mg) x je u paleti Input → more. Sledeći program pritiskom na dugme prikazuje vrednost jedne ose:
input.onButtonPressed(Button.A, function () {
basic.showNumber(input.acceleration(Dimension.X)) // nagib levo-desno
})
input.onButtonPressed(Button.B, function () {
basic.showNumber(input.acceleration(Dimension.Y)) // nagib napred-nazad
})
input.onButtonPressed(Button.AB, function () {
basic.showNumber(input.acceleration(Dimension.Strength)) // ukupna jačina
})
Isprobaj u simulatoru: mišem pomeraj micro:bit na slici i gledaj kako se brojevi menjaju. Na pravom uređaju nagni ga i pritisni dugme.
Gestovi: tresenje, naginjanje, okretanje
Za najčešće pokrete ne moramo da poredimo brojeve – postoji blok on shake (paleta Input). U padajućoj listi su i drugi gestovi:
Gest
Šta znači
shake
micro:bit je protresen
logo up / logo down
logo (gornja ivica) okrenut nagore / nadole
screen up / screen down
ekran okrenut ka nebu / ka stolu
tilt left / tilt right
nagnut ulevo / udesno
free fall
uređaj pada
3g, 6g, 8g
jak udarac (veliko ubrzanje)
Primer: elektronska kockica. Kad se micro:bit protrese, prikazuje slučajan broj od 1 do 6.
input.onGesture(Gesture.Shake, function () {
let broj = randint(1, 6) // slučajan broj od 1 do 6
basic.showNumber(broj)
})
Blokovima:
on shake (Input)
u njega show number (Basic), a u polje broja pick random 1 to 6 (Math)
Gestovi se mogu kombinovati. Ovaj program pokazuje strelicu u smeru u kom je uređaj nagnut:
input.onGesture(Gesture.TiltLeft, function () {
basic.showArrow(ArrowNames.West) // strelica ulevo
})
input.onGesture(Gesture.TiltRight, function () {
basic.showArrow(ArrowNames.East) // strelica udesno
})
input.onGesture(Gesture.ScreenDown, function () {
basic.clearScreen() // ekran okrenut ka stolu – gasimo ga
})
Ugao nagiba i libela
Blok rotation (°) pitch daje ugao nagiba napred-nazad, a rotation (°) roll ugao levo-desno, u stepenima (od −180 do 180). Kada micro:bit leži ravno, oba ugla su blizu 0.
Libela pokazuje da li je površina ravna. Na ekranu svetli jedna tačka – „mehurić“. Kada je uređaj ravan, tačka je u sredini (2, 2); kad ga nagnemo, tačka beži na tu stranu. Ugao od −45° do 45° pretvaramo u kolonu od 0 do 4 blokom map (paleta Math):
let x = 2
let y = 2
basic.forever(function () {
// ugao od -45 do 45 stepeni pretvaramo u kolonu/red od 0 do 4
x = Math.round(Math.map(input.rotation(Rotation.Roll), -45, 45, 0, 4))
y = Math.round(Math.map(input.rotation(Rotation.Pitch), -45, 45, 0, 4))
x = Math.constrain(x, 0, 4) // ne izlazimo van ekrana
y = Math.constrain(y, 0, 4)
basic.clearScreen()
led.plot(x, y) // "mehurić"
basic.pause(50)
})
Blok constrain „seče“ vrednost na zadate granice: ako je ugao veći od 45°, map bi dao broj veći od 4, a takve kolone nema.
Brojač koraka sa pragom
U lekciji o promenljivama brojač koraka je koristio on shake. Tačnije se broji kada sami odredimo prag: korak je trenutak kada ukupna jačina ubrzanja pređe, na primer, 1500 mg.
let koraci = 0
basic.forever(function () {
if (input.acceleration(Dimension.Strength) > 1500) {
koraci += 1
basic.showNumber(koraci)
basic.pause(300) // jedan korak ne brojimo dva puta
}
})
input.onButtonPressed(Button.A, function () {
koraci = 0 // nula za novo merenje
basic.showNumber(koraci)
})
Pauza od 300 ms je važna: jedan korak traje kratko, ali bi ga bez pauze petlja izbrojala više puta. Probaj različite pragove (1300, 1800) i proveri koji najbolje broji tvoje korake.
Zadaci za vežbu
Za svaki zadatak postoji primer, uputstvo i rešenje. Rešenja su provereno tačna na primerima iz teksta.
ZADATAK 01Težina: lako
Merač udarca
Napiši program koji stalno prikazuje grafikon jačine ubrzanja blokom plot bar graph (paleta Led): u mirovanju svetli malo lampica, a kad se micro:bit trese – ceo ekran.
Primer
Izlaz
u mirovanju svetli donji red, pri jakom tresenju ceo ekran
Uputstvo
U bloku forever koristi led.plotBarGraph(vrednost, najveća). Za najveću vrednost uzmi 3000.
Rešenje (JavaScript u MakeCode-u)
basic.forever(function () {
// grafikon: koliko lampica svetli zavisi od jačine ubrzanja
led.plotBarGraph(input.acceleration(Dimension.Strength), 3000)
})
ZADATAK 02Težina: srednje
Drži ravno!
Igra: pritiskom na A počinje merenje. Svake sekunde u kojoj je micro:bit ravan (oba ugla između −10° i 10°) dobija se poen. Kad se uređaj nagne više, igra se završava i prikazuje broj poena.
Primer
Izlaz
posle A: srce dok je uređaj ravan; kad se nagne – broj osvojenih poena
Uputstvo
Koristi petlju while sa složenim uslovom (and) i funkciju Math.abs za apsolutnu vrednost ugla.
Rešenje (JavaScript u MakeCode-u)
input.onButtonPressed(Button.A, function () {
let poeni = 0
// dok su oba ugla mala, micro:bit je "ravan"
while (Math.abs(input.rotation(Rotation.Roll)) < 10 && Math.abs(input.rotation(Rotation.Pitch)) < 10) {
basic.showIcon(IconNames.Heart)
basic.pause(1000)
poeni += 1
}
basic.showNumber(poeni)
})
ZADATAK 03Težina: srednje
Kockica sa dve kocke
Kad se micro:bit protrese, „baca“ dve kockice: prikazuje prvi broj, pa drugi, pa njihov zbir. Ako su oba broja ista, prikazuje i srećno lice.
Primer
Izlaz
npr. 3, 5, 8 – ili 4, 4, 8 i srećno lice
Uputstvo
Dve promenljive dobijaju vrednost blokom pick random 1 to 6; za isti broj koristi if sa uslovom ==.
Rešenje (JavaScript u MakeCode-u)
input.onGesture(Gesture.Shake, function () {
let prva = randint(1, 6)
let druga = randint(1, 6)
basic.showNumber(prva)
basic.showNumber(druga)
basic.showNumber(prva + druga) // zbir
if (prva == druga) {
basic.showIcon(IconNames.Happy) // dupli broj
}
})
Česte greške i saveti
Akcelerometar meri i Zemljinu težu – zato micro:bit koji miruje na stolu ne pokazuje nulu na osi z, već oko −1000.
U petlji koja meri pokret uvek stavi kratku pauzu, inače se jedan pokret izbroji više puta.
Ako blok map može da da vrednost van ekrana, ograniči je blokom constrain.
Gest shake je dovoljan za igre; za tačno merenje koristi brojeve i sopstveni prag.
Proveri znanje
Otvori kviz
Akcelerometar
1. Šta meri akcelerometar?
2. Koliko je približno acceleration strength kada micro:bit miruje?
3. Koji gest se dešava kada je micro:bit nagnut ulevo?
4. Čemu služi constrain(x, 0, 4)?
Podešavanja kolačića
Koristimo kolačiće da bismo vam pružili najbolje moguće iskustvo. Takođe nam omogućavaju da analiziramo ponašanje korisnika kako bismo stalno poboljšavali veb lokaciju za vas.