parent
e00a5b25d9
commit
4b4f0791b9
@ -0,0 +1,34 @@ |
||||
#!/bin/env python3 |
||||
import gex |
||||
import time |
||||
|
||||
ADDR = 0x61 |
||||
MODE = 0b00011000 |
||||
OPTS = 0b00001110 # 1110 = 35mA, 0000 = 40mA |
||||
|
||||
CMD_BRIGHTNESS = 0x19 |
||||
CMD_MODE = 0x00 |
||||
CMD_UPDATE = 0x0C |
||||
CMD_OPTIONS = 0x0D |
||||
|
||||
CMD_MATRIX_1 = 0x01 |
||||
CMD_MATRIX_2 = 0x0E |
||||
|
||||
with gex.Client(gex.TrxRawUSB()) as client: |
||||
bus = gex.I2C(client, 'i2c') |
||||
addr = 0x61 |
||||
bus.write_reg(addr, CMD_MODE, MODE) |
||||
bus.write_reg(addr, CMD_OPTIONS, OPTS) |
||||
bus.write_reg(addr, CMD_BRIGHTNESS, 64) |
||||
|
||||
bus.write(addr, [CMD_MATRIX_1, |
||||
0xAA,0x55,0xAA,0x55, |
||||
0xAA,0x55,0xAA,0x55, |
||||
]) |
||||
|
||||
bus.write(addr, [CMD_MATRIX_2, |
||||
0xFF, 0, 0xFF, 0, |
||||
0xFF, 0, 0xFF, 0, |
||||
]) |
||||
|
||||
bus.write_reg(addr, CMD_UPDATE, 0x01) |
@ -0,0 +1,200 @@ |
||||
#!/bin/env python3 |
||||
import random |
||||
|
||||
import gex |
||||
import time |
||||
|
||||
ADDR = 0x61 |
||||
MODE = 0b00011000 |
||||
OPTS = 0b00001110 # 1110 = 35mA, 0000 = 40mA |
||||
|
||||
CMD_BRIGHTNESS = 0x19 |
||||
CMD_MODE = 0x00 |
||||
CMD_UPDATE = 0x0C |
||||
CMD_OPTIONS = 0x0D |
||||
|
||||
CMD_MATRIX_1 = 0x01 |
||||
CMD_MATRIX_2 = 0x0E |
||||
|
||||
MATRIX_1 = 0 |
||||
MATRIX_2 = 1 |
||||
|
||||
# This is an adaptation of the phat library |
||||
# - the only change needed was replacing the smbus class with the GEX unit driver |
||||
|
||||
class NanoMatrix: |
||||
''' |
||||
_BUF_MATRIX_1 = [ # Green |
||||
#Col 1 2 3 4 5 |
||||
0b00000000, # Row 1 |
||||
0b00000000, # Row 2 |
||||
0b00000000, # Row 3 |
||||
0b00000000, # Row 4 |
||||
0b00000000, # Row 5 |
||||
0b00000000, # Row 6 |
||||
0b10000000, # Row 7, bit 8 = decimal place |
||||
0b00000000 |
||||
] |
||||
_BUF_MATRIX_2 = [ # Red |
||||
#Row 8 7 6 5 4 3 2 1 |
||||
0b01111111, # Col 1, bottom to top |
||||
0b01111111, # Col 2 |
||||
0b01111111, # Col 3 |
||||
0b01111111, # Col 4 |
||||
0b01111111, # Col 5 |
||||
0b00000000, |
||||
0b00000000, |
||||
0b01000000 # bit 7, decimal place |
||||
] |
||||
_BUF_MATRIX_1 = [0] * 8 |
||||
_BUF_MATRIX_2 = [0] * 8 |
||||
''' |
||||
|
||||
def __init__(self, bus:gex.I2C, address=ADDR): |
||||
self.address = address |
||||
self._brightness = 127 |
||||
|
||||
self.bus = bus |
||||
|
||||
self.bus.write_byte_data(self.address, CMD_MODE, MODE) |
||||
self.bus.write_byte_data(self.address, CMD_OPTIONS, OPTS) |
||||
self.bus.write_byte_data(self.address, CMD_BRIGHTNESS, self._brightness) |
||||
|
||||
self._BUF_MATRIX_1 = [0] * 8 |
||||
self._BUF_MATRIX_2 = [0] * 8 |
||||
|
||||
def set_brightness(self, brightness): |
||||
self._brightness = int(brightness * 127) |
||||
if self._brightness > 127: self._brightness = 127 |
||||
|
||||
self.bus.write_byte_data(self.address, CMD_BRIGHTNESS, self._brightness) |
||||
|
||||
def set_decimal(self, m, c): |
||||
|
||||
if m == MATRIX_1: |
||||
if c == 1: |
||||
self._BUF_MATRIX_1[6] |= 0b10000000 |
||||
else: |
||||
self._BUF_MATRIX_1[6] &= 0b01111111 |
||||
|
||||
elif m == MATRIX_2: |
||||
|
||||
if c == 1: |
||||
self._BUF_MATRIX_2[7] |= 0b01000000 |
||||
else: |
||||
self._BUF_MATRIX_2[7] &= 0b10111111 |
||||
|
||||
#self.update() |
||||
|
||||
def set(self, m, data): |
||||
for y in range(7): |
||||
self.set_row(m, y, data[y]) |
||||
|
||||
def set_row(self, m, r, data): |
||||
for x in range(5): |
||||
self.set_pixel(m, x, r, (data & (1 << (4-x))) > 0) |
||||
|
||||
def set_col(self, m, c, data): |
||||
for y in range(7): |
||||
self.set_pixel(m, c, y, (data & (1 << y)) > 0) |
||||
|
||||
def set_pixel(self, m, x, y, c): |
||||
|
||||
if m == MATRIX_1: |
||||
if c == 1: |
||||
self._BUF_MATRIX_1[y] |= (0b1 << x) |
||||
else: |
||||
self._BUF_MATRIX_1[y] &= ~(0b1 << x) |
||||
elif m == MATRIX_2: |
||||
if c == 1: |
||||
self._BUF_MATRIX_2[x] |= (0b1 << y) |
||||
else: |
||||
self._BUF_MATRIX_2[x] &= ~(0b1 << y) |
||||
|
||||
#self.update() |
||||
|
||||
def clear(self, m): |
||||
if m == MATRIX_1: |
||||
self._BUF_MATRIX_1 = [0] * 8 |
||||
elif m == MATRIX_2: |
||||
self._BUF_MATRIX_2 = [0] * 8 |
||||
|
||||
self.update() |
||||
|
||||
def update(self): |
||||
for x in range(10): |
||||
try: |
||||
self.bus.write_i2c_block_data(self.address, CMD_MATRIX_1, self._BUF_MATRIX_1) |
||||
self.bus.write_i2c_block_data(self.address, CMD_MATRIX_2, self._BUF_MATRIX_2) |
||||
|
||||
self.bus.write_byte_data(self.address, CMD_UPDATE, 0x01) |
||||
break |
||||
except IOError: |
||||
print("IO Error") |
||||
|
||||
|
||||
|
||||
|
||||
with gex.Client(gex.TrxRawUSB()) as client: |
||||
bus = gex.I2C(client, 'i2c') |
||||
|
||||
n1 = NanoMatrix(bus, 0x61) |
||||
n2 = NanoMatrix(bus, 0x62) |
||||
n3 = NanoMatrix(bus, 0x63) |
||||
|
||||
n1.set_pixel(0, 0, 0, 1) |
||||
n1.set_pixel(0, 4, 0, 1) |
||||
n1.set_pixel(0, 0, 6, 1) |
||||
n1.set_pixel(0, 4, 6, 1) |
||||
|
||||
n1.set_pixel(1, 0, 0, 1) |
||||
n1.set_pixel(1, 4, 0, 1) |
||||
n1.set_pixel(1, 0, 3, 1) |
||||
n1.set_pixel(1, 4, 3, 1) |
||||
|
||||
n2.set_pixel(0, 0, 2, 1) |
||||
n2.set_pixel(0, 4, 2, 1) |
||||
n2.set_pixel(0, 0, 5, 1) |
||||
n2.set_pixel(0, 4, 5, 1) |
||||
|
||||
n2.set_pixel(1, 0, 0, 1) |
||||
n2.set_pixel(1, 4, 0, 1) |
||||
n2.set_pixel(1, 0, 6, 1) |
||||
n2.set_pixel(1, 4, 6, 1) |
||||
|
||||
|
||||
n3.set_pixel(0, 1, 0, 1) |
||||
n3.set_pixel(0, 3, 0, 1) |
||||
n3.set_pixel(0, 1, 6, 1) |
||||
n3.set_pixel(0, 3, 6, 1) |
||||
|
||||
n3.set_pixel(1, 1, 1, 1) |
||||
n3.set_pixel(1, 3, 1, 1) |
||||
n3.set_pixel(1, 1, 5, 1) |
||||
n3.set_pixel(1, 3, 5, 1) |
||||
|
||||
n1.update() |
||||
n2.update() |
||||
n3.update() |
||||
|
||||
b1 = 64 |
||||
b2 = 64 |
||||
b3 = 64 |
||||
|
||||
while True: |
||||
b1 += random.randint(-20, 15) |
||||
b2 += random.randint(-20, 15) |
||||
b3 += random.randint(-20, 15) |
||||
|
||||
if b1 < 0: b1 = 0 |
||||
if b2 < 0: b2 = 0 |
||||
if b3 < 0: b3 = 0 |
||||
if b1 > 127: b1 = 127 |
||||
if b2 > 127: b2 = 127 |
||||
if b3 > 127: b3 = 127 |
||||
|
||||
n1.set_brightness(b1) |
||||
n2.set_brightness(b2) |
||||
n3.set_brightness(b3) |
||||
|
||||
time.sleep(0.001) |
Loading…
Reference in new issue