彙整

Posts Tagged ‘Servo 討論’

時間 , 速度 及 角度

十一月 20, 2007 4 留言
今天晚上回家忙完手上的工作後 , 再繼續着手 TK01的速度、角度及角度變化的關連問題 , 得出來的結果令我滿意 , 以下是結果 : 
以踎低起身正在用的角度及速度為例子  以 Timer 量度的時間數據 
Servo  Servo  Location  rotate  Location 
Status  Number  Store  degree  Store 
    站立    踎低 
no change  0  95    95 
decrease  1  89  22  67 
no change  2  97    97 
increase  3  90  16  106 
decrease  4  90  56  34 
decrease  5  136  72  64 
no change  6  80    80 
no change  7  93    92 
no change  14  96    96 
no change  15  98    98 
increase  16  43  72  115 
increase  17  89  56  145 
decrease  18  90  16  74 
no change  19  90    90 
increase  20  91  22  113
TowerPro 
speed 0 用 0.39 秒 行 154度 , 
speed 5 用 1.40 秒 行 154度 , 
speed 4 用 1.76 秒 行 154度 , 
speed 3 用 2.35 秒 行 154度 , 
speed 2 用 3.54 秒 行 154度 , 
speed 1 用 7.10 秒 行 154度 ,

對比以上資料 , 將用 Timer 的資料 ( 角度除時間 ) 或 ( 時間除角度 ), 得出以下結果 :

TowerPro     
speed 0 用 0.39 秒 行 154度 ,  394d/s  0.0025s/d 
speed 5 用 1.40 秒 行 154度 ,  110d/s  0.0090s/d 
speed 4 用 1.76 秒 行 154度 ,  88d/s  0.0114s/d 
speed 3 用 2.35 秒 行 154度 ,  66d/s  0.0152s/d 
speed 2 用 3.54 秒 行 154度 ,  44d/s  0.0229s/d 
speed 1 用 7.10 秒 行 154度 ,  22d/s  0.0461s/d
例如 :  

如果用 speed 1 計算 ,

TowerPro 每秒可前進 21.69…….. 度 ( 角度除時間 ) D/S , 即大概為 22度 ,

而 speed 1 每 0.0461…… 度需要 0.1秒 ( 時間除角度 ) ,

假設現在只知道現在 speed 1 每 0.0461度需要 0.1秒 , 現在要前進 22 度 , 求 22 度總共需要時間 , 算式為 ( 0.0461 x 22 = 1.0142 ) 即大概為 1 秒 , 跟上表計出來結果相若 。

 

但如何知道用在機體需要用什麽速度呢 ?

只要知道每個 Servo 轉動了多小角度便可以了 , 例如 16 , 17 , 18 及 20 號 Servo , 首先 18 號 servo 轉動角度是最小的只有 16 度 , 故此要用最慢的速度 speed 1 , 而 18 號 servo 若轉動完 16 度所需要時間為 0.0461 x 16 = 0.7376 秒 , 所以其他 3 隻 servo 要遷就返 servo 18 的時間 ,

 

例如 servo 20 所轉動角度,

如果用 speed 1 ,

0.0461 x 22 = 1.0142 , 跟 servo 16 時間相差 1.0142 – 0.7376 = 0.2766

如果用 speed 2,

0.0229 x 22 = 0.5038 , 跟 servo 16 時間相差 0.7376 – 0.5038 = 0.2338

所以 servo 20 應以 speed 2 為準 ,

 

如此再計出其餘 servo 的轉動時間 , 就正正跟我現在程式內的速度一樣 , 當然以上只是很間單的加減乘除數 , 並非精密數學 , 但如果都係用同一個 servo controller 的可作參考用途 , 因為不同的 servo controller 或 servo 應會產生不同的速度的。

 

另一方面 , 在 Program 時 , 找了很久也找不到 Loop 以下如何 reset servo 的速度 ,

P.S. Dr. Victor 請看看有沒有錯的地方 , Thanks again . 你幾時得閑幫我補習 Program 呢 ?

 

#define Head 0

