wjb711 发表于 2013-8-19 20:52:27

步进电机,走起!

本帖最后由 wjb711 于 2013-8-19 20:59 编辑

参考文档http://www.codelast.com/?p=5232
所需工具 步进电机一个, 步进驱动板一个, 如图(树老大的店有售, 本人不是托, 本人用的系从树老大的店采购)
友情给个树老大的广告:步进电机购买地址
http://raspi.taobao.com/category-743871825.htm?spm=a1z10.1.w5003-3008993771.25.jm7zAq&search=y&parentCatId=646415781&parentCatName=%CA%F7%DD%AE%C5%C9%C5%E4%BC%FE&catName=%B5%E7%BB%FA%CF%E0%B9%D8&scene=taobao_shop#bd





步进电机的接法



驱动板的接法如图


口述如下
int1->gpio0
int2->gpio1
int3->gpio2
int4->gpio3
电源要接5v和接地

程序如下(抄别人的)



/* moto.c
* A program to control a stepper motor through the GPIO on Raspberry Pi.
*
* Author: Darran Zhang
*/

#include <wiringPi.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

#define CLOCKWISE 1
#define COUNTER_CLOCKWISE 2

void delayMS(int x);
void rotate(int* pins, int direction);

int main(int argc,char* argv[]) {
if (argc < 4) {
    printf("Usage example: ./motor 0 1 2 3 \n");
    return 1;
}

/* number of the pins which connected to the stepper motor driver board */
int pinA = atoi(argv);
int pinB = atoi(argv);
int pinC = atoi(argv);
int pinD = atoi(argv);

int pins = {pinA, pinB, pinC, pinD};

if (-1 == wiringPiSetup()) {
    printf("Setup wiringPi failed!");
    return 1;
}

/* set mode to output */
pinMode(pinA, OUTPUT);
pinMode(pinB, OUTPUT);
pinMode(pinC, OUTPUT);
pinMode(pinD, OUTPUT);

delayMS(50);    // wait for a stable status
for (int i = 0; i < 500; i++) {
    rotate(pins, CLOCKWISE);
}

return 0;
}

/* Suspend execution for x milliseconds intervals.
*@param ms Milliseconds to sleep.
*/
void delayMS(int x) {
usleep(x * 1000);
}

/* Rotate the motor.
*@param pins   A pointer which points to the pins number array.
*@param directionCLOCKWISE for clockwise rotation, COUNTER_CLOCKWISE for counter clockwise rotation.
*/
void rotate(int* pins, int direction) {
for (int i = 0; i < 4; i++) {
    if (CLOCKWISE == direction) {
      for (int j = 0; j < 4; j++) {
      if (j == i) {
          digitalWrite(pins, 1); // output a high level
      } else {
          digitalWrite(pins, 0); // output a low level
      }
      }
    } else if (COUNTER_CLOCKWISE == direction) {
      for (int j = 0; j < 4; j++) {
      if (j == i) {
          digitalWrite(pins, 1); // output a high level
      } else {
          digitalWrite(pins, 0); // output a low level
      }
      }
    }
    delayMS(4);
}
}
然后编译
g++ motor.c -o motor -lwiringPi
最后运行
./motor 0 1 2 3
马达就转起来了

树老大 发表于 2013-8-19 20:56:24

前来支持。最好是树莓派使用不进店的全部过程,包括驱动起来的教程哦。貌似还没有这样的文章,有的也是杂七杂八不详细的。

xiaoma 发表于 2013-8-19 21:54:10

看楼主的图上 好像一个驱动板就只能带一个电机??好像驱动板上就一个插口

wjb711 发表于 2013-8-19 23:04:18

对,一个驱动板一个电机,或者用扩展版来实现两个电机的连接,不过我没试过

wjb711 发表于 2013-8-20 10:58:34

