Files
microbit-micropython-cookbook/README.md
2020-02-19 02:06:35 +08:00

4.4 KiB

micro:bit MicroPython Cookbook - Tricks and Experiments

Easer Eggs

Enter the following codes into REPL:

import this
import love
import antigravity

Also

this.authors()
love.badaboom()

Some Lesser Known Facts

Since Python and MicroPython are interpreted languages, they eat a lot of memory. Also, the hex file generated by micro:bit Python editors are consisted of 2 parts: the MicroPython firmware (up to 248 KB) and user's script (up to only 8 KB). See Firmware Hex File. Which means it's not possible to build big projects with micro:bit's MicroPython.

Also, how micro:bit get its own version of MicroPython anyway: The Story of MicroPython on the BBC micro:bit by Nicholas H. Tollervey, who also created the Mu editor, which is easier to use than the official online editor.

Fill LED Display

from microbit import display, Image, sleep

def fillScreen(b = 9):
    f = (str(b) * 5 + ":") * 5
    display.show(Image(f[:len(f)-1]))


while True:
    
    for i in range(9):
        fillScreen(i)
        sleep(50)
    
    for i in reversed(range(9)):
        fillScreen(i)
        sleep(50)

A More Convenient Pin Class

Using namedtuple to "rename" pin methods.

from microbit import pin0, sleep
from ucollections import namedtuple

Pin = namedtuple('Pin', ['set', 'get'])
setPin = lambda p: Pin(p.write_digital, p.read_digital)


led = setPin(pin0)

while True:
    print(led.set(1))
    sleep(500)
    print(led.set(0))
    sleep(500)

LED Bar Graph

Not perfect. A bit slow. Interference with microbit.display.read_light_level().

from microbit import display

def plotBarGraph(value, maxValue, brightness = 9):
    bar = value / maxValue
    valueArray = ((0.96, 0.88, 0.84, 0.92, 1.00), 
                  (0.76, 0.68, 0.64, 0.72, 0.80),
                  (0.56, 0.48, 0.44, 0.52, 0.60), 
                  (0.36, 0.28, 0.24, 0.32, 0.40), 
                  (0.16, 0.08, 0.04, 0.12, 0.20))
    for y in range(5):
        for x in range(5):
            if bar >= valueArray[y][x]:
                display.set_pixel(x, y, brightness)
            else:
                display.set_pixel(x, y, 0)


while True:
    for i in range(255):
        plotBarGraph(i, 255, 9)

Servo Control

from microbit import pin0, sleep

def servoWrite(pin, degree):
    pin.set_analog_period(20)
    pin.write_analog(round((degree * 92 / 180 + 30), 0))


servoPin = pin0

while True:
    servoWrite(servoPin, 0)
    sleep(1000)
    servoWrite(servoPin, 180)
    sleep(1000)

Get Pitch and Roll Degrees

These function cannot tell if the board is facing up or down. Probably need to use accelerometer.get_z() for that.

from microbit import accelerometer, sleep
import math

def rotationPitch():
    return math.atan2(
            accelerometer.get_y(), 
            math.sqrt(accelerometer.get_x() ** 2 + accelerometer.get_z() ** 2)
            ) * (180 / math.pi)

def rotationRoll():
    return math.atan2(
            accelerometer.get_x(), 
            math.sqrt(accelerometer.get_y() ** 2 + accelerometer.get_z() ** 2)
            ) * (180 / math.pi)


while True:
    print("Pitch:", rotationPitch(), " / roll:", rotationRoll())
    sleep(100)

Rainbow NeoPixel

This code needs at least 3 LEDs in the NeoPixel chain.

from microbit import pin0, sleep
from neopixel import NeoPixel
from micropython import const

led_num = const(12)
led_maxlevel = const(64) # max 255
led_pin = pin0

np = NeoPixel(led_pin, led_num)

def showRainbow():
    change_amount = int(led_maxlevel / (led_num / 3))
    index = [0, int(led_num / 3), int(led_num / 3 * 2)]
    for i in range(led_num):
        color = [0, 0, 0]
        for j in range(3):
            if abs(i - index[j]) <= int(led_num / 3):
                color[j] = led_maxlevel - abs(i - index[j]) * change_amount
                if color[j] < 0:
                    color[j]
        if i >= int(led_num / 3 * 2):
            color[0] = led_maxlevel - (led_num - i) * change_amount
            if color[0] < 0:
                color[0] = 0
        np[i] = (color[0], color[1], color[2])
    np.show()

def rotate():
    tmp = np[led_num - 1]
    for i in reversed(range(1, led_num)): # clockwise
        np[i] = np[i - 1]
    np[0] = tmp
    np.show()


showRainbow()

while True:
    rotate()
    sleep(50)