树莓派开发日记:基于Python控制42步进电机
树莓派 5 + D36A 驱动控制 42 步进电机:GPIO 接线表与 gpiozero 的 StepperMotor_42 类(PWM 脉冲、方向、使能),含转速与 PWM 频率换算公式。
前言
在物联网与智能硬件的浪潮中,树莓派凭借其轻量化架构与丰富的GPIO接口,已成为创客与开发者实现机电一体化项目的首选平台。42步进电机作为部分精密机械结构的核心执行器。二者的结合,便能实现实现1从代码到物理世界的精确映射。本文将以树莓派5为硬件载体,结合Python语言的gpiozero库,深入剖析42步进电机的控制逻辑
一、硬件选择
树莓派:树莓派5
驱动:D36A双路步进电机驱动
电机:42步进电机
二、硬件接线
接线顺序:树莓派GPIO口——驱动用户控制信号输入口——驱动电机接口——步进电机
1、树莓派接口
首先需要在树莓派文档中查询到树莓派对应版本的接口信息:树莓派5对应文档
该图即为树莓派的GPIO口分布图,其中黄色为GPIO口,黑色为地,红色和橙色分别为5V和3.3V,在接线时候要注意左上方这个圆孔对应树莓派上的圆孔,避免弄错方向。
2、D36A双路驱动模块接口
接下来我们看D36A双路驱动模块的的结构

以及用户控制信号的各个引脚的说明

在控制42步进电机的过程中我们只需要用到其中5个引脚就好,分别是5V、GND、ST1、DIR1以及EN1,后面三个是用来控制电机接口A(该驱动可以同时驱动两路电机,ST2\DIR2\EN2控制的便是电机接口B)
3、42步进电机接口

步进电机只需要接四个口既可(虽然他的接口是6P)
4、接线
树莓派—驱动
在连接树莓派与驱动时候,一般不建议直接用树莓派对驱动进行供电,需要另外的电源模块来对驱动供电。因此将5V与地线接在特定的电源模块上既可。
同时需要将ST1、DIR1以及EN1分别接到树莓派上的三个不同GPIO口,并记住对应的GPIO编号。
本次作者使用的对应接口如下(后续在程序中有用)
| 驱动的接口 | 树莓派接口 |
|---|---|
| ST1 | 12 |
| DIR1 | 16 |
| EN1 | 20 |
驱动—电机
需要将AC、BD分别接在驱动上一个象的±端,例如作者将A接在A+、C接在A-、B接B+、D接B-。如下图所示:(接线可以采用杜邦线进行连接,也可购买6P转4P的线,不过购买时需注意是否正确对应)

