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".
In the example below, click the Download Project Bundle button below to download the necessary libraries and the code.py file in a zip file. Extract the contents of the zip file, open the directory and then click on the directory that matches the version of CircuitPython you're using and copy the contents of that directory to your CIRCUITPY drive.
Your CIRCUITPY drive should now look similar to the following image:
# 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.
Text editor powered by tinymce.