kopia lustrzana https://github.com/pimoroni/pimoroni-pico
234 wiersze
5.9 KiB
Python
234 wiersze
5.9 KiB
Python
import time
|
|
from pimoroni_i2c import PimoroniI2C
|
|
from breakout_ioexpander import BreakoutIOExpander
|
|
from adafruit_is31fl3731 import IS31FL3731
|
|
import sys
|
|
from machine import I2C, Pin
|
|
|
|
PINS_BREAKOUT_GARDEN = {"sda": 4, "scl": 5}
|
|
PINS_PICO_EXPLORER = {"sda": 20, "scl": 21}
|
|
|
|
s1_pin = 1
|
|
s2_pin = 13
|
|
s3_pin = 11
|
|
s4_pin = 4
|
|
s5_pin = 2
|
|
|
|
ENC_TERM_A = 3
|
|
ENC_TERM_B = 12
|
|
|
|
ENC_CHANNEL = 1
|
|
|
|
#i2c = PimoroniI2C(**PINS_BREAKOUT_GARDEN)
|
|
i2c = I2C(0, sda=Pin(4), scl=Pin(5))
|
|
ioe = BreakoutIOExpander(i2c, address=0x18)#, interrupt=3)
|
|
ioe.enable_interrupt_out(pin_swap=True)
|
|
#ioe.set_address(0x13)
|
|
|
|
#2c.writeto(0x18, bytearray([0xF9, 0x06]))
|
|
#i2c.writeto(0x18, bytearray([0x00, 0b11000000]))
|
|
#i2c.writeto(0x18, bytearray([0x01, 0b00110001]))
|
|
|
|
ioe.set_mode(s1_pin, BreakoutIOExpander.PIN_IN_PU)
|
|
ioe.set_mode(s2_pin, BreakoutIOExpander.PIN_IN_PU)
|
|
ioe.set_mode(s3_pin, BreakoutIOExpander.PIN_IN_PU)
|
|
ioe.set_mode(s4_pin, BreakoutIOExpander.PIN_IN_PU)
|
|
ioe.set_mode(s5_pin, BreakoutIOExpander.PIN_IN_PU)
|
|
|
|
ioe.setup_rotary_encoder(ENC_CHANNEL, ENC_TERM_A, ENC_TERM_B, 6, count_microsteps=True)
|
|
#ioe.set_mode(ENC_TERM_A, BreakoutIOExpander.PIN_IN_PU)
|
|
#ioe.set_mode(ENC_TERM_B, BreakoutIOExpander.PIN_IN_PU)
|
|
ioe.set_pin_interrupt(s1_pin, True)
|
|
ioe.set_pin_interrupt(s2_pin, True)
|
|
ioe.set_pin_interrupt(s3_pin, True)
|
|
ioe.set_pin_interrupt(s4_pin, True)
|
|
ioe.set_pin_interrupt(s5_pin, True)
|
|
|
|
display = IS31FL3731(i2c, address=0x77)
|
|
display2 = IS31FL3731(i2c, address=0x77-3)
|
|
display.fill(10)
|
|
display2.fill(10)
|
|
|
|
time.sleep(1)
|
|
|
|
mapping = ((128, 32, 48),
|
|
(129, 33, 49),
|
|
(130, 17, 50),
|
|
(131, 18, 34),
|
|
(132, 19, 35),
|
|
(133, 20, 36),
|
|
(134, 21, 37),
|
|
(112, 80, 96),
|
|
(113, 81, 97),
|
|
(114, 82, 98),
|
|
(115, 83, 99),
|
|
(116, 84, 100),
|
|
(117, 68, 101),
|
|
(118, 69, 85),
|
|
(127, 47, 63),
|
|
(121, 41, 57),
|
|
(122, 25, 58),
|
|
(123, 26, 42),
|
|
(124, 27, 43),
|
|
(125, 28, 44),
|
|
(126, 29, 45),
|
|
(15, 95, 111),
|
|
(8, 89, 105),
|
|
(9, 90, 106))
|
|
|
|
|
|
def hsv_to_rgb(h, s, v):
|
|
if s == 0.0:
|
|
return v, v, v
|
|
i = int(h * 6.0)
|
|
f = (h * 6.0) - i
|
|
p = v * (1.0 - s)
|
|
q = v * (1.0 - s * f)
|
|
t = v * (1.0 - s * (1.0 - f))
|
|
i = i % 6
|
|
if i == 0:
|
|
return v, t, p
|
|
if i == 1:
|
|
return q, v, p
|
|
if i == 2:
|
|
return p, v, t
|
|
if i == 3:
|
|
return p, q, v
|
|
if i == 4:
|
|
return t, p, v
|
|
if i == 5:
|
|
return v, p, q
|
|
|
|
'''
|
|
while True:
|
|
for x in range(0, 24):
|
|
single = mapping[x]
|
|
display.pixel(single[0], 0, 255)
|
|
display.pixel(single[1], 0, 255)
|
|
display.pixel(single[2], 0, 255)
|
|
print(x)
|
|
time.sleep(0.05)
|
|
display.pixel(single[0], 0, 0)
|
|
display.pixel(single[1], 0, 0)
|
|
display.pixel(single[2], 0, 0)
|
|
'''
|
|
|
|
last_s1 = True
|
|
last_s2 = True
|
|
last_s3 = True
|
|
last_s4 = True
|
|
last_s5 = True
|
|
last_count = -1
|
|
|
|
last_enc_a = False
|
|
last_enc_b = False
|
|
|
|
toggler = False
|
|
|
|
import sys
|
|
from machine import Pin
|
|
p15 = Pin(15, Pin.OUT)
|
|
p15.value(True)
|
|
|
|
last_sp = 0
|
|
|
|
while True:
|
|
s1 = bool(ioe.input(s1_pin))
|
|
s2 = bool(ioe.input(s2_pin))
|
|
s3 = bool(ioe.input(s3_pin))
|
|
s4 = bool(ioe.input(s4_pin))
|
|
s5 = bool(ioe.input(s5_pin))
|
|
if s1 is not last_s1:
|
|
if s1:
|
|
print("Centre (S1) has been released")
|
|
else:
|
|
print("Centre (S1) has been pressed")
|
|
last_s1 = s1
|
|
|
|
if s2 is not last_s2:
|
|
if s2:
|
|
print("Up (S2) has been released")
|
|
else:
|
|
print("Up (S2) has been pressed")
|
|
last_s2 = s2
|
|
|
|
if s3 is not last_s3:
|
|
if s3:
|
|
print("Left (S3) has been released")
|
|
else:
|
|
print("Left (S3) has been pressed")
|
|
last_s3 = s3
|
|
|
|
if s4 is not last_s4:
|
|
if s4:
|
|
print("Down (S4) has been released")
|
|
else:
|
|
print("Down (S4) has been pressed")
|
|
last_s4 = s4
|
|
|
|
if s5 is not last_s5:
|
|
if s5:
|
|
print("Right (S5) has been released")
|
|
else:
|
|
print("Right (S5) has been pressed")
|
|
last_s5 = s5
|
|
|
|
if ioe.get_interrupt_flag():
|
|
ioe.clear_interrupt_flag()
|
|
|
|
count = ioe.read_rotary_encoder(ENC_CHANNEL) // 2
|
|
if count != last_count:
|
|
if count - last_count > 0:
|
|
print("Clockwise, Count = ", count)
|
|
else:
|
|
print("Counter Clockwise, Count = ", count)
|
|
|
|
if count == 0 and (last_count > 1 or last_count < -1):
|
|
p15.value(False)
|
|
#sys.exit()
|
|
|
|
last_single = mapping[last_count % 24]
|
|
display.pixel(last_single[0], 0, 0)
|
|
display.pixel(last_single[1], 0, 0)
|
|
display.pixel(last_single[2], 0, 0)
|
|
display2.pixel(last_single[0], 0, 0)
|
|
display2.pixel(last_single[1], 0, 0)
|
|
display2.pixel(last_single[2], 0, 0)
|
|
single = mapping[count % 24]
|
|
r, g, b = hsv_to_rgb(count / 24, 1.0, 1.0)
|
|
display.pixel(single[0], 0, int(255 * r))
|
|
display.pixel(single[1], 0, int(255 * g))
|
|
display.pixel(single[2], 0, int(255 * b))
|
|
display2.pixel(single[0], 0, int(255 * r))
|
|
display2.pixel(single[1], 0, int(255 * g))
|
|
display2.pixel(single[2], 0, int(255 * b))
|
|
last_count = count
|
|
|
|
|
|
i2c.writeto(0x13, bytearray([0x41]))
|
|
sp = i2c.readfrom(0x13, 1)
|
|
if sp != last_sp:
|
|
print("SP =", sp)
|
|
last_sp = sp
|
|
|
|
|
|
'''
|
|
enc_a = bool(ioe.input(ENC_TERM_A))
|
|
enc_b = bool(ioe.input(ENC_TERM_B))
|
|
|
|
if enc_a is not last_enc_a:
|
|
if enc_a:
|
|
print("ENC A high")
|
|
else:
|
|
print("ENC A low")
|
|
last_enc_a = enc_a
|
|
|
|
if enc_b is not last_enc_b:
|
|
if enc_b:
|
|
print("ENC B high")
|
|
else:
|
|
print("ENC B low")
|
|
last_enc_b = enc_b
|
|
'''
|
|
|
|
#time.sleep(0.001) |