提问者:小点点

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


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

嘿,乡亲们。我在这里发帖是因为我有一个朋友迫切需要她的项目帮助。我熟悉脚本,但不太熟悉编程。我在信息技术领域工作,所以我会尽我所能提供必要的信息。她试图用树莓派零编程来控制使用Python 3的步进电机。就这么简单。

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

>

https://www.raspberrypi.org/forums/viewtopic.php?f=49

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

帮助说明:她提到电源和L293D驱动IC之间没有使用电阻器。

使用的部件:

-Raspberry Pi Zero(推荐Pi 2或3,但Zero具有与2相同的引脚

-12V直流电源

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

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

-带跨接电缆的试验板(Duh!)

她使用的代码如下。当她试图运行它时,马达只是振动。似乎它反复向前迈一步,向后退一步。没有收到错误代码。她还尝试使用另一个画2A的Nema 17步进电机,但下降到画0.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)

如果有什么我错过了或更多的信息,你需要,请让我知道,我会迅速回应!任何帮助都非常感谢!提前感谢!


共3个答案

匿名用户

看起来你在那里的大部分时间。。。但是这个特定的序列并没有使步进器步进。对于L293D,IO引脚值基本上就是我们驱动线圈所用的,我猜这里线圈A和线圈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))

第二眼看去,这实际上是你第一个链接中使用的模式(就在注释“如果不同,调整”下面——只是颠倒了,两个半步与这里的版本不一致)。

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

如果我们比较中所示的表格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 Zero,2或3。使用的其他部件是12V直流电源、面包板、L293D电机驱动器IC和Nema 17步进电机(0.4A抽签)。这都是使用Python 3完成的。如果您需要图片或教程,请查看上面的链接。向Yann大喊,因为他提供了修复!他是真正的最有价值球员。

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 zero W和一个SDS组件MotorShield来控制两个步进电机。

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

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

我注意到,使用默认的顺序设置,步进电机会执行奇怪的步进模式,似乎会将其恢复到原始位置。我尝试过上面提到的其他序列,但它们都会导致你(或你的同事)试图描述的令人恼火的振动。

我最终找到了一个使用另一个序列的视频,看起来很有效。现在,当我说它“似乎起作用了”时,我的意思是马达现在成功地向前旋转,而不是向前滴答一声,回到原来的位置。我改变了PiMotor.py上的0和1,并运行了如下测试代码:

    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视频上发现了这个序列--

这家伙解释了他是如何设置的,这与你的实验板和所有类似(我没有使用实验板),我只是简单地插入了他在视频5:22中显示的“前进”的数字,然后将表格倒置,从3到0读取“后退”的值。

我现在卡住试图找出如何加速步进电机,但我不是太有经验的python和我觉得这个过程将涉及到添加一个速度变量,这是依赖于每一步之间的延迟时间。还有半步进和微步进序列,我试图探索,但还没有找到任何相关的资源。

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