极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16264|回复: 12

关于delay的一个问题

[复制链接]
发表于 2013-5-28 13:41:43 | 显示全部楼层 |阅读模式
我上个月刚刚开始学习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);
        }
}

回复

使用道具 举报

发表于 2013-5-28 14:31:35 | 显示全部楼层
你的判断是对的,先不管Setup(); 在loop()中,不能按顺序加延时,一圈下来该动的动了(停不下来),该不动的就不动了.应该把四个轮子的时间统一考虑,如a的延时也会是b的延时,不在后他的延时必须将a的延时考虑进去。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-28 14:36:03 | 显示全部楼层
林定祥 发表于 2013-5-28 14:31
你的判断是对的,先不管Setup(); 在loop()中,不能按顺序加延时,一圈下来该动的动了(停不下来),该不动的就不动 ...

"如a的延时也会是b的延时,不在后他的延时必须将a的延时考虑进去。"
这一句话没有理解,如果我在LOOP里面用延时,那不是后面越加越多?
我是要用TIMING的节奏么?
回复 支持 反对

使用道具 举报

发表于 2013-5-28 14:43:02 | 显示全部楼层
将各种需要的延时嵌套进行考虑,小延时应该在大延时之中。估计需要使用定时器,来分隔各种的延时,到时产生中断,根据中断来确定下一个动作。这样会清晰些。
回复 支持 反对

使用道具 举报

发表于 2013-5-28 15:06:20 | 显示全部楼层
尽量少用 delay
多用 比对时间的方式,
如果时间还没到,就跳过。
这样才不会让 delay 影响了整体程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-28 22:26:28 | 显示全部楼层
学长 发表于 2013-5-28 15:06
尽量少用 delay
多用 比对时间的方式,
如果时间还没到,就跳过。

请问 比对时间是什么意思啊?
就是TIMER对么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-28 22:27:54 | 显示全部楼层
林定祥 发表于 2013-5-28 14:43
将各种需要的延时嵌套进行考虑,小延时应该在大延时之中。估计需要使用定时器,来分隔各种的延时,到时产生 ...

大延时套小延时是什么意思啊?
我有一个想法,就是在程序的最后加一个WHILE(1),就是说让这个程序永远停在最后,这样子可以解决我上面那个问题吗?
回复 支持 反对

使用道具 举报

发表于 2013-5-28 23:07:14 | 显示全部楼层
czh007007 发表于 2013-5-28 22:26
请问 比对时间是什么意思啊?
就是TIMER对么?

就是 Timer 的概念.. 不过比较像是 Tick 的想法

你可以看下 Library 的 Timer1 这个程式库..
回复 支持 反对

使用道具 举报

发表于 2013-5-29 21:22:18 | 显示全部楼层
arduino有个有趣的命令millis,这个命令是从系统启动后开始计数,没一毫秒作为计数单位,大概50天一个循环.可以利用这个命令,在需要时读一次数标记为millis1,加上你需要的延迟量,每次循环到时再次采样millis2,比对下millis2是否大于millis1加上的延迟量,不满足条件继续循环,到了执行动作。这样可以不影响各自动作。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-31 11:00:02 | 显示全部楼层
学长 发表于 2013-5-28 23:07
就是 Timer 的概念.. 不过比较像是 Tick 的想法

你可以看下 Library 的 Timer1 这个程式库..

好的,非常谢谢啦~~~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-31 11:01:21 | 显示全部楼层
林定祥 发表于 2013-5-29 21:22
arduino有个有趣的命令millis,这个命令是从系统启动后开始计数,没一毫秒作为计数单位,大概50天一个循环.可以 ...

这个是不是只能对应一个动作呢?就是说不能出现类似于millis2,millis3 ,milli4之类的东西么?
回复 支持 反对

使用道具 举报

发表于 2013-5-31 11:34:10 | 显示全部楼层
可以啊,系统millis只有一个,但是你使用时可以将它当时的时间给x,y,z--------
回复 支持 反对

使用道具 举报

发表于 2013-5-31 20:18:29 | 显示全部楼层
czh007007 发表于 2013-5-31 11:00
好的,非常谢谢啦~~~



抱歉,您的帖子小于 10 个字符的限制
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 21:17 , Processed in 0.043502 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表