BBC Micro Bit

The ARM version of uLisp now runs on the BBC Micro Bit, the low-cost controller board pioneered by the BBC in the UK.

The BBC Micro Bit is based on a Nordic Semiconductor nRF51822 ARM Cortex-M0 microcontroller. It runs at 16 MHz and provides 256 Kbytes of flash program memory and 16 Kbytes of RAM:

MicroBit2.jpg

Pin connections

The BBC Micro Bit provides 19 digital input/output pins, 6 analogue inputs, and 19 analogue outputs. They are accessible from the edge connector as follows:

pinout.png

The board also includes two pushbuttons and a matrix of 5 x 5 multiplexed LEDs. See Example programs below for examples of using these from uLisp.

Installing uLisp on the BBC Micro Bit

You can install the ARM version of uLisp on a BBC Micro Bit using the Arduino IDE as follows:

  • Download the ARM version of uLisp from the downloads page: Download uLisp.
  • In the Arduino IDE open the Preferences dialog box, and add the following URL to Additional Board Manager URLs:
https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json
  • Open the Boards Manager… from the Board item on the Tools menu, search for nRF5, and install Nordic Semiconductor nRF5 Boards by Sandeep Mistry.
  • Connect the BBC Micro Bit to your computer using a USB cable.
  • Select BBC micro:bit from the Board menu, set Softdevice to None, and set Port to the USB port.

You should now be able to upload uLisp to the BBC Micro Bit.

Follow the instructions in Using uLisp to interact with uLisp on the BBC Micro Bit.

Example programs

Buttons

The reverse side of the BBC Micro Bit provides two pushbuttons on pins 5 and 11. You can read these with the following program:

(defun buttons ()
  (pinmode 5 nil)
  (pinmode 11 nil)
  (loop
   (print
    (list (digitalread 5) (digitalread 11)))
   (delay 1000)))

Run it by typing:

(buttons)

LEDs

The reverse of the BBC Micro Bit also provides a matrix of 5 x 5 LEDs. They are connected in a totally illogical arrangement of nine columns and three rows, and to light any individual LED you need to take the column low and the row high corresponding to that LED.

The following table shows the (row, column) for each LED:

(26, 3) (27, 23) (26, 4) (27, 24) (26, 10)
(28, 23) (28, 24) (28, 25) (28, 9) (28, 7)
(27, 4) (26, 6) (27, 10) (28, 6) (27, 3)
(26, 7) (26, 9) (26, 25) (26, 24) (26, 23)
(28, 10) (27, 9) (28, 3) (27, 25) (28, 4)

This program flashes the LED at (row, column):

(defun b (row col)
  (let (x)
    (pinmode row t)
    (pinmode col t)
    (digitalwrite row t)
    (loop
     (digitalwrite col x)
     (delay 1000)
     (setq x (not x)))))

For example, to flash the centre LED run:

(b 27 10)

Analogue outputs

Any pin can also be used as an 8-bit analogue output, so you can pulsate the centre LED slowly on and off with the program:

(defun pulse ()
  (let (down)
    (pinmode 27 t)
    (digitalwrite 27 t)
    (loop
     (dotimes (x 256) 
       (delay 5) 
       (analogwrite 10 (if down (- 255 x) x)))
     (setq down (not down)))))

Run it by typing:

(pulse)

Exit from any program by entering ~.

Analogue inputs

The BBC Micro Bit provides six 10-bit analogue inputs, three of which are available on the edge connector pins labelled 0, 1, and 2. The following example program reads the analogue input on pin 0 and displays the value as a bar of LEDs, using the fourth row of LEDs on the matrix:

MicroBit3.jpg

The program takes advantage of the fact that this row of LEDs share the same row number. Here's the program:

(defun meter ()
  (let ((col '(7 9 25 24 23))
        (row 26))
    (pinmode row t)
    (digitalwrite row t)
    (mapc (lambda (x) (pinmode x t)) col)
    (loop
     (dotimes (n 5)
       (digitalwrite 
        (nth n col)
        (< 
         (analogread 0)
         (* (1+ n) 170)))))))

To run it evaluate:

(meter)

If you touch pin 0 on the edge connector you'll see the bar flash from the voltage on your finger. Connect a voltage of up to 3.3V to pin 0 to display a bar of LEDs in proportion to the voltage.