溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MicroPython怎么實現旋轉按鈕控制脫機擺動

發布時間:2022-01-13 11:02:26 來源:億速云 閱讀:191 作者:iii 欄目:互聯網科技
# 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   # 舵機信號線

MicroPython怎么實現旋轉按鈕控制脫機擺動 (圖示:黃色線接信號,紅色接VCC,黑色接GND)


二、MicroPython基礎配置

2.1 固件燒錄

  1. 從MicroPython官網下載對應固件
  2. 使用esptool工具燒錄:
esptool.py --port /dev/ttyUSB0 erase_flash
esptool.py --port /dev/ttyUSB0 write_flash 0x1000 firmware.bin

2.2 必要庫安裝

通過upip安裝旋轉編碼器驅動庫:

import upip
upip.install('micropython-rotary')

三、核心代碼實現

3.1 旋轉編碼器驅動

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

3.2 舵機PWM控制

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)

3.3 按鍵中斷處理

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)

四、系統邏輯整合

4.1 狀態機設計

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)

4.2 主循環實現

import time
import math

system = SwingSystem()

while True:
    system.update()
    time.sleep_ms(20)  # 50Hz更新頻率

五、高級功能擴展

5.1 參數存儲

使用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  # 默認值

5.2 多級速度調節

speed_levels = [1, 3, 5]  # 角度變化步長
current_speed = 0

# 長按切換速度
if btn_pressed_time > 1000:
    current_speed = (current_speed + 1) % len(speed_levels)

六、常見問題解決

6.1 編碼器抖動問題

  1. 硬件方案:增加0.1uF電容濾波
  2. 軟件方案:采用消抖算法
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))

6.2 舵機響應延遲

  • 檢查電源是否充足(建議單獨供電)
  • 降低PWM頻率至50Hz
  • 使用uasyncio實現異步控制

七、完整代碼示例

# 完整實現代碼見附錄
# 項目Github倉庫:https://github.com/example/rotary_servo

結語

本文實現了基于MicroPython的旋轉編碼器控制舵機系統,具有以下特點: - ? 脫機獨立運行 - ? 支持手動/自動雙模式 - ? 可擴展的速度調節 - ? 參數斷電保存

通過這個項目,開發者可以快速掌握: 1. MicroPython硬件交互方法 2. 旋轉編碼器信號處理 3. 舵機精確控制技術 4. 嵌入式狀態機設計

下一步改進方向:增加藍牙/WiFi遠程控制功能,結合PID算法實現更精確的位置控制。 “`

注:實際實現時需要根據具體硬件調整引腳定義,建議在面包板上先完成原型驗證后再制作PCB。完整代碼已托管至Github(見文末鏈接)。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女