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



(警告!我没有受过这个话题的教育)

嘿伙计们。我在这里发帖是因为我有一个朋友,她的项目迫切需要帮助。我熟悉脚本,但不太熟悉编程。我确实从事IT工作,所以我会尽力提供必要的信息。她正在尝试对Raspberry Pi Zero进行编程,以使用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 Zero(推荐Pi 2或3,但Zero与2和3具有相同的引脚排列。她只需要焊接自己的双头)

-12V 直流移动电源

-尼玛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))

再看一眼,这实际上是您的第一个链接中使用的模式(就在评论"如果不同则调整"下方 - 只是颠倒了,与这里的版本相差了两步半)。

在任何时候都至少有一个线圈通电,防止电机掉入未知位置。

如果我们比较 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大喊大叫,以提供修复!他是真正的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)

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

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

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

我注意到,使用他们的默认设置,步进电机会做一个奇怪的步骤模式,似乎把它带回了原来的位置。我尝试过其他像上面提到的序列,但它们都导致了你(或你的同事)试图描述的巨大烦人的振动。

我最终找到了一个使用另一个序列的视频,这似乎有效。现在,当我说它"似乎有效"时,我的意思是电机现在成功地向前旋转,而不是向前滴答并回到其原始位置。我更改了 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 中显示的数字"前进",然后将桌子倒置以从 3 读取到 0 以获得"向后"的值。

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

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

好吧,如果只有振动,那么您可能会遇到延迟问题。只是提到,万一你没有想到。尝试更大的延迟。

相关内容

  • 没有找到相关文章

最新更新