双轴摇杆模块(常见于 PS2 手柄摇杆)里装了两个电位器和一个按钮。
[接线图占位,后续添加]
文字说明(具体接法见下方代码注释):
VCC → Pico 3V3GND → Pico GNDVRx → Pico GP26(ADC0,X 轴)VRy → Pico GP27(ADC1,Y 轴)SW → Pico GP14(数字输入,用内部上拉;按下读到 0)# ============ 接线 ============
# 摇杆 VCC → Pico 3V3
# 摇杆 GND → Pico GND
# 摇杆 VRx → Pico GP26(ADC0,X 轴)
# 摇杆 VRy → Pico GP27(ADC1,Y 轴)
# 摇杆 SW → Pico GP14(数字输入,内部上拉;按下读到 0)
# =============================
from machine import ADC, Pin
import time
x = ADC(Pin(26))
y = ADC(Pin(27))
sw = Pin(14, Pin.IN, Pin.PULL_UP) # 内部上拉,按下读到 0
print('读取摇杆...')
while True:
xv = x.read_u16() # 0 ~ 65535
yv = y.read_u16()
pressed = sw.value() == 0 # True 表示被按下
print('X:', xv, 'Y:', yv, '按下:', pressed)
time.sleep_ms(200)
# ============ 接线 ============
# 摇杆 VCC → Pico 3V3,GND → GND
# VRx → GP26,VRy → GP27,SW → GP14(内部上拉)
# =============================
from machine import ADC, Pin
import time
x = ADC(Pin(26))
y = ADC(Pin(27))
sw = Pin(14, Pin.IN, Pin.PULL_UP)
# 每块模块中位值都不一样,启动时先校准"中点"
print('请松开摇杆,校准中...')
cx = 0
cy = 0
for _ in range(10): # 读 10 次求平均作为中点
cx += x.read_u16()
cy += y.read_u16()
time.sleep_ms(20)
cx //= 10
cy //= 10
print('中点 X:', cx, 'Y:', cy)
DEAD = 4000 # 死区:离中点这么近就算"中间",滤掉抖动
print('开始判断方向...')
while True:
xv = x.read_u16()
yv = y.read_u16()
if xv < cx - DEAD:
direction = '左'
elif xv > cx + DEAD:
direction = '右'
elif yv < cy - DEAD:
direction = '上'
elif yv > cy + DEAD:
direction = '下'
else:
direction = '中间'
print('方向:', direction, '按下:', sw.value() == 0)
time.sleep_ms(150)
# ============ 接线 ============
# 摇杆 VCC → Pico 3V3,GND → GND
# VRx → GP26(X 轴,控制亮度),VRy、SW 本示例不接
# LED 正极 → 串联 220Ω 限流电阻 → Pico GP15
# LED 负极 → Pico GND
# =============================
from machine import ADC, Pin, PWM
import time
x = ADC(Pin(26))
led = PWM(Pin(15)) # GP15 输出 PWM 调亮度
led.freq(1000)
print('推动摇杆 X 轴调节 LED 亮度')
while True:
xv = x.read_u16() # 0 ~ 65535
led.duty_u16(xv) # 占空比直接等于 X 值,越往右越亮
time.sleep_ms(50)
想用摇杆控制舵机:舵机需要外接 5V 供电(Pico 的 3V3 带不动),把舵机信号线接 GPIO、舵机 GND 和 Pico GND 共地,再用
machine.Servo或 PWM 输出 50Hz 信号。不要从 Pico 的 3V3 给舵机供电。
DEAD 死区避免"中间"误判成方向3V3;若接了舵机,舵机的 5V 要单独供,且必须和 Pico 共地Q: 读出来的 X/Y 值不动,一直是一个固定数? A: 检查 VRx/VRy 有没有接到 GP26/GP27 这些 ADC 脚;再确认 VCC、GND 接好。
Q: 摇杆放在中间,方向却显示"左"或"右"?
A: 中位值有偏差,先跑进阶示例的校准,或把 DEAD 死区调大一点。
Q: 能同时控制两个东西吗(比如 X 控亮度、Y 控舵机)?
A: 可以,X 和 Y 是独立的 ADC,各自 read_u16() 后分别用即可;舵机记得外接 5V 并共地。