Вы находитесь на странице: 1из 5

Micro:bit, Servo control with Micropython or blocks

You can control servos (small ones) from a Micro:Bit directly. Following a link from the David
Whale (Twitter @whaleygeek) , thank you, took me to a Kitronik blog
post, https://www.kitronik.co.uk/blog/using-bbc-microbit-control-servo/, which has the answer.

The code uses Microsoft Blocks taken from the post, runs the servos 180 degrees and back again,
when button A is pressed. It does exactly what it should. I am also using the Tower Pro SG90
servo.

Can it be replicated in Micropython? This is a new mini project, there seems to be little out there
yet on how do this but the best so far is this video by PHILG2864:

The closest I have is the following, it is essentially there.


from microbit import *
pin0.set_analog_period(20)
while True:
pin0.write_analog(180)
sleep(1000)
pin0.write_analog(1)
sleep(1000)

Setting the time period to 20ms pin0.set_analog_period(20)seems by experiment (and used


in the video above) to be best value so far. The reason for pin0.write_analog(1) set to 1
instead of 0, 0 seems to stop the whole thing.
kitronik :Move buggy (Python controlled servos)

In a previous post I looked at controlling the Kitronik :Move buggy using Javascript based blocks.
In this short post I will show controlling the servos of the micro:bit based :Move buggy with
Python.

Control is via pin1(left motor) and pin2 (right motor) and the motors have to be driven in opposite
directions to move forward or backwards. The direction of the motors is controlled by the
analogue value written to the pins; pinX.write_analog(180) - anticlockwise
or pinX.write_analog(1) - clockwise (pinX.write_analog(0) - stops the motor). Setting the
analog_period seems to work at 20ms; this was found by experiment, discussed in a previouspost.

So the initial code below sets up the moves for forward, backward, turn left, turn right all
controlled with a move for so many milliseconds.

Code
from microbit import *

pin1.set_analog_period(20)
pin2.set_analog_period(20)

def forward(N):
pin1.write_analog(180)
pin2.write_analog(1)
sleep(N)

def backward(N):
pin1.write_analog(1)
pin2.write_analog(180)
sleep(N)

def turnLeft(N):
pin1.write_analog(1)
pin2.write_analog(1)
sleep(N)

def turnRight(N):
pin1.write_analog(180)
pin2.write_analog(180)
sleep(N)

while True:
forward(1500)
backward(1500)
turnLeft(1500)
turnRight(1500)

I would recommend running the :Move buggy on a surface that isn't smooth, I found the wheels
slipping on a smooth surface. This is a really nice little robot to play with.

kitronik :Move mini buggy (Python control of LEDs)

In two previous posts I looked at control the :Move buggy using JavaScript Blocks or Python. In
this post we are going to look at controlling the LEDs using Python (or more accurately
micropython).

Pin 0 controls the LEDs, they are based on5 NeoPixel compatible, RGB, addressable LEDs; so the
Neopixel protocols (and library for Neopixels) can be used.
Code First five colours of the rainbow. The array lig holds the RGB settings for the rainbow
colours (more details on the RGB colours can be found at Lorraine Underwood's Halloween Cloud
project). In the code below, the five LEDs have a different colour allocated to them.

from microbit import *


import neopixel

np = neopixel.NeoPixel(pin0, 5)
lig=[[255,0,0],[255,127,0],[255,255,0],[0,255,0],[0,0,255],[75,0,136],[139,0,255]]
while True:
np[0] = lig[0]
np[1] = lig[1]
np[2] = lig[2]
np[3] = lig[3]
np[4] = lig[4]

np.show()

Code to cycle through the rainbow


from microbit import *
import neopixel

np = neopixel.NeoPixel(pin0, 5)
lig=[[255,0,0],[255,127,0],[255,255,0],[0,255,0],[0,0,255],[75,0,136],[139,0,255]]
count1=1
count0=0
count2=2
count3=3
count4=4
while True:
np[0] = lig[count0]
if count0>=6:
count0=0;
else:
count0=count0+1
np[1] = lig[count1]
if count1>=6:
count1=0;
else:
count1=count1+1
np[2] = lig[count2]
if count2>=6:
count2=0;
else:
count2=count2+1
np[3] = lig[count3]
if count3>=6:
count3=0;
else:
count3=count3+1
np[4] = lig[count4]
if count4>=6:
count4=0;
else:
count4=count4+1
np.show()

sleep(500)

All opinions in this blog are the Author's and should not in any way be seen as reflecting the views of any
organisation the Author has any association with. Twitter @scottturneruon