Raspberry Pi Pico
11x7 LED Matrix Breakout

The 11x7 LED matrix breakout is a nice little board. It is part of a range of lovely Pimoroni products called the 'breakout garden'. Pimoroni have built a library into their own MicroPython build. I thought I'd have a quick go and see how easy it was to use the same code base I had for the Scroll Pack.

I am using a breadboard adapter that Pimoroni have for these boards. This means that nothing had to be soldered to get this working.

Pico Circuit

A minor adjustment to the library I used for the Scroll Pack. Again, I have added line breaks to the font definition to make this fit the page. Remove the line breaks when you copy this. This is the library that I saved as scroll11x7.py.

from time import sleep_ms

font = bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x5f\x00\x00\x00\x07\x00\x07\x00\x14\x7f
\x14\x7f\x14\x24\x2a\x7f\x2a\x12\x23\x13\x08\x64\x62\x36\x49\x55\x22\x50\x00\x05\x03\x00\x00
\x00\x1c\x22\x41\x00\x00\x41\x22\x1c\x00\x14\x08\x3e\x08\x14\x08\x08\x3e\x08\x08\x00\x50\x30
\x00\x00\x08\x08\x08\x08\x08\x00\x60\x60\x00\x00\x20\x10\x08\x04\x02\x3e\x51\x49\x45\x3e\x00
\x42\x7f\x40\x00\x42\x61\x51\x49\x46\x21\x41\x45\x4b\x31\x18\x14\x12\x7f\x10\x27\x45\x45\x45
\x39\x3c\x4a\x49\x49\x30\x01\x71\x09\x05\x03\x36\x49\x49\x49\x36\x06\x49\x49\x29\x1e\x00\x36
\x36\x00\x00\x00\x56\x36\x00\x00\x08\x14\x22\x41\x00\x14\x14\x14\x14\x14\x00\x41\x22\x14\x08
\x02\x01\x51\x09\x06\x32\x49\x79\x41\x3e\x7e\x11\x11\x11\x7e\x7f\x49\x49\x49\x36\x3e\x41\x41
\x41\x22\x7f\x41\x41\x22\x1c\x7f\x49\x49\x49\x41\x7f\x09\x09\x09\x01\x3e\x41\x49\x49\x7a\x7f
\x08\x08\x08\x7f\x00\x41\x7f\x41\x00\x20\x40\x41\x3f\x01\x7f\x08\x14\x22\x41\x7f\x40\x40\x40
\x40\x7f\x02\x0c\x02\x7f\x7f\x04\x08\x10\x7f\x3e\x41\x41\x41\x3e\x7f\x09\x09\x09\x06\x3e\x41
\x51\x21\x5e\x7f\x09\x19\x29\x46\x46\x49\x49\x49\x31\x01\x01\x7f\x01\x01\x3f\x40\x40\x40\x3f
\x1f\x20\x40\x20\x1f\x3f\x40\x38\x40\x3f\x63\x14\x08\x14\x63\x07\x08\x70\x08\x07\x61\x51\x49
\x45\x43\x00\x7f\x41\x41\x00\x02\x04\x08\x10\x20\x00\x41\x41\x7f\x00\x04\x02\x01\x02\x04\x40
\x40\x40\x40\x40\x00\x01\x02\x04\x00\x20\x54\x54\x54\x78\x7f\x48\x44\x44\x38\x38\x44\x44\x44
\x20\x38\x44\x44\x48\x7f\x38\x54\x54\x54\x18\x08\x7e\x09\x01\x02\x0c\x52\x52\x52\x3e\x7f\x08
\x04\x04\x78\x00\x44\x7d\x40\x00\x20\x40\x44\x3d\x00\x7f\x10\x28\x44\x00\x00\x41\x7f\x40\x00
\x7c\x04\x18\x04\x78\x7c\x08\x04\x04\x78\x38\x44\x44\x44\x38\x7c\x14\x14\x14\x08\x08\x14\x14
\x18\x7c\x7c\x08\x04\x04\x08\x48\x54\x54\x54\x20\x04\x3f\x44\x40\x20\x3c\x40\x40\x20\x7c\x1c
\x20\x40\x20\x1c\x3c\x40\x30\x40\x3c\x44\x28\x10\x28\x44\x0c\x50\x50\x50\x3c\x44\x64\x54\x4c
\x44\x00\x08\x36\x41\x00\x00\x00\x7f\x00\x00\x00\x41\x36\x08\x00\x10\x08\x08\x10\x08\x00\x00
\x00\x00\x00')

_f = 0
_b = bytearray(145)

class Matrix:   
    def __init__(self, i2c):
        self.i2c = i2c
        self._w(253, 11)
        sleep_ms(100)
        self._w(10, 0)
        sleep_ms(100)
        self._w(10, 1)
        sleep_ms(100)
        self._w(0, 0)
        self._w(6, 0)
        for bank in [1,0]:
            self._w(253, bank)
            self._w([0] + [255] * 17)
        self.clear()
        self.show()
    
    
    def _w(self, *args):
        if len(args) == 1: args = args[0]
        self.i2c.writeto(117, bytes(args))

    def clear(self):
        global _b
        del _b
        _b = bytearray(145)
    
    def fill(self, v):
        global _b
        del _b
        _b = bytearray([v]*145)
        
    def show(self):
        global _f
        _f = not _f
        self._w(253, _f)
        _b[0] = 36
        self._w(_b)
        self._w(253, 11)
        self._w(1, _f)

    def set_pixel(self,col, row, brightness):
        global _b
        _b[self._pixel_addr(col, row)] = brightness

    def get_pixel(self, col, row):
        global _b
        return _b[self._pixel_addr(col, row)]
        
    def _pixel_addr(self, x, y):
        return (x << 4) - y + 1 + (6 if x <= 5 else -82)
   
    def scroll(self, txt, delay, v):
        global _b
        msg = bytearray([0]*11)
        for c in txt:
            msg += bytearray(b'\x00')
            msg += font[(ord(c)-32)*5:(ord(c)-32)*5+5]
            msg += bytearray(b'\x00')
        msg += bytearray([0]*11)
        for i in range(len(msg)-11):
            m = msg[i:i+11]
            for y in range(7):
                for x in range(11):
                    if m[x]>>y & 1:
                        self.set_pixel(x,y,v)
                    else:
                        self.set_pixel(x,y,0)
            self.show()
            sleep_ms(delay)

I connected up the pins of the adapter so that the 3V and GND pins went where you would expect. I have connected SDA to GP4 and SCL to GP5,

from machine import Pin, I2C
from time import sleep
from scroll11x7 import Matrix

i2c=I2C(0,sda=Pin(4), scl=Pin(5))

display = Matrix(i2c)

# test pixel writing
for y in range(7):
    for x in range(11):
        display.set_pixel(x,y,128)
        display.show()
        sleep(0.05)


while True:
    display.scroll("Scrolling again.", 50, 128)