您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# MicroPython怎么实现旋转按钮控制脱机摆动
## 引言
在嵌入式开发领域,MicroPython因其简洁的语法和强大的硬件交互能力,成为快速原型开发的利器。本文将详细介绍如何利用旋转编码器(旋转按钮)作为输入设备,通过MicroPython控制舵机实现脱机摆动系统。该系统无需连接上位机即可独立运行,适用于机器人关节控制、智能家居调节等场景。
---
## 一、硬件准备
### 1.1 核心组件清单
| 组件 | 型号 | 数量 | 备注 |
|------|------|------|------|
| 主控板 | ESP32/STM32 | 1 | 需支持MicroPython固件 |
| 旋转编码器 | EC11 | 1 | 带按键功能 |
| 舵机 | SG90 | 1 | 180度标准舵机 |
| 杜邦线 | - | 若干 | 建议使用母对母线 |
### 1.2 电路连接示意图
```python
# 引脚定义(以ESP32为例)
ROTARY_CLK = 25 # 编码器CLK引脚
ROTARY_DT = 26 # 编码器DT引脚
ROTARY_SW = 27 # 编码器按键引脚
SERVO_PIN = 14 # 舵机信号线
(图示:黄色线接信号,红色接VCC,黑色接GND)
esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --port /dev/ttyUSB0 write_flash 0x1000 firmware.bin
通过upip安装旋转编码器驱动库:
import upip
upip.install('micropython-rotary')
from rotary_irq_esp import RotaryIRQ
# 初始化编码器
r = RotaryIRQ(
pin_num_clk=ROTARY_CLK,
pin_num_dt=ROTARY_DT,
min_val=0,
max_val=180,
reverse=False,
range_mode=RotaryIRQ.RANGE_BOUNDED
)
last_val = r.value()
while True:
val = r.value()
if last_val != val:
print('旋转值:', val)
last_val = val
from machine import Pin, PWM
# 初始化PWM
servo = PWM(Pin(SERVO_PIN), freq=50)
def set_servo_angle(angle):
duty = int(40 + (angle / 180) * 115)
servo.duty(duty)
from machine import Pin
btn = Pin(ROTARY_SW, Pin.IN, Pin.PULL_UP)
def btn_callback(p):
print("按键触发!切换摆动模式")
btn.irq(trigger=Pin.IRQ_FALLING, handler=btn_callback)
class SwingSystem:
def __init__(self):
self.mode = 0 # 0:手动 1:自动摆动
self.angle = 90
def update(self):
if self.mode == 0:
# 手动模式读取编码器
self.angle = r.value()
else:
# 自动模式正弦摆动
self.angle = 90 + 45 * math.sin(time.ticks_ms()/1000)
set_servo_angle(self.angle)
import time
import math
system = SwingSystem()
while True:
system.update()
time.sleep_ms(20) # 50Hz更新频率
使用ESP32的Flash存储关键参数:
import ujson
import uos
def save_config(angle):
with open('config.json', 'w') as f:
ujson.dump({'last_angle': angle}, f)
def load_config():
try:
with open('config.json') as f:
return ujson.load(f)['last_angle']
except:
return 90 # 默认值
speed_levels = [1, 3, 5] # 角度变化步长
current_speed = 0
# 长按切换速度
if btn_pressed_time > 1000:
current_speed = (current_speed + 1) % len(speed_levels)
from machine import Timer
debounce_timer = Timer(-1)
debounce_flag = False
def debounce(p):
global debounce_flag
debounce_flag = True
debounce_timer.init(mode=Timer.ONE_SHOT, period=50, callback=lambda t: set_flag(False))
uasyncio
实现异步控制# 完整实现代码见附录
# 项目Github仓库:https://github.com/example/rotary_servo
本文实现了基于MicroPython的旋转编码器控制舵机系统,具有以下特点: - ✅ 脱机独立运行 - ✅ 支持手动/自动双模式 - ✅ 可扩展的速度调节 - ✅ 参数断电保存
通过这个项目,开发者可以快速掌握: 1. MicroPython硬件交互方法 2. 旋转编码器信号处理 3. 舵机精确控制技术 4. 嵌入式状态机设计
下一步改进方向:增加蓝牙/WiFi远程控制功能,结合PID算法实现更精确的位置控制。 “`
注:实际实现时需要根据具体硬件调整引脚定义,建议在面包板上先完成原型验证后再制作PCB。完整代码已托管至Github(见文末链接)。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。