main()
{
int i;

sys(0, 1); // select COM port 1
setcomm(9600);
delay(2000);

for(i=0; i<=0; i++) set_servo_speed(i, 0);
for(i=1; i<=1; i++) set_servo_speed(i, 2);
for(i=2; i<=2; i++) set_servo_speed(i, 0);
for(i=3; i<=3; i++) set_servo_speed(i, 1);
for(i=4; i<=4; i++) set_servo_speed(i, 4);
for(i=5; i<=5; i++) set_servo_speed(i, 5);
for(i=6; i<=6; i++) set_servo_speed(i, 0);
for(i=7; i<=7; i++) set_servo_speed(i, 0);
for(i=14; i<=14; i++) set_servo_speed(i, 0);
for(i=15; i<=15; i++) set_servo_speed(i, 0);
for(i=16; i<=16; i++) set_servo_speed(i, 5);
for(i=17; i<=17; i++) set_servo_speed(i, 4);
for(i=18; i<=18; i++) set_servo_speed(i, 1);
for(i=19; i<=19; i++) set_servo_speed(i, 0);
for(i=20; i<=20; i++) set_servo_speed(i, 2);

// Store data to mem locs
stand_still(); writec(232, 252, 0); writec(232, 0, 0); delay(1000); // Loc 0
sit_full(); writec(232, 252, 0); writec(232, 10, 0); delay(1000); // Loc 10

// retrieve data from mem locs
loop {
writec(232, 250, 0); set_servo_speed(0, 1); delay(2000);         <——– 這一句有沒有錯
writec(232, 253, 0); writec(232, 0, 0); delay(1000); toggle(5); // Loc 0
writec(232, 253, 0); writec(232, 10, 0); delay(1000); toggle(5);toggle(3); // Loc 10
writec(232, Head, 50); writec(232, 39, 50); delay(1000); // Servo 0
writec(232, Head, 50); writec(232, 151, 50); delay(1000); // Servo 0
writec(232, 250, 0); set_servo_speed(0, 5);                            <——– 這一句有沒有錯
writec(232, 14, 50); writec(232, 73, 50); delay(1000); // Servo 14
writec(232, 14, 50); writec(232, 111, 50); delay(1000); // Servo 14
writec(232, Head, 50); writec(232, 39, 50); delay(1000); // Servo 0
writec(232, Head, 50); writec(232, 151, 50); delay(1000); // Servo 0
writec(232, 253, 0); writec(232, 0, 0); delay(3000); toggle(5); // Loc 0
writec(232, 7, 50); writec(232, 135, 50); delay(1000); // Servo 7
writec(232, 7, 50); writec(232, 92, 50); delay(1000); // Servo 7
writec(232, 7, 50); writec(232, 48, 50); delay(1000); // Servo 7
writec(232, 7, 50); writec(232, 92, 50); delay(3000); // Servo 7
toggle(3);
}
}

set_servo_speed(svr, spd)
{
writec(232, 250, 0);
writec(232, svr, 0);
writec(232, spd, 0);
}
stand_still()
{

writec(232, Head, 50); writec(232, 95, 50); // Servo 0
writec(232, 1, 50); writec(232, 89, 50); // Servo 1
writec(232, 2, 50); writec(232, 97, 50); // Servo 2
writec(232, 3, 25); writec(232, 90, 50); // Servo 3
writec(232, 4, 50); writec(232, 90, 50); // Servo 4
writec(232, 5, 50); writec(232, 136, 50); // Servo 5
writec(232, 6, 50); writec(232, 80, 50); // Servo 6
writec(232, 7, 50); writec(232, 92, 50); // Servo 7
writec(232, 14, 50); writec(232, 96, 50); // Servo 14
writec(232, 15, 50); writec(232, 98, 50); // Servo 15
writec(232, 16, 50); writec(232, 43, 50); // Servo 16
writec(232, 17, 50); writec(232, 89, 50); // Servo 17
writec(232, 18, 50); writec(232, 90, 50); // Servo 18
writec(232, 19, 50); writec(232, 90, 50); // Servo 19
writec(232, 20, 50); writec(232, 91, 50); // Servo 20
}
sit_full()
{

writec(232, Head, 50); writec(232, 95, 50); // Servo 0
writec(232, 1, 50); writec(232, 67, 50); // Servo 1
writec(232, 2, 50); writec(232, 97, 50); // Servo 2
writec(232, 3, 50); writec(232, 106, 50); // Servo 3
writec(232, 4, 50); writec(232, 34, 50); // Servo 4
writec(232, 5, 50); writec(232, 64, 50); // Servo 5
writec(232, 6, 50); writec(232, 80, 50); // Servo 6
writec(232, 7, 50); writec(232, 92, 50); // Servo 7
writec(232, 14, 50); writec(232, 96, 50); // Servo 14
writec(232, 15, 50); writec(232, 98, 50); // Servo 15
writec(232, 16, 50); writec(232, 115, 50); // Servo 16
writec(232, 17, 50); writec(232, 145, 50); // Servo 17
writec(232, 18, 50); writec(232, 74, 50); // Servo 18
writec(232, 19, 50); writec(232, 90, 50); // Servo 19
writec(232, 20, 50); writec(232, 113, 50); // Servo 20
}

