/ Pico_RP2040_Mech_Keyboard / code.py
code.py
1 # SPDX-FileCopyrightText: 2021 John Park for Adafruit Industries 2 # SPDX-License-Identifier: MIT 3 # RaspberryPi Pico RP2040 Mechanical Keyboard 4 5 import time 6 import board 7 from digitalio import DigitalInOut, Direction, Pull 8 import usb_hid 9 from adafruit_hid.keyboard import Keyboard 10 from adafruit_hid.keycode import Keycode 11 from adafruit_hid.consumer_control import ConsumerControl 12 from adafruit_hid.consumer_control_code import ConsumerControlCode 13 14 print("---Pico Pad Keyboard---") 15 16 led = DigitalInOut(board.LED) 17 led.direction = Direction.OUTPUT 18 led.value = True 19 20 kbd = Keyboard(usb_hid.devices) 21 cc = ConsumerControl(usb_hid.devices) 22 23 # list of pins to use (skipping GP15 on Pico because it's funky) 24 pins = ( 25 board.GP0, 26 board.GP1, 27 board.GP2, 28 board.GP3, 29 board.GP4, 30 board.GP5, 31 board.GP6, 32 board.GP7, 33 board.GP8, 34 board.GP9, 35 board.GP10, 36 board.GP11, 37 board.GP12, 38 board.GP13, 39 board.GP14, 40 board.GP16, 41 board.GP17, 42 board.GP18, 43 board.GP19, 44 board.GP20, 45 board.GP21, 46 ) 47 48 MEDIA = 1 49 KEY = 2 50 51 keymap = { 52 (0): (KEY, (Keycode.GUI, Keycode.C)), 53 (1): (KEY, (Keycode.GUI, Keycode.V)), 54 (2): (KEY, [Keycode.THREE]), 55 (3): (KEY, [Keycode.FOUR]), 56 (4): (KEY, [Keycode.FIVE]), 57 (5): (MEDIA, ConsumerControlCode.VOLUME_DECREMENT), 58 (6): (MEDIA, ConsumerControlCode.VOLUME_INCREMENT), 59 60 (7): (KEY, [Keycode.R]), 61 (8): (KEY, [Keycode.G]), 62 (9): (KEY, [Keycode.B]), 63 (10): (KEY, [Keycode.UP_ARROW]), 64 (11): (KEY, [Keycode.X]), # plus key 65 (12): (KEY, [Keycode.Y]), 66 (13): (KEY, [Keycode.Z]), 67 68 (14): (KEY, [Keycode.I]), 69 (15): (KEY, [Keycode.O]), 70 (16): (KEY, [Keycode.LEFT_ARROW]), 71 (17): (KEY, [Keycode.DOWN_ARROW]), 72 (18): (KEY, [Keycode.RIGHT_ARROW]), 73 (19): (KEY, [Keycode.ALT]), 74 (20): (KEY, [Keycode.U]), 75 76 } 77 78 switches = [] 79 for i in range(len(pins)): 80 switch = DigitalInOut(pins[i]) 81 switch.direction = Direction.INPUT 82 switch.pull = Pull.UP 83 switches.append(switch) 84 85 86 switch_state = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 87 88 while True: 89 for button in range(21): 90 if switch_state[button] == 0: 91 if not switches[button].value: 92 try: 93 if keymap[button][0] == KEY: 94 kbd.press(*keymap[button][1]) 95 else: 96 cc.send(keymap[button][1]) 97 except ValueError: # deals w six key limit 98 pass 99 switch_state[button] = 1 100 101 if switch_state[button] == 1: 102 if switches[button].value: 103 try: 104 if keymap[button][0] == KEY: 105 kbd.release(*keymap[button][1]) 106 107 except ValueError: 108 pass 109 switch_state[button] = 0 110 111 time.sleep(0.01) # debounce