Elecfreaks ring:bit Car: Rozdiel medzi revíziami
Zo stránky SensorWiki
| Riadok 168: | Riadok 168: | ||
Tento ukážkový program   | Tento ukážkový program po stlačení tlačidla A pohýbe robotom vpred a vzad, po stlačení B pohýbe vľavo a vpravo.    | ||
| Riadok 246: | Riadok 246: | ||
</tabs>  | </tabs>  | ||
[[Súbor:microbit-RingBitLibraries|300px|right]]  | [[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.)  | 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.)  | ||
Verzia z 11:41, 20. január 2022
Robot ring:bot Car od firmy Elecfreaks.
- 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
 
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 A pohýbe robotom vpred a vzad, po stlačení B 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.)
- 
			
			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
ring:bit ukazkovy program https://makecode.microbit.org/45086-58044-52516-35101
Robot musí byť doplnený špeciálnym senzorom, ktorý sa pripojí k expanznej doske, umožňujúcej využiť aj viac ako 3 vstupy P0 - P3. 
Samozrejmosťou je tiež vopred nahrať knižnicu Kitronik
- Product page https://kitronik.co.uk/products/5659-line-following-add-on-for-move-mini-v2
 - Product manual https://resources.kitronik.co.uk/pdf/5629-move-line-following-board-microbit-datasheet.pdf
 
- 
			
			Robot sleduje čiernu čiaru na svetlom podklade.
 - 
			
			Robot sleduje čiernu čiaru na svetlom podklade.
 
let Left_Detector = 0
let Right_Detector = 0
pins.setPull(DigitalPin.P15, PinPullMode.PullUp)
pins.setPull(DigitalPin.P16, PinPullMode.PullUp)
basic.forever(function on_forever() {
    
    Right_Detector = pins.digitalReadPin(DigitalPin.P15)
    Left_Detector = pins.digitalReadPin(DigitalPin.P16)
    if (Left_Detector == 1 && Right_Detector == 1) {
        kitronik.forward()
    } else if (Left_Detector == 0 && Right_Detector == 1) {
        kitronik.left()
    } else if (Left_Detector == 1 && Right_Detector == 0) {
        kitronik.right()
    } else if (Left_Detector == 0 && Right_Detector == 0) {
        kitronik.forward()
    }
    
})
Left_Detector = 0
Right_Detector = 0
pins.set_pull(DigitalPin.P15, PinPullMode.PULL_UP)
pins.set_pull(DigitalPin.P16, PinPullMode.PULL_UP)
def on_forever():
    global Right_Detector, Left_Detector
    Right_Detector = pins.digital_read_pin(DigitalPin.P15)
    Left_Detector = pins.digital_read_pin(DigitalPin.P16)
    if Left_Detector == 1 and Right_Detector == 1:
        kitronik.forward()
    elif Left_Detector == 0 and Right_Detector == 1:
        kitronik.left()
    elif Left_Detector == 1 and Right_Detector == 0:
        kitronik.right()
    elif Left_Detector == 0 and Right_Detector == 0:
        kitronik.forward()
basic.forever(on_forever)
Ultrazvukový senzor
Pre prácu s ultrazvukovým senzorom je potrebné nahrať knižnicu Sonar
Jednoduchý program, ktorý ukáže ako robot zastaví pred prekážkou
- 
			
			Robot s namontovaným snímačom.
 - 
			
			Stoj, prekážka.
 
let Distance = 0
pins.setPull(DigitalPin.P8, PinPullMode.PullUp)
pins.setPull(DigitalPin.P10, PinPullMode.PullUp)
basic.forever(function () {
    Distance = sonar.ping(
    DigitalPin.P8,
    DigitalPin.P10,
    PingUnit.Centimeters
    )
    if (Distance > 4) {
        kitronik_servo_lite.driveForwards(1)
    } else {
        kitronik_servo_lite.stop()
    }
})
Distance = 0
pins.set_pull(DigitalPin.P8, PinPullMode.PULL_UP)
pins.set_pull(DigitalPin.P10, PinPullMode.PULL_UP)
def on_forever():
    global Distance
    Distance = sonar.ping(DigitalPin.P8, DigitalPin.P10, PingUnit.CENTIMETERS)
    if Distance > 4:
        kitronik_servo_lite.drive_forwards(1)
    else:
        kitronik_servo_lite.stop()
basic.forever(on_forever)
👉 Späť na zoznam príkladov....