Elecfreaks ring:bit Car: Rozdiel medzi revíziami
Zo stránky SensorWiki
Vytvorená stránka „Robot ring:bot Car od firmy Elecfreaks. <div style='text-align: center;'> 500px<BR> ''Elecfreaks ring:bit Car v2'' </div> * Produc…“ |
|||
(19 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
Robot ring:bot Car od firmy Elecfreaks. | Robot ring:bot Car od firmy Elecfreaks. Dodáva sa vo forme jednoduchej stavebnice, ktorú raz poskladáte a potom už nemeníte. | ||
Riadok 41: | Riadok 41: | ||
P1 ľavý motor | P1 ľavý motor | ||
P2 pravý motor | P2 pravý motor | ||
Výhody: | |||
* jednoduchosť | |||
* kvalitné servomotory | |||
Nevýhody: | |||
* len tri porty (P0-2) využiteľné | |||
* vypínač na rozširujúcej doske nevypína motory pri napájaní cez USB | |||
* neprístupné tlačidlo RESET | |||
* ''môj exemplár mal výrazne nesymetrické motorčeky, zrejme bol jeden poškodený'' | |||
== Základné programy == | == Základné programy == | ||
Riadok 48: | Riadok 59: | ||
=== Blinker === | === Blinker === | ||
[[Súbor:microbit-LEDmoduleNumbering.png|300px|right]] | |||
Ukážka práce s RGB LED diódami na rozširovacom module. Ak ho nemáte, zameňte LED číslo 2 a 9 za 0 a 1, ktoré sú priamo na základnej doske. | |||
Pozri aj číslovanie LED na nasledovnom obrázku. Správna činnosť programu vyžaduje knižnicu '''<code>Neopixel</code>''' a prepínač na spodnej strane robota musí byť prepnutý do polohy | |||
Rainbow LED. | |||
Jednoduchý program pre blinker, funguje na tlačítka - stlačením ľavého tlačidla 🅰 sa zapne ľavá smerovka, pravým tlačidlom 🅱 sa zapne pravá. Stlačením oboch 🅰+🅱 sa blinker vypne. | Jednoduchý program pre blinker, funguje na tlačítka - stlačením ľavého tlačidla 🅰 sa zapne ľavá smerovka, pravým tlačidlom 🅱 sa zapne pravá. Stlačením oboch 🅰+🅱 sa blinker vypne. | ||
<gallery heights=600px mode="packed"> <!-- slideshow? --> | <gallery heights=600px mode="packed"> <!-- slideshow? --> | ||
Image:microbit- | Image:microbit-RingBitBlinker.png|''Smerovky'' | ||
</gallery> | </gallery> | ||
Riadok 60: | Riadok 74: | ||
<tab name="Javascript"><source lang="javascript"> | <tab name="Javascript"><source lang="javascript"> | ||
input.onButtonPressed(Button.A, function () { | input.onButtonPressed(Button.A, function () { | ||
turn_right_indicator_on = true | |||
turn_left_indicator_on = false | |||
indicator.clear() | indicator.clear() | ||
indicator.show() | indicator.show() | ||
Riadok 72: | Riadok 86: | ||
}) | }) | ||
input.onButtonPressed(Button.B, function () { | input.onButtonPressed(Button.B, function () { | ||
turn_left_indicator_on = | turn_left_indicator_on = true | ||
turn_right_indicator_on = | turn_right_indicator_on = false | ||
indicator.clear() | indicator.clear() | ||
indicator.show() | indicator.show() | ||
}) | }) | ||
let turn_left_indicator_on = false | |||
let turn_right_indicator_on = false | let turn_right_indicator_on = false | ||
let indicator: neopixel.Strip = null | let indicator: neopixel.Strip = null | ||
indicator = neopixel.create(DigitalPin.P0, | indicator = neopixel.create(DigitalPin.P0, 10, NeoPixelMode.RGB) | ||
indicator.setBrightness(80) | indicator.setBrightness(80) | ||
basic.forever(function () { | basic.forever(function () { | ||
if (turn_left_indicator_on == true) { | if (turn_left_indicator_on == true) { | ||
indicator.setPixelColor( | indicator.setPixelColor(9, neopixel.colors(NeoPixelColors.Orange)) | ||
indicator.show() | indicator.show() | ||
basic.pause(75) | basic.pause(75) | ||
indicator.setPixelColor( | indicator.setPixelColor(9, neopixel.colors(NeoPixelColors.Black)) | ||
indicator.show() | indicator.show() | ||
basic.pause(75) | basic.pause(75) | ||
} else if (turn_right_indicator_on == true) { | } else if (turn_right_indicator_on == true) { | ||
indicator.setPixelColor( | indicator.setPixelColor(2, neopixel.colors(NeoPixelColors.Orange)) | ||
indicator.show() | indicator.show() | ||
basic.pause(75) | basic.pause(75) | ||
indicator.setPixelColor( | indicator.setPixelColor(2, neopixel.colors(NeoPixelColors.Black)) | ||
indicator.show() | indicator.show() | ||
basic.pause(75) | basic.pause(75) | ||
Riadok 102: | Riadok 116: | ||
<tab name="MS Python"><source lang="python" style="background: LightBlue;"> | <tab name="MS Python"><source lang="python" style="background: LightBlue;"> | ||
def on_button_pressed_a(): | def on_button_pressed_a(): | ||
global turn_left_indicator_on | global turn_right_indicator_on, turn_left_indicator_on | ||
turn_right_indicator_on = True | |||
turn_left_indicator_on = False | |||
indicator.clear() | indicator.clear() | ||
indicator.show() | indicator.show() | ||
Riadok 119: | Riadok 133: | ||
def on_button_pressed_b(): | def on_button_pressed_b(): | ||
global turn_left_indicator_on, turn_right_indicator_on | global turn_left_indicator_on, turn_right_indicator_on | ||
turn_left_indicator_on = | turn_left_indicator_on = True | ||
turn_right_indicator_on = | turn_right_indicator_on = False | ||
indicator.clear() | indicator.clear() | ||
indicator.show() | indicator.show() | ||
input.on_button_pressed(Button.B, on_button_pressed_b) | input.on_button_pressed(Button.B, on_button_pressed_b) | ||
turn_left_indicator_on = False | |||
turn_right_indicator_on = False | turn_right_indicator_on = False | ||
indicator: neopixel.Strip = None | indicator: neopixel.Strip = None | ||
indicator = neopixel.create(DigitalPin.P0, | indicator = neopixel.create(DigitalPin.P0, 10, NeoPixelMode.RGB) | ||
indicator.set_brightness(80) | indicator.set_brightness(80) | ||
def on_forever(): | def on_forever(): | ||
if turn_left_indicator_on == True: | if turn_left_indicator_on == True: | ||
indicator.set_pixel_color( | indicator.set_pixel_color(9, neopixel.colors(NeoPixelColors.ORANGE)) | ||
indicator.show() | indicator.show() | ||
basic.pause(75) | basic.pause(75) | ||
indicator.set_pixel_color( | indicator.set_pixel_color(9, neopixel.colors(NeoPixelColors.BLACK)) | ||
indicator.show() | indicator.show() | ||
basic.pause(75) | basic.pause(75) | ||
elif turn_right_indicator_on == True: | elif turn_right_indicator_on == True: | ||
indicator.set_pixel_color( | indicator.set_pixel_color(2, neopixel.colors(NeoPixelColors.ORANGE)) | ||
indicator.show() | indicator.show() | ||
basic.pause(75) | basic.pause(75) | ||
indicator.set_pixel_color( | indicator.set_pixel_color(2, neopixel.colors(NeoPixelColors.BLACK)) | ||
indicator.show() | indicator.show() | ||
basic.pause(75) | basic.pause(75) | ||
Riadok 152: | Riadok 166: | ||
=== Základné pohyby === | === Základné pohyby === | ||
Kaďže na pohon slúžia klasické servomotorčeky, robot sa dá rozhýbať aj pomocou štandartnej knižnice Servo. Príklad je tu. Odporúčame však použiť lepšiu knižnicu, ktorú poskytuje výrobca, pretože má trocha jednoznačnejšie a užitočnejšie príkazy. | |||
Tento ukážkový program | |||
Tento ukážkový program po stlačení tlačidla 🅰 pohýbe robotom vpred a vzad, po stlačení 🅱 pohýbe vľavo a vpravo. | |||
<gallery heights=400px mode="packed"> <!-- slideshow? --> | <gallery heights=400px mode="packed"> <!-- slideshow? --> | ||
Image:microbit- | Image:microbit-RingBitMoveMovementsServoLib.png|''Základné pohyby'' | ||
</gallery> | </gallery> | ||
Riadok 165: | Riadok 180: | ||
<tab name="Javascript"><source lang="javascript"> | <tab name="Javascript"><source lang="javascript"> | ||
/** | |||
basic.pause( | * VPRED | ||
* | |||
basic.pause( | * Kedze motorceky su navzajom zrkadlovo, pre smer vpred sa musia otacat navzajom opacnym smerom. | ||
*/ | |||
basic.pause( | |||
input.onButtonPressed(Button.A, function () { | |||
basic.pause( | servos.P1.run(50) | ||
servos.P2.run(-50) // toto je VPRED | |||
basic.pause(1000) | |||
servos.P1.run(-50) // toto je VZAD | |||
servos.P2.run(50) | |||
basic.pause(1000) | |||
servos.P1.stop() // a toto je STOP | |||
servos.P2.stop() | |||
}) | |||
input.onButtonPressed(Button.B, function () { | |||
servos.P1.run(50) | |||
servos.P2.run(50) // toto je VPRAVO | |||
basic.pause(1000) | |||
servos.P1.run(-50) | |||
servos.P2.run(-50) // toto je VLAVO | |||
basic.pause(1000) | |||
servos.P1.stop() | |||
servos.P2.stop() // a toto je STOP | |||
}) | |||
servos.P1.setStopOnNeutral(true) | |||
servos.P2.setStopOnNeutral(true) | |||
basic.showIcon(IconNames.Happy) | |||
</source></tab> | |||
<tab name="MS Python"><source lang="python" style="background: LightBlue;"> | |||
""" | |||
VPRED: Kedze motorceky su navzajom zrkadlovo, pre smer vpred sa musia otacat navzajom opacnym smerom. | |||
""" | |||
def on_button_pressed_a(): | |||
servos.P1.run(50) | |||
servos.P2.run(-50) | |||
basic.pause(1000) | |||
servos.P1.run(-50) | |||
servos.P2.run(50) | |||
basic.pause(1000) | |||
servos.P1.stop() | |||
servos.P2.stop() | |||
input.on_button_pressed(Button.A, on_button_pressed_a) | |||
def on_button_pressed_b(): | |||
servos.P1.run(50) | |||
servos.P2.run(50) | |||
basic.pause(1000) | |||
servos.P1.run(-50) | |||
servos.P2.run(-50) | |||
basic.pause(1000) | |||
servos.P1.stop() | |||
servos.P2.stop() | |||
input.on_button_pressed(Button.B, on_button_pressed_b) | |||
servos.P1.set_stop_on_neutral(True) | |||
servos.P2.set_stop_on_neutral(True) | |||
basic.show_icon(IconNames.HAPPY) | |||
</source></tab> | |||
</tabs> | |||
[[Súbor:microbit-RingBitLibraries.png|300px|right]] | |||
Výrobca, firma Elecfreaks poskytuje pre robota špeciálnu knižnicu. Existujú dve verzie -- jednoduchšia '''<code>bitbuggy</code>''', ale lepšie je použiť komplexnejšiu '''<code>ringbitcar</code>''' (pozri obr.) | |||
Tento ukážkový program po stlačení tlačidla 🅰 pohýbe robotom vpred a vzad, po stlačení 🅱 pohýbe vľavo a vpravo. | |||
<gallery heights=400px mode="packed"> <!-- slideshow? --> | |||
Image:microbit-RingBitMoveMovementsRingLib.png|''Základné pohyby'' | |||
</gallery> | |||
<tabs> | |||
<tab name="Javascript"><source lang="javascript"> | |||
input.onButtonPressed(Button.A, function () { | |||
RingbitCar.running_time(RingbitCar.Direction_run.forward, 1) | |||
RingbitCar.running_distance(RingbitCar.Direction_run.backward, 5) | |||
RingbitCar.brake() | |||
}) | |||
input.onButtonPressed(Button.AB, function () { | |||
RingbitCar.freestyle(50, -50) | |||
basic.pause(1000) | |||
RingbitCar.brake() | |||
}) | |||
input.onButtonPressed(Button.B, function () { | |||
RingbitCar.steering_angle(RingbitCar.Direction_turn.right, 90) | |||
RingbitCar.steering_angle(RingbitCar.Direction_turn.left, 90) | |||
RingbitCar.brake() | |||
}) | |||
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2) | |||
</source></tab> | </source></tab> | ||
<tab name="MS Python"><source lang="python" style="background: LightBlue;"> | <tab name="MS Python"><source lang="python" style="background: LightBlue;"> | ||
def on_button_pressed_a(): | |||
RingbitCar.running_time(RingbitCar.Direction_run.FORWARD, 1) | |||
RingbitCar.running_distance(RingbitCar.Direction_run.BACKWARD, 5) | |||
RingbitCar.brake() | |||
input.on_button_pressed(Button.A, on_button_pressed_a) | |||
def on_button_pressed_ab(): | |||
RingbitCar.freestyle(50, -50) | |||
basic.pause(1000) | |||
RingbitCar.brake() | |||
input.on_button_pressed(Button.AB, on_button_pressed_ab) | |||
def on_button_pressed_b(): | |||
RingbitCar.steering_angle(RingbitCar.Direction_turn.RIGHT, 90) | |||
RingbitCar.steering_angle(RingbitCar.Direction_turn.LEFT, 90) | |||
RingbitCar.brake() | |||
input.on_button_pressed(Button.B, on_button_pressed_b) | |||
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2) | |||
</source></tab> | </source></tab> | ||
</tabs> | </tabs> | ||
=== Line following robot === | === Line following robot === | ||
Tento program vyžaduje špeciálne príslušenstvo - line tracking senzor. | |||
* Product page | |||
* Product manual | |||
Ak modrá LEDka na senzore svieti, znamená to, že neregistruje odraz, teda pravdepodobne je pod senzorom ČIERNA čiara (alebo nič, keď je robot vo vzduchu napr.). | |||
Nevýhodou je, že citlivosť ani vzdialenosť senzorov sa nedá nijako nastaviť. | |||
Prepínač na spodnej strane musí byť v polohe '''OTHER MODULES'''! | |||
Samozrejmosťou je tiež vopred nahrať knižnicu '''<code>ringbitcar</code>''' | |||
ring:bit ukazkovy program https://makecode.microbit.org/45086-58044-52516-35101 | ring:bit ukazkovy program https://makecode.microbit.org/45086-58044-52516-35101 | ||
<gallery heights=600px mode="packed"> <!-- slideshow? --> | <gallery heights=600px mode="packed"> <!-- slideshow? --> | ||
Image:microbit- | Image:microbit-RingBitLinefollowerRobot.jpg|''Robot sleduje čiernu čiaru na svetlom podklade.'' | ||
Image:microbit- | Image:microbit-RingBitLinefollower.png|''Robot sleduje čiernu čiaru na svetlom podklade.'' | ||
</gallery> | </gallery> | ||
Riadok 210: | Riadok 328: | ||
<tab name="Javascript"><source lang="javascript"> | <tab name="Javascript"><source lang="javascript"> | ||
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2) | |||
RingbitCar.forward() | |||
basic.forever(function on_forever() { | basic.forever(function on_forever() { | ||
if (RingbitCar.tracking(RingbitCar.TrackingStateType.Tracking_State_2)) { | |||
RingbitCar.freestyle(50, 0) | |||
basic.pause(100) | |||
} | |||
if (RingbitCar.tracking(RingbitCar.TrackingStateType.Tracking_State_1)) { | |||
RingbitCar.freestyle(0, 50) | |||
basic.pause(100) | |||
} | |||
if (RingbitCar.tracking(RingbitCar.TrackingStateType.Tracking_State_0)) { | |||
RingbitCar.freestyle(100, 100) | |||
basic.pause(100) | |||
} | |||
if (RingbitCar.tracking(RingbitCar.TrackingStateType.Tracking_State_3)) { | |||
RingbitCar.brake() | |||
basic.pause(100) | |||
} | } | ||
}) | }) | ||
</source></tab> | </source></tab> | ||
<tab name="MS Python"><source lang="python" style="background: LightBlue;"> | <tab name="MS Python"><source lang="python" style="background: LightBlue;"> | ||
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2) | |||
RingbitCar.forward() | |||
def on_forever(): | def on_forever(): | ||
if RingbitCar.tracking(RingbitCar.TrackingStateType.TRACKING_STATE_2): | |||
RingbitCar.freestyle(50, 0) | |||
basic.pause(100) | |||
if | if RingbitCar.tracking(RingbitCar.TrackingStateType.TRACKING_STATE_1): | ||
RingbitCar.freestyle(0, 50) | |||
basic.pause(100) | |||
if RingbitCar.tracking(RingbitCar.TrackingStateType.TRACKING_STATE_0): | |||
RingbitCar.freestyle(100, 100) | |||
basic.pause(100) | |||
if RingbitCar.tracking(RingbitCar.TrackingStateType.TRACKING_STATE_3): | |||
RingbitCar.brake() | |||
basic.pause(100) | |||
basic.forever(on_forever) | basic.forever(on_forever) | ||
Riadok 260: | Riadok 382: | ||
=== Ultrazvukový senzor === | === Ultrazvukový senzor === | ||
Pre prácu s ultrazvukovým senzorom je potrebné nahrať knižnicu '''<code> | Pre prácu s ultrazvukovým senzorom je potrebné nahrať knižnicu '''<code>ringbitcar</code>'''. Zároveň so sonarom nemôžete použiť žiaden iný modul, ani linefollower. Ani to fyzicky nejde, pripojiť sa dá len jeden konektor súčasne. | ||
Jednoduchý program, ktorý ukáže ako robot | Jednoduchý program, ktorý ukáže ako robot zdetekuje prekážku, trocha cúvne a otočí sa o náhodný uhol. Takto by sme mohli naprogramovať napríklad robotický vysávač, aby postupne povysával celú miesntosť. | ||
<gallery heights=500px mode="packed"> <!-- slideshow? --> | <gallery heights=500px mode="packed"> <!-- slideshow? --> | ||
Image:microbit- | Image:microbit-RingBitRobotWithSonar.jpg|''Robot s namontovaným snímačom.'' | ||
Image:microbit- | Image:microbit-RingBitSonarRandom.png|''Náhodná prechádzka s vyhýbaním.'' | ||
</gallery> | </gallery> | ||
Riadok 273: | Riadok 395: | ||
<tab name="Javascript"><source lang="javascript"> | <tab name="Javascript"><source lang="javascript"> | ||
let | let sonar = 0 | ||
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2) | |||
while (!(input.buttonIsPressed(Button.A))) | |||
{ /* Tu cakame na stlacenie A, aby sa robot hned nerozbehol. */ } | |||
basic.showIcon(IconNames.Happy) | |||
basic.forever(function () { | basic.forever(function () { | ||
sonar = RingbitCar.ringbitcar_sonarbit(RingbitCar.Distance_Unit.Distance_Unit_cm) | |||
if (sonar < 20 && sonar != 0) { | |||
/** | |||
* V pripade, ze robot "vidi" prekazku, trocha cuvne a pootoci sa o nahodny uhol. | |||
*/ | |||
RingbitCar.back() | |||
basic.pause(1000) | |||
RingbitCar.freestyle(0, 100) | |||
basic.pause(randint(300, 1500)) | |||
} else { | } else { | ||
RingbitCar.forward() | |||
} | } | ||
}) | }) | ||
Riadok 292: | Riadok 422: | ||
<tab name="MS Python"><source lang="python" style="background: LightBlue;"> | <tab name="MS Python"><source lang="python" style="background: LightBlue;"> | ||
sonar = 0 | |||
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2) | |||
while not (input.button_is_pressed(Button.A)): | |||
pass | |||
basic.show_icon(IconNames.HAPPY) | |||
def on_forever(): | def on_forever(): | ||
global | global sonar | ||
sonar = RingbitCar.ringbitcar_sonarbit(RingbitCar.Distance_Unit.DISTANCE_UNIT_CM) | |||
if | if sonar < 20 and sonar != 0: | ||
RingbitCar.back() | |||
basic.pause(1000) | |||
RingbitCar.freestyle(0, 100) | |||
basic.pause(randint(300, 1500)) | |||
else: | else: | ||
RingbitCar.forward() | |||
basic.forever(on_forever) | basic.forever(on_forever) | ||
</source></tab> | </source></tab> | ||
Riadok 310: | Riadok 445: | ||
=== Tip na záver === | |||
<html> | |||
<P Align="center"> | |||
<IMG Src="https://elecfreaks.com/learn-en/_images/EfYkq79.jpg"><BR> | |||
<I>Pripevnite dozadu fixku (napr. drôtikom, alebo gumičkou) a robot bude kresliť svoju trajektóriu.</I> | |||
</html> | |||
Aktuálna revízia z 13:26, 20. január 2022
Robot ring:bot Car od firmy Elecfreaks. Dodáva sa vo forme jednoduchej stavebnice, ktorú raz poskladáte a potom už nemeníte.
- Product page https://www.elecfreaks.com/ring-bit-car-v2-for-micro-bit.html
- Príslušenstvo
- Manual https://www.elecfreaks.com/learn-en/microbitKit/ring_bit_v2/index.html
- RLX (ceny k 20.1.2022)
- ring:bit v2 + micro:bit v2 47,88 € s DPH
- ring:bit v2 bez micro:bitu 23,00 € s DPH
- príslušenstvo: ultrazvukový senzor, sledovanie čiary a LED pásik 17,40 € s DPH
- príslušenstvo: len sledovanie čiary 7,08 € s DPH
- náhradný diel: riadiaca doska 6,73 € s DPH
- Návod v slovenčine https://www.nextech.sk/a/Konstrukcia-a-programovanie-robotov-3--E2-80-93-podvozok-Ring-bit-pre-Micro-bit
Technické parametre
- Napájanie 3,5 - 5,0 V DC ( 3x AAA 1,5 V batéria)
- Vstupy a senzory
- 2x infračervený detektor (na čiary) s roztečou 1,5 cm
- 1x ultrazvukový senzor SR04, SR04P (5V interface? odmeraj)
- P0, P1, P2
- Výstupy a aktory
- 2x modifikovaný servomotor EF90D
- 2x RGB LED Neopixel zo spodnej strany (s príslušenstvom Light Bar + ďalších 8
- Rozmery: 88 x 80 x 80 mm (bez príslušenstva)
- Hmotnosť: 120 g (bez/s batériami)
Priradenie vstupov a výstupov
P0 rozširujúce moduly (nedajú sa používať súčasne viaceré) P1 ľavý motor P2 pravý motor
Výhody:
- jednoduchosť
- kvalitné servomotory
Nevýhody:
- len tri porty (P0-2) využiteľné
- vypínač na rozširujúcej doske nevypína motory pri napájaní cez USB
- neprístupné tlačidlo RESET
- môj exemplár mal výrazne nesymetrické motorčeky, zrejme bol jeden poškodený
Základné programy
Blinker
Ukážka práce s RGB LED diódami na rozširovacom module. Ak ho nemáte, zameňte LED číslo 2 a 9 za 0 a 1, ktoré sú priamo na základnej doske.
Pozri aj číslovanie LED na nasledovnom obrázku. Správna činnosť programu vyžaduje knižnicu Neopixel
a prepínač na spodnej strane robota musí byť prepnutý do polohy
Rainbow LED.
Jednoduchý program pre blinker, funguje na tlačítka - stlačením ľavého tlačidla 🅰 sa zapne ľavá smerovka, pravým tlačidlom 🅱 sa zapne pravá. Stlačením oboch 🅰+🅱 sa blinker vypne.
-
Smerovky
input.onButtonPressed(Button.A, function () {
turn_right_indicator_on = true
turn_left_indicator_on = false
indicator.clear()
indicator.show()
})
input.onButtonPressed(Button.AB, function () {
turn_left_indicator_on = false
turn_right_indicator_on = false
indicator.clear()
indicator.show()
})
input.onButtonPressed(Button.B, function () {
turn_left_indicator_on = true
turn_right_indicator_on = false
indicator.clear()
indicator.show()
})
let turn_left_indicator_on = false
let turn_right_indicator_on = false
let indicator: neopixel.Strip = null
indicator = neopixel.create(DigitalPin.P0, 10, NeoPixelMode.RGB)
indicator.setBrightness(80)
basic.forever(function () {
if (turn_left_indicator_on == true) {
indicator.setPixelColor(9, neopixel.colors(NeoPixelColors.Orange))
indicator.show()
basic.pause(75)
indicator.setPixelColor(9, neopixel.colors(NeoPixelColors.Black))
indicator.show()
basic.pause(75)
} else if (turn_right_indicator_on == true) {
indicator.setPixelColor(2, neopixel.colors(NeoPixelColors.Orange))
indicator.show()
basic.pause(75)
indicator.setPixelColor(2, neopixel.colors(NeoPixelColors.Black))
indicator.show()
basic.pause(75)
}
})
def on_button_pressed_a():
global turn_right_indicator_on, turn_left_indicator_on
turn_right_indicator_on = True
turn_left_indicator_on = False
indicator.clear()
indicator.show()
input.on_button_pressed(Button.A, on_button_pressed_a)
def on_button_pressed_ab():
global turn_left_indicator_on, turn_right_indicator_on
turn_left_indicator_on = False
turn_right_indicator_on = False
indicator.clear()
indicator.show()
input.on_button_pressed(Button.AB, on_button_pressed_ab)
def on_button_pressed_b():
global turn_left_indicator_on, turn_right_indicator_on
turn_left_indicator_on = True
turn_right_indicator_on = False
indicator.clear()
indicator.show()
input.on_button_pressed(Button.B, on_button_pressed_b)
turn_left_indicator_on = False
turn_right_indicator_on = False
indicator: neopixel.Strip = None
indicator = neopixel.create(DigitalPin.P0, 10, NeoPixelMode.RGB)
indicator.set_brightness(80)
def on_forever():
if turn_left_indicator_on == True:
indicator.set_pixel_color(9, neopixel.colors(NeoPixelColors.ORANGE))
indicator.show()
basic.pause(75)
indicator.set_pixel_color(9, neopixel.colors(NeoPixelColors.BLACK))
indicator.show()
basic.pause(75)
elif turn_right_indicator_on == True:
indicator.set_pixel_color(2, neopixel.colors(NeoPixelColors.ORANGE))
indicator.show()
basic.pause(75)
indicator.set_pixel_color(2, neopixel.colors(NeoPixelColors.BLACK))
indicator.show()
basic.pause(75)
basic.forever(on_forever)
Základné pohyby
Kaďže na pohon slúžia klasické servomotorčeky, robot sa dá rozhýbať aj pomocou štandartnej knižnice Servo. Príklad je tu. Odporúčame však použiť lepšiu knižnicu, ktorú poskytuje výrobca, pretože má trocha jednoznačnejšie a užitočnejšie príkazy.
Tento ukážkový program po stlačení tlačidla 🅰 pohýbe robotom vpred a vzad, po stlačení 🅱 pohýbe vľavo a vpravo.
-
Základné pohyby
/**
* VPRED
*
* Kedze motorceky su navzajom zrkadlovo, pre smer vpred sa musia otacat navzajom opacnym smerom.
*/
input.onButtonPressed(Button.A, function () {
servos.P1.run(50)
servos.P2.run(-50) // toto je VPRED
basic.pause(1000)
servos.P1.run(-50) // toto je VZAD
servos.P2.run(50)
basic.pause(1000)
servos.P1.stop() // a toto je STOP
servos.P2.stop()
})
input.onButtonPressed(Button.B, function () {
servos.P1.run(50)
servos.P2.run(50) // toto je VPRAVO
basic.pause(1000)
servos.P1.run(-50)
servos.P2.run(-50) // toto je VLAVO
basic.pause(1000)
servos.P1.stop()
servos.P2.stop() // a toto je STOP
})
servos.P1.setStopOnNeutral(true)
servos.P2.setStopOnNeutral(true)
basic.showIcon(IconNames.Happy)
"""
VPRED: Kedze motorceky su navzajom zrkadlovo, pre smer vpred sa musia otacat navzajom opacnym smerom.
"""
def on_button_pressed_a():
servos.P1.run(50)
servos.P2.run(-50)
basic.pause(1000)
servos.P1.run(-50)
servos.P2.run(50)
basic.pause(1000)
servos.P1.stop()
servos.P2.stop()
input.on_button_pressed(Button.A, on_button_pressed_a)
def on_button_pressed_b():
servos.P1.run(50)
servos.P2.run(50)
basic.pause(1000)
servos.P1.run(-50)
servos.P2.run(-50)
basic.pause(1000)
servos.P1.stop()
servos.P2.stop()
input.on_button_pressed(Button.B, on_button_pressed_b)
servos.P1.set_stop_on_neutral(True)
servos.P2.set_stop_on_neutral(True)
basic.show_icon(IconNames.HAPPY)
Výrobca, firma Elecfreaks poskytuje pre robota špeciálnu knižnicu. Existujú dve verzie -- jednoduchšia bitbuggy
, ale lepšie je použiť komplexnejšiu ringbitcar
(pozri obr.)
Tento ukážkový program po stlačení tlačidla 🅰 pohýbe robotom vpred a vzad, po stlačení 🅱 pohýbe vľavo a vpravo.
-
Základné pohyby
input.onButtonPressed(Button.A, function () {
RingbitCar.running_time(RingbitCar.Direction_run.forward, 1)
RingbitCar.running_distance(RingbitCar.Direction_run.backward, 5)
RingbitCar.brake()
})
input.onButtonPressed(Button.AB, function () {
RingbitCar.freestyle(50, -50)
basic.pause(1000)
RingbitCar.brake()
})
input.onButtonPressed(Button.B, function () {
RingbitCar.steering_angle(RingbitCar.Direction_turn.right, 90)
RingbitCar.steering_angle(RingbitCar.Direction_turn.left, 90)
RingbitCar.brake()
})
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
def on_button_pressed_a():
RingbitCar.running_time(RingbitCar.Direction_run.FORWARD, 1)
RingbitCar.running_distance(RingbitCar.Direction_run.BACKWARD, 5)
RingbitCar.brake()
input.on_button_pressed(Button.A, on_button_pressed_a)
def on_button_pressed_ab():
RingbitCar.freestyle(50, -50)
basic.pause(1000)
RingbitCar.brake()
input.on_button_pressed(Button.AB, on_button_pressed_ab)
def on_button_pressed_b():
RingbitCar.steering_angle(RingbitCar.Direction_turn.RIGHT, 90)
RingbitCar.steering_angle(RingbitCar.Direction_turn.LEFT, 90)
RingbitCar.brake()
input.on_button_pressed(Button.B, on_button_pressed_b)
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
Line following robot
Tento program vyžaduje špeciálne príslušenstvo - line tracking senzor.
- Product page
- Product manual
Ak modrá LEDka na senzore svieti, znamená to, že neregistruje odraz, teda pravdepodobne je pod senzorom ČIERNA čiara (alebo nič, keď je robot vo vzduchu napr.).
Nevýhodou je, že citlivosť ani vzdialenosť senzorov sa nedá nijako nastaviť.
Prepínač na spodnej strane musí byť v polohe OTHER MODULES!
Samozrejmosťou je tiež vopred nahrať knižnicu ringbitcar
ring:bit ukazkovy program https://makecode.microbit.org/45086-58044-52516-35101
-
Robot sleduje čiernu čiaru na svetlom podklade.
-
Robot sleduje čiernu čiaru na svetlom podklade.
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
RingbitCar.forward()
basic.forever(function on_forever() {
if (RingbitCar.tracking(RingbitCar.TrackingStateType.Tracking_State_2)) {
RingbitCar.freestyle(50, 0)
basic.pause(100)
}
if (RingbitCar.tracking(RingbitCar.TrackingStateType.Tracking_State_1)) {
RingbitCar.freestyle(0, 50)
basic.pause(100)
}
if (RingbitCar.tracking(RingbitCar.TrackingStateType.Tracking_State_0)) {
RingbitCar.freestyle(100, 100)
basic.pause(100)
}
if (RingbitCar.tracking(RingbitCar.TrackingStateType.Tracking_State_3)) {
RingbitCar.brake()
basic.pause(100)
}
})
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
RingbitCar.forward()
def on_forever():
if RingbitCar.tracking(RingbitCar.TrackingStateType.TRACKING_STATE_2):
RingbitCar.freestyle(50, 0)
basic.pause(100)
if RingbitCar.tracking(RingbitCar.TrackingStateType.TRACKING_STATE_1):
RingbitCar.freestyle(0, 50)
basic.pause(100)
if RingbitCar.tracking(RingbitCar.TrackingStateType.TRACKING_STATE_0):
RingbitCar.freestyle(100, 100)
basic.pause(100)
if RingbitCar.tracking(RingbitCar.TrackingStateType.TRACKING_STATE_3):
RingbitCar.brake()
basic.pause(100)
basic.forever(on_forever)
Ultrazvukový senzor
Pre prácu s ultrazvukovým senzorom je potrebné nahrať knižnicu ringbitcar
. Zároveň so sonarom nemôžete použiť žiaden iný modul, ani linefollower. Ani to fyzicky nejde, pripojiť sa dá len jeden konektor súčasne.
Jednoduchý program, ktorý ukáže ako robot zdetekuje prekážku, trocha cúvne a otočí sa o náhodný uhol. Takto by sme mohli naprogramovať napríklad robotický vysávač, aby postupne povysával celú miesntosť.
-
Robot s namontovaným snímačom.
-
Náhodná prechádzka s vyhýbaním.
let sonar = 0
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
while (!(input.buttonIsPressed(Button.A)))
{ /* Tu cakame na stlacenie A, aby sa robot hned nerozbehol. */ }
basic.showIcon(IconNames.Happy)
basic.forever(function () {
sonar = RingbitCar.ringbitcar_sonarbit(RingbitCar.Distance_Unit.Distance_Unit_cm)
if (sonar < 20 && sonar != 0) {
/**
* V pripade, ze robot "vidi" prekazku, trocha cuvne a pootoci sa o nahodny uhol.
*/
RingbitCar.back()
basic.pause(1000)
RingbitCar.freestyle(0, 100)
basic.pause(randint(300, 1500))
} else {
RingbitCar.forward()
}
})
sonar = 0
RingbitCar.init_wheel(AnalogPin.P1, AnalogPin.P2)
while not (input.button_is_pressed(Button.A)):
pass
basic.show_icon(IconNames.HAPPY)
def on_forever():
global sonar
sonar = RingbitCar.ringbitcar_sonarbit(RingbitCar.Distance_Unit.DISTANCE_UNIT_CM)
if sonar < 20 and sonar != 0:
RingbitCar.back()
basic.pause(1000)
RingbitCar.freestyle(0, 100)
basic.pause(randint(300, 1500))
else:
RingbitCar.forward()
basic.forever(on_forever)
Tip na záver
Pripevnite dozadu fixku (napr. drôtikom, alebo gumičkou) a robot bude kresliť svoju trajektóriu.
👉 Späť na zoznam príkladov....