Simple test¶
Ensure your device works with this simple test.
examples/hid_simpletest.py¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
import time
import board
import digitalio
import usb_hid
from adafruit_hid.mouse import Mouse
mouse = Mouse(usb_hid.devices)
# define buttons. these can be any physical switches/buttons, but the values
# here work out-of-the-box with a CircuitPlayground Express' A and B buttons.
up = digitalio.DigitalInOut(board.D4)
up.direction = digitalio.Direction.INPUT
up.pull = digitalio.Pull.DOWN
down = digitalio.DigitalInOut(board.D5)
down.direction = digitalio.Direction.INPUT
down.pull = digitalio.Pull.DOWN
while True:
# scroll up one unit (varies with host/OS)
if up.value:
mouse.move(wheel=1)
# scroll down one unit (varies with host/OS)
elif down.value:
mouse.move(wheel=-1)
time.sleep(0.1)
|
Keyboard Shortcuts¶
Send ALT+Tab for swapping windows, and CTRL+K for searching in a browser.
examples/hid_keyboard_shortcuts.py¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
import time
import board
import digitalio
import usb_hid
from adafruit_hid.keyboard import Keyboard
from adafruit_hid.keycode import Keycode
kbd = Keyboard(usb_hid.devices)
# define buttons. these can be any physical switches/buttons, but the values
# here work out-of-the-box with a CircuitPlayground Express' A and B buttons.
swap = digitalio.DigitalInOut(board.D4)
swap.direction = digitalio.Direction.INPUT
swap.pull = digitalio.Pull.DOWN
search = digitalio.DigitalInOut(board.D5)
search.direction = digitalio.Direction.INPUT
search.pull = digitalio.Pull.DOWN
while True:
# press ALT+TAB to swap windows
if swap.value:
kbd.send(Keycode.ALT, Keycode.TAB)
# press CTRL+K, which in a web browser will open the search dialog
elif search.value:
kbd.send(Keycode.CONTROL, Keycode.K)
time.sleep(0.1)
|
Simple Gamepad¶
Send gamepad buttons and joystick to the host.
examples/hid_simple_gamepad.py¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | # SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
# You must add a gamepad HID device inside your boot.py file
# in order to use this example.
# See this Learn Guide for details:
# https://learn.adafruit.com/customizing-usb-devices-in-circuitpython/hid-devices#custom-hid-devices-3096614-9
import board
import digitalio
import analogio
import usb_hid
from hid_gamepad import Gamepad
gp = Gamepad(usb_hid.devices)
# Create some buttons. The physical buttons are connected
# to ground on one side and these and these pins on the other.
button_pins = (board.D2, board.D3, board.D4, board.D5)
# Map the buttons to button numbers on the Gamepad.
# gamepad_buttons[i] will send that button number when buttons[i]
# is pushed.
gamepad_buttons = (1, 2, 8, 15)
buttons = [digitalio.DigitalInOut(pin) for pin in button_pins]
for button in buttons:
button.direction = digitalio.Direction.INPUT
button.pull = digitalio.Pull.UP
# Connect an analog two-axis joystick to A4 and A5.
ax = analogio.AnalogIn(board.A4)
ay = analogio.AnalogIn(board.A5)
# Equivalent of Arduino's map() function.
def range_map(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
while True:
# Buttons are grounded when pressed (.value = False).
for i, button in enumerate(buttons):
gamepad_button_num = gamepad_buttons[i]
if button.value:
gp.release_buttons(gamepad_button_num)
print(" release", gamepad_button_num, end="")
else:
gp.press_buttons(gamepad_button_num)
print(" press", gamepad_button_num, end="")
# Convert range[0, 65535] to -127 to 127
gp.move_joysticks(
x=range_map(ax.value, 0, 65535, -127, 127),
y=range_map(ay.value, 0, 65535, -127, 127),
)
print(" x", ax.value, "y", ay.value)
|
HID Joywing¶
Use Joy FeatherWing to drive Gamepad.
examples/hid_joywing_gamepad.py¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | # SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT
# Use Joy FeatherWing to drive Gamepad.
# https://www.adafruit.com/product/3632
# https://learn.adafruit.com/joy-featherwing
# You must add a gamepad HID device inside your boot.py file
# in order to use this example.
# See this Learn Guide for details:
# https://learn.adafruit.com/customizing-usb-devices-in-circuitpython/hid-devices#custom-hid-devices-3096614-9
import time
import board
import busio
from micropython import const
from adafruit_seesaw.seesaw import Seesaw
import usb_hid
from hid_gamepad import Gamepad
def range_map(value, in_min, in_max, out_min, out_max):
return (value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min
BUTTON_RIGHT = const(6)
BUTTON_DOWN = const(7)
BUTTON_LEFT = const(9)
BUTTON_UP = const(10)
BUTTON_SEL = const(14)
button_mask = const(
(1 << BUTTON_RIGHT)
| (1 << BUTTON_DOWN)
| (1 << BUTTON_LEFT)
| (1 << BUTTON_UP)
| (1 << BUTTON_SEL)
)
i2c = busio.I2C(board.SCL, board.SDA)
ss = Seesaw(i2c)
ss.pin_mode_bulk(button_mask, ss.INPUT_PULLUP)
last_game_x = 0
last_game_y = 0
g = Gamepad(usb_hid.devices)
while True:
x = ss.analog_read(2)
y = ss.analog_read(3)
game_x = range_map(x, 0, 1023, -127, 127)
game_y = range_map(y, 0, 1023, -127, 127)
if last_game_x != game_x or last_game_y != game_y:
last_game_x = game_x
last_game_y = game_y
print(game_x, game_y)
g.move_joysticks(x=game_x, y=game_y)
buttons = (BUTTON_RIGHT, BUTTON_DOWN, BUTTON_LEFT, BUTTON_UP, BUTTON_SEL)
button_state = [False] * len(buttons)
for i, button in enumerate(buttons):
buttons = ss.digital_read_bulk(button_mask)
if not (buttons & (1 << button) and not button_state[i]):
g.press_buttons(i + 1)
print("Press", i + 1)
button_state[i] = True
elif button_state[i]:
g.release_buttons(i + 1)
print("Release", i + 1)
button_state[i] = False
time.sleep(0.01)
|
Consumer Control Brightness¶
Send brightness up and down consumer codes to the host.
examples/hid_consumer_control_brightness.py¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # SPDX-FileCopyrightText: 2021 Tim C for Adafruit Industries
# SPDX-License-Identifier: MIT
import time
import board
import digitalio
import usb_hid
from adafruit_hid.consumer_control import ConsumerControl
from adafruit_hid.consumer_control_code import ConsumerControlCode
cc = ConsumerControl(usb_hid.devices)
# define buttons. these can be any physical switches/buttons, but the values
# here work out-of-the-box with a FunHouse UP and DOWN buttons.
button_up = digitalio.DigitalInOut(board.BUTTON_UP)
button_up.switch_to_input(pull=digitalio.Pull.DOWN)
button_down = digitalio.DigitalInOut(board.BUTTON_DOWN)
button_down.switch_to_input(pull=digitalio.Pull.DOWN)
while True:
if button_up.value:
print("Button up pressed!")
# send brightness up button press
cc.send(ConsumerControlCode.BRIGHTNESS_INCREMENT)
if button_down.value:
print("Button down pressed!")
# send brightness down button press
cc.send(ConsumerControlCode.BRIGHTNESS_DECREMENT)
time.sleep(0.1)
|