TILE-LED36 reference

TILE-LED36

Usage

Please see the reference manual, in PDF form here: TILE_LED36_ref.pdf

The reference manual is also available in HTML form here: TILE_LED36_ref.html

Getting started

The LED36 tile is an I2C device. It responds to the I2C broadcast address 1, as well as the default individual address 60 (which can be changed). Commands sent to either of these addresses act the same.

To initialise an LED36 tile send it the byte 0x01 (to either address 1 or 60) and then wait 20 milliseconds before sending the next command. For example:

import time, machine

machine.Pin('EN_3V3').on()  # enable power on LED36 bus
i2c = machine.I2C('X')      # select X bus (use 'Y' on DIP28)
i2c.writeto(1, b'\x01')     # initialise all LED36 tiles with broadcast address
time.sleep_ms(20)           # wait for LED36 tiles to be ready

Code Samples

import time, machine

LED_BROADCAST = 1           # broadcast I2C address
LED_ADDR = 60               # default individual LED36 address

machine.Pin('EN_3V3').on()  # enable power on LED36 bus
i2c = machine.I2C('X')      # select X bus

def cyc(addr, dt=250):
    """ Set all LEDs to black, red, green, yellow, blue, magenta, cayn and white for dt ms
        ramp up brightnes from 0 % to 100 %
    """
    while True:
        try:
            fill_rgb(addr, 100, 100, 100)
            break
        except:
            time.sleep_ms(100)
    for i in range(8):
        fill_rgb(addr, (i & 1) * 255, ((i >> 1) & 1) * 255, ((i >> 2) & 1) * 255)
        time.sleep_ms(dt)
    for i in range(100):
        brightness(addr, i)
        time.sleep_ms(20)

def brightness(addr, b=100):
    """ Set brigntness """
    ba = bytearray(b'\x02\x16 ')
    ba[-1] = b & 0xff
    i2c.writeto(addr, ba)

def bloop(addr, dt=100, maxv=100, inc=1):
    """ Cycle through brigntness ramp """
    b = 0
    while True:
        print(b)
        brightness(addr, b)
        b += inc
        b %= maxv
        time.sleep_ms(dt)

def pump(addr, dt=10, maxv=100):
    """ Cycle through brightness modulation """
    import math
    sinar = []
    for i in range(90):
        sinar.append(int((math.sin(i * 4 / 180 * math.pi) + 1) * maxv / 2))
    i = 0
    while True:
        brightness(addr, sinar[i])
        i += 1
        i %= len(sinar)
        time.sleep_ms(dt)

def fill_rgb(addr, r, g, b):
    """ Fill LED array using set pixel command """
    i2c.writeto(addr, b'\x02X\x00\x00')
    buf = bytearray(b'\x02A   ')
    buf[2] = r
    buf[3] = g
    buf[4] = b
    for i in range(36):
        i2c.writeto(addr, buf)

def illu(addr, r, g, b):
    """ Fill LED array using set illumination command """
    buf = bytearray(b'\x02i   ')
    buf[2] = r
    buf[3] = g
    buf[4] = b
    i2c.writeto(addr, buf)

def fill_frame(addr, r, g, b):
    """ Fill LED array using fill frame command """
    i2c.writeto(addr, b'\x02ml')
    buf = bytearray(b'   ')
    buf[0] = r
    buf[1] = g
    buf[2] = b
    for i in range(36):
        i2c.writeto(addr, buf)

def set_dot(addr, x, y, r, g, b):
    """ Set single LED color at position """
    buf = bytearray(b'\x02X  ')
    buf[2] = x
    buf[3] = y
    i2c.writeto(addr, buf)

    buf = bytearray(b'\x02A   ')
    buf[2] = r
    buf[3] = g
    buf[4] = b
    i2c.writeto(addr, buf)

def fill_raw(addr, r, g, b):
    """ Fill LED array with raw values using fill frame command """
    i2c.writeto(addr, b'\x02nl')
    buf = bytearray(b'   ')
    buf[0] = r
    buf[1] = g
    buf[2] = b
    for i in range(36):
        i2c.writeto(addr, buf)

def led_pins(addr, v):
    """ Permute LED colors (use with care) """
    buf = bytearray(b'\x02\x1c\x00')
    buf[-1] = v & 3
    i2c.writeto(addr, buf)

def random_dots(addr, dt=10):
    """ Set random colors at random positions """
    import pyb
    while True:
        rn = pyb.rng()
        r = rn & 0xff
        g = (rn >> 8) & 0xff
        b = (rn >> 16) & 0xff
        x = (rn >> 24) % 36
        y = x // 6
        x %= 6
        set_dot(addr, x, y, r, g, b)
        time.sleep_ms(dt)

The default I2C address of 60 can be changed using the following code:

def save_nvram(addr):
    """ Save NVRAM state """
    i2c.writeto(addr, b'\x02fn')

def set_i2caddr(cur_addr, new_addr):
    """ Modify I2C address and save it to NVRAM """
    ba = bytearray(b'\x02\x0eI2C ')
    ba[-1] = (new_addr * 2) & 0xfe
    i2c.writeto(cur_addr, ba)
    save_nvram(cur_addr)