Python编程:控制步进电机+Raspberry Pi零+L293D IC
Programming in Python: Controlling Stepper Motor + Raspberry Pi Zero + L293D IC
(警告!我没有受过这方面的教育)
大家好。我在这里发帖是因为我有一个朋友在她的项目上迫切需要帮助。我熟悉脚本,但不太熟悉编程。我从事 IT 工作,所以我会尽力提供必要的信息。她正在尝试编写一个 Raspberry Pi 零来使用 Python 3 控制步进电机。就这么简单。
她遵循了这些教程。看起来她使用了#1 中的零件和接线以及#2 中的代码:
这里有有用的图片。这是她的实际设置:
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' 的顺序是否适合您。祝你好运!
嗯,如果只有振动,那么你可能有延迟问题。只是提一下,以防你没有想到它。尝试更大的延迟。
(警告!我没有受过这方面的教育)
大家好。我在这里发帖是因为我有一个朋友在她的项目上迫切需要帮助。我熟悉脚本,但不太熟悉编程。我从事 IT 工作,所以我会尽力提供必要的信息。她正在尝试编写一个 Raspberry Pi 零来使用 Python 3 控制步进电机。就这么简单。
她遵循了这些教程。看起来她使用了#1 中的零件和接线以及#2 中的代码:
这里有有用的图片。这是她的实际设置: 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' 的顺序是否适合您。祝你好运!
嗯,如果只有振动,那么你可能有延迟问题。只是提一下,以防你没有想到它。尝试更大的延迟。