Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/patriyt191/domains/robotmc.be/:/home/patriyt191/domains/include/:/etc/pki/tls/certs:/tmp:/var/tmp:/usr/local/lib/php/:/usr/local/php81/lib/php/:/usr/local/php0/lib/php/) in /home/patriyt191/domains/robotmc.be/public_html/wiki/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/patriyt191/domains/robotmc.be/:/home/patriyt191/domains/include/:/etc/pki/tls/certs:/tmp:/var/tmp:/usr/local/lib/php/:/usr/local/php81/lib/php/:/usr/local/php0/lib/php/) in /home/patriyt191/domains/robotmc.be/public_html/wiki/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/patriyt191/domains/robotmc.be/:/home/patriyt191/domains/include/:/etc/pki/tls/certs:/tmp:/var/tmp:/usr/local/lib/php/:/usr/local/php81/lib/php/:/usr/local/php0/lib/php/) in /home/patriyt191/domains/robotmc.be/public_html/wiki/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/patriyt191/domains/robotmc.be/:/home/patriyt191/domains/include/:/etc/pki/tls/certs:/tmp:/var/tmp:/usr/local/lib/php/:/usr/local/php81/lib/php/:/usr/local/php0/lib/php/) in /home/patriyt191/domains/robotmc.be/public_html/wiki/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/patriyt191/domains/robotmc.be/:/home/patriyt191/domains/include/:/etc/pki/tls/certs:/tmp:/var/tmp:/usr/local/lib/php/:/usr/local/php81/lib/php/:/usr/local/php0/lib/php/) in /home/patriyt191/domains/robotmc.be/public_html/wiki/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/patriyt191/domains/robotmc.be/:/home/patriyt191/domains/include/:/etc/pki/tls/certs:/tmp:/var/tmp:/usr/local/lib/php/:/usr/local/php81/lib/php/:/usr/local/php0/lib/php/) in /home/patriyt191/domains/robotmc.be/public_html/wiki/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/patriyt191/domains/robotmc.be/:/home/patriyt191/domains/include/:/etc/pki/tls/certs:/tmp:/var/tmp:/usr/local/lib/php/:/usr/local/php81/lib/php/:/usr/local/php0/lib/php/) in /home/patriyt191/domains/robotmc.be/public_html/wiki/includes/shell/CommandFactory.php on line 119

Warning: file_exists(): open_basedir restriction in effect. File(/bin/bash) is not within the allowed path(s): (/home/patriyt191/domains/robotmc.be/:/home/patriyt191/domains/include/:/etc/pki/tls/certs:/tmp:/var/tmp:/usr/local/lib/php/:/usr/local/php81/lib/php/:/usr/local/php0/lib/php/) in /home/patriyt191/domains/robotmc.be/public_html/wiki/includes/shell/CommandFactory.php on line 119
MaqueenPlus programmeren in Micropython - RobotMC.be

MaqueenPlus programmeren in Micropython

Uit RobotMC.be
Ga naar: navigatie, zoeken
Maqueen Plus, met voorop het slot voor de BBC micro:bit

Dit artikel legt uit hoe je de MaqueenPlus robot kunt programmeren in de taal Python. Eigenlijk praten we dan over de speciale variant van Python voor microcontrollers, genaamd MicroPython. Meer informatie over de mogelijkheden van deze kleine, maar veelzijdige robot kun je lezen in het algemene MaqueenPlus artikel op deze Wiki.


Installatie

Een eenvoudige optie om de micro:bit/MaqueenPlus in MicroPython te programmeren is de Mu editor. Dit artikel beschrijft in het Nederlands hoe je deze kunt installeren. De highlights om te starten:

  • Download de Mu-editor van de website. https://codewith.mu/en/download
  • Start het gedownloade installatieprogramma van de Mu-editor.
  • Indien een melding van Microsoft Defender Smartscreen verschijnt dat de app een risico vormt, klik op "Meer informatie". Dan verschijnt er een tweede knop aan de onderkant van het venster met de tekst "Toch uitvoeren". Klik op die tweede knop.
  • Accepteer de voorwaarden en klik op "Install".


Library installeren op de micro:bit

