# Raspberry Pi Pico Stopmo pad # # Using CircuitPython : https://circuitpython.org/board/raspberry_pi_pico/ # Using Adafruit USB_HID Library : https://github.com/adafruit/Adafruit_CircuitPython_HID/releases # # Buttons default mapping # Red = Del/E # Green = Spacebar/Return # Blue = Right arrow/Up # Yellow = Left arrow/Down # Black = Esc/R # # Switch on : Alt mode # # Forked from # DroneBot Workshop 2021 # https://dronebotworkshop.com import time import board import digitalio import rotaryio import usb_hid # Regular keys from adafruit_hid.keyboard import Keyboard from keyboard_layout_win_fr import KeyboardLayout from keycode_win_fr import Keycode # Rotary encoder setup enc = rotaryio.IncrementalEncoder(board.GP0, board.GP1) last_pos = 0 # Keys sent on rotary encoder rotation rot_right = Keycode.A rot_left = Keycode.Z # When in ALT mode, buttons use an alternative keycode. ALT = False # KB setup keyboard = Keyboard(usb_hid.devices) keyboard_layout = KeyboardLayout(keyboard) # Buttons setup buttons_gpio = { # name GPIO Keycode_1 Keycode_2(ALT mode) State DigitalIO Pull (Switch) "red" : dict(gpio=board.GP18, keycode_1=Keycode.DELETE, keycode_2=Keycode.E, state=False, DIO=None, pullr=digitalio.Pull.DOWN), "green" : dict(gpio=board.GP19, keycode_1=Keycode.SPACEBAR, keycode_2=Keycode.RETURN, state=False, DIO=None, pullr=digitalio.Pull.DOWN), "blue" : dict(gpio=board.GP16, keycode_1=Keycode.RIGHT_ARROW, keycode_2=Keycode.UP_ARROW, state=False, DIO=None, pullr=digitalio.Pull.DOWN), "black" : dict(gpio=board.GP20, keycode_1=Keycode.O, keycode_2=Keycode.R, state=False, DIO=None, pullr=digitalio.Pull.DOWN), "yellow": dict(gpio=board.GP17, keycode_1=Keycode.LEFT_ARROW, keycode_2=Keycode.DOWN_ARROW,state=False, DIO=None, pullr=digitalio.Pull.DOWN), "switch": dict(gpio=board.GP21, keycode_1=None, keycode_2=None, state=False, DIO=None, pullr=digitalio.Pull.DOWN, switch_setup=dict(gpio=board.GP7, state=False, DIO=None)), "fn_1": dict(gpio=board.GP15, keycode_1=Keycode.W, keycode_2=Keycode.X, state=False, DIO=None, pullr=digitalio.Pull.DOWN), "fn_2": dict(gpio=board.GP14, keycode_1=Keycode.L, keycode_2=Keycode.F, state=False, DIO=None, pullr=digitalio.Pull.DOWN), # This one is reversed (True when not pressed) so we need some logic to interpret a HIGH as False "rot": dict(gpio=board.GP6, keycode_1=Keycode.Q, keycode_2=Keycode.S, state=False, DIO=None, pullr=digitalio.Pull.UP, reverse=True), } # GPIO setup for btn in buttons_gpio: buttons_gpio[btn]['DIO'] = digitalio.DigitalInOut(buttons_gpio[btn]['gpio']) buttons_gpio[btn]['DIO'].direction = digitalio.Direction.INPUT buttons_gpio[btn]['DIO'].pull = buttons_gpio[btn]['pullr'] # Switch setup if 'switch_setup' in buttons_gpio[btn]: buttons_gpio[btn]['switch_setup']['DIO'] = digitalio.DigitalInOut(buttons_gpio[btn]['switch_setup']['gpio']) buttons_gpio[btn]['switch_setup']['DIO'].direction = digitalio.Direction.OUTPUT btn_scan_delay = 1.0/200 while True: for btn in buttons_gpio: # Logic for switches that read True when not pressed if 'reverse' in buttons_gpio[btn]: btn_value = not buttons_gpio[btn]['DIO'].value else: btn_value = buttons_gpio[btn]['DIO'].value # If digital input is true and was not pressed previously if btn_value and not buttons_gpio[btn]['state']: if ALT: if buttons_gpio[btn]['keycode_2'] is not None: keyboard.press(buttons_gpio[btn]['keycode_2']) else: if buttons_gpio[btn]['keycode_1'] is not None: keyboard.press(buttons_gpio[btn]['keycode_1']) buttons_gpio[btn]['state'] = True # Turn light on, turn ALT mode on if 'switch_setup' in buttons_gpio[btn]: if not buttons_gpio[btn]['switch_setup']['DIO'].value: buttons_gpio[btn]['switch_setup']['DIO'].value = True ALT = True # If digital input is false and was pressed previously if not btn_value and buttons_gpio[btn]['state']: if ALT: if buttons_gpio[btn]['keycode_2'] is not None: keyboard.release(buttons_gpio[btn]['keycode_2']) else: if buttons_gpio[btn]['keycode_1'] is not None: keyboard.release(buttons_gpio[btn]['keycode_1']) buttons_gpio[btn]['state'] = False # Turn light off, turn ALT mode off if 'switch_setup' in buttons_gpio[btn]: if buttons_gpio[btn]['switch_setup']['DIO'].value: buttons_gpio[btn]['switch_setup']['DIO'].value = False ALT = False pos = enc.position if pos > last_pos: if ALT: keyboard.send(Keycode.LEFT_SHIFT, rot_right) else: keyboard.send(rot_right) elif pos < last_pos: if ALT: keyboard.send(Keycode.LEFT_SHIFT, rot_left) else: keyboard.send(rot_left) last_pos = pos time.sleep(btn_scan_delay)