Met de accelerometer een bal besturen

In dit voorbeeld wordt de callback accelerometer_data geregistreerd voor de accelerometergegevens met microbit.accelerometer.notify

Dit gebeurt wanneer de micro:bit nieuwe accelerometergegevens aanbiedt:

  • de accelerometer_data callback wordt aangeroepen met de nieuwe gegevens als argument
  • de callback registreert de gegevens als de balrichting
  • tk.main_loop() roept redraw aan, waardoor de bal op het canvas beweegt in de richting die eerder is ingesteld door de callback

Zie ook de API-documentatie:

class XY:
    def __init__(self, x, y):
        self.x = x
        self.y = y


class Ball:

    def __init__(self, canvas: Canvas, color):
        self.canvas = canvas
        self.position = XY((canvas.winfo_width() / 2) - 5, (canvas.winfo_height() / 2) - 5)
        self.direction = XY(0, 0)
        self.id = canvas.create_oval(self.position.x, self.position.y, self.position.x + 10, self.position.y + 10, fill=color)

    def draw(self):
        new_position = XY(self.position.x+self.direction.x, self.position.y+self.direction.y)
        self.position.x = max(0, min(new_position.x, canvas.winfo_width()-10))
        self.position.y = max(0, min(new_position.y, canvas.winfo_height()-10))
        self.canvas.moveto(self.id, new_position.x, self.position.y)


tk = Tk()
tk.title("Use accelerometer to move ball")
tk.resizable(False, False)
tk.wm_attributes("-topmost", 1)
canvas = Canvas(tk, width=1280, height=720)
canvas.pack()
tk.update()
ball = Ball(canvas, 'blue')


def redraw():
    ball.draw()
    tk.after(10, redraw)


tk.after(10, redraw)


def accelerometer_data(data: AccelerometerData):
    ball.direction.x = data.x / 100
    ball.direction.y = data.y / 100


with KaspersMicrobit.find_one_microbit() as microbit:
    microbit.accelerometer.notify(accelerometer_data)
    tk.mainloop()