Om de functies van de MaqueenPlus te ontsluiten is er een library te vinden op GitHub. Het bestand lib-robot-maqueen.py kun je van hier downloaden. Kopieer dit bestand met behulp van de Files-functie in de Mu editor naar de micro:bit, dit werkt als volgt:

  • Plaats het bestand lib_robot_maqueen.py in de mu_code directory in je profielmap. Deze directory is aangemaakt tijdens de installatie van Mu. De directory kun je vinden onder C:\Gebruikers\[gebruikersnaam]\mu_code.
  • Open de Mu-editor
  • Klik op "Mode" in de menubalk. Klik daarna op "BBC micro:bit".
  • Verbind de micro:bit aan je computer met de Micro-USB kabel.
  • Klik op "New" om een nieuwe file te creeren.
  • Flash het lege programma naar de microbit met de "Flash" knop in de menubalk. (Dit voorziet de micro:bit van MicroPython firmware.)
  • Reset de micro:bit met de reset button.
  • Klik op de "Files" knop.
  • Sleep het bestand lib_robot_maqueen.py van het rechterpaneel "Files on your computer" naar het linkerpaneel "Files on your micro:bit".
  • Nadat het bestand is overgezet, klik weer op de "Files" knop om terug te keren naar programmeermodus.

Daarna kun je in de Mu editor je python script schrijven, wat je met de Flash-functie op de micro:bit plaatst.


Voorbeeldprogramma's

Om je op weg te helpen met het programmeren in MicroPython volgen hier wat voorbeelden:


Gebruik van de RGB LEDs

import microbit
import lib_robot_maqueen as mqn
import time

mq = mqn.MaqueenPlus()

mq.RGBLight(mq.RGB_L, mq.RED)
mq.RGBLight(mq.RGB_R, mq.BLUE)


Aansturen van de motoren

Er staan drie functies ter beschikking om de motoren aan te sturen. De move functie geeft de mogelijkheid om vooruit, achteruit, linksaf en rechtsaf te rijden. Met de motorControl functie kunnen de motoren individueel worden aangestuurd. Met de goto functie kan de robot aangestuurd worden op de encoders om een specifiek aantal encoder ticks te draaien of af te leggen.

import microbit
import lib_robot_maqueen as mqn
import time

mq = mqn.MaqueenPlus()


mq.move("F", 70)
time.sleep(2) #wait for 2s
mq.move("R", 70)
time.sleep(2) #wait for 2s
mq.move("L", 70)
time.sleep(2) #wait for 2s
mq.stop()

# Rij 400 encoder ticks voorwaarts met PWM snelheid 200 
mq.goto("F", 200, 400)

# Draai 144 encoder ticks naar links met PWM snelheid 70 (ongeveer 180 graden)
mq.goto("L", 70, 144)

# Draai 60 encoder ticks naar rechts met PWM snelheid 70 (ongeveer 90 graden)
mq.goto("R", 70, 60)


Gebruik van de ultrasone afstandssensor

Dit programma gebruikt de meegeleverde URM10 ultrasone sensor om van de MaqueenPlus een obstakelvermijdende robot te maken.

import microbit
import lib_robot_maqueen as mqn
import time

mq = mqn.MaqueenPlus()

def turn():
    mq.stop()
    time.sleep(0.2)
    mq.move("B", 60)
    time.sleep(0.4)
    mq.stop()
    time.sleep(0.2)
    mq.move("R", 60)
    time.sleep(0.8)
    mq.stop()
    time.sleep(0.2)

while True:
    time.sleep(0.1)
    dist = mq.ultrasonic()
    print((dist,))
    if (dist > 0.3):
        mq.move("F", 60)
    else:
        turn()


Gebruik van de lijnvolgsensor

Een lijnvolgprogramma in MicroPython.

import microbit
import lib_robot_maqueen as mqn
import time

mq = mqn.MaqueenPlus()

while True:
    Line = mq.getLine()
    MotL = 30
    MotR = 30
    if Line["L1"] == 0 and Line["L2"] == 0:
        if Line["R1"] == 1 and Line["R2"] == 0:
            MotL = 80
            MotR = 20
        elif Line["R1"] == 1 and Line["R2"] == 1:
            MotL = 140
            MotR = 20
        elif Line["R1"] == 0 and Line["R2"] == 1:
            MotL = 255
            MotR = 15
    elif Line["R1"] == 0 and Line["R2"] == 0:
        if Line["L1"] == 1 and Line["L2"] == 0:
            MotR = 80
            MotL = 20
        elif Line["L1"] == 1 and Line["L2"] == 1:
            MotR = 140
            MotL = 20
        elif Line["L1"] == 0 and Line["L2"] == 1:
            MotR = 255
            MotL = 15
    print((Line["L2"], Line["L1"], Line["R1"], Line["R2"]))
    mq.motorControl(mq.MT_L, 1, MotL)
    mq.motorControl(mq.MT_R, 1, MotR)
    time.sleep(0.05)


