关于delay的一个问题
我上个月刚刚开始学习ARDUINO,因为老师要求,所以全部自学。我目前的任务是要用UNO这个板子来控制三个DC MOTOR 和 两个 SERVO MOTOR。
在我写好程序后,我进行了测验,但是我发现竟然出现两个DC MOTOR同时转动,而且SERVO MOTOR完全不会转动的现象。
我猜想会不会是因为delay()引起的问题。
程序大致是这样子,写的很简单,有哪位高手能够帮帮我的忙吗?
//servo1 (s1) elbow of left arm
//dc motor1 (dc1) elbow of right arm
//servo2 (s2) gripper
//dc motor2 (dc2) body
//dc motoe3 (dc3) cloth at left hand
#include <Servo.h>
Servo s1;
Servo s2;
int interrupt = 2;
int dc11 = 3;
int dc12 = 4;
int dc21 = 5;
int dc22 = 6;
int dc31 = 7;
int dc32 = 8;
unsigned int a,i,j,n = 0
void setup(){
Serial.begin(9600);
pinMode(dc11,OUTPUT);
pinMode(dc12,OUTPUT);
pinMode(dc21,OUTPUT);
pinMode(dc22,OUTPUT);
pinMode(dc31,OUTPUT);
pinMode(dc32,OUTPUT);
s1.attach(12);
s2.attach(13);
}
void step1(){
digitalWrite(dc31,HIGH);
digitalWrite(dc32,LOW);
delay(1500);
digitalWrite(dc31,HIGH);
digitalWrite(dc32,HIGH);
digitalWrite(dc11,HIGH);
digitalWrite(dc12,LOW);
delay(2000);
digitalWrite(dc11,HIGH);
digitalWrite(dc12,HIGH);
for(i= 0; i < 100;i++);
{
s2.write(i);
delay(50);
}
digitalWrite(dc11,LOW);
digitalWrite(dc12,HIGH);
delay(2000);
digitalWrite(dc11,HIGH);
digitalWrite(dc12,HIGH);
}
void step2(){
digitalWrite(dc11,HIGH);
digitalWrite(dc12,LOW);
delay(2000);
for(j = 100; j > 0;j--)
{
s2.write(j);
delay(50);
}
digitalWrite(dc11,LOW);
digitalWrite(dc12,HIGH);
delay(2000);
digitalWrite(dc11,HIGH);
digitalWrite(dc12,HIGH);
}
void loop()
{
for(a = 0; a < 130;a++)
{
s1.write(a);
delay(50);
}
step1();
digitalWrite(dc21,HIGH);
digitalWrite(dc22,LOW);
delay(5000);
step2();
digitalWrite(dc31,LOW);
digitalWrite(dc32,HIGH);
delay(1500);
digitalWrite(dc31,HIGH);
digitalWrite(dc32,HIGH);
delay(10000);
step1();
digitalWrite(dc21,LOW);
digitalWrite(dc22,HIGH);
delay(5000);
step2();
for(n = 130; n > 0;n--)
{
s1.write(n);
delay(50);
}
}
你的判断是对的,先不管Setup(); 在loop()中,不能按顺序加延时,一圈下来该动的动了(停不下来),该不动的就不动了.应该把四个轮子的时间统一考虑,如a的延时也会是b的延时,不在后他的延时必须将a的延时考虑进去。 林定祥 发表于 2013-5-28 14:31 static/image/common/back.gif
你的判断是对的,先不管Setup(); 在loop()中,不能按顺序加延时,一圈下来该动的动了(停不下来),该不动的就不动 ...
"如a的延时也会是b的延时,不在后他的延时必须将a的延时考虑进去。"
这一句话没有理解,如果我在LOOP里面用延时,那不是后面越加越多?
我是要用TIMING的节奏么? 将各种需要的延时嵌套进行考虑,小延时应该在大延时之中。估计需要使用定时器,来分隔各种的延时,到时产生中断,根据中断来确定下一个动作。这样会清晰些。 尽量少用 delay
多用 比对时间的方式,
如果时间还没到,就跳过。
这样才不会让 delay 影响了整体程序 学长 发表于 2013-5-28 15:06 static/image/common/back.gif
尽量少用 delay
多用 比对时间的方式,
如果时间还没到,就跳过。
请问 比对时间是什么意思啊?
就是TIMER对么?
林定祥 发表于 2013-5-28 14:43 static/image/common/back.gif
将各种需要的延时嵌套进行考虑,小延时应该在大延时之中。估计需要使用定时器,来分隔各种的延时,到时产生 ...
大延时套小延时是什么意思啊?
我有一个想法,就是在程序的最后加一个WHILE(1),就是说让这个程序永远停在最后,这样子可以解决我上面那个问题吗?
czh007007 发表于 2013-5-28 22:26 static/image/common/back.gif
请问 比对时间是什么意思啊?
就是TIMER对么?
就是 Timer 的概念.. 不过比较像是 Tick 的想法
你可以看下 Library 的 Timer1 这个程式库.. arduino有个有趣的命令millis,这个命令是从系统启动后开始计数,没一毫秒作为计数单位,大概50天一个循环.可以利用这个命令,在需要时读一次数标记为millis1,加上你需要的延迟量,每次循环到时再次采样millis2,比对下millis2是否大于millis1加上的延迟量,不满足条件继续循环,到了执行动作。这样可以不影响各自动作。 学长 发表于 2013-5-28 23:07 static/image/common/back.gif
就是 Timer 的概念.. 不过比较像是 Tick 的想法
你可以看下 Library 的 Timer1 这个程式库..
好的,非常谢谢啦~~~ 林定祥 发表于 2013-5-29 21:22 static/image/common/back.gif
arduino有个有趣的命令millis,这个命令是从系统启动后开始计数,没一毫秒作为计数单位,大概50天一个循环.可以 ...
这个是不是只能对应一个动作呢?就是说不能出现类似于millis2,millis3 ,milli4之类的东西么? 可以啊,系统millis只有一个,但是你使用时可以将它当时的时间给x,y,z-------- czh007007 发表于 2013-5-31 11:00 static/image/common/back.gif
好的,非常谢谢啦~~~
:)
抱歉,您的帖子小于 10 个字符的限制
页:
[1]