To use the CRICKIT with MicroPython, you will need the Adafruit seesaw.py driver code loaded onto the board in addition to your user program named main.py.
The seesaw driver code is below. You can use the Download function to put it on your computer. The best location to download seesaw.py depends on your operating system.
Place the file seesaw.py into your mu_code
folder, which might be in:
- C:\Users\YourUserName\mu_code on Windows
- /Users/YourUserName/mu_code on macOS
Putting it in the mu_code folder makes it much easier to copy the files onto the micro:bit on the next page.
# SPDX-FileCopyrightText: 2019 Limor Fried for Adafruit Industries # # SPDX-License-Identifier: MIT # Adafruit Seesaw / CRICKIT driver for MicroPython # MIT License by Adafruit Industries Limor Fried # Copy onto the micro:bit with main.py using Mu Files icon from microbit import i2c import struct import time _SIGNALS = (2, 3, 40, 41, 11, 10, 9, 8) _PWMS = (14, 15, 16, 17, 19, 18, 22, 23, 42, 43, 12, 13) _SERVOS = (17, 16, 15, 14) _MOTORS = (22, 23, 19, 18) _DRIVES = (13, 12, 43, 42) _TOUCHES = (0, 1, 2, 3) _ADDR = 0x49 reg_buf = bytearray(2) pwm_buf = bytearray(3) def _read(reghi, reglo, n, delay_s=0.01): reg_buf[0] = reghi reg_buf[1] = reglo i2c.write(_ADDR, reg_buf) time.sleep(delay_s) return i2c.read(_ADDR, n) def _write(reghi, reglo, cmd): reg_buf[0] = reghi reg_buf[1] = reglo #print("sswrite: ", [hex(i) for i in reg_buf+cmd]) i2c.write(_ADDR, reg_buf+cmd) # t is between 1 and 4 def read_touch(t): return struct.unpack(">H", _read(0x0F, 0x10+_TOUCHES[t-1], 2))[0] def pwm_write(pwm, val): pwm_buf[0] = _PWMS.index(pwm) pwm_buf[1] = val >> 8 pwm_buf[2] = val & 0xFF _write(0x08, 0x01, pwm_buf) def set_pwmfreq(pwm, freq): pwm_buf[0] = _PWMS.index(pwm) pwm_buf[1] = freq >> 8 pwm_buf[2] = freq & 0xFF _write(0x08, 0x02, pwm_buf) # signal is between 1 and 8 def analog_read(signal): return struct.unpack(">H", _read(0x09, 0x07+signal-1, 2))[0] def pin_config(pin, mode, pull=None, val=None): if pin >= 32: cmd = struct.pack(">I", 1 << (pin - 32)) cmd = bytearray(4) + cmd else: cmd = struct.pack(">I", 1 << pin) if 0 <= mode <= 1: _write(0x01, 0x03-mode, cmd) if pull is not None and 0 <= pull <= 1: _write(0x01, 0x0C-pull, cmd) if val is not None and 0 <= val <= 1: _write(0x01, 0x06-val, cmd) def init(): i2c.init() while not _ADDR in i2c.scan(): print("Crickit not found!") time.sleep(1) reg_buf[0] = 0x7F reg_buf[1] = 0xFF i2c.write(_ADDR, reg_buf) # s is between 1 and 4 def servo(s, degree, min=1.0, max=2.0): set_pwmfreq(_SERVOS[s-1], 50) val = 3276*min + (max-min)*3276*degree/180 pwm_write(_SERVOS[s-1], int(val)) # d is between 1 and 4 def drive(d, frac, freq=1000): set_pwmfreq(_DRIVES[d-1], freq) pwm_write(_DRIVES[d-1], int(frac*65535)) # m is 1 or 2 def motor(m, frac, freq=1000): m -= 1 # start with 1 pin1,pin2 = _MOTORS[m*2:m*2+2] set_pwmfreq(pin1, freq) set_pwmfreq(pin2, freq) if frac < 0: pin1, pin2 = pin2, pin1 pwm_write(pin1, 0) pwm_write(pin2, abs(int(frac*65535))) # signal is between 1 and 8, val is 0 or 1 def write_digital(signal, val): pin_config(_SIGNALS[signal-1], 1, 0, val) # output, pullup, value # signal is between 1 and 8 def read_digital(signal): pin = _SIGNALS[signal-1] pin_config(pin, 0, 1, 1) # input, pullup, pullvalue ret = _read(0x01, 0x04, 8) b = 0 if pin > 32: b = 4 pin -= 32 b += 3 - (pin // 8) return (ret[b] & 1<<(pin % 8)) != 0
Page last edited January 22, 2025
Text editor powered by tinymce.