Gebruik van de ultrasone afstandssensor

Dit programma gebruikt de meegeleverde URM10 ultrasone sensor om van de MaqueenPlus een obstakelvermijdende robot te maken.

import microbit
import lib_robot_maqueen as mqn
import time

mq = mqn.MaqueenPlus()

def turn():
    mq.stop()
    time.sleep(0.2)
    mq.move("B", 60)
    time.sleep(0.4)
    mq.stop()
    time.sleep(0.2)
    mq.move("R", 60)
    time.sleep(0.8)
    mq.stop()
    time.sleep(0.2)

while True:
    time.sleep(0.1)
    dist = mq.ultrasonic()
    print((dist,))
    if (dist > 0.3):
        mq.move("F", 60)
    else:
        turn()


RoboRama met bonus!

Het bovenstaande kunnen we combineren in onderstaand lijnvolgprogramma, dat de robot stilzet als de ultrasoonsensor een obstakel ziet en stopt aan het eind van de lijn, zou je mee moeten kunnen doen aan RoboRama opdracht lijnvolgen met bonus!

import microbit
import lib_robot_maqueen as mqn
import time

mq = mqn.MaqueenPlus()

mq.RGBLight(mq.RGB_ALL, mq.GREEN)
noline = 0
dist = 1

while noline < 10:
    timer = time.ticks_add(time.ticks_ms(), 20)
    Line = mq.getLine()
    MotL = 30
    MotR = 30
    if Line["L1"] == 0 and Line["L2"] == 0:
        if Line["R1"] == 1 and Line["R2"] == 0:
            MotL = 80
            MotR = 20
        elif Line["R1"] == 1 and Line["R2"] == 1:
            MotL = 140
            MotR = 20
        elif Line["R1"] == 0 and Line["R2"] == 1:
            MotL = 255
            MotR = 15
        else:
            noline += 1
    elif Line["R1"] == 0 and Line["R2"] == 0:
        if Line["L1"] == 1 and Line["L2"] == 0:
            MotR = 80
            MotL = 20
        elif Line["L1"] == 1 and Line["L2"] == 1:
            MotR = 140
            MotL = 20
        elif Line["L1"] == 0 and Line["L2"] == 1:
            MotR = 255
            MotL = 15
        else:
            noline += 1
    dist = mq.ultrasonic()
    if dist < 0.2:
        MotL = 0
        MotR = 0
    mq.motorControl(mq.MT_L, 1, MotL)
    mq.motorControl(mq.MT_R, 1, MotR)
    while time.ticks_diff(timer, time.ticks_ms()) > 0:
        pass
mq.stop()
mq.RGBLight(mq.RGB_ALL, mq.RED)

Motor encoders uitlezen

Met de getEncoders() functie kunnen de waarden van de linker en rechter wiel encoders worden uitgelezen. De functie retourneert beide waarden in een zogenaamd Python tuple.

import microbit
import lib_robot_maqueen as mqn

mq = mqn.MaqueenPlus()

encoders = mq.getEncoders()
print(encoders)
print(encoders[0])  # waarde encoder linkerwiel 
print(encoders[1])  # waarde encoder rechterwiel


Encoders resetten

Met de clearEncoders() functie kunnen de waarden van de linker en rechter wiel encoders terug op 0 worden gezet.

import microbit
import lib_robot_maqueen as mqn

mq = mqn.MaqueenPlus()

mq.clearEncoders()


Geheugengebruik onder MicroPython

Helaas neemt de MicroPython firmware en een library (zelfs een kleine) een flink deel van het geheugen in beslag op de micro:bit waardoor je programma al snel te groot wordt. Je kunt de resterende vrije ruimte opvragen. Start de REPL-functie in Mu en geef de volgende commando's:

>>> import gc
>>> gc.collect()
>>> gc.mem_free()

Een oplossing voor het geheugentekort is aanschaf van een micro:bit V2 in plaats van een V1. De micro:bit V1 heeft ca 9k vrij lees/schrijf geheugen, de V2 heeft 63k vrij geheugen. Daarnaast heeft de V2 dubbel zoveel flash-geheugen als de V1. Flink meer mogelijkheden dus.