In this project, you will learn:
- What number bases are
- How to connect and program buttons on the BBC micro:bit (works on V1 and V2)
- How to program the micro:bit in Python, to convert between different number bases
You will need:
- A BBC micro:bit V2, or the V1 will work fine too
- Jumper wires with crocodile clips on one end. We used crocodile -> jumper -> F2F lead.
- The Kitronik Resistive Touch Keypad (other buttons will work too). See the note in step 2 re: capacitive touch on the micro:bit V2.
- To know how to write and flash a MicroPython program on the micro:bit web editor or mu or Thonny editors (see our previous tutorials for information on this).
Step 1: Number Bases
Number bases refer to the place value of each column in a number. We commonly use base10 during everyday life, which means that the place value of each column in base10 is a power of 10.
The top row of the table below, shows the place value for each column of the number 2,313 in base10. Each column value is multiplied by the number below it. So, the 2 in the 10^{3} column is 10 x 10 x 10 x 2, because 10^{3} = 10 x 10 x 10.
10^{3} | 10^{2} | 10^{1} | 10^{0} |
---|---|---|---|
2 | 3 | 1 | 3 |
Because we are using base10, the highest number in a column is 9.
In the table below, we will represent the value of 25 in base10, as base2.
2^{4} | 2^{3} | 2^{2} | 2^{1} | 2^{0} |
---|---|---|---|---|
1 | 1 | 0 | 0 | 1 |
For base2, the highest number in a column can only be 1.
So if we work out the place value, 2^{4} is 2 x 2 x 2 x 2 = 16 in base10. For the 2^{3} column, we have 2 x 2 x 2 = 8, and for the 2^{0} we have 1. Adding these together we have 16 + 8 + 1 = 25 in base10.
Step 2: Connecting Switches to the micro:bit
The micro:bit has a ground pin (GND) and when we connect a wire between pins 0, 1, 2 to GND, the Python function, is_touched()
will return a True value.
A code example below will display a happy face on the micro:bit when pin0 is connected to GND, and a sad face if it isn’t.
from microbit import *
while True: # keep looping forever
if pin0.is_touched():
display.show(Image.HAPPY)
else:
display.show(Image.SAD)
You can test this by using flashing this code to your micro:bit and using a small wire to connect pin0 to the GND pin.
Step 3: Using Switches to Represent Binary Numbers
Because a switch and be either on of off, it can be used to represent a single binary digit with 1 (on) or 0 (off).
Because the Kitronik Resistive Touch Keypad has 3 switches (pads that short together when touched), its perfect to represent a 3-digit binary (base2) number. We will connect each of the Resistive Touch Keypad pins to pins 0, 1, and 2 of the micro:bit and the keypad GND pin to the corresponding GND pin on the micro:bit.
Note: capacitive touch, which doesn't require a connection to GND, is already implemented in the v2 hardware. At the time of writing, this was not yet implemented in the stable version of micro:bit Python. You can try this out in the development version of micro:bit Python here. This will just require an extra command to change the mode from resistive to capacitive i.e. `pin.set_touch_mode(mode)`.
To start off writing our Python script, we can use variables to set the place value powers.
from microbit import *
column_zero_power = 0
column_one_power = 1
column_two_power = 2
Now, using the same code from before, repeated for each pin, we'll calculate each binary column value, and add it to our final result, `my_integer`.
while True:
my_integer, zero_binary, one_binary, two_binary = 0, 0, 0, 0 # reset everything before touch
if pin2.is_touched():
zero_binary = 1 # binary column 2 ^ 0
my_integer += 2 ** column_zero_power # add to decimal conversion
if pin1.is_touched():
one_binary = 1 # binary column 2 ^ 1
my_integer += 2 ** column_one_power # add to decimal conversion
if pin0.is_touched():
two_binary = 1 # binary column 2 ^ 2
my_integer += 2 ** column_two_power # add to decimal conversion
We still need to display our result. This following code will display a message on the micro:bit as well as a message on the REPL debug console (accessible if you are using mu editor or Thonny). The following code will do this. There’s a sleep()
command at the end to give the micro:bit some time to do catch up.
print("Binary (base2): {}{}{} Decimal (base10): {}".format(two_binary, one_binary, zero_binary, my_integer))
display.show(my_integer) # also write it to the onboard LED matrix
sleep(100)
Flash your program onto your micro:bit and press different combinations of the pads. You should see the equivalnt base10 number displayed on the micro:bit LED matrix.
The Complete Program
The complete program is shown below:
from microbit import *
column_zero_power = 0
column_one_power = 1
column_two_power = 2
while True:
my_integer, zero_binary, one_binary, two_binary = 0, 0, 0, 0 # reset everything before touch
if pin2.is_touched():
zero_binary = 1 # binary column 2 ^ 0
my_integer += 2 ** column_zero_power # add to decimal conversion
if pin1.is_touched():
one_binary = 1 # binary column 2 ^ 1
my_integer += 2 ** column_one_power # add to decimal conversion
if pin0.is_touched():
two_binary = 1 # binary column 2 ^ 2
my_integer += 2 ** column_two_power # add to decimal conversion
print("Binary (base2): {}{}{} Decimal (base10): {}".format(two_binary, one_binary, zero_binary, my_integer))
display.show(my_integer) # also write it to the onboard LED matrix
sleep(100)
Each touched pad is read as a `1` with the remaining pads read as `0`. You can see how the micro:bit displays the base10 version of the binary numbers below.
Challenge
See if you can convert from base2 to base8 instead of base10.oct()
function to convert from base10 to base8 (octal).