步进电机28BYJ-48反转

By | 2014/02/20

步进电机应该是可正转,也可以反转的。但是在arduino测试后,设置step不管正数还是负数都是同一个方向转动。这是由于库文件是针对4拍的,而步进电机28BYJ-48为8拍,所以控制有问题,解决方案如下:

直接替换stepper.cpp里面的代码吧
/*
Stepper.cpp - - Stepper library for Wiring/Arduino - Version 0.4

Original library (0.1) by Tom Igoe.
Two-wire modifications (0.2) by Sebastian Gassner
Combination version (0.3) by Tom Igoe and David Mellis
Bug fix for four-wire (0.4) by Tom Igoe, bug fix from Noah Shibley

Drives a unipolar or bipolar stepper motor using 2 wires or 4 wires

When wiring multiple stepper motors to a microcontroller,
you quickly run out of output pins, with each motor requiring 4 connections.

By making use of the fact that at any time two of the four motor
coils are the inverse of the other two, the number of
control connections can be reduced from 4 to 2.

A slightly modified circuit around a Darlington transistor array or an L293 H-bridge
connects to only 2 microcontroler pins, inverts the signals received,
and delivers the 4 (2 plus 2 inverted ones) output signals required
for driving a stepper motor.

The sequence of control signals for 4 control wires is as follows:

Step C0 C1 C2 C3
1 1 0 1 0
2 0 1 1 0
3 0 1 0 1
4 1 0 0 1

The sequence of controls signals for 2 control wires is as follows
(columns C1 and C2 from above):

Step C0 C1
1 0 1
2 1 1
3 1 0
4 0 0

The circuits can be found at

http://www.arduino.cc/en/Tutorial/Stepper

*/

#include “Arduino.h”
#include “Stepper.h”

/*
* two-wire constructor.
* Sets which wires should control the motor.
*/
Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2)
{
this->step_number = 0; // which step the motor is on
this->speed = 0; // the motor speed, in revolutions per minute
this->direction = 0; // motor direction
this->last_step_time = 0; // time stamp in ms of the last step taken
this->number_of_steps = number_of_steps; // total number of steps for this motor

// Arduino pins for the motor control connection:
this->motor_pin_1 = motor_pin_1;
this->motor_pin_2 = motor_pin_2;

// setup the pins on the microcontroller:
pinMode(this->motor_pin_1, OUTPUT);
pinMode(this->motor_pin_2, OUTPUT);

// When there are only 2 pins, set the other two to 0:
this->motor_pin_3 = 0;
this->motor_pin_4 = 0;

// pin_count is used by the stepMotor() method:
this->pin_count = 2;
}

/*
* constructor for four-pin version
* Sets which wires should control the motor.
*/

Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4)
{
this->step_number = 0; // which step the motor is on
this->speed = 0; // the motor speed, in revolutions per minute
this->direction = 0; // motor direction
this->last_step_time = 0; // time stamp in ms of the last step taken
this->number_of_steps = number_of_steps; // total number of steps for this motor

// Arduino pins for the motor control connection:
this->motor_pin_1 = motor_pin_1;
this->motor_pin_2 = motor_pin_2;
this->motor_pin_3 = motor_pin_3;
this->motor_pin_4 = motor_pin_4;

// setup the pins on the microcontroller:
pinMode(this->motor_pin_1, OUTPUT);
pinMode(this->motor_pin_2, OUTPUT);
pinMode(this->motor_pin_3, OUTPUT);
pinMode(this->motor_pin_4, OUTPUT);

// pin_count is used by the stepMotor() method:
this->pin_count = 8;
}

/*
Sets the speed in revs per minute

*/
void Stepper::setSpeed(long whatSpeed)
{
this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
}

/*
Moves the motor steps_to_move steps. If the number is negative,
the motor moves in the reverse direction.
*/
void Stepper::step(int steps_to_move)
{
int steps_left = abs(steps_to_move); // how many steps to take

// determine direction based on whether steps_to_mode is + or -:
if (steps_to_move > 0) {this->direction = 1;}
if (steps_to_move < 0) {this->direction = 0;}

// decrement the number of steps, moving one step each time:
while(steps_left > 0) {
// move only if the appropriate delay has passed:
if (millis() – this->last_step_time >= this->step_delay) {
// get the timeStamp of when you stepped:
this->last_step_time = millis();
// increment or decrement the step number,
// depending on direction:
if (this->direction == 1) {
this->step_number++;
if (this->step_number == this->number_of_steps) {
this->step_number = 0;
}
}
else {
if (this->step_number == 0) {
this->step_number = this->number_of_steps;
}
this->step_number–;
}
// decrement the steps left:
steps_left–;
// step the motor to step number 0, 1, 2, or 3:
stepMotor(this->step_number % 8);
}
}
}

