Created
January 23, 2021 11:23
-
-
Save sandyjmacdonald/b465377dc11a8c83a8c40d1c9b990a90 to your computer and use it in GitHub Desktop.
Emergency cat GIF macro example for Pimoroni RGB Keypad for Raspberry Pi Pico
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
import board | |
import busio | |
import usb_hid | |
from adafruit_bus_device.i2c_device import I2CDevice | |
import adafruit_dotstar | |
from adafruit_hid.keyboard import Keyboard | |
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS | |
from adafruit_hid.keycode import Keycode | |
from adafruit_hid.consumer_control import ConsumerControl | |
from adafruit_hid.consumer_control_code import ConsumerControlCode | |
from digitalio import DigitalInOut, Direction, Pull | |
# Emergency cat GIF example for Pimoroni RGB Keypad for Raspberry Pi Pico | |
# Prerequisites | |
# | |
# Requires Adafruit CircuitPython: https://learn.adafruit.com/getting-started-with-raspberry-pi-pico-circuitpython | |
# | |
# Also requires the following CircuitPython libs: adafruit_hid, adafruit_bus_device, adafruit_dotstar | |
# (drop them into the lib folder) | |
# | |
# Save this code in code.py on your Raspberry Pi Pico CIRCUITPY drive | |
# | |
# Note that this example is specific for macOS and uses button 0 to trigger the macro. | |
# Pull CS pin low to enable level shifter | |
cs = DigitalInOut(board.GP17) | |
cs.direction = Direction.OUTPUT | |
cs.value = 0 | |
# Set up APA102 pixels | |
num_pixels = 16 | |
pixels = adafruit_dotstar.DotStar(board.GP18, board.GP19, num_pixels, brightness=0.1, auto_write=True) | |
# Set up I2C for IO expander (addr: 0x20) | |
i2c = busio.I2C(board.GP5, board.GP4) | |
device = I2CDevice(i2c, 0x20) | |
# Set up the keyboard | |
kbd = Keyboard(usb_hid.devices) | |
layout = KeyboardLayoutUS(kbd) | |
# Function to map 0-255 to position on colour wheel | |
def colourwheel(pos): | |
if pos < 0 or pos > 255: | |
return (0, 0, 0) | |
if pos < 85: | |
return (255 - pos * 3, pos * 3, 0) | |
if pos < 170: | |
pos -= 85 | |
return (0, 255 - pos * 3, pos * 3) | |
pos -= 170 | |
return (pos * 3, 0, 255 - pos * 3) | |
# Read button states from the I2C IO expander on the keypad | |
def read_button_states(x, y): | |
pressed = [0] * 16 | |
with device: | |
# Read from IO expander, 2 bytes (8 bits) correspond to the 16 buttons | |
device.write(bytes([0x0])) | |
result = bytearray(2) | |
device.readinto(result) | |
b = result[0] | result[1] << 8 | |
# Loop through the buttons | |
for i in range(x, y): | |
if not (1 << i) & b: | |
pressed[i] = 1 | |
else: | |
pressed[i] = 0 | |
return pressed | |
# List to store the button states | |
held = [0] * 16 | |
# Keep reading button states, setting pixels | |
while True: | |
pressed = read_button_states(0, 16) | |
if pressed[0]: | |
pixels[0] = colourwheel(0 * 16) # Map pixel index to 0-255 range | |
if not held[0]: | |
# Trigger Spotlight search | |
kbd.send(Keycode.COMMAND, Keycode.SPACE) | |
time.sleep(0.2) | |
# Open Safari | |
layout.write("safari") | |
time.sleep(0.1) | |
kbd.send(Keycode.ENTER) | |
time.sleep(0.5) | |
# Focus on search bar | |
kbd.send(Keycode.COMMAND, Keycode.L) | |
time.sleep(0.1) | |
# Go to giphy car GIF URL | |
layout.write("https://giphy.com/explore/cat") | |
time.sleep(0.2) | |
kbd.send(Keycode.ENTER) | |
# Update held state to prevent retriggering | |
held[0] = 1 | |
else: # Released state | |
pixels[0] = (0, 0, 0) # Turn pixel off | |
held[0] = 0 # Set held state to off |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@sandyjmacdonald I'm getting the error
SDA or SCL needs a pull up
on line 43Anything I'm missing? I'm using the latest circuitpython and added the adafruit libraries to the lib folder.