# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。