关于Arduino 步进电机Stepper库的一些想法
官方提供了一些库,使Arduino入门起来更加快速,我们连原理都不用懂,就能通过函数控制终端。但是,这样也带来了很多的缺陷,比如,库函数的功能有限,有些无法实现。然后还有库函数因为要考虑其他的情况,你是四线的还是两线的,于是整个程序就会写的很麻烦。
我想用Sony无线手柄控制电机停止、顺时针、逆时针转动,按Start键能启动。但是库里根本没有这个功能。
还有我发现,一旦我的无线手柄里面加入了电机的相关程序,无线手柄与接收器的通信就会变迟钝,往往需要按着才能等到电机反向转动,而且有时候我改变方向,结果它转了一圈又回到原来方向了,完全就是乱套了。不过,中断还是能照常反应,但是还是会出现延迟现象。
后来看了一下代码,库文件只有在转完一圈才会跳出循环,所以按键的消息根本没办法马上反应。
后来就直接根据库文件写了函数,反应很迅速!!!!
下面是库文件的函数
1: #ifndef Stepper_h
2: #define Stepper_h
3:
4: // library interface description
5: class Stepper {
6: public:
7: // constructors:
8: Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2);
9: Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4);
10:
11: // speed setter method:
12: void setSpeed(long whatSpeed);
13:
14: // mover method:
15: void step(int number_of_steps);
16:
17: int version(void);
18:
19: private:
20: void stepMotor(int this_step);
21:
22: int direction; // Direction of rotation
23: int speed; // Speed in RPMs
24: unsigned long step_delay; // delay between steps, in ms, based on speed
25: int number_of_steps; // total number of steps this motor can take
26: int pin_count; // whether you're driving the motor with 2 or 4 pins
27: int step_number; // which step the motor is on
28:
29: // motor pin numbers:
30: int motor_pin_1;
31: int motor_pin_2;
32: int motor_pin_3;
33: int motor_pin_4;
34:
35: long last_step_time; // time stamp in ms of when the last step was taken
36: };
37:
38: #endif
39:
1: #include "Arduino.h"
2: #include "Stepper.h"
3:
4: /*
5: * two-wire constructor.
6: * Sets which wires should control the motor.
7: */
8: Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2)
9: {
10: this->step_number = 0; // which step the motor is on
11: this->speed = 0; // the motor speed, in revolutions per minute
12: this->direction = 0; // motor direction
13: this->last_step_time = 0; // time stamp in ms of the last step taken
14: this->number_of_steps = number_of_steps; // total number of steps for this motor
15:
16: // Arduino pins for the motor control connection:
17: this->motor_pin_1 = motor_pin_1;
18: this->motor_pin_2 = motor_pin_2;
19:
20: // setup the pins on the microcontroller:
21: pinMode(this->motor_pin_1, OUTPUT);
22: pinMode(this->motor_pin_2, OUTPUT);
23:
24: // When there are only 2 pins, set the other two to 0:
25: this->motor_pin_3 = 0;
26: this->motor_pin_4 = 0;
27:
28: // pin_count is used by the stepMotor() method:
29: this->pin_count = 2;
30: }
31:
32:
33: /*
34: * constructor for four-pin version
35: * Sets which wires should control the motor.
36: */
37:
38: Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4)
39: {
40: this->step_number = 0; // which step the motor is on
41: this->speed = 0; // the motor speed, in revolutions per minute
42: this->direction = 0; // motor direction
43: this->last_step_time = 0; // time stamp in ms of the last step taken
44: this->number_of_steps = number_of_steps; // total number of steps for this motor
45:
46: // Arduino pins for the motor control connection:
47: this->motor_pin_1 = motor_pin_1;
48: this->motor_pin_2 = motor_pin_2;
49: this->motor_pin_3 = motor_pin_3;
50: this->motor_pin_4 = motor_pin_4;
51:
52: // setup the pins on the microcontroller:
53: pinMode(this->motor_pin_1, OUTPUT);
54: pinMode(this->motor_pin_2, OUTPUT);
55: pinMode(this->motor_pin_3, OUTPUT);
56: pinMode(this->motor_pin_4, OUTPUT);
57:
58: // pin_count is used by the stepMotor() method:
59: this->pin_count = 4;
60: }
61:
62: /*
63: Sets the speed in revs per minute
64:
65: */
66: void Stepper::setSpeed(long whatSpeed)
67: {
68: this->step_delay = 60L * 1000L / this->number_of_steps / whatSpeed;
69: }
70:
71: /*
72: Moves the motor steps_to_move steps. If the number is negative,
73: the motor moves in the reverse direction.
74: */
75: void Stepper::step(int steps_to_move)
76: {
77: int steps_left = abs(steps_to_move); // how many steps to take
78:
79: // determine direction based on whether steps_to_mode is + or -:
80: if (steps_to_move > 0) {this->direction = 1;}
81: if (steps_to_move < 0) {this->direction = 0;}
82:
83:
84: // decrement the number of steps, moving one step each time:
85: while(steps_left > 0) {
86: // move only if the appropriate delay has passed:
87: if (millis() - this->last_step_time >= this->step_delay) {
88: // get the timeStamp of when you stepped:
89: this->last_step_time = millis();
90: // increment or decrement the step number,
91: // depending on direction:
92: if (this->direction == 1) {
93: this->step_number++;
94: if (this->step_number == this->number_of_steps) {
95: this->step_number = 0;
96: }
97: }
98: else {
99: if (this->step_number == 0) {
100: this->step_number = this->number_of_steps;
101: }
102: this->step_number--;
103: }
104: // decrement the steps left:
105: steps_left--;
106: // step the motor to step number 0, 1, 2, or 3:
107: stepMotor(this->step_number % 4);
108: }
109: }
110: }
111:
112: /*
113: * Moves the motor forward or backwards.
114: */
115: void Stepper::stepMotor(int thisStep)
116: {
117: if (this->pin_count == 2) {
118: switch (thisStep) {
119: case 0: /* 01 */
120: digitalWrite(motor_pin_1, LOW);
121: digitalWrite(motor_pin_2, HIGH);
122: break;
123: case 1: /* 11 */
124: digitalWrite(motor_pin_1, HIGH);
125: digitalWrite(motor_pin_2, HIGH);
126: break;
127: case 2: /* 10 */
128: digitalWrite(motor_pin_1, HIGH);
129: digitalWrite(motor_pin_2, LOW);
130: break;
131: case 3: /* 00 */
132: digitalWrite(motor_pin_1, LOW);
133: digitalWrite(motor_pin_2, LOW);
134: break;
135: }
136: }
137: if (this->pin_count == 4) {
138: switch (thisStep) {
139: case 0: // 1010
140: digitalWrite(motor_pin_1, HIGH);
141: digitalWrite(motor_pin_2, LOW);
142: digitalWrite(motor_pin_3, HIGH);
143: digitalWrite(motor_pin_4, LOW);
144: break;
145: case 1: // 0110
146: digitalWrite(motor_pin_1, LOW);
147: digitalWrite(motor_pin_2, HIGH);
148: digitalWrite(motor_pin_3, HIGH);
149: digitalWrite(motor_pin_4, LOW);
150: break;
151: case 2: //0101
152: digitalWrite(motor_pin_1, LOW);
153: digitalWrite(motor_pin_2, HIGH);
154: digitalWrite(motor_pin_3, LOW);
155: digitalWrite(motor_pin_4, HIGH);
156: break;
157: case 3: //1001
158: digitalWrite(motor_pin_1, HIGH);
159: digitalWrite(motor_pin_2, LOW);
160: digitalWrite(motor_pin_3, LOW);
161: digitalWrite(motor_pin_4, HIGH);
162: break;
163: }
164: }
165: }
166:
167: /*
168: version() returns the version of the library:
169: */
170: int Stepper::version(void)
171: {
172: return 4;
173: }
关于Arduino 步进电机Stepper库的一些想法的更多相关文章
- arduino中SCoop库的简单应用案例
转载:https://www.csdn.net/gather_27/MtTaggzsMDExMS1ibG9n.html arduino中SCoop库的简单应用案例首先这篇文章来在视频https://v ...
- arduino红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法
最近在调试红外遥控格力空调,在论坛中学到了不少东西.参考: (1)<解决问题系列(4)——红外编码分析利器使用> (2)<315Mhz模块传输替代315Mhz遥控器> 调试环境 ...
- 手把手教你看懂并理解Arduino PID控制库——引子
介绍 本文主要依托于Brett Beauregard大神针对Arduino平台撰写的PID控制库Arduino PID Library及其对应的帮助博客Improving the Beginner’s ...
- Arduino学习——u8glib库资料整理
第一部分,u8glib标准语法格式: 本文使用的是DFRobot出品的LCD12864 Shield V1.0 端口占用情况: SPI Com: SCK = 13, MOSI = 11, CS = 1 ...
- Arduino利用TimerOne库产生固定频率和占空比的方波
TimerOne地址: https://code.google.com/archive/p/arduino-timerone/downloads ex: #include "TimerOne ...
- Arduino 使用舵机库时 其它引脚输出怪异 解决方案
使用Servo.h时,不管你在初始化时用的是9还是10脚,都不要把这两个脚作为舵机以外的用途! 例: servo.attach(9); digitalWrite(10,1);//错,不能把第10脚用作 ...
- Arduino Micro USB库
USBCore.cpp #define D_DEVICE(_class,_subClass,_proto,_packetSize0,_vid,_pid,_version,_im,_ip,_is,_co ...
- Arduino下LCD1602综合探究(下)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法
一.前言: 上文中,笔者系统的阐述了1602的两种驱动方式,并简单的提到了Arduino的LiquidCrystal库.本文紧接上文,对以下两个问题进行更加深入的探讨:如何能够使1602对Arduin ...
- 如何编写自己的Arduino库?
一开始写Arduino 的时候很不习惯,没有main函数,因为好多东西都被隐藏了.一直想搞清楚,以便编写自己的库文件.于是研究一下午,下面是一些总结. Arduino工程的初步认识 一.目录规范 当你 ...
随机推荐
- 2、Spring的 IoC详解(第一个Spring程序)
Spring是为了解决企业应用开发的复杂性而创建的一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.在这句话中重点有两个,一个是IoC,另一个是AOP.今天我们讲第一个IoC. IoC概念 ...
- web页面开发相关基础
CSS是一种用于web的标准布局语言,可以控制版面.颜色以及元素和图像的大小和位置.HTML文档应该利用外部样式表来定义文档中使用的样式.JavaScript也应该放在外部文档中,这个文档应该只包含J ...
- MySQL(3)-索引
一.索引类型 在MySQL中,存储引擎使用索引,首先在索引中找到对应值,然后根据匹配的索引记录中找到对应的行. 无论是多么复杂的ORM工具,在精妙和复杂的索引面前都是"浮云".这里 ...
- MVC jsonModelBuilder
/// <summary> /// JsonModelBinderAttribute /// author:BearLee /// 2015/5/20 11:48:40 /// </ ...
- D - 小晴天老师系列——晴天的后花园
D - 小晴天老师系列——晴天的后花园 Time Limit: 10000/5000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Oth ...
- MATLAB将变量存储到EXCEL
代码如下: d = {'Time','Temperature'; 12,98; 13,99; 14,97}; xlswrite('testdata2.xls', d, 1, 'E1') 运行如下:
- Shell grep 和正则
在grep中正则有三种模式, 分别是基础(-G), 扩展(-E)和Perl(-P)模式 basic 模式 不支持\d, 支持\w \s \b. ?, +, {, |, (, and ) 在basic ...
- css3字体
1.定义个性化字体 @font-face{ font-family:字体名字; src:字体地址,可以多写几个用逗号隔开兼容浏览器 } div{ font-family:字体名字/*使用字体*/ } ...
- AIR文件操作:使用文件对象操作文件和目录 .
来源:http://blog.csdn.net/zdingxin/article/details/6635376 在AIR中可以方便的对本地文件操作,不过上次做了个项目,发现还是有不少不方便的地方,比 ...
- java的(PO,VO,TO,BO,DAO,POJO)包解释
java的(PO,VO,TO,BO,DAO,POJO)解释 action包 顾名思义请求,主要是和view 即我们所说的视图就是页面打交道,action类 是 操作方法,对于页 面Form 表单的操 ...