raspberry pi GPIO 控制步进电机

  其它部分的工具(python-setuptools,python-dev)已经在初始化时安装。现在安装GPIO
sudo easy_install RPi.GPIO

  需要在root权限下调用。如果不想使用管理权限,也可以用第三方的WiringPi,使用easy_install直接安装。
  接上步进电机和驱动板。
image
板子是V2.0的,内存512M的,使用GPIO图如下:
Raspberry-Pi-GPIO-Layout-Revision-2

#!/bin/env python
# -*- coding:utf-8 -*-
# Revision:
# Date:        2012-12-11
# Author:      simonzhang
# Email:       simon-zzm@163.com
# Web:         www.simonzhang.net
# ------------------------------- 
import time
import RPi.GPIO as GPIO

#要使用的四个针脚
Pins = [17,18,22,23]

#初始化。使用BCM2835标准。具体对应要查说明
#http://elinux.org/RPi_BCM2835_GPIOs
GPIO.setmode(GPIO.BCM)
for pin in Pins:
    try:
        GPIO.setup(pin, GPIO.OUT)
        GPIO.output(pin, False)
    except:
        pass

# 顺时针旋转矩阵
Seq1 = []
Seq1 = range(0, 4)
Seq1[0] = [1,0,0,0]
Seq1[1] = [0,1,0,0]
Seq1[2] = [0,0,1,0]
Seq1[3] = [0,0,0,1]

# 逆时针旋转矩阵
Seq2 = []
Seq2 = range(0, 4)
Seq2[0] = [0,0,0,1]
Seq2[1] = [0,0,1,0]
Seq2[2] = [0,1,0,0]
Seq2[3] = [1,0,0,0]

#初始化步数
setup_count = 0
while 1:
  for set in range(0, 4):
      # 小于100步按照逆时针转,100步到200步之间按顺时针转
      print "setup %s" % setup_count
      if 100 < setup_count < 200:
          l = Seq1[set]
      else:
          l = Seq2[set]
      for ls in range(len(Pins)):
          if l[ls] == 1:
              GPIO.output(Pins[ls], True)
          else:
              GPIO.output(Pins[ls], False)
      # 大于200步初始化为0,否则加1
      if setup_count < 200:
          setup_count += 1
      else:
          setup_count = 0
      # 需要做一定延迟,最小延迟应该是0.01s
      time.sleep(0.1)

raspberry pi GPIO 控制步进电机 python 源码

5 thoughts on “raspberry pi GPIO 控制步进电机

  1. 你好。我用的是pi 1.0的板子,接上步进电机后启动python程序,电机好像一直在动,但是不会转。不知是什么原因。

    • 如果是驱动板上的灯正常和流水灯一样走,步进电机也有震动,但是不转的话,应该是,发送信号频率或者电压问题。你看我代码最后做了延迟,这个还要结合你的硬件驱动板判断。

    • 不知道你的步进电机驱动板是不是和我的一样。我的驱动板的测试代码如下
      #include
      unsigned char code F_Rotation[4]={0x02,0x04,0x08,0x10};//正转表格
      unsigned char code B_Rotation[4]={0x10,0x08,0x04,0x02};//反转表
      void Delay(unsigned int i)//延时
      {
      while(--i);
      }

      main()
      {
      unsigned char i;
      while(1)
      {
      for(i=0;i<4;i++) //4相
      {
      P1=F_Rotation[i]; //输出对应的相 可以自行换成反转表
      Delay(500); //改变这个参数可以调整电机转速
      }
      }
      }

      以上是单片机的C程序。
      所以延迟在2毫秒左右,要循环四次也就是8毫秒,在算上输出输入时间,大约是10毫秒处理完一次循环。所以我发送的时间是间隔100毫秒,是没有问题。步进电机单步运行幅度很小,所以要连续发送。并且你可以用纸片做个小指针在上面,看是否有动。如果还不行就检查一下电压能不能到5V,看看电机是否有故障。

  2. 非常感谢。按照你说的放了个纸片,原来会动啊。只不过转动的幅度很小。仔细看才能看出来。另外我把延迟改成了0.01s。

D.K进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注