/*
* Moves the motor forward or backwards.
*/
void Stepper::stepMotor(int thisStep)
{
if (this->pin_count == 2) {
switch (thisStep) {
case 0: /* 01 */
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
break;
case 1: /* 11 */
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, HIGH);
break;
case 2: /* 10 */
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
break;
case 3: /* 00 */
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, LOW);
break;
}
}
if (this->pin_count == 4) {
switch (thisStep) {
case 0: // 1010
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
break;
case 1: // 0110
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, HIGH);
digitalWrite(motor_pin_4, LOW);
break;
case 2: //0101
digitalWrite(motor_pin_1, LOW);
digitalWrite(motor_pin_2, HIGH);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
break;
case 3: //1001
digitalWrite(motor_pin_1, HIGH);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
digitalWrite(motor_pin_4, HIGH);
break;
}
}
if (this->pin_count == 8) {
switch (thisStep) {
case 0:
digitalWrite(motor_pin_1,LOW);
digitalWrite(motor_pin_2,LOW);
digitalWrite(motor_pin_3,LOW);
digitalWrite(motor_pin_4,HIGH);
break;
case 1:
digitalWrite(motor_pin_1,LOW);
digitalWrite(motor_pin_2,LOW);
digitalWrite(motor_pin_3,HIGH);
digitalWrite(motor_pin_4,HIGH);
break;
case 2:
digitalWrite(motor_pin_1,LOW);
digitalWrite(motor_pin_2,LOW);
digitalWrite(motor_pin_3,HIGH);
digitalWrite(motor_pin_4,LOW);
break;
case 3:
digitalWrite(motor_pin_1,LOW);
digitalWrite(motor_pin_2,HIGH);
digitalWrite(motor_pin_3,HIGH);
digitalWrite(motor_pin_4,LOW);
break;
case 4:
digitalWrite(motor_pin_1,LOW);
digitalWrite(motor_pin_2,HIGH);
digitalWrite(motor_pin_3,LOW);
digitalWrite(motor_pin_4,LOW);
break;
case 5:
digitalWrite(motor_pin_1,HIGH);
digitalWrite(motor_pin_2,HIGH);
digitalWrite(motor_pin_3,LOW);
digitalWrite(motor_pin_4,LOW);
break;
case 6:
digitalWrite(motor_pin_1,HIGH);
digitalWrite(motor_pin_2,LOW);
digitalWrite(motor_pin_3,LOW);
digitalWrite(motor_pin_4,LOW);
break;
case 7:
digitalWrite(motor_pin_1,HIGH);
digitalWrite(motor_pin_2,LOW);
digitalWrite(motor_pin_3,LOW);
digitalWrite(motor_pin_4,HIGH);
break;
}
}
}

/*
version() returns the version of the library:
*/
int Stepper::version(void)
{
return 4;
}

 

修改过的地方加红标示了,也可以修改对应的地方。

ps:大家可以关注下文章下面老赵的回复,方便使用。

3 thoughts on “步进电机28BYJ-48反转

  1. 老赵

    终于测出来了,费了好大劲!
    1.这种电机在实际例子中要“#define STEPS 4096”,即4096步;
    2.Stepper.cpp中还要增加一句,在“stepMotor(this->step_number % 8);”之后增加1句延迟:delay(1);不然你试试,几乎不转动。

    Reply
    1. admin Post author

      嗯,当时确实发现步进有问题,会出现你说的这个几乎不动的情况。我当时没解决,现在没时间捣鼓arduino了。

      Reply
  2. 老赵

    总结得不错,今天也发现这个问题了。但有2个小问题:
    1.这一句代码修改了(%4->%8)没标黄:stepMotor(this->step_number % 8);
    2.这种电机在实际例子中“#define STEPS 512”定义多少步呢?好像64或512都不合适,我还在结合代码在分析中。
    找不到你的联系方式,方便了加我QQ吧:154527723,一起学习arduino。

    Reply

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据