树莓派开发日记:基于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编号。
本次作者使用的对应接口如下(后续在程序中有用)

驱动的接口树莓派接口
ST112
DIR116
EN120

驱动—电机

需要将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編號。
本次作者使用的對應接口如下(後續在程序中有用)

驅動的接口樹莓派接口
ST112
DIR116
EN120

驅動—電機

需要將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

Pi 5 pinout (Chinese doc)

在这里插入图片描述

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:

DriverPi GPIO
ST112
DIR116
EN120

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.