廣告

速度的影響,重量

十一月 18, 2007 發表留言
前雨次講到量度了 TK01 Servo 的速度 , 現在就用回踎底的動作証明量度了度速後 , 是否可以剩係比兩個角度加速度完成動作 ,
答案係得的 , 以下是片段 ,
雖然動作跟之前的是一樣 , 但現在所用的 program 比之前細 , 因為在站立及踎底之間己經冇任何間隔 ,
亦即是用起點到終點都沒有其他角度插入中間位置 , 但係要留意一點 , 就是 loading 的問題 , 量度 servo 的時侯 ,
是因為沒有 loading ( 重量 ) 的 , 但在加入機體之後 loading ( 重量 ) 會改變速度 , 例如由站立到踎底的時候 ,
大腿位置的 servo 會加快 , 但由踎底到站立的時候 , 大腿位置的 servo 會減慢 , 因為有地心吸力啊 ,
所以唔好以為量好速度後就咁 set 左速度一定得 , 仲要留意實際有 loading ( 重量 ) 時的速度 ,
最後以下片段是黑夜版踎底及起身的動作 ,

片段2 高解像儲存

Servo Speed Test

十月 31, 2007 2 留言

上次講到現在正進行 Servo 速度的量度 , 得出以下結果 ,以 23度至 177度計算 , 共行 154度 ,

speed 0 用 0.7 秒 行 154度 ,

speed 5 用 1.6 秒 行 154度 ,

speed 4 用 2.2 秒 行 154度 ,

speed 3 用 3.0 秒 行 154度 ,

speed 2 用 4.0 秒 行 154度 ,

speed 1 用 7.4 秒 行 154度 ,

但係因為上次是用手提電話內的計時器進行量度 ( 影片一 ) ,

所以應該是唔準的 ,而今次買了一個時間制回來進行測試 ( 影片二 )  , 得出以下結果 :

 

TowerPro MG995 , 由 23度至 177度 , 共 154度

speed 0 用 0.39 秒 行 154度 ,

speed 5 用 1.40 秒 行 154度 ,

speed 4 用 1.76 秒 行 154度 ,

speed 3 用 2.35 秒 行 154度 ,

speed 2 用 3.54 秒 行 154度 ,

speed 1 用 7.10 秒 行 154度 ,

 

Futaba S3003 , 由 6度至 158度 , 共 152度

speed 0 用 0.38 秒 行 152度 ,

speed 5 用 1.39 秒 行 152度 ,

speed 4 用 1.74 秒 行 152度 ,

speed 3 用 2.30 秒 行 152度 ,

speed 2 用 3.47 秒 行 152度 ,

speed 1 用 6.95 秒 行 152度 ,

 

BlueBird BMS-630MG , 由 14度至 144度 , 共 130度

speed 0 用 0.50 秒 行 130度 ,

speed 5 用 1.31 秒 行 130度 ,

speed 4 用 1.60 秒 行 130度 ,

speed 3 用 2.07 秒 行 130度 ,

speed 2 用 3.07 秒 行 130度 ,

