chylove 发表于 2013-5-21 12:51:16

舵机运行时间一个小问题

本帖最后由 chylove 于 2013-5-22 18:41 编辑

    麻烦大家看一下:
    例如一个程序:
    servo函数库定义、初始化省略。
    int run()
   {
         for(i=0;i<=180;i++)
      {
          int pos1=map(i,0,180,50,60);
          int pos2=map(i,0,180,60,50);
          int pos3=map(i,0,180,50,60);
          servo1.write(pos1);
          servo2.write(pos2);
          servo3.write(pos3);
          delay(5);
         }
      }
    void loop()
    {
      run();
    }

   请问在run函数内每个舵机是多长时间写入一次角度。忽略map的运行时间?是20+5=25ms还是20x3+5=65ms?抑或其他?
   跪求各位大哥大姐指教。。。毕业论文马上要交了,要处理一些数据,麻烦大家帮帮忙。不胜感激!!

学长 发表于 2013-5-21 14:12:45

晚上试试
再跟你说结果

chylove 发表于 2013-5-21 15:23:17

OK,谢谢啦O(∩_∩)O~

chylove 发表于 2013-5-21 15:24:29

学长 发表于 2013-5-21 14:12 static/image/common/back.gif
晚上试试
再跟你说结果

OK,谢谢啦O(∩_∩)O~

学长 发表于 2013-5-21 22:22:32

本帖最后由 学长 于 2013-5-21 22:27 编辑

先贴图跟代码 再解释




接线实拍
跟代码及代码运行

接下来贴代码/*问题来源
*http://www.geek-workshop.com/thread-4655-1-1.html
*/

#include <Servo.h>
Servo myservo;
int val= 0 ;   
void setup()
{
Serial.begin(9600);
myservo.attach(4);
}

void loop()
{
if (val == 0) {
    val = 180;
} else {
    val = 0;
}
myservo.write(val);                  
Serial.println(val);
delay(1500);                           
}

接下来说明

主要问题就是
myservo.write(val);之後
到底是等 servo 转完 再执行下一行, 还是直接执行下一行, 不管 servo 有没有转完。

实验结果:
myservo.write(val); 之後, Servo 开始转动, 并且 Serial 输出角度数值。
Serial 输出数值时, Sever 并未转到定位。
所以推论得知, myservo.write(val); 之後, 并不会等待 Servo 转动到定位再执行下一行。

所以开始回答你的问题
每个舵机多久写入一次 .
不一定, 但实际上空 loop 大约 5xxus 以上。(不加 run 函数的执行时间)
不是 25ms 也不是 65 ms ,
而是两种情况
1. 在 for 内... 所有指定执行的时间,
2. 在 loop 内.. loop 执行时间,

所以, 在此指出2 个问题

1. 控制舵机不像其他步进马达, 如非特殊须要, 不应再用 for 回圈 自行控制转向。
2. 此程序的 map 有点奇怪, x 用途为何? 若非相关, 应将此三行移至其他函数内

以上, 共同讨论之

Servo 程式库 参考 http://www.game7777.net/doku.php?id=arduino:libraries:servo

学长 发表于 2013-5-21 22:25:04

另外补充一点

电机类的装置使用电流较大

最好是另外供电

罹凝寒冰 发表于 2013-5-22 10:31:26

学长 发表于 2013-5-21 22:25 static/image/common/back.gif
另外补充一点

电机类的装置使用电流较大


我要实现的是在竖直方向一度一度叠加,加到90度 然后水平方向转动一度,如果想你的例程 只是0度 180度变换那么肯定得加延时,才能让它完全到位 再继续转的。那么对于我的舵机来说 for不宜用?那用while?

学长 发表于 2013-5-22 12:16:51

罹凝寒冰 发表于 2013-5-22 10:31 static/image/common/back.gif
我要实现的是在竖直方向一度一度叠加,加到90度 然后水平方向转动一度,如果想你的例程 只是0度 180度变换 ...

其实,你要的操作已经符合特殊需要了,
所以用 for 控制也没什麽不可以...
但如你所说的90度後加1度.. 不如 直接转到 90 度然後,再加1 。
一度一度转, 也要时间, 不如一次转到位。

另外, for 也行 while 也行, 高兴怎麽控制就怎麽控制... 呵呵

罹凝寒冰 发表于 2013-5-22 15:08:39

学长 发表于 2013-5-22 12:16 static/image/common/back.gif
其实,你要的操作已经符合特殊需要了,
所以用 for 控制也没什麽不可以...
但如你所说的90度後加1度.. 不 ...

一次转到位就不让它循环了 直接赋值就好 因为我要再每个角度采集数据 所以不能一次从0转到90度的

chylove 发表于 2013-5-22 18:40:42

学长 发表于 2013-5-21 22:22 static/image/common/back.gif
先贴图跟代码 再解释




不好意思,x其实是i的。我现在改回来

chylove 发表于 2013-5-22 18:54:33

学长 发表于 2013-5-21 22:22 static/image/common/back.gif
先贴图跟代码 再解释




请问您提出的第一个问题是什么意思?本人愚钝,望指教。

学长 发表于 2013-5-22 20:08:49

chylove 发表于 2013-5-22 18:54 static/image/common/back.gif
请问您提出的第一个问题是什么意思?本人愚钝,望指教。

没什麽特别的意思, 就是字面上的含义

既然有用, 就1度1度的转, 用 for 或是用 while 都可以。

呵呵

学长 发表于 2013-5-22 20:11:52

chylove 发表于 2013-5-22 18:40 static/image/common/back.gif
不好意思,x其实是i的。我现在改回来

那你的 map 用法, 是不是错了?
把 0-180 映射为 50-60 ?

chylove 发表于 2013-5-23 00:54:13

学长 发表于 2013-5-22 20:11 static/image/common/back.gif
那你的 map 用法, 是不是错了?
把 0-180 映射为 50-60 ?

没错呀,i是从0-180,舵机转动的角度就从50-60.这样的话,多个舵机就可以同时运动并同时到达各自预设角度。

学长 发表于 2013-5-23 12:07:57

chylove 发表于 2013-5-23 00:54 static/image/common/back.gif
没错呀,i是从0-180,舵机转动的角度就从50-60.这样的话,多个舵机就可以同时运动并同时到达各自预设角度 ...

嗯.. 没错就好.. 只是很难理解
页: [1] 2
查看完整版本: 舵机运行时间一个小问题