# MicroPython怎么實現驅動28BYJ-48步進電機
## 引言
28BYJ-48步進電機因其低成本、易用性和較高的扭矩輸出,成為DIY項目和嵌入式系統開發中的熱門選擇。結合MicroPython這一輕量級Python實現,開發者可以快速構建原型并控制硬件設備。本文將詳細介紹如何使用MicroPython驅動28BYJ-48步進電機,涵蓋硬件連接、驅動原理、代碼實現及優化技巧。
---
## 一、28BYJ-48步進電機概述
### 1.1 基本參數
- **類型**:單極5線4相步進電機
- **步距角**:5.625°(64步/轉,帶減速齒輪)
- **減速比**:1:64(實際輸出軸步距角約0.0879°)
- **電壓**:通常5V DC
- **相電阻**:約50Ω
### 1.2 內部結構
電機內部包含一個4相線圈繞組和1個公共端(COM),通過ULN2003驅動板可簡化控制邏輯。
---
## 二、硬件準備與連接
### 2.1 所需組件
| 組件 | 數量 |
|------|------|
| 28BYJ-48電機 + ULN2003驅動板 | 1套 |
| 支持MicroPython的開發板(如ESP32/ESP8266/RP2040) | 1個 |
| 5V電源(或開發板USB供電) | 1個 |
| 杜邦線 | 若干 |
### 2.2 接線示意圖
```python
# ULN2003引腳對應關系
28BYJ-48 ULN2003 MCU GPIO
IN1 IN1 GPIO12
IN2 IN2 GPIO14
IN3 IN3 GPIO27
IN4 IN4 GPIO26
COM +5V 5V電源
注意:若使用ESP32開發板,建議選擇支持PWM的GPIO引腳以便后續優化。
28BYJ-48支持兩種驅動模式: 1. 全步進(Full Step):4步/周期,扭矩大但震動明顯 2. 半步進(Half Step):8步/周期,平滑但扭矩略低
# 全步進序列(4步)
FULL_STEP_SEQ = [
[1, 0, 0, 1], # 相位A+D
[1, 1, 0, 0], # 相位A+B
[0, 1, 1, 0], # 相位B+C
[0, 0, 1, 1] # 相位C+D
]
# 半步進序列(8步)
HALF_STEP_SEQ = [
[1, 0, 0, 0],
[1, 1, 0, 0],
[0, 1, 0, 0],
[0, 1, 1, 0],
[0, 0, 1, 0],
[0, 0, 1, 1],
[0, 0, 0, 1],
[1, 0, 0, 1]
]
from machine import Pin
import time
class Stepper28BYJ48:
def __init__(self, in1, in2, in3, in4, delay=2):
self.pins = [
Pin(in1, Pin.OUT),
Pin(in2, Pin.OUT),
Pin(in3, Pin.OUT),
Pin(in4, Pin.OUT)
]
self.delay_ms = delay # 步間延遲(ms)
self.step_mode = 0 # 0=全步進, 1=半步進
self.step_sequence = [
[[1, 0, 0, 1], [1, 1, 0, 0], [0, 1, 1, 0], [0, 0, 1, 1]], # Full
[[1, 0, 0, 0], [1, 1, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], # Half
[0, 0, 1, 0], [0, 0, 1, 1], [0, 0, 0, 1], [1, 0, 0, 1]]
]
def step(self, steps):
direction = 1 if steps > 0 else -1
steps = abs(steps)
for _ in range(steps):
current_seq = self.step_sequence[self.step_mode]
for phase in current_seq[::direction]:
for i in range(4):
self.pins[i].value(phase[i])
time.sleep_ms(self.delay_ms)
def set_speed(self, rpm):
steps_per_rev = 64 * 64 # 內部64步 × 減速比64
self.delay_ms = int(60000 / (steps_per_rev * rpm))
# 初始化電機(ESP32引腳示例)
motor = Stepper28BYJ48(12, 14, 27, 26)
# 順時針轉1圈(2048步)
motor.step(2048)
# 逆時針轉半圈
motor.step(-1024)
# 設置轉速為10RPM
motor.set_speed(10)
from machine import PWM
class SmoothStepper(Stepper28BYJ48):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.pwm_pins = [PWM(pin, freq=1000) for pin in self.pins]
def step(self, steps):
direction = 1 if steps > 0 else -1
steps = abs(steps)
for _ in range(steps):
current_seq = self.step_sequence[self.step_mode]
for phase in current_seq[::direction]:
for i, duty in enumerate(phase):
self.pwm_pins[i].duty_u16(duty * 65535)
time.sleep_ms(self.delay_ms)
def step_with_accel(self, steps, accel=100):
initial_delay = self.delay_ms
min_delay = max(1, initial_delay - accel)
for step_num in range(abs(steps)):
# 動態計算延遲
if step_num < abs(steps) // 2:
current_delay = max(min_delay,
initial_delay - int(accel * step_num / (steps//2)))
else:
current_delay = min(initial_delay,
min_delay + int(accel * (step_num - steps//2) / (steps//2)))
# 執行單步
self._single_step(direction, current_delay)
motor.release()
def release(self):
for pin in self.pins:
pin.value(0)
通過AS5600等磁編碼器實現位置反饋:
from machine import I2C
import as5600
i2c = I2C(0)
encoder = as5600.AS5600(i2c)
while True:
target_pos = 180 # 目標角度
current_pos = encoder.get_angle()
steps_needed = int((target_pos - current_pos) * 11.377) # 角度→步數轉換
motor.step(steps_needed)
使用_thread
模塊實現多線程控制:
import _thread
def motor_task(motor, steps):
motor.step(steps)
_thread.start_new_thread(motor_task, (motor1, 1024))
_thread.start_new_thread(motor_task, (motor2, -512))
通過MicroPython驅動28BYJ-48步進電機,開發者可以快速驗證運動控制方案。本文從硬件連接到高級優化提供了完整解決方案,實際項目中可根據需求調整步進模式、加減速曲線等參數。這種組合特別適合需要快速迭代的物聯網設備和教育類機器人項目。
資源推薦: - MicroPython官方文檔 - 28BYJ-48電機詳細規格書 - ULN2003驅動原理分析 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。