|
本帖最后由 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函数就只执行一次...
如下是测试视频:
如果把测试代码中最后两行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);
- // 获取传感器读数
- }
复制代码
测试视频如下:
我检查了库文件好久了,实在是没发现哪不对劲的...求解......
|
|