三、软件部分
软件部分采用Python实现,利用gpiozero库进行控制
代码实现如下:
定义步进电机控制类StepperMotor_42
from gpiozero import PWMOutputDevice, DigitalOutputDevice, OutputDevice, DistanceSensor
class StepperMotor_42:
def __init__(self, pulse_pin=12, dir_pin=16, enable_pin=20):
"""
初始化步进电机控制
参数:
pulse_pin: 脉冲信号引脚(PWM)
dir_pin: 方向控制引脚
enable_pin: 使能控制引脚
"""
# 创建PWM输出设备用于脉冲信号
self.pulse = PWMOutputDevice(pulse_pin)
# 创建数字输出设备用于方向控制
self.direction = DigitalOutputDevice(dir_pin)
# 创建数字输出设备用于使能控制
self.enable = DigitalOutputDevice(enable_pin)
# 默认禁用电机
self.enable.off()
# 默认方向为正向
self.direction.off()
# 默认频率(转速)
self.frequency = 100
self.pulse.frequency = self.frequency
定义设置电机旋转方向的方法
def set_direction(self, clockwise=True):
if clockwise:
self.direction.off()
else:
self.direction.on()
定义控制转速的方法(通过PWM的频率设置frequency)
def set_speed(self, frequency):
self.frequency = frequency
self.pulse.frequency = frequency
定义启停的方法
def start(self):
# 使能电机
self.enable.on()
# 设置PWM占空比为50%
self.pulse.value = 0.5
def stop(self):
# 将PWM占空比设为0
self.pulse.value = 0
# 禁用电机
self.enable.off()
完整代码如下:
class StepperMotor_42:
"""步进电机控制类 - 适用于带驱动器的42步进电机"""
def __init__(self, pulse_pin=12, dir_pin=16, enable_pin=20):
"""
初始化步进电机控制
参数:
pulse_pin: 脉冲信号引脚(PWM)
dir_pin: 方向控制引脚
enable_pin: 使能控制引脚
"""
# 创建PWM输出设备用于脉冲信号
self.pulse = PWMOutputDevice(pulse_pin)
# 创建数字输出设备用于方向控制
self.direction = DigitalOutputDevice(dir_pin)
# 创建数字输出设备用于使能控制
self.enable = DigitalOutputDevice(enable_pin)
# 默认禁用电机
self.enable.off()
# 默认方向为正向
self.direction.off()
# 默认频率(转速)
self.frequency = 100
self.pulse.frequency = self.frequency
def set_direction(self, clockwise=True):
"""设置电机旋转方向"""
if clockwise:
self.direction.off()
else:
self.direction.on()
def set_speed(self, frequency):
"""
通过设置PWM频率来控制电机转速
参数:
frequency: PWM频率(Hz),频率越高,转速越快
"""
self.frequency = frequency
self.pulse.frequency = frequency
def start(self):
"""启动电机旋转"""
# 使能电机
self.enable.on()
# 设置PWM占空比为50%
self.pulse.value = 0.5
def stop(self):
"""停止电机旋转"""
# 将PWM占空比设为0
self.pulse.value = 0
# 禁用电机
self.enable.off()
只需要调用好类里面的方法,传入正确的参数就可以实现42步进电机操控。
(在更新参数之后需要调用stop 和start刷新一下电机的状态。)
四、补充
在设置转速时候需要注意,频率不等于转速,该处设置的频率只是PWM波的频率,需要经过以下公式换算才能得到对应转速:
R P M
f × 60 × m 360 / θ
f
×
m
×
θ
6
RPM= \frac{f \times 60 \times m}{360/\theta} = \frac{f \times m \times \theta}{6}
RPM=360/θf×60×m=6f×m×θ
其中:
f:PWM频率(Hz)
θ:电机固有步距角(单位:度,如1.8°、0.9°)
m:驱动器的细分数(如1细分、16细分)
θ与m需要根据具体的电机参数来进行代入。
樹莓派開發日記:基於Python控制42步進電機
樹莓派 5 + D36A 驅動控制 42 步進電機:GPIO 接線表與 gpiozero 的 StepperMotor_42 類(PWM 脈衝、方向、使能),含轉速與 PWM 頻率換算公式。
來源:https://blog.csdn.net/2403_87969572/article/details/147653031
抓取時間(ISO本地):2026-05-18 05:17:00
文章目錄
前言
在物聯網與智能硬件的浪潮中,樹莓派憑藉其輕量化架構與豐富的GPIO接口,已成為創客與開發者實現機電一體化項目的首選平臺。42步進電機作為部分精密機械結構的核心執行器。二者的結合,便能實現實現1從代碼到物理世界的精確映射。本文將以樹莓派5為硬件載體,結合Python語言的gpiozero庫,深入剖析42步進電機的控制邏輯
一、硬件選擇
樹莓派:樹莓派5
驅動:D36A雙路步進電機驅動
電機:42步進電機
二、硬件接線
接線順序:樹莓派GPIO口——驅動用戶控制信號輸入口——驅動電機接口——步進電機
1、樹莓派接口
首先需要在樹莓派文檔中查詢到樹莓派對應版本的接口信息:樹莓派5對應文檔
該圖即為樹莓派的GPIO口分佈圖,其中黃色為GPIO口,黑色為地,紅色和橙色分別為5V和3.3V,在接線時候要注意左上方這個圓孔對應樹莓派上的圓孔,避免弄錯方向。
2、D36A雙路驅動模塊接口
接下來我們看D36A雙路驅動模塊的的結構

以及用戶控制信號的各個引腳的說明

在控制42步進電機的過程中我們只需要用到其中5個引腳就好,分別是5V、GND、ST1、DIR1以及EN1,後面三個是用來控制電機接口A(該驅動可以同時驅動兩路電機,ST2\DIR2\EN2控制的便是電機接口B)
3、42步進電機接口

步進電機只需要接四個口既可(雖然他的接口是6P)
4、接線
樹莓派—驅動
在連接樹莓派與驅動時候,一般不建議直接用樹莓派對驅動進行供電,需要另外的電源模塊來對驅動供電。因此將5V與地線接在特定的電源模塊上既可。
同時需要將ST1、DIR1以及EN1分別接到樹莓派上的三個不同GPIO口,並記住對應的GPIO編號。
本次作者使用的對應接口如下(後續在程序中有用)
| 驅動的接口 | 樹莓派接口 |
|---|---|
| ST1 | 12 |
| DIR1 | 16 |
| EN1 | 20 |
驅動—電機
需要將AC、BD分別接在驅動上一個象的±端,例如作者將A接在A+、C接在A-、B接B+、D接B-。如下圖所示:(接線可以採用杜邦線進行連接,也可購買6P轉4P的線,不過購買時需注意是否正確對應)

