Robofun 機器人論壇
標題:
[請教] 關於控制 Servo 轉動的速度...(有高人解答,快來看~)
[打印本頁]
作者:
tommylin
時間:
2010-6-29 17:18
標題:
[請教] 關於控制 Servo 轉動的速度...(有高人解答,快來看~)
本帖最後由 tommylin 於 2010-6-30 23:42 編輯
請問大大們~RoboIO.lib 有可以控制 servo 轉動速度的功能嗎?
感謝先~
作者:
mzw2008
時間:
2010-6-29 17:42
從沒在注意轉速問題
不過似乎調整PWM週期可以控制喔
分享的範例是用10000us ---> 本來也是這樣用
可是我最近改用20000us , 感覺有變慢
今晚回來實際測一下好了
作者:
tommylin
時間:
2010-6-30 11:20
殘念~
昨晚測試了..改週期不行的...
作者:
acen2008
時間:
2010-6-30 22:04
本帖最後由 acen2008 於 2010-6-30 22:33 編輯
HI
RoBoIO Library中有可以控制速度的函數唷, 依照馬達有無feedback
功能可以使用下列方法 :
1. 沒有feedback的馬達
在初始化(rcservo_Initialize)後, 可以使用rcservo_EnterPlayMode_NOFB()把
沒有feedback的馬達先歸位, 而歸位的位置就是要傳入這個函數的引數(它是一個陣列)
, 然後再使用rcservo_MoveTo()這個函數, rcservo_MoveTo()的第一個引數是馬達下
一個位置的陣列, 第二個引數就是時間, 時間以ms為單位, 設定1000L的話, 就是馬達從現
在的位置轉到下個位置需要花1秒, 2000L的話就是2秒, 3000L的話就是3秒, 建議可以把
函數放在for loop 中, 依序傳入角度陣列與時間.....
(註 : rcservo_MoveTo(array, time), array 是記錄馬達角度的陣列, time是時間)
2. 有feedback的馬達(例如 : kondo, hitec)
初始化(rcservo_Initialize)後, 呼叫rcservo_EnterCaptureMode(), 可以使用
rcservo_ReadPositions()來取得目前馬達的位置, 並且將位置放在陣列中, 擷取
數筆後, 呼叫rcservo_EnterPlayMode(), 就可以再使用rcservo_MoveTo()讓馬
達依照剛剛所擷取回來的角度轉了(依序把角度陣列與時間傳入)
試試看吧
作者:
mzw2008
時間:
2010-6-30 23:01
請教這些參數是哪裡看來的呢?
雖然不會有速度上的需求
不過還是感謝多學了點東西哩XD
作者:
tommylin
時間:
2010-6-30 23:41
acen2008 大大~
您的解說來的真是時候阿!!! 太感謝了, 馬上試試...
我爬了國外討論版都沒有人提到這個功能,我還覺得納悶 ~"~
(p.s acen2008大大.. 你真是強人阿...謝謝指導 )
作者:
acen2008
時間:
2010-7-1 09:06
本帖最後由 acen2008 於 2010-7-1 09:09 編輯
我只是一個對RoBoard有興趣的玩家而已...
希望大家一起玩RoBoard^^
補充上面說明 :
陣列宣告建議是一個size為32的unsigned long
例如 : unsigned long position[32] - 一組馬達角度
或是unsigned long positions[5][32] - 五組馬達角度 (傳入rcservo_MoveTo()
還是得一組一組傳)
作者:
tommylin
時間:
2010-7-1 15:47
回復
4#
acen2008
Hi acen2008 大大... 再請教一下..
RBAPI(void) rcservo_MoveTo(unsigned long* width, unsigned long playtime);
上述這個function 缺少一個 Channel 變數,
呼叫 rcservo_MoveTo() 的時候, 怎麼指定是 move 哪一個 channel 呢?
先謝嚕~
作者:
acen2008
時間:
2010-7-1 20:31
是用傳入的陣列表示的喔
陣列第1個值代表第0個馬達角度, 第2個代表第1個馬達角度......依此類推
角度值就是它的duty 大小 (單位 : 1 us)
作者:
mzw2008
時間:
2010-7-1 22:45
這就是roboard的動作播放模式哩
這樣就可以輕易錄製動作並且連續撥放
是一種很方便的控制功能
只是之前都用另外一種, 沒看到他後面的playtime
真是感謝了
詳細資訊這裡有
http://www.roboard.com/Files/RB-100/RoBoard_Training_SW_v16.pdf
45頁的地方
原來早就看過, 卻跳過了
我都一直注意他的PWM MODE而已@@
作者:
acen2008
時間:
2010-7-2 09:47
感謝鯨大把文件連接貼上來
裡面的rcservo_SetAction() + rcservo_PlayAction() 除了等於
rcservo_MoveTo()的功能外, 還有釋放控制權的功能, 也就是馬達在運
轉的同時, 程式還能處理其它的事情(寫在While{}中, 例如 : 讀感測器
回傳的訊號)用rcservo_MoveTo()的話, RoBoard 就只做馬達運轉的
功能, 直到所有角度都跑完, 昨天花了幾分鐘寫了有關rcservo_MoveTo()
的使用, 等一下會貼上來, 而rcservo_PlayAction() 的使用其實是大同小異的
作者:
acen2008
時間:
2010-7-2 10:08
我用了兩個沒有feedback的馬達做測試, 分別接在channel0和channel1上
送了5組不同的馬達位置, 用rcservo_MoveTo() 來幫我完成, code如下 ,
參考看看囉~
=============================================
#include <stdio.h>
#include "roboard.h"
int main()
{
int i,j;
unsigned long position_home[32] = {0L};
unsigned long position[32] = {0L};
unsigned long positions[5][32];
position_home[0] = 1500L; position_home[1] = 1000L; // 馬達的初始角度
positions[0][0] = 1200L ; positions[0][1] = 1500L; // 馬達的轉動角度
positions[1][0] = 1700L ; positions[1][1] = 800L; // 共5組(2個馬達)
positions[2][0] = 1000L ; positions[2][1] = 1700L; // 角度值是我隨意
positions[3][0] = 2000L ; positions[3][1] = 1300L; // 填的
positions[4][0] = 1500L ; positions[4][1] = 1500L;
roboio_SetRBVer(RB_100); // 設定為RoBoard RB_100
// 用了channel0, channel1, 馬達型態為無feedback伺服馬達
for(i=0; i<2; i++)
rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB);
rcservo_Initialize(RCSERVO_USECHANNEL0 + RCSERVO_USECHANNEL1);
rcservo_EnterPlayMode_NOFB(position_home); // 馬達一開始的角度
for(i=0; i<5; i++) // 把五組馬達轉動角度依序傳入rcservo_MoveTo()
{
for(j=0; j<2; j++)
position[j] = positions[i][j];
rcservo_MoveTo(position, 1000L); // 時間設定1秒
}
rcservo_Close();
return 0;
}
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2