关于自己写的一个两轴步进电机云台的库函数,求助...
本帖最后由 highplay86 于 2012-10-19 17:45 编辑最近在搞一个履带机器人,上面需要用到一个两轴的步进电机云台,为了编写程序更快捷高效,于是花时间自己写了一个专门驱动这个云台的库函数...其实原理简单的不能再简单....
就是写一个库函数,打包同时控制两个步进电机的函数调用,具体的代码如下...
#ifndef Movetable_h
#define Movetable_h
class Movetable
{
private:
int _stepper1A1pin;
int _stepper1A2pin;
int _stepper1B1pin;
int _stepper1B2pin;
int _stepper2A1pin;
int _stepper2A2pin;
int _stepper2B1pin;
int _stepper2B2pin;
public:
Movetable(int _stepper1A1pin,int _stepper1A2pin,int _stepper1B1pin,int _stepper1B2pin,
int _stepper2A1pin,int _stepper2A2pin,int _stepper2B1pin,int _stepper2B2pin);
void setSpeed(float _speed);
void left_Rotate(float _speed);
void right_Rotate(float _speed);
void up_Rotate(float _speed);
void down_Rotate(float _speed);
void left_up_Rotate(float _speed);
void left_down_Rotate(float _speed);
void right_up_Rotate(float _speed);
void right_down_Rotate(float _speed);
void stop();
};
以上是定义的库函数的头文件说明
以下是库函数主体:
/**************************************************
两轴步进电机云台驱动库函数
编写人:highplay86
时间:2012/10/17
***************************************************/
#include "Arduino.h"
#include "Movetable.h"
#include "Stepper.h"
#define STEPS 100// 这里设置步进电机旋转一圈是多少步
Movetable::Movetable(int _step1A1pin,int _step1A2pin,int _step1B1pin,int _step1B2pin,
int _step2A1pin,int _step2A2pin,int _step2B1pin,int _step2B2pin)
{
_stepper1A1pin=_step1A1pin;
_stepper1A2pin=_step1A2pin;
_stepper1B1pin=_step1B1pin;
_stepper1B2pin=_step1B2pin;
_stepper2A1pin=_step2A1pin;
_stepper2A2pin=_step2A2pin;
_stepper2B1pin=_step2B1pin;
_stepper2B2pin=_step2B2pin;
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
}
void Movetable::setSpeed(float _speed)
{
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
stepper1.setSpeed(_speed);
stepper2.setSpeed(_speed);
}
void Movetable::left_Rotate(float _speed)
{
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
stepper1.step(100);
delay(2);
stepper1.setSpeed(300-(_speed/521)*300);
}
void Movetable::right_Rotate(float _speed)
{
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
stepper1.step(-100);
delay(2);
stepper1.setSpeed(300-(_speed/521)*300);
}
void Movetable::up_Rotate(float _speed)
{
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
stepper2.step(100);
delay(2);
stepper2.setSpeed(300-(_speed/521)*300);
}
void Movetable::down_Rotate(float _speed)
{
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
stepper2.step(-100);
delay(2);
stepper2.setSpeed(300-(_speed/521)*300);
}
void Movetable::left_up_Rotate(float _speed)
{
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
stepper1.step(100);
delay(1);
stepper1.setSpeed(300-(_speed/521)*300);
stepper2.step(100);
delay(1);
stepper2.setSpeed(300-(_speed/521)*300);
}
void Movetable::left_down_Rotate(float _speed)
{
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
stepper1.step(100);
delay(1);
stepper1.setSpeed(300-(_speed/521)*300);
stepper2.step(-100);
delay(1);
stepper2.setSpeed(((_speed-521)/521)*300);
}
void Movetable::right_up_Rotate(float _speed)
{
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
stepper1.step(-100);
delay(1);
stepper1.setSpeed(((_speed-521)/521)*300);
stepper2.step(100);
delay(1);
stepper2.setSpeed(300-(_speed/521)*300);
}
void Movetable::right_down_Rotate(float _speed)
{
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
stepper1.step(-100);
delay(1);
stepper1.setSpeed(((_speed-521)/521)*300);
stepper2.step(-100);
delay(1);
stepper2.setSpeed(((_speed-521)/521)*300);
}
void Movetable::stop()
{
Stepper stepper1(STEPS, _stepper1A1pin, _stepper1A2pin, _stepper1B1pin, _stepper1B2pin);
Stepper stepper2(STEPS, _stepper2A1pin, _stepper2A2pin, _stepper2B1pin, _stepper2B2pin);
stepper1.step(0);
stepper2.step(0);
修改了好多次...到上面这个版本...终于能够驱动一个步进电机了...不过问题就是,只能驱动一个步进电机,另一个就是不动...
测试过后发现是程序的问题,库函数主体程序中Stepper1控制的那个通道控制正常...Stepper2控制就不正常...
下方是写的一个测试这个库的测试程序:
#include <Stepper.h>
#include <Movetable.h>
int xpotPin = 0;//设置模拟口0为X的信号输入端口
int ypotPin = 1;//设置模拟口1为Y的信号输入端口
int xval=0; //设置变量
int yval=0;
long value=0;
float val;
// attached to设置步进电机的步数和引脚
Movetable movetable(2,3,4,5,8,9,10,11);
void setup()
{
Serial.begin(9600);//设置波特率为9600
movetable.setSpeed(300);
}
void loop ()
{
xval = analogRead(xpotPin); //xval变量为从0信号口读取到的数值
yval = analogRead(ypotPin); //yval变量为从1信号口读取到的数值
Serial.print(xval);//显示xval 变量数值
Serial.print(" and ");
Serial.println(yval);//显示yval 变量数值
delay(200);
movetable.right_Rotate(2);
movetable.left_Rotate(2);
movetable.up_Rotate(2);
movetable.down_Rotate(2);
// 获取传感器读数
程序中的X,Y是一个PS2摇杆,串口打印函数仅仅是为了判断程序有无在执行Loop循环...我发现只要写进了Stepper2通道的执行程序,Loop函数就只执行一次...
如下是测试视频:
http://v.youku.com/v_show/id_XNDY0MDExMzU2.html
如果把测试代码中最后两行Stepper2的去掉,驱动就正常了...
#include <Stepper.h>
#include <Movetable.h>
int xpotPin = 0;//设置模拟口0为X的信号输入端口
int ypotPin = 1;//设置模拟口1为Y的信号输入端口
int xval=0; //设置变量
int yval=0;
long value=0;
float val;
// attached to设置步进电机的步数和引脚
Movetable movetable(2,3,4,5,8,9,10,11);
void setup()
{
Serial.begin(9600);//设置波特率为9600
movetable.setSpeed(300);
}
void loop ()
{
xval = analogRead(xpotPin); //xval变量为从0信号口读取到的数值
yval = analogRead(ypotPin); //yval变量为从1信号口读取到的数值
Serial.print(xval);//显示xval 变量数值
Serial.print(" and ");
Serial.println(yval);//显示yval 变量数值
delay(200);
movetable.right_Rotate(2);
movetable.left_Rotate(2);
// 获取传感器读数
}
测试视频如下:
http://v.youku.com/v_show/id_XNDY0MDExNzI0.html
我检查了库文件好久了,实在是没发现哪不对劲的...求解......
页:
[1]