Operácie

Elecfreaks wukong board: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Bez shrnutí editace
Balogh (diskusia | príspevky)
Bez shrnutí editace
 
(Jedna medziľahlá úprava od rovnakého používateľa nie je zobrazená.)
Riadok 26: Riadok 26:
'''Technické parametre'''
'''Technické parametre'''


* Napájanie 3,5 - 5,0 V DC ( 3x AAA 1,5 V batéria)
* Napájanie Zabudovaná LiPoly batéria 3,7V / 400mA s integrovaným power manazmentom  Zapni: 1x stlac, Vypni" 2x krátko stlac
* Vstupy a senzory
* Vstupy a senzory
** 2x infračervený detektor (na čiary) s roztečou 1,5 cm
** P0, P1, P2, 8,12,13,14,15 vyvedené na 3V piny SVG
** 1x ultrazvukový senzor SR04, SR04P (5V interface? odmeraj)
** I2C zbernica 3V
** P0, P1, P2
 
* Výstupy a aktory
* Výstupy a aktory
** 2x modifikovaný [https://www.elecfreaks.com/ef90d-micro-servo-360-degrees-digital-servo-for-micro-bit.html servomotor EF90D]
** Reproduktorcek s vypínačom
** 2x RGB LED Neopixel zo spodnej strany (s príslušenstvom Light Bar + ďalších 8
** 8 malých modrých LED, ktoré sa dajú zapnúť, vypnúť a dýchať všetky naraz
* Rozmery:  88 x 80 x 80 mm (bez príslušenstva)
** 2x výstup na DC motor (M1, M2)
* Hmotnosť: 120 g (bez/s batériami)
** 8x výstup na servo +5V na piny SVG (S0,..S7) (naozaj +5V? Nie su len 3,7V? - asi je to +5V pri napajani z USB)
** 4x RGB LED Neopixel z hornej strany  
* Rozmery:  40.00 X 58.12 X 24.53 mm (bez príslušenstva)
* Hmotnosť: 41,6 g (s batériou)
 
Obsahuje interný 8-bitový mikroprocesor [http://www.stcmicro.com/stc/stc8f1k08s2.html 8F2K0852] kompatibilný s x51, ktorý sa pre micro:bit tvári ako i2c slave periféria s možnosťou zapisovania podľa tabuľky.
Okrem toho obsahuje dva H-mosty pre jednosmerné motory typ [https://www.yoycart.com/Product/559821845566/ 75V18AM], ktorý je tiež ovládaný týmto mikroprocesorom ako i2c periféria. Posledný integrovaný obvod
je typu [https://www.laskakit.cz/injoinic-ip5306-nabijecka-li-ion-clanku-boost-5v-2-1a IP5306], čo je špeciálny LiIon power management obvod s indikáciou stavu batérie 4 LEDkami. Je určený pre powerbanky. Podla datasheetu by mal mať aj i2c
rozhranie, takže teoreticky by sa dal ovládať z mikropočítača, ale to nie je jasné.




'''Priradenie vstupov a výstupov'''
'''Priradenie vstupov a výstupov'''


   P0 rozširujúce moduly (nedajú sa používať súčasne viaceré)
   P0 mikroreproduktor
   P1 ľavý motor
   P16 neopixel LED
   P2 pravý motor
  P19/P20 zbernica I2C s riadiacim obvodom periférií
    




Výhody:
Výhody:
* jednoduchosť
* jednoduchosť
* kvalitné servomotory 
* kompatibilita s LEGOM 7x5 dielikov
* integrovaná batéria
* univerzálnosť, množstvo V/V


Nevýhody:  
Nevýhody:  
* len tri porty (P0-2) využiteľné
* SVG nie sú 5V
* vypínač na rozširujúcej doske nevypína motory pri napájaní cez USB
* Servo výstupy sa nedajú (?) použiť ako univerzálne V/V
* neprístupné tlačidlo RESET
* malá kapacita batérie
* ''môj exemplár mal výrazne nesymetrické motorčeky, zrejme bol jeden poškodený''
 


== Základné programy ==
== Základné programy ==

Aktuálna revízia z 20:58, 21. máj 2022

Robot postavený s univerzálnou doskou Wukong od firmy Elecfreaks. Nie je to kompletný robot, len riadiaca doska, s ktorou s pomocou dielikov z LEGO stavebnice dokážete postaviť takmer čokoľvek.


Súbor:ElecfreaksWukongCar.png
Elecfreaks Wukong minirobot

Technické parametre

  • Napájanie Zabudovaná LiPoly batéria 3,7V / 400mA s integrovaným power manazmentom Zapni: 1x stlac, Vypni" 2x krátko stlac
  • Vstupy a senzory
    • P0, P1, P2, 8,12,13,14,15 vyvedené na 3V piny SVG
    • I2C zbernica 3V
  • Výstupy a aktory
    • Reproduktorcek s vypínačom
    • 8 malých modrých LED, ktoré sa dajú zapnúť, vypnúť a dýchať všetky naraz
    • 2x výstup na DC motor (M1, M2)
    • 8x výstup na servo +5V na piny SVG (S0,..S7) (naozaj +5V? Nie su len 3,7V? - asi je to +5V pri napajani z USB)
    • 4x RGB LED Neopixel z hornej strany
  • Rozmery: 40.00 X 58.12 X 24.53 mm (bez príslušenstva)
  • Hmotnosť: 41,6 g (s batériou)

Obsahuje interný 8-bitový mikroprocesor 8F2K0852 kompatibilný s x51, ktorý sa pre micro:bit tvári ako i2c slave periféria s možnosťou zapisovania podľa tabuľky. Okrem toho obsahuje dva H-mosty pre jednosmerné motory typ 75V18AM, ktorý je tiež ovládaný týmto mikroprocesorom ako i2c periféria. Posledný integrovaný obvod je typu IP5306, čo je špeciálny LiIon power management obvod s indikáciou stavu batérie 4 LEDkami. Je určený pre powerbanky. Podla datasheetu by mal mať aj i2c rozhranie, takže teoreticky by sa dal ovládať z mikropočítača, ale to nie je jasné.


Priradenie vstupov a výstupov

 P0 mikroreproduktor
 P16 neopixel LED
 P19/P20 zbernica I2C s riadiacim obvodom periférií
 


Výhody:

  • jednoduchosť
  • kompatibilita s LEGOM 7x5 dielikov
  • integrovaná batéria
  • univerzálnosť, množstvo V/V

Nevýhody:

  • SVG nie sú 5V
  • Servo výstupy sa nedajú (?) použiť ako univerzálne V/V
  • malá kapacita batérie

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.


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.



/**
 * 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.


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



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ť.


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....