Raspberry Pi Pico
Original Scroll pHAT
The orginal Scroll pHAT (not the HD one) was based on a completely different LED driver. It used the IS31FL3730. This has more basic variation of LED brightness and has fewer pixels. The trade-off is that it is a little simpler to drive. I had previously got this working on a BBC micro:bit and decided to have a quick go at making this work for the Pico. These don't seem to be on sale in the Pimoroni store but I do keep seeing them elsewhere.
My library code is here. I saved this as scrollphat.py. I went to some lengths to make a very compact font. It doesn't look amazing but, if you read the micro:bit page on this board, you can find out what I did.
from micropython import const from time import sleep_ms _ADDRESS = const(0x60) font = [0x0,0x17,0xc03,0x2bea,0x6a76,0x2889,0x6aaa,0x3,0x45c0,0x1d1,0xc6, 0x11c4,0x38c,0x1084,0x10,0xc98,0x7e3f,0x3e2,0x5ebd,0x7eb5,0x790f, 0x76b7,0x76bf,0x7c21,0x7ebf,0x7eb7,0x140,0x340,0x4544,0x294a,0x1151, 0x1ea0,0x5ebf,0x7cbf,0x6ebf,0x463f,0x3a3f,0x56bf,0x4bf,0x763f,0x7c9f, 0x47f1,0x3e08,0x6c9f,0x421f,0x7cdf,0x709c,0x7e3f,0x1cbf,0x7b2e,0x6cbf, 0x76b7,0x7e1,0x7e1f,0x3e0f,0x7d9f,0x6c9b,0x7e97,0x4eb9,0x47e0,0x6083, 0x3f1,0x1826,0x4210,0x821,0x7298,0x729f,0x529c,0x7e9c,0x534c,0x17c4, 0x7ab7,0x709f,0x3a0,0x3608,0x699f,0x3e0,0x6198,0x6098,0x7a5e,0x1cbf, 0x7ca7,0x109e,0x26b2,0xbe2,0x721c,0x320c,0x330c,0x5114,0x1b16,0x4384] class ScrollP: def __init__(self, i2c): self.i2c = i2c self.buffer = bytearray([0] * 11) self.offset = 0 # set 5x11 mode self.i2c.writeto_mem(_ADDRESS, 0, b'\x03') self.set_brightness(32) self.show() def set_brightness(self, b): self.i2c.writeto_mem(_ADDRESS, 0x19, bytes([b])) def show(self): data = bytearray([0x01]) + self.buffer + bytearray([0xff]) self.i2c.writeto(_ADDRESS, data) def set_pixel(self, x, y, value): if value: self.buffer[x] |= (1 << y) else: self.buffer[x] &= ~(1 << y) def get_char_bytes(self,c): if ord(c)<32 or ord(c)>122: return [0,0,0] else: return bytes([font[ord(c)-32]>>(i*5) & 31 for i in range(3)]) def scroll_msg(self, msg, delay): data = bytearray([0]*11) for c in msg: data += bytearray(b'\x00') data += self.get_char_bytes(c) data += bytearray(b'\x00') data += bytearray([0]*11) for i in range(len(data)-11): self.buffer = data[i:i+11] self.show() sleep_ms(delay)
Here was some test code,
from machine import Pin, I2C from scrollphat import ScrollP from time import sleep i2c=I2C(1,sda=Pin(2), scl=Pin(3)) display = ScrollP(i2c) #test pixels for y in range(5): for x in range(11): display.set_pixel(x,y,1) display.show() sleep(0.1) # test scrolling display.scroll_msg("OMG! The scrolling works.", 100)