Last active
January 11, 2024 19:23
-
-
Save maxmacstn/805991009e9302977f694e5b17a62b73 to your computer and use it in GitHub Desktop.
Raspberry Pi Pico - CircuitPython volume knob
This file contains 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
import digitalio | |
import board | |
import usb_hid | |
import time | |
from adafruit_hid.keyboard import Keyboard | |
from adafruit_hid.mouse import Mouse | |
from adafruit_hid.keycode import Keycode | |
from adafruit_hid.consumer_control import ConsumerControl | |
from adafruit_hid.consumer_control_code import ConsumerControlCode | |
print("== Pi Pico multifunction knob 1.0 ==") | |
CLK_PIN = board.GP4 | |
DT_PIN = board.GP3 | |
SW_PIN = board.GP2 | |
clk_last = None | |
count = 0 | |
totalMode = 3 | |
currentMode = 0 | |
cc = ConsumerControl(usb_hid.devices) | |
mouse = Mouse(usb_hid.devices) | |
keyboard = Keyboard(usb_hid.devices) | |
clk = digitalio.DigitalInOut(CLK_PIN) | |
clk.direction = digitalio.Direction.INPUT | |
dt = digitalio.DigitalInOut(DT_PIN) | |
dt.direction = digitalio.Direction.INPUT | |
sw = digitalio.DigitalInOut(SW_PIN) | |
sw.direction = digitalio.Direction.INPUT | |
sw.pull = digitalio.Pull.UP | |
def millis(): | |
return time.monotonic() * 1000 | |
def ccw(): | |
print("CCW") | |
if (currentMode == 0): # Mac brightness down | |
keyboard.send(Keycode.SCROLL_LOCK) | |
elif(currentMode ==1): # Mac horizontal scroll right | |
keyboard.press(Keycode.SHIFT) | |
mouse.move(wheel=-1) | |
keyboard.release(Keycode.SHIFT) | |
elif(currentMode == 2): # Volume decrement | |
cc.send(ConsumerControlCode.VOLUME_DECREMENT) | |
def cw(): | |
print("CW") | |
if (currentMode == 0): # Mac brightness up | |
keyboard.send(Keycode.PAUSE) | |
elif(currentMode ==1): # Mac horizontal scroll left | |
keyboard.press(Keycode.SHIFT) | |
mouse.move(wheel=1) | |
keyboard.release(Keycode.SHIFT) | |
elif(currentMode == 2): # Volume increment | |
cc.send(ConsumerControlCode.VOLUME_INCREMENT) | |
def long_press(): | |
#Mac sleep: CMD + OPT + EJECT | |
keyboard.press(Keycode.ALT, Keycode.COMMAND) | |
cc.send(ConsumerControlCode.EJECT) | |
keyboard.release_all() | |
while(1): | |
clkState = clk.value | |
if(clk_last != clkState): | |
if(dt.value != clkState): | |
cw() | |
else: | |
ccw() | |
if (sw.value == 0): | |
pressTime = millis() | |
time.sleep(0.2) | |
longPress = False | |
while(sw.value == 0): | |
if(millis() - pressTime > 1000 and not longPress): | |
print("longPress") | |
longPress = True | |
long_press() | |
if (not longPress): | |
currentMode += 1 | |
currentMode %= totalMode | |
print("Mode: " + str(currentMode)) | |
clk_last = clkState | |
If anyone is interested, I've made some improvements to the code, for example fixing the problem that the knob sometimes stops working. Xitee1/multimedia-knob
Thanks!
got error Traceback (most recent call last):
File "", line 5, in
ImportError: no module named 'adafruit_hid'
got error Traceback (most recent call last): File "", line 5, in ImportError: no module named 'adafruit_hid'
You haven't copied the adafruit_hid library to the pico. Follow the instructions carefully. Check out my version of the knob (comment above). There you can download and extract the library from if you can't find it online.
thanks will try...just starting here ; - )
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
If anyone is interested, I've made some improvements to the code, for example fixing the problem that the knob sometimes stops working. Xitee1/multimedia-knob