首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python编程:控制步进电机+树莓Pi零+ L293D集成电路

用Python编程:控制步进电机+树莓Pi零+ L293D集成电路
EN

Stack Overflow用户
提问于 2018-05-15 20:07:26
回答 4查看 7.6K关注 0票数 2

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

嘿伙计们。我张贴在这里,因为我有一个朋友谁迫切需要帮助她的项目。我熟悉脚本,但不太熟悉编程。我确实在IT领域工作,所以我会尽我所能提供必要的信息。她试图编程一个Raspberry Pi零,以控制步进电机使用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驱动芯片之间使用电阻。

使用的部件:

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

-Breadboard w/跳线电缆(Duh!)

她正在使用的代码如下。当她试图运行它时,马达就会震动。看上去这是一次又一次的进步和倒退。没有收到错误代码。她也尝试使用另一个内马17步进电机,它拉出2A,但下降到内马17,绘制.4A,并得到同样的结果。

代码语言:javascript
复制
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)

如果有什么我错过或更多的信息,您需要,请让我知道,我会迅速回应!任何帮助都是非常感谢的!提前感谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-05-15 20:44:27

看来你大部分时间都在那里..。但特定的序列并不是步进一步。对于L293D,IO引脚值基本上是我们驱动线圈的值,我猜这里coil_A和coil_B是两个线圈,它们的末端是1和2(两个线圈在双极步进电机中是典型的)。所以你申请的州是:

代码语言:javascript
复制
1100  == ==   No power
0110  << >>   both coils energised
0011  == ==   No power
1001  >> <<   both coils energised the opposite way

这并不能为电机提供方向导向,而且很可能只会导致振动。尝试一个完整的步骤模式,在那里你一次翻转一个线圈的方向:

代码语言:javascript
复制
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)

下一个变体可能尝试的是半步,其中我们让线圈采取两个步骤从一个方向过渡到另一个方向:

代码语言:javascript
复制
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 ~B的顺序,而您的代码使用A ~A ~B。因此,另一种使代码工作的方法应该是交换B和~A:

代码语言:javascript
复制
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) 
票数 1
EN

Stack Overflow用户

发布于 2018-05-16 01:58:45

下面显示了工作的代码。您可以使用Raspberry Pi零,2,或3。其他使用的部分是12V直流电源库,面包板,L293D电机驱动器IC,和一个涅马17步进电机(0.4A抽奖)。所有这些都是使用Python 3完成的。如果您需要图片或教程,请查看上面的链接。向亚恩大喊大叫,因为他提供了修理品!他是真正的MVP。

代码语言:javascript
复制
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)

票数 1
EN

Stack Overflow用户

发布于 2018-11-20 21:06:49

我使用一个类似的设置使用树莓π零W和SDComponents MotorShield控制两个步进电机。

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

它看起来非常类似于如何设置代码(请看一下PiMotor.py文件)。

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

我最终找到了一个视频,它使用了另一个序列,这似乎是可行的。现在,当我说它“似乎起作用了”时,我的意思是电机现在正成功地向前旋转,而不是向前移动,回到原来的位置。我更改了PiMotor.py上的0和1,并运行测试代码如下:

代码语言:javascript
复制
    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上发现了测序-> zuMw8

这个家伙解释了他是如何设置的,就像你的面包板和所有东西一样(我没有用面包板),我只是插入了他在5:22的“前进”视频中显示的数字,然后倒转桌子从3读到0,得到了“向后”的值。

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

我可以提供我的设置是什么样子的图片,我们可以比较/帮助对方在我们的小项目。让我知道“向前”和“向后”的顺序是否对你有用。祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50358413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档