gpt4 book ai didi

python - 用 Python 编程 : Controlling Stepper Motor + Raspberry Pi Zero + L293D IC

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:26 24 4
gpt4 key购买 nike

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

大家好。我在这里发帖是因为我有一个 friend 在她的项目上迫切需要帮助。我熟悉脚本,但不太熟悉编程。我从事 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-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)

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

最佳答案

看起来您已经完成了大部分……但是特定的序列并没有进行步进。对于 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)

关于python - 用 Python 编程 : Controlling Stepper Motor + Raspberry Pi Zero + L293D IC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50358413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com