蟒蛇 中的步进电机控制

54

玩完LED,开关和蜂鸣器后,我觉得自然而然的下一步就是玩一两个步进电机。与常规电动机不同,步进电动机允许您以精确的增量旋转轴。这使它们在各种Raspberry 体育彩票31选7项目中很有用。

基本步进电机

28BY-J48步进电机

那里 is a huge selection of 步per motors to buy but I decided to experiment 与 a 28BJY-48 与 ULN2003 control board. The reasons I chose this device where :

  • 便宜
  • 以5V运行
  • 易于连接到体育彩票31选7’s 通用输入输出 header
  • 小但相对强大
  • 海外和英国卖家均可广泛使用
  • 易于通过控制板获得

那里 are additional details in the 步进电动机28BJY-48数据表.

购买 Stepper Motors 对于 the 体育彩票31选7

The 28BJY-48 步per motors can be obtained from :

与体育彩票31选7接口

步进电机和控制板

The 步per motor connects to the controller board 与 a pre-supplied connector. The controller board has six pins which need to be connected to the 体育彩票31选7’s 通用输入输出 header :

  • 5V(P1-02)
  • GND(P1-06)

  • Inp1(P1-11)
  • Inp2(P1-15)
  • Inp3(P1-16)
  • Inp4(P1-18)

上面的P1-XX参考代表 体育彩票31选7接头 我用过的别针。这些在下面的Python示例中的“步骤插件”列表中定义,因此,如果您使用其他引脚,请确保也更新了Python列表。如果需要,您可以使用其他GPIO引脚,只要记住要更新Python脚本即可。

要旋转步进电机,您需要提供以下顺序:“high” 和 “low” levels to each of the 4 inputs in sequence. 通过 setting the correct sequence of 高 和 低 levels the motor spindle will rotate. Reversing the sequence results in the direction being reversed.

步进电机Python脚本示例

这是副本 步per motor script I used to rotate the 步per motor. It uses the R体育彩票31选7.GPIO library 和 defines a 4-step 和 8-step sequence.

#!/usr/bin/python
# Import required libraries
import sys
import time
import R体育彩票31选7.GPIO as  通用输入输出 

# Use BCM  通用输入输出  references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)

#定义要使用的GPIO信号
#物理引脚11,15,16,18
#GPIO17,GPIO22,GPIO23,GPIO24
步长= [17,22,23,24]

# Set all pins as output
for pin in Step体育彩票31选7ns:
  打印"Setup pins"
   通用输入输出 .setup(pin,GPIO.OUT)
   通用输入输出 .output(pin, False)

# Define advanced sequence
# as shown in manufacturers datasheet
Seq = [[1,0,0,1],
       [1,0,0,0],
       [1,1,0,0],
       [0,1,0,0],
       [0,1,1,0],
       [0,0,1,0],
       [0,0,1,1],
       [0,0,0,1]]

StepCount = len(Seq)
StepDir = 1 # Set to 1 or 2 对于 clockwise
            # Set to -1 or -2 对于 anti-clockwise

# Read wait time from command line
if len(sys.argv)>1:
  WaitTime = int(sys.argv [1])/ float(1000)
else:
  WaitTime = 10/float(1000)

# Initialise variables
StepCounter = 0

# Start main loop
while True:

  打印StepCounter,
  打印Seq[StepCounter]

  对于 pin in range(0, 4):
    xpin = Step体育彩票31选7ns [pin]#
    如果Seq [StepCounter] [pin]!= 0:
      打印" Enable  通用输入输出  %i" %(xpin)
       通用输入输出 .output(xpin,True)
     其他: 
       通用输入输出 .output(xpin,假)

  StepCounter + = StepDir

  #如果我们到达序列的末尾
  # 开始 again
  如果(StepCounter>=StepCount):
    StepCounter = 0
  如果(StepCounter<0):
    StepCounter = StepCount+StepDir

  #等待前进
  time.sleep(等待时间)

您 can download it directly to your 体育彩票31选7 using :

wget //bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/stepper.py

该脚本需要使用“sudo” :

须藤  蟒蛇  步per.py

按Ctrl-C退出。

步骤等待时间

该脚本在每个步骤之间增加了一个小的延迟,以使电动机有足够的时间赶上来。在本示例中,默认等待时间设置为0.01秒(10毫秒)。 要更改旋转速度,您可以更改此 值。我发现我可以在电动机停止工作之前将其减少到4毫秒。如果脚本运行太快,则电动机控制器可以’不要跟上。该性能可能会因您的电动机及其控制器而异。

要指定其他等待时间,您可以使用以下命令在命令行中传递毫秒数作为参数:

须藤  蟒蛇  步per.py 20

其中20是毫秒数。

步骤顺序

The complete 步 sequence consists of 8 步s. If StepDir is set to -2 or 2 the number of 步s is reduced to 4.

4步顺序更快,但扭矩更低。它’握住电机主轴很容易停止旋转。 8步顺序较慢,但转矩要高得多。对于我的转盘应用程序,我更喜欢转矩而不是速度,因此我将使用8步序列。

最后的想法

您 can now control a 步per motor using a Raspberry 体育彩票31选7 和 a 蟒蛇 script. If you add another motor you’我有一个小型机器人的开始!

分享。

54条留言

  1. 据我了解,选择两个输入时,转矩较高,因为线圈数是原来的两倍“activated”。在这种情况下,请确定您的8步序列确实执行了高扭矩转(2输入),低扭矩转(1输入),高扭矩转(2输入),低扭矩转(1输入)…

    我可能错了,但认为您可能没有使用全部可用扭矩。

    • 数据表中的官方步骤是8个步骤。 4步版本只是我尝试的版本,因为它很容易在Python脚本中实现。我认为您的发言是正确的,但我认为’这就是您必须驱动电动机的方式。

    • 是的你可以。只要5V电源可以提供电流,您就可以’有4个GPIO输出来驱动每个电机,您可以添加更多。从技术上讲,您可以使用16个GPIO引脚添加4个。额定电源为1A’体育彩票31选7接好后,在5V引脚上可以使用300mA的电流’s 700mA.

  2. 感谢这篇文章,我几乎可以很快使步进电机旋转。我发现我需要增加几分之一秒的WaitTime,否则会嗡嗡响但没有旋转。可能是目前的事,但现在我’我很高兴能够超越LED闪烁而毕业。

    • 我认为步进电机有时需要一些时间才能完成“step”在应用下一个序列之前。一世’我想知道由于新版本的R体育彩票31选7.GPIO库(0.3.1a)快得多,我是否需要重新引入一个小的延迟。

  3. 为了什么’值得的是,此主循环消除了昂贵的数组查找。它必须更有效,因为我还需要0.001的延迟

    #alt. loop
    mask = 3 # set to 1 or 3
    而True:
    # 打印mask
    通用输入输出 .output(24,mask & 1)
    通用输入输出 .output(25,mask & 2)
    通用输入输出 .output(8, mask & 4)
    通用输入输出 .output(7, mask & 8)
    面具=(((面具& 1)<>1
    time.sleep(0.003)

  4. pingback: Controlling a 步per motor 28BYI-48 与 a Raspberry 体育彩票31选7 | defendtheplanet.net

  5. 嗨,马特,
    自从你’ve评论了我的源代码版本,我只想提及一下,如果您在使用GPIO后不进行GPIO切换,电机会变热。
    Thanks anyways, this page is a good 开始 与 步per motors.

    • 威廉·福斯特

      我注意到相反的情况!

      我的马达’通常将其连接到+ 12V,并且当GPIO关闭时,线圈可能连接到0V。当我的电动机什么也不做时,它变得非常烫是很不直观的!

  6. 戴夫·巴恩威尔

    Thanks 对于 your 步per motor.py program, but I keep getting
    文件“stepper motor.py” , line 45, in
    通用输入输出 .output(xpin,True)
    RuntimeError:尚未将GPIO通道设置为OUTPUT

    我检查过措辞,和你的一样
    有什么建议

    再次感谢
    戴夫·巴恩威尔

    • 该错误表示第33-39行未正确配置GPIO引脚。在您的错误消息中说第45行是“GPIO.output(xpin,True)”. That doesn’直到68行出现在我的脚本中,所以我怀疑你’文件中缺少一些代码。一世’ve将脚本的副本上传到了我的Bitbucket帐户,并更新了帖子以包含下载链接。使用wget将其直接下载到您的体育彩票31选7上,然后重试。

  7. 我配置了此代码(马特’的原始版本)在新的R体育彩票31选7 B +上实现了梦想。然后,我分别尝试了0.001和0.0的速度,它们都同样起作用。寻找一些代码以转到特定点(即向前或向后旋转x步)和/或向前或向后旋转x度,但是我’同时将进行实验。谢谢你的“start” 马特 .

  8. 嗨,马特
    thanks i try the code 和 i got good result . now i look 对于 a code 对于 controlling the number of 步s .ie if i want to 停 the motor after 100 rotation ,any code is available 对于 this purpoe pls help

  9. 嗨,您好
    只是想学体育彩票31选7& 蟒蛇

    I have this script running 与 the 步s moving 上 the 屏幕 , the LED ’闪烁,但电机不运转

    任何想法

    戴夫

  10. 我已正确接线。指示灯同步闪烁,但电机不转动。电机变热。如图所示,使用板外的5伏电压。我需要更改什么?

    • Try increasing the time delay. Also try physically twisting the motor axle at the same time. One of my cheap 步per motors was stuck but 开始ed turning 与 a quick twist.

      • 马特,感谢您的协助。电机实际上在运动,但是速度太慢,我不知道它在前进。我更改了时间延迟,现在速度很快。您是否推荐任何可以使用这种小马达扩展的站点?想要使一个方向快速移动,停止并更快地向另一个方向移动的代码。以及需要输入来启动,停止和改变速度的代码。再次感谢您的迅速答复。由于您向新人提供信息的程度很高,因此我在您的网站上花费了很多时间。史蒂夫·乔普林,美国密苏里州

  11. 布莱恩·格劳堡

    我为什么可以’不要使用外部5V电源(两个地都共用),而不要使用体育彩票31选7 ’s?如果可以,我想知道是否在控制器板和体育彩票31选7之间使用电平转换器?’t be a good idea.

  12. 如何在单个raspberrypi上连接2个步进电机?我需要两个控制板吗?如果是这样,那么可以将2个控制板连接到单个树莓派?请尽快替换。一世’我的项目要在2周内完成。一世’我是树莓派的新手。

    • 您 can connect two 步per motors 和 you would need two control boards. The second board would be connected to another 4 available 通用输入输出 pins. The 蟒蛇 code would need to be modified to use those 4 pins.

  13. 威廉·福斯特

    Thanks so much 对于 the info 和 the code, got my motor going 与 上 ly some minor troubles.

    一些对我有帮助的事情:
    也许要注意,树莓派2(和型号b)具有不同的GPIO引脚排列。
    Please 对于 future people change the code so 上 line 37 it casts to a float rather than int. I was trying to get my motor to run quite slow so I did $sudo 蟒蛇 步per.pi 500.
    Unfortunately as an int this evaluates to 0 和 waits 对于 0 seconds.

    • 嗨,威廉,我’更改了我在示例中使用的GPIO引脚以避免GPIO27,因为这在B和B +配置之间发生了变化。一世’d更新了代码的BitBucket版本以修复等待时间问题,但没有’t更新页面上的版本。好的,现在就工作。

  14. 您好先生,请帮我显示错误如下
    该怎么办
    [追踪(最近通话):
    文件“/home/pi/stepper1.py”, line 20, in
    通用输入输出 .setup(pin,GPIO.OUT)
    RuntimeError:无法访问/ dev / mem。尝试以root身份运行!]

  15. 嗨,谢谢你的信息。顺时针方向对我来说效果很好,但我可以’使其不能逆时针旋转,我的电机有故障还是做错了什么?我有一个Model B版本1.0,并且在我的代码中使用了物理引脚11、15、16和18,以及步进引脚[17,22,23,24]。一世’d非常感谢您的帮助。谢谢。

  16. 这对我的设置非常有效,我要做的就是更改引脚号。我试图将电动机部分的实际运动纳入功能,想知道这有多容易?

    香港专业教育学院一直在尝试:
    def mover():
    对于 pin in range(0, 4):
    xpin = Step体育彩票31选7ns [pin]
    打印StepCounter
    打印pin
    如果Seq [StepCounter] [pin]!= 0:
    打印” Step %i Enable %i” %(StepCounter,xpin)
    通用输入输出 .output(xpin,True)
    其他:
    通用输入输出 .output(xpin,假)

    StepCounter + = StepDir

    #如果我们到达序列的末尾
    # 开始 again
    如果(StepCounter>=StepCount):
    StepCounter = 0
    如果(StepCounter<0):
    StepCounter = StepCount

    #等待前进
    time.sleep(等待时间)

    而True:
    mover()

    但是,这行不通吗?什么需要传递给此函数?

  17. 那里’s代码中的错误,其中StepDir = -2。它从0到7换行(应为0到6)。

    更换

    如果(StepCounter>=StepCount):
    StepCounter = 0
    如果(StepCounter<0):
    StepCounter = StepCount

    StepCounter%= len(Seq)

    修理。

    Also, the full 步 logic should have two phases 上 at all times (i.e. the 步s 与 two outputs set to 上 e). Move the two phase arrays to even slots to fix it.

    • 嗨,威尔,我’ve updated the sequence so it 开始s 与 two phases energised. I’ve also corrected a bug that got the sequencing wrong 对于 negative 步s. Should work much better now.

  18. 萨巴·科勒(Csaba Koller)

    你好

    The cycle skips 上 e 步 in the sequence. I think the = sign in line 63 is superfluous.

    如果(StepCounter>=StepCount):
    
    • 您’对。排序不正确。一世’进行了一些更改,它应该正确处理-2,-1、1和2的StepDir设置。’ve更新了打印语句,使顺序更加明显。

  19. 嘿,你能帮我吗?

    我希望引擎仅旋转一次而不会连续循环。

    My Speed 对于 my Motor is:

    如果len(sys.argv)>1:
    WaitTime = int(sys.argv [1])/ float(1000)
    其他:
    WaitTime = 0.4 / float(1000)

    我希望你能理解我想要的。

    您能告诉我我需要更改脚本吗?

    ps: sry 对于 my bad englisch i come from ger.

    • 您 would need to replace the “while true” line 与 a 对于 loop so it 停ped moving after a certain number of 步s. The while loop keeps the motor 步ping through the sequence.

  20. 通过使用您的代码,是的,电动机可以一直运行。一世’我是一个写代码的新手,所以我不’t know how to ”stop” the motor as i reached the desire seq 步 that i want.

  21. 嗨,马特,

    您 Mention the pins you are wiring up:

    Inp1(P1-18)
    Inp2(P1-22)
    Inp3(P1-24)
    Inp4(P1-26)

    然后在代码中使用其他集合:
    #定义要使用的GPIO信号
    #物理引脚11,15,16,18
    #GPIO17,GPIO22,GPIO23,GPIO24
    步长= [17,22,23,24]

  22. 太棒了!我一直在到处寻求帮助,大多数事情都试图将您推向arduino板,我想控制一台电动机,并认为那已经过头了。现在我要破解此代码,我们正在使用它来控制计算机科学团队’s vending machine.

  23. 您好,使用了您的代码,它说:

    xpin = Step体育彩票31选7ns [pin] if Seq [StepCounter] [pin]!= 0:
    ^
    SyntaxError:语法无效

    我该如何解决?谢谢

    • 您需要在“if”。该站点上的代码格式化程序感到困惑,并删除了换行符。最简单的解决方案是直接从我的Bitbucket存储库下载文件,而不是从网页上剪切粘贴。

  24. “#物理引脚11,15,16,18
    #GPIO17,GPIO22,GPIO23,GPIO24
    步长= [17,22,23,24]”

    感谢您的指导!您能解释一下物理引脚和GPIO / Step体育彩票31选7ns之间的区别吗?别针?我可以’t弄清楚为什么要区分它们。那么物理引脚11是步骤引脚17?物理引脚15是Step体育彩票31选7n 22?如何建立这种关联?为什么呢’物理引脚和GPIO / Step体育彩票31选7n编号相同吗?

发表评论

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.