(警告!我没有受过这方面的教育)
嘿,乡亲们。我在这里发帖是因为我有一个朋友迫切需要她的项目帮助。我熟悉脚本,但不太熟悉编程。我在信息技术领域工作,所以我会尽我所能提供必要的信息。她试图用树莓派零编程来控制使用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)
如果有什么我错过了或更多的信息,你需要,请让我知道,我会迅速回应!任何帮助都非常感谢!提前感谢!
看起来你在那里的大部分时间。。。但是这个特定的序列并没有使步进器步进。对于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和我觉得这个过程将涉及到添加一个速度变量,这是依赖于每一步之间的延迟时间。还有半步进和微步进序列,我试图探索,但还没有找到任何相关的资源。
我可以提供我的设置的图片,我们可以在我们的小项目中互相比较/帮助。让我知道“前进”和“后退”的顺序是否适合您。祝你好运