三、軟件部分
軟件部分採用Python實現,利用gpiozero庫進行控制
代碼實現如下:
定義步進電機控制類StepperMotor_42
from gpiozero import PWMOutputDevice, DigitalOutputDevice, OutputDevice, DistanceSensor
class StepperMotor_42:
def __init__(self, pulse_pin=12, dir_pin=16, enable_pin=20):
"""
初始化步進電機控制
參數:
pulse_pin: 脈衝信號引腳(PWM)
dir_pin: 方向控制引腳
enable_pin: 使能控制引腳
"""
# 創建PWM輸出設備用於脈衝信號
self.pulse = PWMOutputDevice(pulse_pin)
# 創建數字輸出設備用於方向控制
self.direction = DigitalOutputDevice(dir_pin)
# 創建數字輸出設備用於使能控制
self.enable = DigitalOutputDevice(enable_pin)
# 默認禁用電機
self.enable.off()
# 默認方向為正向
self.direction.off()
# 默認頻率(轉速)
self.frequency = 100
self.pulse.frequency = self.frequency
定義設置電機旋轉方向的方法
def set_direction(self, clockwise=True):
if clockwise:
self.direction.off()
else:
self.direction.on()
定義控制轉速的方法(通過PWM的頻率設置frequency)
def set_speed(self, frequency):
self.frequency = frequency
self.pulse.frequency = frequency
定義啟停的方法
def start(self):
# 使能電機
self.enable.on()
# 設置PWM佔空比為50%
self.pulse.value = 0.5
def stop(self):
# 將PWM佔空比設為0
self.pulse.value = 0
# 禁用電機
self.enable.off()
完整代碼如下:
class StepperMotor_42:
"""步進電機控制類 - 適用於帶驅動器的42步進電機"""
def __init__(self, pulse_pin=12, dir_pin=16, enable_pin=20):
"""
初始化步進電機控制
參數:
pulse_pin: 脈衝信號引腳(PWM)
dir_pin: 方向控制引腳
enable_pin: 使能控制引腳
"""
# 創建PWM輸出設備用於脈衝信號
self.pulse = PWMOutputDevice(pulse_pin)
# 創建數字輸出設備用於方向控制
self.direction = DigitalOutputDevice(dir_pin)
# 創建數字輸出設備用於使能控制
self.enable = DigitalOutputDevice(enable_pin)
# 默認禁用電機
self.enable.off()
# 默認方向為正向
self.direction.off()
# 默認頻率(轉速)
self.frequency = 100
self.pulse.frequency = self.frequency
def set_direction(self, clockwise=True):
"""設置電機旋轉方向"""
if clockwise:
self.direction.off()
else:
self.direction.on()
def set_speed(self, frequency):
"""
通過設置PWM頻率來控制電機轉速
參數:
frequency: PWM頻率(Hz),頻率越高,轉速越快
"""
self.frequency = frequency
self.pulse.frequency = frequency
def start(self):
"""啟動電機旋轉"""
# 使能電機
self.enable.on()
# 設置PWM佔空比為50%
self.pulse.value = 0.5
def stop(self):
"""停止電機旋轉"""
# 將PWM佔空比設為0
self.pulse.value = 0
# 禁用電機
self.enable.off()
只需要調用好類裡面的方法,傳入正確的參數就可以實現42步進電機操控。
(在更新參數之後需要調用stop 和start刷新一下電機的狀態。)
四、補充
在設置轉速時候需要注意,頻率不等於轉速,該處設置的頻率只是PWM波的頻率,需要經過以下公式換算才能得到對應轉速:
R P M
f × 60 × m 360 / θ
f
×
m
×
θ
6
RPM= \frac{f \times 60 \times m}{360/\theta} = \frac{f \times m \times \theta}{6}
RPM=360/θf×60×m=6f×m×θ
其中:
f:PWM頻率(Hz)
θ:電機固有步距角(單位:度,如1.8°、0.9°)
m:驅動器的細分數(如1細分、16細分)
θ與m需要根據具體的電機參數來進行代入。
Raspberry Pi Diary: Control a 42 Stepper Motor with Python
Pi 5 + D36A driver for 42-stepper: wiring table and gpiozero StepperMotor_42 (PWM pulse, DIR, EN) with RPM vs. PWM frequency formula.
Captured at (local ISO): 2026-05-18 05:17:00
Preface
Raspberry Pi plus 42 stepper motors map code to precise motion. This post uses Pi 5 and Python gpiozero for control logic.
I. Hardware
- Board: Raspberry Pi 5
- Driver: D36A dual-channel stepper driver
- Motor: 42 stepper
II. Wiring
Order: Pi GPIO → driver control inputs → motor port → stepper.
1. Pi GPIO

