標(biāo)題: 樹莓派RP2350實(shí)現(xiàn)步進(jìn)電機(jī)精確控制 [打印本頁]
作者: lijinlei 時(shí)間: 2025-5-3 14:51
標(biāo)題: 樹莓派RP2350實(shí)現(xiàn)步進(jìn)電機(jī)精確控制
本文介紹了 樹莓派 RP2350 開發(fā)板實(shí)現(xiàn)步進(jìn)電機(jī)驅(qū)動(dòng)的項(xiàng)目設(shè)計(jì),主要包括旋轉(zhuǎn)角度的精確控制、串口發(fā)送實(shí)現(xiàn)自定義角度旋轉(zhuǎn)、OLED 顯示旋轉(zhuǎn)狀態(tài)三部分。
擴(kuò)展板PCB工程詳見:Beetle-RP2350擴(kuò)展板 - 立創(chuàng)開源硬件平臺(tái)oshwhubcom/lijinlei0907/beetle-rp2350-expansion-board
項(xiàng)目介紹
包括步進(jìn)電機(jī)原理、該項(xiàng)目使用的 28BYJ-48 步進(jìn)電機(jī),及其驅(qū)動(dòng)器——ULN2003 驅(qū)動(dòng)模塊介紹。
步進(jìn)電機(jī)原理
步進(jìn)電機(jī)(Stepper Motor)是一種將電脈沖信號(hào)轉(zhuǎn)換為精確角度位移的執(zhí)行器件,屬于開環(huán)控制電機(jī)。
核心特點(diǎn):每接收一個(gè)脈沖,轉(zhuǎn)子就轉(zhuǎn)動(dòng)一個(gè)固定的角度(稱為“步距角”),無需反饋傳感器即可實(shí)現(xiàn)位置控制。
step-motors.jpg (94.92 KB, 下載次數(shù): 0)
下載附件
2025-5-3 14:52 上傳
結(jié)構(gòu)組成
定子:繞有線圈的磁極,分為多相(常見2相、4相、5相)。
轉(zhuǎn)子:永磁體(永磁式)或齒狀鐵芯(反應(yīng)式/混合式)。
定子繞組按特定順序通電,產(chǎn)生旋轉(zhuǎn)磁場(chǎng),吸引轉(zhuǎn)子逐步轉(zhuǎn)動(dòng)。
工作過程
28BYJ-48 步進(jìn)電機(jī)
28BYJ-48 是一款常見的低成本、小扭矩 5 線單極步進(jìn)電機(jī),可使用 ULN2003 控制器和單片機(jī)實(shí)現(xiàn)旋轉(zhuǎn)控制,廣泛用于打印機(jī)、掃描儀、攝像機(jī)云臺(tái)、空調(diào)、家電、玩具、消費(fèi)電子等領(lǐng)域。
28BYJ-48-group.jpg (32.96 KB, 下載次數(shù): 0)
下載附件
2025-5-3 14:53 上傳
參數(shù) | 值/描述 |
電機(jī)類型 | 單極 4 相永磁式步進(jìn)電機(jī)(5線制) |
步距角 | 5.625°(64 步/圈),配合減速齒輪后 0.0879°(實(shí)際輸出軸 4096 步/圈) |
減速比 | 1:64(內(nèi)部齒輪組減速) |
額定電壓 | 5V 或 12V DC |
相電流 | 約 100mA(每相) |
保持扭矩 | 約 0.1 N·m(輸出軸,受減速齒輪影響) |
繞組電阻 | 約 50Ω/相 |
實(shí)際輸出軸步距角為 5.625°/64 ≈ 0.0879°,轉(zhuǎn)一圈理論上需要 64×64=4096 步,實(shí)際可能存在誤差。
ULN2003 驅(qū)動(dòng)器
ULN2003 是一款常用的達(dá)林頓晶體管陣列芯片,專為驅(qū)動(dòng)高電流負(fù)載(如繼電器、步進(jìn)電機(jī)、LED陣列等)設(shè)計(jì)。其作用是將 MCU 輸出的弱電流信號(hào)轉(zhuǎn)換為大電流輸出,是控制 28BYJ-48 步進(jìn)電機(jī)的核心驅(qū)動(dòng)芯片。
ULN2003_module_large.jpg (65.73 KB, 下載次數(shù): 0)
下載附件
2025-5-3 14:52 上傳
原理圖
SCH_ULN2003_module.jpg (86.98 KB, 下載次數(shù): 0)
下載附件
2025-5-3 14:48 上傳
使用時(shí)需要將 28BYJ-48 步進(jìn)電機(jī)的5線快接插頭與 ULN2003 模塊對(duì)應(yīng)接口連接,并將模塊的 4 個(gè)控制引腳(信號(hào)輸入端,絲印 IN1、IN2、IN3、IN4)與單片機(jī)對(duì)應(yīng)引腳相連,實(shí)現(xiàn)控制信號(hào)輸入。
詳見:
uln2003a.pdf
(2.04 MB, 下載次數(shù): 0)
2025-5-3 15:49 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
項(xiàng)目方案
具體執(zhí)行方案和工程測(cè)試流程如下
旋轉(zhuǎn)指定角度
本節(jié)介紹并實(shí)現(xiàn)了指定角度的步進(jìn)電機(jī)旋轉(zhuǎn)控制。
硬件連接
- GP0 ---- IN1 (ULN2003)
- GP1 ---- IN2 (ULN2003)
- GP18 ---- IN3 (ULN2003)
- GP19 ---- IN4 (ULN2003)
step-moter-board-connect.jpg (68.92 KB, 下載次數(shù): 0)
下載附件
2025-5-3 14:49 上傳
代碼
- '''
- Name: Stepper Motor driven by ULN2003
- Version: v1.0
- Date: 2025.05
- Author: ljl
- Other: Rotate stepper motor (28byj-48) for custom angle.
- Hardware connect:
- 0 ---- IN1 (ULN2003)
- 1 ---- IN2 (ULN2003)
- 18 ---- IN3 (ULN2003)
- 19 ---- IN4 (ULN2003)
- '''
-
- from machine import Pin
- import utime
-
- # 電機(jī)控制引腳
- coils = [
- Pin(0, Pin.OUT), # A相 (IN1)
- Pin(1, Pin.OUT), # B相 (IN2)
- Pin(18, Pin.OUT), # C相 (IN3)
- Pin(19, Pin.OUT) # D相 (IN4)
- ]
-
- # 四相八拍步進(jìn)電機(jī)的順序值
- STEP_SEQ = [
- [1, 0, 0, 1], # AB'
- [1, 0, 0, 0], # A
- [1, 1, 0, 0], # AB
- [0, 1, 0, 0], # B
- [0, 1, 1, 0], # BC
- [0, 0, 1, 0], # C
- [0, 0, 1, 1], # CD
- [0, 0, 0, 1] # D
- ]
-
- '''
- 驅(qū)動(dòng)電機(jī)旋轉(zhuǎn)指定步數(shù)
- :param steps: 正數(shù)=順時(shí)針,負(fù)數(shù)=逆時(shí)針
- :param delay_ms: 步間延時(shí)(ms),控制轉(zhuǎn)速
- '''
- def step_motor(steps, delay_ms=1):
- direction = 1 if steps >=0 else -1
- for _ in range(abs(steps)):
- for phase in range(8)[::direction]: # 方向控制
- for coil, state in zip(coils, STEP_SEQ[phase]):
- coil.value(state)
- utime.sleep_ms(delay_ms)
-
- # 旋轉(zhuǎn)角度控制
- def rotate_angle(angle):
- steps_per_rev = 509
- steps = int(angle * (steps_per_rev / 360))
- step_motor(steps)
-
- # 釋放電機(jī)扭矩
- def release():
- for coil in coils:
- coil.value(0)
-
- while True:
- #rotate_angle(1) # 以單步方式持續(xù)轉(zhuǎn)動(dòng)
- rotate_angle(180) # 逆時(shí)針
- release()
- utime.sleep_ms(2000)
- rotate_angle(-90) # 順時(shí)針
- release()
- utime.sleep_ms(2000)
復(fù)制代碼
效果
step-motor-power-moving.gif (2.29 MB, 下載次數(shù): 0)
下載附件
2025-5-3 14:54 上傳
由供電處的電壓-電流計(jì)量工具可知,步進(jìn)電機(jī)旋轉(zhuǎn)工作時(shí)的功率約為 1W
串口自定義角度
在實(shí)現(xiàn)步進(jìn)電機(jī)旋轉(zhuǎn)驅(qū)動(dòng)的基礎(chǔ)上,進(jìn)一步實(shí)現(xiàn)串口發(fā)送自定義角度并旋轉(zhuǎn)的功能設(shè)計(jì)方案。
硬件連接- GP0 ---- IN1 (ULN2003)
- GP1 ---- IN2 (ULN2003)
- GP4 ---- IN3 (ULN2003)
- GP5 ---- IN4 (ULN2003)
- GP8 ---- RXD (CH340)
- GP9 ---- TXD (CH340)
USB2TTL-step-motor-uln2003-connect.jpg (62.63 KB, 下載次數(shù): 0)
下載附件
2025-5-3 14:49 上傳
代碼
- '''
- Name: Stepper Motor rotate custom angle from serial
- Version: v1.0
- Date: 2025.05
- Author: ljl
- Other: Rotate stepper motor (28byj-48) for custom angle from UART.
- Hardware connect:
- 0 ---- IN1 (ULN2003)
- 1 ---- IN2 (ULN2003)
- 4 ---- IN3 (ULN2003)
- 5 ---- IN4 (ULN2003)
- 8 ---- RXD (CH340)
- 9 ---- TXD (CH340)
- '''
-
- from machine import Pin, UART
- import utime
- import ujson
-
- # 電機(jī)控制引腳
- coils = [
- Pin(0, Pin.OUT), # A相 (IN1)
- Pin(1, Pin.OUT), # B相 (IN2)
- Pin(4, Pin.OUT), # C相 (IN3)
- Pin(5, Pin.OUT) # D相 (IN4)
- ]
-
- # 四相八拍步進(jìn)電機(jī)的相序
- STEP_SEQ = [
- [1, 0, 0, 1], # AB'
- [1, 0, 0, 0], # A
- [1, 1, 0, 0], # AB
- [0, 1, 0, 0], # B
- [0, 1, 1, 0], # BC
- [0, 0, 1, 0], # C
- [0, 0, 1, 1], # CD
- [0, 0, 0, 1] # D
- ]
-
- # 驅(qū)動(dòng)電機(jī)旋轉(zhuǎn)指定步數(shù);delay_ms 步間延時(shí)(ms),控制轉(zhuǎn)速
- def step_motor(steps, delay_ms=1):
- direction = 1 if steps >=0 else -1
- for _ in range(abs(steps)):
- for phase in range(8)[::direction]: # 方向控制
- for coil, state in zip(coils, STEP_SEQ[phase]):
- coil.value(state)
- utime.sleep_ms(delay_ms)
-
- # 角度控制
- def rotate_angle(angle):
- steps_per_rev = 509
- steps = int(angle * (steps_per_rev / 360))
- step_motor(steps)
-
- # 釋放電機(jī)扭矩
- def release():
- for coil in coils:
- coil.value(0)
-
- # 串口控制旋轉(zhuǎn)角度
- def uart_control():
- uart = machine.UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9))
- while True:
- if uart.any():
- cmd = uart.read()
- try:
- data = ujson.loads(cmd)
- rotate_angle(int(data['angle']))
- release()
- except:
- uart.write('Invalid command\r\n')
- release()
- else:
- release()
- utime.sleep_ms(100)
-
- # main loop
- while True:
- uart_control()
復(fù)制代碼
這里為了節(jié)能并提高效率,僅在串口發(fā)送正確指令時(shí)旋轉(zhuǎn),其他情況均釋放步進(jìn)電機(jī)扭矩,此時(shí)電流約為 0 .
效果
step-motor_uart_control.gif (14.57 KB, 下載次數(shù): 0)
下載附件
2025-5-3 14:54 上傳
由于調(diào)用了 ujson 庫(kù),因此串口發(fā)送指令需符合 json 格式,如 {"angle":40} .
若串口發(fā)送 json 消息的格式錯(cuò)誤,則反饋指令無效的提示。
OLED 顯示旋轉(zhuǎn)狀態(tài)
在前面實(shí)現(xiàn)步進(jìn)電機(jī)旋轉(zhuǎn)驅(qū)動(dòng)、串口自定義角度控制的基礎(chǔ)上,進(jìn)一步實(shí)現(xiàn)串口發(fā)送角度、旋轉(zhuǎn)、OLED 狀態(tài)顯示的功能設(shè)計(jì)方案。
硬件連接
- GP0 ---- IN1 (ULN2003)
- GP1 ---- IN2 (ULN2003)
- GP18 ---- IN3 (ULN2003)
- GP19 ---- IN4 (ULN2003)
- GP8 ---- RXD (CH340)
- GP9 ---- TXD (CH340)
- GP4 ---- SDA (OLED_SSD1306)
- GP5 ---- SCL (OLED_SSD1306)
oled-step-motor-usb2ttl-uln2003-board-connect.jpg (67.4 KB, 下載次數(shù): 0)
下載附件
2025-5-3 14:50 上傳
流程圖
flowchart_uart_oled_rotate.jpg (65.25 KB, 下載次數(shù): 0)
下載附件
2025-5-3 14:50 上傳
代碼
- '''
- Name: Stepper Motor rotate custom angle from serial and OLED display
- Version: v1.0
- Date: 2025.05
- Author: ljl
- Other: Rotate stepper motor (28byj-48) for custom angle from UART, and OLED display the motor state in moving or steady.
- Hardware connect:
- 0 ---- IN1 (ULN2003)
- 1 ---- IN2 (ULN2003)
- 18 ---- IN3 (ULN2003)
- 19 ---- IN4 (ULN2003)
- 8 ---- RXD (CH340)
- 9 ---- TXD (CH340)
- 4 ---- SDA (OLED_SSD1306)
- 5 ---- SCL (OLED_SSD1306)
- Serial send style: {"angle": 40}
- '''
-
- from machine import Pin, UART, SoftI2C
- import ssd1306 # OLED
- import ujson # read uart string
- import utime
-
- # ==== Initialized IIC OLED ====
- i2c = SoftI2C(scl=Pin(5), sda=Pin(4))
- oled_width = 128
- oled_height = 64
- oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
-
- # display the motor state
- def display_motor(angle,state):
- oled.fill(0) # 清屏
- oled.text("Rotate Angle: ", 0, 0)
- oled.text("{:.1f} deg".format(angle), 20, 15)
- oled.text("State: ", 0, 35)
- if state == 1:
- oled.text("Rotating ...", 20, 50)
- elif state == 0:
- oled.text("Reset", 20, 50)
- else:
- oled.text("Error", 20, 50)
- oled.show()
-
- # 電機(jī)控制引腳
- coils = [
- Pin(0, Pin.OUT), # A相 (IN1)
- Pin(1, Pin.OUT), # B相 (IN2)
- Pin(18, Pin.OUT), # C相 (IN3)
- Pin(19, Pin.OUT) # D相 (IN4)
- ]
-
- # 四相八拍步進(jìn)電機(jī)的相序
- STEP_SEQ = [
- [1, 0, 0, 1], # AB'
- [1, 0, 0, 0], # A
- [1, 1, 0, 0], # AB
- [0, 1, 0, 0], # B
- [0, 1, 1, 0], # BC
- [0, 0, 1, 0], # C
- [0, 0, 1, 1], # CD
- [0, 0, 0, 1] # D
- ]
-
- # 驅(qū)動(dòng)電機(jī)旋轉(zhuǎn)指定步數(shù);delay_ms 步間延時(shí)(ms),控制轉(zhuǎn)速
- def step_motor(steps, delay_ms=1):
- direction = 1 if steps >=0 else -1
- for _ in range(abs(steps)):
- for phase in range(8)[::direction]: # 方向控制
- for coil, state in zip(coils, STEP_SEQ[phase]):
- coil.value(state)
- utime.sleep_ms(delay_ms)
-
- # 角度控制
- def rotate_angle(angle):
- steps_per_rev = 509 # 64步/拍 × 8拍 × 8相位
- steps = int(angle * (steps_per_rev / 360))
- step_motor(steps)
-
- # 釋放電機(jī)扭矩
- def release():
- for coil in coils:
- coil.value(0)
-
- # 串口控制旋轉(zhuǎn)角度
- def uart_control():
- uart = machine.UART(1, baudrate=9600, tx=Pin(8), rx=Pin(9))
- while True:
- if uart.any():
- cmd = uart.read()
- try:
- data = ujson.loads(cmd)
- ra = float(data['angle']) # rotate angle
- display_motor(ra,1)
- rotate_angle(ra)
- release()
- display_motor(ra,0)
- except:
- uart.write('Invalid command\r\n')
- release()
- else:
- release()
- #display_motor(0,0)
- utime.sleep_ms(100)
-
- # main loop
- display_motor(0,0) # initialize OLED display
- while True:
- uart_control()
復(fù)制代碼
效果
oled_step-motor_moving.gif (972.53 KB, 下載次數(shù): 0)
下載附件
2025-5-3 14:55 上傳
總結(jié)
本文介紹了樹莓派 RP2350 開發(fā)板實(shí)現(xiàn)步進(jìn)電機(jī)驅(qū)動(dòng)的項(xiàng)目設(shè)計(jì),包括旋轉(zhuǎn)角度的精確控制、串口發(fā)送實(shí)現(xiàn)自定義角度旋轉(zhuǎn)、OLED 顯示旋轉(zhuǎn)狀態(tài)等,為 RP2350 的開發(fā)、設(shè)計(jì)和應(yīng)用提供了參考。
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |