Skip to content

Commit 08ce0e1

Browse files
authored
Create seesaw.py
1 parent 0cc824b commit 08ce0e1

1 file changed

Lines changed: 111 additions & 0 deletions

File tree

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
# Adafruit Seesaw / CRICKIT driver for MicroPython
2+
# MIT License by Adafruit Industries Limor Fried
3+
# Copy onto the micro:bit with main.py using Mu Files icon
4+
from microbit import i2c
5+
import struct
6+
import time
7+
8+
_SIGNALS = (2, 3, 40, 41, 11, 10, 9, 8)
9+
_PWMS = (14, 15, 16, 17, 19, 18, 22, 23, 42, 43, 12, 13)
10+
_SERVOS = (17, 16, 15, 14)
11+
_MOTORS = (22, 23, 19, 18)
12+
_DRIVES = (13, 12, 43, 42)
13+
_TOUCHES = (0, 1, 2, 3)
14+
_ADDR = 0x49
15+
16+
reg_buf = bytearray(2)
17+
pwm_buf = bytearray(3)
18+
19+
def _read(reghi, reglo, n, delay_s=0.01):
20+
reg_buf[0] = reghi
21+
reg_buf[1] = reglo
22+
i2c.write(_ADDR, reg_buf)
23+
time.sleep(delay_s)
24+
return i2c.read(_ADDR, n)
25+
26+
def _write(reghi, reglo, cmd):
27+
reg_buf[0] = reghi
28+
reg_buf[1] = reglo
29+
#print("sswrite: ", [hex(i) for i in reg_buf+cmd])
30+
i2c.write(_ADDR, reg_buf+cmd)
31+
32+
# t is between 1 and 4
33+
def read_touch(t):
34+
return struct.unpack(">H", _read(0x0F, 0x10+_TOUCHES[t-1], 2))[0]
35+
36+
def pwm_write(pwm, val):
37+
pwm_buf[0] = _PWMS.index(pwm)
38+
pwm_buf[1] = val >> 8
39+
pwm_buf[2] = val & 0xFF
40+
_write(0x08, 0x01, pwm_buf)
41+
42+
def set_pwmfreq(pwm, freq):
43+
pwm_buf[0] = _PWMS.index(pwm)
44+
pwm_buf[1] = freq >> 8
45+
pwm_buf[2] = freq & 0xFF
46+
_write(0x08, 0x02, pwm_buf)
47+
48+
# signal is between 1 and 8
49+
def analog_read(signal):
50+
return struct.unpack(">H", _read(0x09, 0x07+signal-1, 2))[0]
51+
52+
def pin_config(pin, mode, pull=None, val=None):
53+
if pin >= 32:
54+
cmd = struct.pack(">I", 1 << (pin - 32))
55+
cmd = bytearray(4) + cmd
56+
else:
57+
cmd = struct.pack(">I", 1 << pin)
58+
if 0 <= mode <= 1:
59+
_write(0x01, 0x03-mode, cmd)
60+
if pull is not None and 0 <= pull <= 1:
61+
_write(0x01, 0x0C-pull, cmd)
62+
if val is not None and 0 <= val <= 1:
63+
_write(0x01, 0x06-val, cmd)
64+
65+
66+
def init():
67+
i2c.init()
68+
while not _ADDR in i2c.scan():
69+
print("Crickit not found!")
70+
time.sleep(1)
71+
reg_buf[0] = 0x7F
72+
reg_buf[1] = 0xFF
73+
i2c.write(_ADDR, reg_buf)
74+
75+
# s is between 1 and 4
76+
def servo(s, degree, min=1.0, max=2.0):
77+
set_pwmfreq(_SERVOS[s-1], 50)
78+
val = 3276*min + (max-min)*3276*degree/180
79+
pwm_write(_SERVOS[s-1], int(val))
80+
81+
# d is between 1 and 4
82+
def drive(d, frac, freq=1000):
83+
set_pwmfreq(_DRIVES[d-1], freq)
84+
pwm_write(_DRIVES[d-1], int(frac*65535))
85+
86+
# m is 1 or 2
87+
def motor(m, frac, freq=1000):
88+
m -= 1 # start with 1
89+
pin1,pin2 = _MOTORS[m*2:m*2+2]
90+
set_pwmfreq(pin1, freq)
91+
set_pwmfreq(pin2, freq)
92+
if frac < 0:
93+
pin1, pin2 = pin2, pin1
94+
pwm_write(pin1, 0)
95+
pwm_write(pin2, abs(int(frac*65535)))
96+
97+
# signal is between 1 and 8, val is 0 or 1
98+
def write_digital(signal, val):
99+
pin_config(_SIGNALS[signal-1], 1, 0, val) # output, pullup, value
100+
101+
# signal is between 1 and 8
102+
def read_digital(signal):
103+
pin = _SIGNALS[signal-1]
104+
pin_config(pin, 0, 1, 1) # input, pullup, pullvalue
105+
ret = _read(0x01, 0x04, 8)
106+
b = 0
107+
if pin > 32:
108+
b = 4
109+
pin -= 32
110+
b += 3 - (pin // 8)
111+
return (ret[b] & 1<<(pin % 8)) != 0

0 commit comments

Comments
 (0)