老外写的脚本过于复杂难懂, 我来写个简单的
原理就是分别赋予GPIO0,1,2,3 这4个脚高电平
举例
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
然后无限循环, 就可以让步进电机持续转下去
还有要注意的事项就是
设置高电平的时候至少要3毫秒以上 也就是我写的x=3
设置低电平还原的时候, 最好是1毫秒 也就是我写的y=1
最后发现其实步进电机转的没有想象的那么快, 不想马达一样快, 差不多两秒转一圈吧
/********** motor1.c ***************/
#include <wiringPi.h>
#include <stdlib.h>


int main()
{
if( wiringPiSetup() == -1 )
      exit( 1 );



    pinMode( 0, OUTPUT );
    pinMode( 1, OUTPUT );
    pinMode( 2, OUTPUT );
    pinMode( 3, OUTPUT );       
int x=3;
int y=1;
for (;;)
{
digitalWrite( 0, HIGH );
delay( x );
digitalWrite( 0, LOW );
delay( y );
digitalWrite( 1, HIGH );
delay( x );
digitalWrite( 1, LOW );
delay( y );
digitalWrite( 2, HIGH );
delay( x );
digitalWrite( 2, LOW );
delay( y );
digitalWrite( 3, HIGH );
delay( x );
digitalWrite( 3, LOW );
delay( y );


}
}
/********** motor1.c ***************/

wjb711 发表于 2013-8-20 12:05:38

控制步进电机正传和反转
通过侦测GPIO4的高低电平来实现
脚本如下
/********** motor2.c ***************/
#include <wiringPi.h>
#include <stdlib.h>


int main()
{
if( wiringPiSetup() == -1 )
      exit( 1 );



    pinMode( 0, OUTPUT );
    pinMode( 1, OUTPUT );
    pinMode( 2, OUTPUT );
    pinMode( 3, OUTPUT );   
    pinMode( 4, INPUT );
//增加GPIO4为判断引脚   
int x=3;
int y=1;
for (;;)
{
if (digitalRead(4) == 0)
//如果是低电平,默认还是原来的转法
{
digitalWrite( 0, HIGH );
delay( x );
digitalWrite( 0, LOW );
delay( y );
digitalWrite( 1, HIGH );
delay( x );
digitalWrite( 1, LOW );
delay( y );
digitalWrite( 2, HIGH );
delay( x );
digitalWrite( 2, LOW );
delay( y );
digitalWrite( 3, HIGH );
delay( x );
digitalWrite( 3, LOW );
delay( y );
}
else
//如果是高电平, 就反转, 把顺序倒转过来,3,2,1,0 分别接高电平
{
digitalWrite( 3, HIGH );
delay( x );
digitalWrite( 3, LOW );
delay( y );
digitalWrite( 2, HIGH );
delay( x );
digitalWrite( 2, LOW );
delay( y );
digitalWrite( 1, HIGH );
delay( x );
digitalWrite( 1, LOW );
delay( y );
digitalWrite( 0, HIGH );
delay( x );
digitalWrite( 0, LOW );
delay( y );
}

}
}
/********** motor2.c ***************/

实验结果是 如果GPIO4未接, 顺时针旋转
如果GPIO4接高3.3伏,逆时针旋转。

Chuyue 发表于 2013-8-22 09:36:06

高级,转速如何,可以做小车吗

wjb711 发表于 2013-8-22 10:00:52

Chuyue 发表于 2013-8-22 09:36 static/image/common/back.gif
高级,转速如何,可以做小车吗

转速约两秒一圈, 相当的慢, 不过扭力很大, 直接做小车的的话, 需要加齿轮放大转速

Chuyue 发表于 2013-8-22 10:08:06

wjb711 发表于 2013-8-22 10:00 static/image/common/back.gif
转速约两秒一圈, 相当的慢, 不过扭力很大, 直接做小车的的话, 需要加齿轮放大转速

了解!补字补字

unlucky 发表于 2013-8-22 14:08:41

多谢楼主分享
页: [1] 2
查看完整版本: 步进电机,走起!