view mu_code/bot.py @ 0:48c36bed0f61 draft default tip

Initial commit
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Mon, 15 May 2017 16:43:11 +0200
parents
children
line wrap: on
line source

import microbit
import radio

class Servo:
    def __init__(self, pin, trim=0):
        self.pin = pin
        self.trim = trim
        self.position = 90
        self.set_period()

    def set_period(self):
        self.pin.set_analog_period(20)
        self.write(self.position)
        microbit.sleep(80)
        self.pin.set_analog_period(20)
        self.write(self.position)
        microbit.sleep(80)
        self.pin.write_analog(0)

    def write(self, degrees):
        self.pin.write_analog(int(25 + 100 * degrees / 180 + self.trim))
        self.position = degrees

    def move(self, degrees, delay=8):
        if degrees > self.position:
            step = 1
        else:
            step = -1
        for position in range(self.position, degrees, step):
            self.write(position)
            microbit.sleep(delay)


class Robot:
    NORMAL_FACE = microbit.Image(
        "42024\n"
        "90009\n"
        "00000\n"
        "61016\n"
        "27972\n"
    )
    LEFT_FACE = microbit.Image(
        "24024\n"
        "09009\n"
        "00000\n"
        "81001\n"
        "28952\n"
    )
    RIGHT_FACE = microbit.Image(
        "42042\n"
        "90090\n"
        "00000\n"
        "10018\n"
        "25983\n"
    )

    def __init__(self):
        self.feet_servo = Servo(microbit.pin2, -2)
        self.left_servo = Servo(microbit.pin1, 2)
        self.right_servo = Servo(microbit.pin0, 2)
        microbit.display.show(self.NORMAL_FACE)

    def right_step(self):
        microbit.display.show(self.RIGHT_FACE)
        self.feet_servo.move(130)
        self.left_servo.move(70)
        self.right_servo.move(70)
        self.feet_servo.move(90)

    def left_step(self):
        microbit.display.show(self.LEFT_FACE)
        self.feet_servo.move(50)
        self.right_servo.move(110)
        self.left_servo.move(110)
        self.feet_servo.move(90)

    def right_half_step(self):
        microbit.display.show(self.NORMAL_FACE)
        self.feet_servo.move(110)
        self.left_servo.move(90)
        self.right_servo.move(90)
        self.feet_servo.move(90)

    def left_half_step(self):
        microbit.display.show(self.NORMAL_FACE)
        self.feet_servo.move(70)
        self.right_servo.move(90)
        self.left_servo.move(90)
        self.feet_servo.move(90)


    def walk(self, steps=1):
        step = 0
        for step in range(steps - 1):
            if step % 2:
                self.left_step()
            else:
                self.right_step()
        if step % 2:
            self.right_half_step()
        else:
            self.left_half_step()


robot = Robot()
radio.on()
left_leg = True
command = None
while True:
    received = None
    while received is not None:
        command = received
        received = radio.receive()
    if command == 'step':
        if left_leg:
            robot.right_step()
        else:
            robot.left_step()
        left_leg = not left_leg
    elif command == 'stop':
        if left_leg:
            robot.right_half_step()
        else:
            robot.left_half_step()
        command = None