极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 34268|回复: 16

舵机运行时间一个小问题

[复制链接]
发表于 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 | 显示全部楼层
晚上试试
再跟你说结果
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-21 15:23:17 | 显示全部楼层
OK,谢谢啦O(∩_∩)O~
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-21 15:24:29 | 显示全部楼层
学长 发表于 2013-5-21 14:12
晚上试试
再跟你说结果


OK,谢谢啦O(∩_∩)O~
回复 支持 反对

使用道具 举报

发表于 2013-5-21 22:22:32 | 显示全部楼层
本帖最后由 学长 于 2013-5-21 22:27 编辑

先贴图跟代码 再解释




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

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

  4. #include <Servo.h>
  5. Servo myservo;
  6. int val= 0 ;   
  7. void setup()
  8. {
  9.   Serial.begin(9600);
  10.   myservo.attach(4);  
  11. }

  12. void loop()
  13. {
  14.   if (val == 0) {
  15.     val = 180;
  16.   } else {
  17.     val = 0;
  18.   }
  19.   myservo.write(val);                  
  20.   Serial.println(val);
  21.   delay(1500);                           
  22. }
复制代码


接下来说明

主要问题就是
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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1 +2 收起 理由
幻生幻灭 + 2 赞一个!

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2013-5-21 22:25:04 | 显示全部楼层
另外补充一点

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

最好是另外供电
回复 支持 反对

使用道具 举报

发表于 2013-5-22 10:31:26 | 显示全部楼层
学长 发表于 2013-5-21 22:25
另外补充一点

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

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

使用道具 举报

发表于 2013-5-22 12:16:51 | 显示全部楼层
罹凝寒冰 发表于 2013-5-22 10:31
我要实现的是在竖直方向一度一度叠加,加到90度 然后水平方向转动一度,如果想你的例程 只是0度 180度变换 ...

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

另外, for 也行 while 也行, 高兴怎麽控制就怎麽控制... 呵呵
回复 支持 反对

使用道具 举报

发表于 2013-5-22 15:08:39 | 显示全部楼层
学长 发表于 2013-5-22 12:16
其实,你要的操作已经符合特殊需要了,
所以用 for 控制也没什麽不可以...
但如你所说的90度後加1度.. 不 ...

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

使用道具 举报

 楼主| 发表于 2013-5-22 18:40:42 | 显示全部楼层
学长 发表于 2013-5-21 22:22
先贴图跟代码 再解释

不好意思,x其实是i的。我现在改回来
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-22 18:54:33 | 显示全部楼层
学长 发表于 2013-5-21 22:22
先贴图跟代码 再解释

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

使用道具 举报

发表于 2013-5-22 20:08:49 | 显示全部楼层
chylove 发表于 2013-5-22 18:54
请问您提出的第一个问题是什么意思?本人愚钝,望指教。

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

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

呵呵
回复 支持 反对

使用道具 举报

发表于 2013-5-22 20:11:52 | 显示全部楼层
chylove 发表于 2013-5-22 18:40
不好意思,x其实是i的。我现在改回来

那你的 map 用法, 是不是错了?
把 0-180 映射为 50-60 ?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-23 00:54:13 | 显示全部楼层
学长 发表于 2013-5-22 20:11
那你的 map 用法, 是不是错了?
把 0-180 映射为 50-60 ?

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

使用道具 举报

发表于 2013-5-23 12:07:57 | 显示全部楼层
chylove 发表于 2013-5-23 00:54
没错呀,i是从0-180,舵机转动的角度就从50-60.这样的话,多个舵机就可以同时运动并同时到达各自预设角度 ...

嗯.. 没错就好.. 只是很难理解
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-6 17:48 , Processed in 0.062168 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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