Created
February 12, 2021 10:00
-
-
Save idriszmy/637a422f1f34a5ee9d2d1f3f614cd7db to your computer and use it in GitHub Desktop.
Keyboard Emulator Using Raspberry Pi Pico (Maker Pi Pico) and CircuitPython
This file contains hidden or 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
# | |
# Keyboard Emulator Using Maker Pi Pico and CircuitPython | |
# | |
# References and credit to | |
# - https://learn.adafruit.com/circuitpython-essentials/circuitpython-hid-keyboard-and-mouse | |
# | |
# Raspberry Pi Pico | |
# - [Maker Pi Pico] https://my.cytron.io/p-maker-pi-pico?tracking=idris | |
# | |
# Additional Libraries | |
# - adafruit_hid | |
# | |
# Update: | |
# 12 Feb 2021 - Tested with CircuitPython Pico 6.2.0-beta.2 | |
# | |
import time | |
import board | |
import digitalio | |
import usb_hid | |
from adafruit_hid.keyboard import Keyboard | |
from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS | |
from adafruit_hid.keycode import Keycode | |
# A simple neat keyboard demo in CircuitPython | |
# The pins we'll use, each will have an internal pullup | |
keypress_pins = [board.GP20, board.GP21, board.GP22] | |
# Our array of key objects | |
key_pin_array = [] | |
# The Keycode sent for each button, will be paired with a control key | |
keys_pressed = [Keycode.A, "Hello, World!", "https://cytron.io/p-maker-pi-pico\n"] | |
control_key = Keycode.SHIFT | |
# The keyboard object! | |
time.sleep(1) # Sleep for a bit to avoid a race condition on some systems | |
keyboard = Keyboard(usb_hid.devices) | |
keyboard_layout = KeyboardLayoutUS(keyboard) # We're in the US :) | |
# Make all pin objects inputs with pullups | |
for pin in keypress_pins: | |
key_pin = digitalio.DigitalInOut(pin) | |
key_pin.direction = digitalio.Direction.INPUT | |
key_pin.pull = digitalio.Pull.UP | |
key_pin_array.append(key_pin) | |
# For most CircuitPython boards: | |
led = digitalio.DigitalInOut(board.GP28) | |
# For QT Py M0: | |
# led = digitalio.DigitalInOut(board.SCK) | |
led.direction = digitalio.Direction.OUTPUT | |
print("Waiting for key pin...") | |
while True: | |
# Check each pin | |
for key_pin in key_pin_array: | |
if not key_pin.value: # Is it grounded? | |
i = key_pin_array.index(key_pin) | |
print("Pin #{} is grounded.".format(i)) | |
# Turn on the red LED | |
led.value = True | |
while not key_pin.value: | |
pass # Wait for it to be ungrounded! | |
# "Type" the Keycode or string | |
key = keys_pressed[i] # Get the corresponding Keycode or string | |
if isinstance(key, str): # If it's a string... | |
keyboard_layout.write(key) # ...Print the string | |
else: # If it's not a string... | |
keyboard.press(control_key, key) # "Press"... | |
keyboard.release_all() # ..."Release"! | |
# Turn off the red LED | |
led.value = False | |
time.sleep(0.01) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment