One of the things we baked into CircuitPython is 'HID' control - Keyboard and Mouse capabilities. This means a Circuit Playground Express can act like a keyboard device and press keys, or a mouse and have it move the mouse around and press buttons. This is really handy because even if you cannot adapt your software to work with hardware, there's almost always a keyboard interface - so if you want to have a capacitive touch interface for a game, say, then keyboard emulation can often get you going really fast!
Then try running this example code which will set the Circuit Playground Express Button_A and Button_B as HID keyboard "keys".
# SPDX-FileCopyrightText: 2017 Limor Fried for Adafruit Industries # # SPDX-License-Identifier: MIT # Circuit Playground HID Keyboard import time import board import usb_hid from adafruit_hid.keyboard import Keyboard from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS from adafruit_hid.keycode import Keycode from digitalio import DigitalInOut, Direction, Pull # A simple neat keyboard demo in CircuitPython # The button pins we'll use, each will have an internal pulldown buttonpins = [board.BUTTON_A, board.BUTTON_B] # our array of button objects buttons = [] # The keycode sent for each button, will be paired with a control key buttonkeys = [Keycode.A, "Hello World!\n"] controlkey = Keycode.SHIFT # the keyboard object! # sleep for a bit to avoid a race condition on some systems time.sleep(1) kbd = Keyboard(usb_hid.devices) # we're americans :) layout = KeyboardLayoutUS(kbd) # make all pin objects, make them inputs with pulldowns for pin in buttonpins: button = DigitalInOut(pin) button.direction = Direction.INPUT button.pull = Pull.DOWN buttons.append(button) led = DigitalInOut(board.D13) led.direction = Direction.OUTPUT print("Waiting for button presses") while True: # check each button # when pressed, the LED will light up, # when released, the keycode or string will be sent # this prevents rapid-fire repeats! for button in buttons: if button.value: # pressed? i = buttons.index(button) print("Button #%d Pressed" % i) # turn on the LED led.value = True while button.value: pass # wait for it to be released! # type the keycode or string k = buttonkeys[i] # get the corresponding keycode or string if isinstance(k, str): layout.write(k) else: kbd.press(controlkey, k) # press... kbd.release_all() # release! # turn off the LED led.value = False time.sleep(0.01)
Press Button A or Button B to have the keypresses sent.
The Keyboard and Layout object are created, we only have US right now (if you make other layouts please submit a GitHub pull request!)
# the keyboard object!
kbd = Keyboard(usb_hid.devices)
# we're americans :)
layout = KeyboardLayoutUS(kbd)
Then you can send key-down's with kbd.press(keycode, ...)
You can have up to 6 keycode presses at once. Note that these are keycodes so if you want to send a capital A, you need both SHIFT and A. Don't forget to call kbd.release_all()
soon after or you'll have a stuck key which is really annoying!
You can also send full strings, with layout.write("Hello World!\n")
- it will use the layout to determine the keycodes to press.