speed 1 用 6.01 秒 行 130度 ,

 

SANY0007
影片一  影片二 

ATV 時事追擊

十月 28, 2007 2 留言
早前由 KBS 電視台的訪問 , 原本一心諗住要到下年先有得睇 ,
但原來 27/Oct/07 ATV 時事追擊節目內有一段小插曲有我們的片段 ,
原因是時事追擊有訪問 香港機械人網 http://www.hkrobot.net 的網主 Rex 的詳細報道 ,
有興趣的朋友可到此取得影片 , MPG File .
另外目前正在量度 Servo controller 的 Speed 1-5 的速度 , 暫時所得數值如下 :
以 23度至 177度計算 , 共行 154度 ,
speed 0 共用 0.7秒 行 154度 ,
speed 5 共用 1秒6 行 154度 ,
speed 4 共用 2秒2 行 154度 ,
speed 3 共用 3秒 行 154度 ,
speed 2 共用 4秒 行 154度 ,
speed 1 共用 7秒4 行 154度 ,
可能未量得好準 , 但計過相差不遠 , 過兩天有時間會再量準 D .

servo speed selector

十月 23, 2007 7 留言
經過幾日測試都想不到如何可以用 program 計出改變了的角度 ,
現在以下 program 紅色一段文字 , 是一個程式 , 可除着 servo 改變角度而自動 set 出 servo 的速度 ,
己証實是可行 , 但因為 deg_a 及 deg_b 是沒有 store 入 location 內的 , 所以現正設法如何可將 ,
location 內的角度名為 deg_a 及 deg_b , 如果成功 , 以後可以不用人手計角度 ,
希望做到程式 function :
deg_a 減 deg_b ,
如果減後角度大於 150 度 , set speed 5
如果減後角度大於 130 度 , set speed 4
如果減後角度大於 100 度 , set speed 3
如果減後角度大於 80 度 , set speed 2
如果減後角度大於 60 度 , set speed 1
否則 set speed 0
但這組 deg_a 及 deg_b 一定要代表了 location store 其中 servo 的角度 , 唔知點寫 ???
P.S. Dr. Victor 明唔明我想點寫 ? 以下是成功了一半的 program , 但現在唔知點寫 deg_a 及 deg_b 入 location ,
請問做唔做到 ??
測試程式如下 :
// updown with speed control
// Action: Standup than Sit to Standup
// by BloodKeith 20 Oct 2007
#define HEAD 0
#define NECK 14
#define L_ONE 1
#define L_TWO 2
#define L_THREE 3
#define L_FOUR 4
#define L_FIVE 5
#define L_SIX 6
#define WAIST 7
#define R_ONE 20
#define R_TWO 19
#define R_THREE 18
#define R_FOUR 17
#define R_FIVE 16
#define R_SIX 15
main()
{
int   i , deg_a , deg_b , t_deg;

sys(0, 1);     // select COM port 1
setcomm(9600);
delay(2000);

deg_a=20 ;                                 //servo head start degree
deg_b=160 ;                                //servo end degree
t_deg=deg_a-deg_b;                         //start degree – end degree
if( t_deg > -90 ) set_servo_speed(i, 1);   //if sum > -90 degree , set speed to 1
if( t_deg <-80 ) set_servo_speed(i, 1);    //if sum <-80 degree , set speed to 1
if( t_deg == -86 ) set_servo_speed(i, 1);  //if sum = -86 degree , set speed to 1
else set_servo_speed(i, 5);                //set servo speed 5

for(i=L_ONE; i<=L_ONE; i++) set_servo_speed(i, 5);
for(i=L_TWO; i<=L_TWO; i++) set_servo_speed(i, 5);
for(i=L_THREE; i<=L_THREE; i++) set_servo_speed(i, 5);
for(i=L_FOUR; i<=L_FOUR; i++) set_servo_speed(i, 5);
for(i=L_FIVE; i<=L_FIVE; i++) set_servo_speed(i, 5);
for(i=L_SIX; i<=L_SIX; i++) set_servo_speed(i, 5);
for(i=WAIST; i<=WAIST; i++) set_servo_speed(i, 0);
for(i=NECK; i<=NECK; i++) set_servo_speed(i, 0);
for(i=R_SIX; i<=R_SIX; i++) set_servo_speed(i, 5);
for(i=R_FIVE; i<=R_FIVE; i++) set_servo_speed(i, 5);
for(i=R_FOUR; i<=R_FOUR; i++) set_servo_speed(i, 5);
for(i=R_THREE; i<=R_THREE; i++) set_servo_speed(i, 5);
for(i=R_TWO; i<=R_TWO; i++) set_servo_speed(i, 5);
for(i=R_ONE; i<=R_ONE; i++) set_servo_speed(i, 5);

// Store data to mem locs
stand_still(); writec(232, 252, 0); writec(232, 0, 0); delay(1000); // Loc 0
up_Step_nine(); writec(232, 252, 0); writec(232, 19, 0); delay(1000); // Loc 19
// retrieve data from mem locs
loop {
writec(232, 253, 0); writec(232, 0, 0); delay(250); toggle(5); // Loc 0
writec(232, HEAD,  50); writec(232, deg_a, 50); delay(1000); // Servo 0
writec(232, HEAD,  50); writec(232, deg_b, 50); delay(1000); // Servo 0
writec(232, NECK,  50); writec(232, 73, 50); delay(1000); // Servo 0
writec(232, NECK,  50); writec(232, 111, 50); delay(1000); // Servo 0
writec(232, 253, 0); writec(232, 19, 0); delay(500); toggle(3);toggle(5); // Loc 19
writec(232, WAIST,  50); writec(232, 116, 50); delay(1000); // Servo 7
writec(232, WAIST,  50); writec(232, 93, 50); delay(1000); // Servo 7
writec(232, WAIST,  50); writec(232, 80, 50); delay(1000); // Servo 7
writec(232, WAIST,  50); writec(232, 93, 50); delay(3000); // Servo 7
toggle(3);
}
}
set_servo_speed(svr, spd)
{
writec(232, 250, 0);
writec(232, svr, 0);
writec(232, spd, 0);
}
stand_still()
{
writec(232, HEAD,  50); writec(232, 95, 50); // Servo 0
writec(232, L_ONE,  50); writec(232, 89, 50); // Servo 1
writec(232, L_TWO,  50); writec(232, 97, 50); // Servo 2
writec(232, L_THREE,  25); writec(232, 90, 50); // Servo 3
writec(232, L_FOUR,  50); writec(232, 90, 50); // Servo 4
writec(232, L_FIVE,  50); writec(232, 138, 50); // Servo 5
writec(232, L_SIX,  50); writec(232, 80, 50); // Servo 6
writec(232, WAIST,  50); writec(232, 93, 50); // Servo 7
writec(232, NECK, 50); writec(232, 96, 50); // Servo 14
writec(232, R_SIX, 50); writec(232, 98, 50); // Servo 15
writec(232, R_FIVE, 50); writec(232, 41, 50); // Servo 16
writec(232, R_FOUR, 50); writec(232, 89, 50); // Servo 17
writec(232, R_THREE, 50); writec(232, 90, 50); // Servo 18
writec(232, R_TWO, 50); writec(232, 90, 50); // Servo 19
writec(232, R_ONE, 50); writec(232, 91, 50); // Servo 20
}
up_Step_nine()
{
writec(232, HEAD,  50); writec(232, 95, 50); // Servo 0
writec(232, L_ONE,  50); writec(232, 68, 50); // Servo 1
writec(232, L_TWO,  50); writec(232, 97, 50); // Servo 2
writec(232, L_THREE,  50); writec(232, 106, 50); // Servo 3
writec(232, L_FOUR,  50); writec(232, 43, 50); // Servo 4
writec(232, L_FIVE,  50); writec(232, 78, 50); // Servo 5
writec(232, L_SIX,  50); writec(232, 80, 50); // Servo 6
writec(232, WAIST,  50); writec(232, 93, 50); // Servo 7
writec(232, NECK, 50); writec(232, 96, 50); // Servo 14
writec(232, R_SIX, 50); writec(232, 98, 50); // Servo 15
writec(232, R_FIVE, 50); writec(232, 101, 50); // Servo 16
writec(232, R_FOUR, 50); writec(232, 136, 50); // Servo 17
writec(232, R_THREE, 50); writec(232, 74, 50); // Servo 18
writec(232, R_TWO, 50); writec(232, 90, 50); // Servo 19
writec(232, R_ONE, 50); writec(232, 112, 50); // Servo 20
}

快叫謎女郎解開這個……謎

六月 11, 2007 5 留言
早前被燒毁了的 TowerPro Servo 後 , 一直也像垃圾一樣掉低了在一旁 , 無時間去處理 , 今天在琛圳高新科技園開完會後 , 見還有一點時間 , 便到賽格遊了一下 , 本來是想找其他零件的 , 但在其中一間舖發現有 MG995 賣 , 便問一下價 , 還平香港 $20 , 見都是時侯補回燒了的那三隻了 , 於是便買多兩隻了 , 

回來後諗左一陣 , 之前燒左三隻 , 點都一定有方法整好的 , 於是便用 1cm 微距拍下照了 .

   
在微距拍攝之下 , 之前原來不只燒一粒 IC , 原來兩粒燒晒 ,  在微距拍攝下可看到左邊的 IC 有類似 NE的白色字母 , 唔知係咪 NEC , 但是上面又有 National Semiconductor 的 logo , 及右邊的 IC 右上角有 07 數字及 IC 下有 ?8588 數字 .
   
這張第二隻 TowerPro , 左邊 IC 有白色 885 數字 , 及右邊 IC 是 National 的 logo ,  這張可看到兩粒 IC 是同一樣的 , 原來右邊 IC 原本都是白色字的
   
這兩張右邊的 IC 都有輕微的 C 字印在中間行 , 是否這個謎團已經解開呢 ? 是否又代表了這兩粒 IC 都是 NEC 的 88588 呢 , 請各位在相片上按下放大看一下 , 幫忙引証一下 ,

另外 P.S. Dr. Victor 如以上是對的 , 都是 NEC 或 National 的 88588 , 另外在第三隻燒了的 Servo 看到有 8958 的字樣 , 於是上網查了一下 , 找到有一粒由 National 出的叫 NDS8958 的 IC , 唔知道是不是這一粒 , 外型也是一樣的 , 文件在這裏 , 這兩粒有甚麽用途呢 , 這是否意味我燒了的 Servo 可以重新呢 ? 謝謝

 

Futaba Servo Motor Specifications

一月 13, 2007 4 留言
Type  Model  Voltage  Torque  Speed  Internet Price  HK Price 
oz-in  kg-cm 
Analog Servo  S3003  6v  59.9oz-in  4kg-cm  0.16sec/60º  $10.99USD  $86 
S3010  6v  90.2oz-in  6.5kg-cm  0.16sec/60º  $24.99USD  $195 
Digital Servo  S3050  6v  90.2oz-in  6.5kg-cm  0.16sec/60º  $44.99USD  $350 
S3152  6v  87.0oz-in  6kg-cm  0.18sec/60º  $29.99USD  $233 
S9151  4.8v  131.9oz-in  9.5kg-cm  0.19sec/60º  $89.99USD  $701 
S9155  6v  192oz-in  13.8kg-cm  0.13sec/60º  $109.99USD  $857 
S9250  4.8v  76.3oz-in  5.5kg-cm  0.11sec/60º  $99.99USD  $779 
S9251  4.8v  51.4oz-in  3.7kg-cm  0.07sec/60º  $109.99USD  $857 
S9252  6v  91.6oz-in  6.6kg-cm  0.14sec/60º  $79.99USD  $624 
S9255  4.8v  112oz-in  8kg-cm  0.17sec/60º  $109.99USD  $857 
S9350  6v  138oz-in  9.9kg-cm  0.12sec/60º  $99.99USD  $779 
S9351  6v  190oz-in  13.7kg-cm  0.13sec/60º  $109.99USD  $857 
S9451  6v  120oz-in  8.6kg-cm  0.10sec/60º  $79.99USD  $624

 

%d 位部落客按了讚: