Python编程:控制步进电机+Raspberry Pi零+L293D IC

Programming in Python: Controlling Stepper Motor + Raspberry Pi Zero + L293D IC

(警告!我没有受过这方面的教育)

大家好。我在这里发帖是因为我有一个朋友在她的项目上迫切需要帮助。我熟悉脚本,但不太熟悉编程。我从事 IT 工作,所以我会尽力提供必要的信息。她正在尝试编写一个 Raspberry Pi 零来使用 Python 3 控制步进电机。就这么简单。

她遵循了这些教程。看起来她使用了#1 中的零件和接线以及#2 中的代码:

  1. https://tutorials-raspberrypi.com/how-to-control-a-stepper-motor-with-raspberry-pi-and-l293d-uln2003a/

  2. https://www.raspberrypi.org/forums/viewtopic.php?f=49&t=55580

这里有有用的图片。这是她的实际设置: https://photos.app.goo.gl/WJbCo4UU3wAdo8913

有用的注释:她提到她没有在电源和 L293D 驱动器 IC 之间使用电阻器。

使用的部件:

-Raspberry Pi 零(推荐使用 Pi 2 或 3,但零与 2 和 3 的引出线相同。她只需要焊接自己的双头)

-12V 直流移动电源

-Nema 17 步进电机 (https://www.amazon.com/STEPPERONLINE-17HS13-0404S1-Stepper-Motor-Printer/dp/B00PNEQ9T4)

-L293D电机驱动IC(https://www.amazon.com/NDRTJM-SHOMPFL1045-L293D-Stepper-Driver/dp/B008XCGLNM)

-带跨接电缆的面包板(废话!)

她使用的代码如下。当她尝试 运行 时,电机只是振动。似乎在不断地进退两步。没有收到错误代码。她还尝试使用另一个消耗 2A 的 Nema 17 步进电机,但下降到消耗 .4A 的 Nema 17 并得到相同的结果。

import RPi.GPIO as GPIO
import time

#variables

delay = 0.05
steps = 500

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#Enable GPIO pins for ENA and ENB for stepper

enable_a = 18
enable_b = 22

#Enable pins for IN1-3 to control step sequence
 coil_A_1_pin = 17 #black
coil_A_2_pin = 4 #green
coil_B_1_pin = 24 #red
coil_B_2_pin = 23 #blue

#Set pin states

GPIO.setup(enable_a, GPIO.OUT)
GPIO.setup(enable_b, GPIO.OUT)
GPIO.setup(coil_A_1_pin, GPIO.OUT)
GPIO.setup(coil_A_2_pin, GPIO.OUT)
GPIO.setup(coil_B_1_pin, GPIO.OUT)
GPIO.setup(coil_B_2_pin, GPIO.OUT)

#set ENA and ENB to high to enable stepper

GPIO.output(enable_a, True)
GPIO.output(enable_b, True)

#function for step sequence

def setStep(w1, w2, w3, w4):
     GPIO.output(coil_A_1_pin, w1)
     GPIO.output(coil_A_2_pin, w2)
     GPIO.output(coil_B_1_pin, w3)   
     GPIO.output(coil_B_2_pin, w4) 

#loop through step sequence based on number of steps

for i in range(0, steps):
     setStep(1,1,0,0)
     time.sleep(delay)
     setStep(0,1,1,0)
     time.sleep(delay)
     setStep(0,0,1,1)
     time.sleep(delay)
     setStep(1,0,0,1)
     time.sleep(delay)

#reverse previous step sequence to reverse motor direction

for i in range(0, steps):
     setStep(1,0,0,1)
     time.sleep(delay)
     setStep(0,0,1,1)
     time.sleep(delay)
     setStep(0,1,1,0)
     time.sleep(delay)
     setStep(1,1,0,0)
     time.sleep(delay)

如果有任何遗漏或您需要更多信息,请告诉我,我会尽快回复!任何帮助是极大的赞赏!提前致谢!

看起来你已经完成了大部分...但是特定的序列没有进行步进步骤。使用 L293D,IO 引脚值基本上就是我们驱动线圈的值,我猜这里 coil_A 和 coil_B 是两个线圈,1 和 2 是它们的末端(两个线圈是典型的在双极步进电机中)。所以你申请的州是:

1100  == ==   No power
0110  << >>   both coils energised
0011  == ==   No power
1001  >> <<   both coils energised the opposite way

这并没有为电机提供方向引导,很可能只会导致振动。尝试一个完整的步进模式,一次翻转一个线圈的方向:

fullsteps = ((0,1,0,1), (0,1,1,0), (1,0,1,0), (1,0,0,1))

for i in range(0, steps):
    for pattern in fullsteps:
        setStep(*pattern)
        time.sleep(delay)

下一个可能尝试的变体是半步,我们让线圈分两步从一个方向过渡到另一个方向:

halfsteps = ((0,1,0,1), (0,1,0,0), (0,1,1,0), (0,0,1,0), 
             (1,0,1,0), (1,0,0,0), (1,0,0,1), (0,0,0,1))

乍一看,这实际上是您在第一个 link 中使用的模式(就在评论 "adjust if different" 的下方 - 只是颠倒过来,与此处的版本不同步两个半步) .

始终至少有一个线圈通电,以防止电机落入未知位置。

如果我们比较 http://www.nmbtc.com/step-motors/engineering/full-half-and-microstepping/ 中显示的表格,他们的表格使用顺序 A B ~A ~B,而您的代码使用 A ~A B ~B。所以另一种使代码工作的方法应该只是交换 B 和 ~A:

def setStep(w1, w3, w2, w4):
    GPIO.output(coil_A_1_pin, w1)
    GPIO.output(coil_A_2_pin, w2)
    GPIO.output(coil_B_1_pin, w3)   
    GPIO.output(coil_B_2_pin, w4) 

下面显示了有效的代码。您可以使用 Raspberry Pi 零、2 或 3。使用的其他部件是 12V 直流电源、面包板、L293D 电机驱动器 IC 和 Nema 17 步进电机(0.4A 电流)。这一切都是使用 Python 完成的 3. 如果您需要图片或教程,请查看上面的链接。向 Yann 大声喊叫以提供修复!他是真正的 MVP。

import RPi.GPIO as GPIO
import time

#variables

delay = 0.005
steps = 500

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#Enable GPIO pins for ENA and ENB for stepper

enable_a = 18
enable_b = 22

#Enable pins for IN1-3 to control step sequence
 coil_A_1_pin = 17 #black
coil_A_2_pin = 4 #green
coil_B_1_pin = 24 #red
coil_B_2_pin = 23 #blue

#Set pin states

GPIO.setup(enable_a, GPIO.OUT)
GPIO.setup(enable_b, GPIO.OUT)
GPIO.setup(coil_A_1_pin, GPIO.OUT)
GPIO.setup(coil_A_2_pin, GPIO.OUT)
GPIO.setup(coil_B_1_pin, GPIO.OUT)
GPIO.setup(coil_B_2_pin, GPIO.OUT)

#set ENA and ENB to high to enable stepper

GPIO.output(enable_a, True)
GPIO.output(enable_b, True)

#function for step sequence

def setStep(w1, w2, w3, w4):
     GPIO.output(coil_A_1_pin, w1)
     GPIO.output(coil_A_2_pin, w2)
     GPIO.output(coil_B_1_pin, w3)   
     GPIO.output(coil_B_2_pin, w4) 

#loop through step sequence based on number of steps

for i in range(0, steps):
     setStep(0,1,0,1)
     time.sleep(delay)
     setStep(0,1,1,0)
     time.sleep(delay)
     setStep(1,0,1,0)
     time.sleep(delay)
     setStep(1,0,0,1)
     time.sleep(delay)

#reverse previous step sequence to reverse motor direction

for i in range(0, steps):
     setStep(1,0,0,1)
     time.sleep(delay)
     setStep(1,0,1,0)
     time.sleep(delay)
     setStep(0,1,1,0)
     time.sleep(delay)
     setStep(0,1,0,1)
     time.sleep(delay)

我正在使用类似的设置,使用 raspberry pi 零 W 和 SDComponents MotorShield 来控制两个步进电机。

我正在使用他们在 github 上提供的代码:https://github.com/sbcshop/motor-shield

这看起来与您设置代码的方式非常相似(查看 PiMotor.py 文件)

我注意到,使用他们的默认排序设置,步进电机会执行一种奇怪的步进模式,似乎将其带回到原来的位置。我已经尝试过其他序列,如上面提到的那些,但它们都导致了您(或您的同事)试图描述的非常烦人的振动。

我最终找到了一个使用另一个序列的视频,而且似乎有效。现在,当我说它 "seemed to work" 时,我的意思是电机现在成功地向前旋转,而不是向前旋转并回到原来的位置。我更改了 PiMotor.py 和 运行 测试代码中的零和一,如下所示:

    def forward(self, delay, steps):
       for i in range(0, steps):
          setStep(1,0,1,1)
          time.sleep(delay)
          setStep(0,0,1,0)
          time.sleep(delay)
          setStep(0,1,0,0)
          time.sleep(delay)
          setStep(1,1,0,1)
          time.sleep(delay)

    def backward(self, delay, steps):
       for i in range(0, steps):
          setStep(1,1,0,1)
          time.sleep(delay)
          setStep(0,1,0,0)
          time.sleep(delay)
          setStep(0,0,1,0)
          time.sleep(delay)
          setStep(1,0,1,1)
          time.sleep(delay)

我发现这个 youtube 视频的排序 --> https://youtu.be/ca8VP_zuMw8

这家伙解释了他是如何设置的,这与你的面包板和所有东西都很相似(我没有使用面包板),我只是插入了他在 5:22 中显示的数字'forward' 的视频,然后将 table 上下翻转以从 3 读取到 0 以获得 'backward'.

的值

我现在一直在试图找出如何加速步进电机,但我对 python 不太熟悉,我觉得这个过程将涉及添加一个速度变量,该变量取决于每个步骤之间的延迟时间。还有我正在尝试探索的半步进和微步进序列,但未能找到任何相关资源。

我可以提供我的设置的图片,我们可以在我们的小项目中相互比较/帮助。让我知道 'forward' 和 'backward' 的顺序是否适合您。祝你好运!

嗯,如果只有振动,那么你可能有延迟问题。只是提一下,以防你没有想到它。尝试更大的延迟。