Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 5341|回復: 11
打印 上一主題 下一主題

[請教] 關於控制 Servo 轉動的速度...(有高人解答,快來看~)

[複製鏈接]
1#
發表於 2010-6-30 22:04:29 | 顯示全部樓層
本帖最後由 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()讓馬
    達依照剛剛所擷取回來的角度轉了(依序把角度陣列與時間傳入)

試試看吧
2#
發表於 2010-7-1 09:06:46 | 顯示全部樓層
本帖最後由 acen2008 於 2010-7-1 09:09 編輯

我只是一個對RoBoard有興趣的玩家而已...
希望大家一起玩RoBoard^^

補充上面說明 :
    陣列宣告建議是一個size為32的unsigned long
    例如 : unsigned long position[32] - 一組馬達角度
             或是unsigned long positions[5][32] - 五組馬達角度 (傳入rcservo_MoveTo()
                                                                                     還是得一組一組傳)
3#
發表於 2010-7-1 20:31:51 | 顯示全部樓層
是用傳入的陣列表示的喔

陣列第1個值代表第0個馬達角度, 第2個代表第1個馬達角度......依此類推

角度值就是它的duty 大小 (單位 : 1 us)
4#
發表於 2010-7-2 09:47:28 | 顯示全部樓層
感謝鯨大把文件連接貼上來
裡面的rcservo_SetAction() + rcservo_PlayAction() 除了等於
rcservo_MoveTo()的功能外, 還有釋放控制權的功能, 也就是馬達在運
轉的同時, 程式還能處理其它的事情(寫在While{}中, 例如 : 讀感測器
回傳的訊號)用rcservo_MoveTo()的話, RoBoard 就只做馬達運轉的
功能, 直到所有角度都跑完, 昨天花了幾分鐘寫了有關rcservo_MoveTo()
的使用, 等一下會貼上來, 而rcservo_PlayAction() 的使用其實是大同小異的
5#
發表於 2010-7-2 10:08:00 | 顯示全部樓層
我用了兩個沒有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;
}
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-6-11 08:49 , Processed in 0.301510 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表