2

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

嘿伙计。我在这里发帖是因为我有一个朋友在她的项目上急需帮助。我熟悉脚本,但对编程不太熟悉。我在 IT 部门工作,所以我会尽力提供必要的信息。她正在尝试使用 Python 3 对 Raspberry Pi Zero 进行编程以控制步进电机。就这么简单。

她遵循了这些教程。看起来她使用了#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 直流移动电源

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

-L293D电机驱动IC(https://www.amazon.com/NDRTJM-SHOMP ​​FL1045-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)

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

4

4 回答 4

1

看起来你大部分都在那里......但特定的序列并没有使步进器步进。使用 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/中显示的表格,他们的表格使用顺序 AB ~A ~B,而您的代码使用 A ~AB ~ 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) 
于 2018-05-15T20:44:27.660 回答
1

有效的代码如下所示。您可以使用 Raspberry Pi Zero、2 或 3。使用的其他部件包括 12V DC 移动电源、面包板、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)

于 2018-05-16T01:58:45.543 回答
0

我正在使用类似的设置,使用树莓派零 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 的经验并不多,我觉得这个过程将涉及添加一个速度变量,该变量取决于每一步之间的延迟时间。我还尝试探索半步和微步序列,但找不到任何相关资源。

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

于 2018-11-20T21:06:49.453 回答
0

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

于 2018-11-23T07:50:13.353 回答