Yellow = GPIO, black = GND, red/orange = 5V/3.3V. Align the corner hole with the board.
2. D36A driver


For one motor use 5V, GND, ST1, DIR1, EN1 (ST2/DIR2/EN2 = channel B).
3. 42 stepper

Four wires (6P connector).
4. Connections
Pi → driver
Use a separate power supply for the driver (not Pi 5V). Wire ST1, DIR1, EN1 to GPIO:
| Driver | Pi GPIO |
|---|---|
| ST1 | 12 |
| DIR1 | 16 |
| EN1 | 20 |
Driver → motor
A+/A−, B+/B− as in diagram:

III. Software (gpiozero)
Class StepperMotor_42:
from gpiozero import PWMOutputDevice, DigitalOutputDevice, OutputDevice, DistanceSensor
class StepperMotor_42:
def __init__(self, pulse_pin=12, dir_pin=16, enable_pin=20):
"""
初始化步进电机控制
参数:
pulse_pin: 脉冲信号引脚(PWM)
dir_pin: 方向控制引脚
enable_pin: 使能控制引脚
"""
# 创建PWM输出设备用于脉冲信号
self.pulse = PWMOutputDevice(pulse_pin)
# 创建数字输出设备用于方向控制
self.direction = DigitalOutputDevice(dir_pin)
# 创建数字输出设备用于使能控制
self.enable = DigitalOutputDevice(enable_pin)
# 默认禁用电机
self.enable.off()
# 默认方向为正向
self.direction.off()
# 默认频率(转速)
self.frequency = 100
self.pulse.frequency = self.frequency
Direction:
def set_direction(self, clockwise=True):
if clockwise:
self.direction.off()
else:
self.direction.on()
Speed (PWM frequency):
def set_speed(self, frequency):
self.frequency = frequency
self.pulse.frequency = frequency
Start / stop:
def start(self):
# 使能电机
self.enable.on()
# 设置PWM占空比为50%
self.pulse.value = 0.5
def stop(self):
# 将PWM占空比设为0
self.pulse.value = 0
# 禁用电机
self.enable.off()
Full class:
class StepperMotor_42:
"""步进电机控制类 - 适用于带驱动器的42步进电机"""
def __init__(self, pulse_pin=12, dir_pin=16, enable_pin=20):
"""
初始化步进电机控制
参数:
pulse_pin: 脉冲信号引脚(PWM)
dir_pin: 方向控制引脚
enable_pin: 使能控制引脚
"""
# 创建PWM输出设备用于脉冲信号
self.pulse = PWMOutputDevice(pulse_pin)
# 创建数字输出设备用于方向控制
self.direction = DigitalOutputDevice(dir_pin)
# 创建数字输出设备用于使能控制
self.enable = DigitalOutputDevice(enable_pin)
# 默认禁用电机
self.enable.off()
# 默认方向为正向
self.direction.off()
# 默认频率(转速)
self.frequency = 100
self.pulse.frequency = self.frequency
def set_direction(self, clockwise=True):
"""设置电机旋转方向"""
if clockwise:
self.direction.off()
else:
self.direction.on()
def set_speed(self, frequency):
"""
通过设置PWM频率来控制电机转速
参数:
frequency: PWM频率(Hz),频率越高,转速越快
"""
self.frequency = frequency
self.pulse.frequency = frequency
def start(self):
"""启动电机旋转"""
# 使能电机
self.enable.on()
# 设置PWM占空比为50%
self.pulse.value = 0.5
def stop(self):
"""停止电机旋转"""
# 将PWM占空比设为0
self.pulse.value = 0
# 禁用电机
self.enable.off()
Call methods with correct parameters. After parameter changes, stop() then start() to refresh state.
IV. RPM Note
PWM frequency ≠ shaft RPM:
[ RPM = \frac{f \times 60 \times m}{360/\theta} = \frac{f \times m \times \theta}{6} ]
- (f): PWM frequency (Hz)
- (\theta): step angle (deg, e.g. 1.8°)
- (m): microstepping factor
Use motor and driver datasheet values.