Robofun 機器人論壇

標題: Roboard 的 PWM 好像會干擾? [打印本頁]

作者: miaoichi    時間: 2012-1-8 17:29
標題: Roboard 的 PWM 好像會干擾?
以下範例程式是輸入要執行的pin,channel, period, duty 來控制某一個pwm
但是一執行,很多其他的pwn好像也都會有信號送到其他馬達,
請問是哪裡有問題?是軟體還是硬體?




  1. int main(int argc, char **argv)
  2. {
  3. int i;
  4. roboio_SetRBVer(RB_100;
  5. for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++) //只初始 1~4 , 11~24的pwm
  6. if(i<RCSERVO_PINS5 || i>RCSERVO_PINS10)
  7.     rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB); // select the servo model as non-feedback servo
  8. if (rcservo_Init(RCSERVO_USEPINS1TO24) == false) // set PWM/GPIO pin 1~4 , 11~24 as Servo mode
  9. {
  10. printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
  11. return -1;
  12. }

  13. rcservo_EnterPWMMode(); // make all servo-mode pins go into PWM mode
  14. printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
  15. rcservo_SendCPWM((atoi(argv[1]) - 1),atol(argv[2]),atol(argv[3]));
  16. printf("Press ENTER to stop.\n"); getchar();
  17. rcservo_StopPWM(channel);
  18. rcservo_Close(); // close RC Servo lib
  19. }
複製代碼

作者: mzw2008    時間: 2012-1-8 23:28
咦?! 是說給這三個參數去控制某馬達
結果其他的也一起動?
上面的程式看起來不會耶

那些被干擾的馬達也動到一樣的位置?!
作者: mzw2008    時間: 2012-1-8 23:30
rcservo_StopPWM(channel);
channel 這個變恕宣告在哪裡? 怎麼沒看到呢?
作者: miaoichi    時間: 2012-1-10 21:57
本帖最後由 miaoichi 於 2012-1-10 21:59 編輯

感謝m大幫忙,我把程式重貼了,請幫我再看一下。謝謝



  1. int main(int argc, char **argv)
  2. {
  3.     roboio_SetRBVer(RB_100);// first set the correct RoBoard version
  4.     if(InitServo())
  5.        return -1;
  6.     if(argc == 4)
  7.    {
  8.        BodyServoDrive((atoi(argv[1]) - 1),atol(argv[2]),atol(argv[3]));
  9.        return 0;
  10.     }
  11.     else if(argc == 3)
  12.    {
  13.         rcservo_OutPin((atoi(argv[1]) -1), atoi(argv[2]));
  14.     }
  15.     else
  16.    {
  17.         printf("input example-- %s channel period duty \n",argv[0]);
  18.         printf("channel : from 1 to 19 \n");
  19.         printf("period 10ms => 10000\n");
  20.         printf("duty 1500us => 1500\n");
  21.     }

  22.     return -1;
  23. }



  24. int InitServo(void)
  25. {
  26.      int i;
  27.      for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++)
  28.      if(i<5 || i>10)
  29.            rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB);     // select the servo model as non-feedback servo
  30.      if (rcservo_Init(RCSERVO_USEPINS1TO24) == false)  // set PWM/GPIO  as Servo mode
  31.     {
  32.         printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
  33.         return -1;
  34.     }
  35.     return 0;
  36. }

  37. void BodyServoDrive(int channel, long period, long duty)
  38. {
  39.     rcservo_EnterPWMMode();  // make all servo-mode pins go into PWM mode
  40.     printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
  41.     rcservo_SendCPWM(channel, period, duty);
  42.     printf("Press ENTER to stop.\n"); getchar();
  43.     rcservo_StopPWM(channel);
  44.     rcservo_Close();  // close RC Servo lib
  45. }





複製代碼

作者: miaoichi    時間: 2012-1-10 22:02
有用到的pwm 共18個
PWM1 -> Servo
PWM2 -> Servo
PWM3-> Servo
PWM4-> Servo
PWM11-> Servo
PWM12-> Servo
PWM13-> Servo
PWM14-> Servo
PWM15-> Servo
PWM16-> Servo
PWM17-> Servo
PWM18-> Servo
PWM19-> Servo
PWM20-> Servo
PWM21-> Servo
PWM22-> Servo
PWM23-> Servo
PWM24-> Servo
作者: roboardgod    時間: 2012-1-12 11:53
請教下...
rcservo_Init(RCSERVO_USEPINS1TO24)
裡面的RCSERVO_USEPINS1 TO 24 這個您是從哪找到的??
因為我沒看過這東西...

然後你的問題[很多其他的pwm好像也都會有信號送到其他馬達]
是怎樣的情況?

*已測試過兩顆RS-0263馬達  未出現你說的情況...
作者: mzw2008    時間: 2012-1-12 14:15
哈哈
RB魔人出現了
而且有很壯觀的新辦公室耶XD
作者: roboardgod    時間: 2012-1-12 16:24
本帖最後由 roboardgod 於 2012-1-12 16:34 編輯
哈哈
RB魔人出現了
而且有很壯觀的新辦公室耶XD
mzw2008 發表於 2012-1-12 14:15


既然已經鯨魚大大注意到了, 本魔就順便自介一下吧!

自介:


稱號: RoBoard魔人(還是隻嫩魔而已啦)

等級: RoBoard初學者, 機器人菜鳥

職業: DMP象牙塔小書僮

目標: 成為RoBoard神人

夢想: RoBoard控制BigDog


本魔受 DMP 象牙塔上焚書坑儒的萬惡罪魁──藏鏡人指示, 專門來此地服 lu , 幫忙解答關於 RoBoard 的技術問題!


本魔目前大二,剛開始進入RoBoard與機器人的領域學習, 知識層面或許有很多不足的地方, 不足之處未來還請版上諸位大大不吝指導!


lu , 我來拜碼頭啦! 以後本魔萬一在版上搞出笑話, 還要請您多罩一下囉!


作者: roboardgod    時間: 2012-1-12 16:27
順便預告: 等 lu 大進駐新總部, 我會代替大家採訪 lu 大的高級專屬辦公室喔!
敬請期待~~
作者: lakers3411    時間: 2012-1-12 17:37
用rb控制bigdog好像不太好喔
黑道大哥會不爽

(小聲)他都很常來偷看喔,快改成控制老戴一號吧~
作者: miaoichi    時間: 2012-1-12 23:16
本帖最後由 miaoichi 於 2012-1-12 23:21 編輯
請教下...
rcservo_Init(RCSERVO_USEPINS1TO24)
裡面的RCSERVO_USEPINS1 TO 24 這個您是從哪找到的??
因 ...
roboardgod 發表於 2012-1-12 11:53


歹勢,這是我寫的但是我忘了貼上去。

    #define RCSERVO_USEPINS1TO24 (RCSERVO_USEPINS1+RCSERVO_USEPINS2+RCSERVO_USEPINS3+RCSERVO_USEPINS4+RCSERVO_USEPINS5+RCSERVO_USEPINS6+RCSERVO_USEPINS7+RCSERVO_USEPINS8+RCSERVO_USEPINS9\
+RCSERVO_USEPINS10+RCSERVO_USEPINS11+RCSERVO_USEPINS12\
+RCSERVO_USEPINS13+RCSERVO_USEPINS14+RCSERVO_USEPINS15+RCSERVO_USEPINS16\
+RCSERVO_USEPINS17+RCSERVO_USEPINS18+RCSERVO_USEPINS19+RCSERVO_USEPINS20\
+RCSERVO_USEPINS21+RCSERVO_USEPINS22+RCSERVO_USEPINS23+RCSERVO_USEPINS24)



我的問題是我把18個馬達都接上去,然後用我自己寫的程式去一個一個下command控制,
例如: sudo ./hexapod.exe 1  10000   1500
                ./hexapod.exe channel   period    duty

但是一執行下去,其他的馬達也會跟著亂動。
作者: mzw2008    時間: 2012-1-13 00:02
原來是這樣寫...
其實那些常數剛好都是2的整數次方, 直接用迴圈跑次方相加也是可以

剛剛心血來潮亂接了20顆(11顆MG995/祥儀的兩顆/7顆RS1270, 供三種不同電壓)
然後亂數送資料他也不會亂動耶
你是馬達都直接接RB?
還是像我一樣用共地另接電源

通通直接接RB100會有電力不穩的情況 , 馬達啟動時板子會不穩, 110因為SERVO獨立供電不會這樣
你的是100要單獨供喔
作者: mzw2008    時間: 2012-1-13 00:03
既然已經被鯨魚大大注意到了, 本魔就順便自介一下吧!
自介:
稱號: RoBoard魔人(還是隻嫩魔而已啦)等級 ...
roboardgod 發表於 2012-1-12 16:24


哈哈
這種介紹好像在玩角色扮演遊戲
出場值設定嗎?
作者: lucrece_lu    時間: 2012-1-13 09:36
哇  魔人駕到..... 請受小弟一拜
作者: roboardgod    時間: 2012-1-13 09:57
本帖最後由 roboardgod 於 2012-1-13 09:58 編輯

m大
你先確定下你RB背面的PULL-UP/DOWN開關 有切到PULL-DOWN位置
請再進一步確認BIOS裡面 Chipset > SouthBridge Configuration > Multi-Function Port Configuration選單的Port0~2的每個Bit都有切成OUT 0


如果沒有這樣設定的話 馬達在呼叫rcservo_Init()的時候 PWM腳位可能會從1變成0  導致馬達誤認為收到pulse亂動歐
作者: roboardgod    時間: 2012-1-13 10:43
本帖最後由 roboardgod 於 2012-1-13 12:34 編輯

程式有些小問題

M大的code
  1. int main(int argc, char **argv){
  2.     roboio_SetRBVer(RB_100);// first set the correct RoBoard version
  3.     if(InitServo())
  4.        return -1;
  5.     if(argc == 4)   {
  6.        BodyServoDrive((atoi(argv[1]) - 1),atol(argv[2]),atol(argv[3]));
  7.        return 0;
  8.     }    else if(argc == 3)   {
  9.         rcservo_OutPin((atoi(argv[1]) -1), atoi(argv[2]));  //你在前面InitServo()這個function就已經把所有PWM切成Servo-Mode PIN了  所以這個 GPIO-Mode PIN function :rcservo_OutPin() 在這使用會沒有效果喔~
  10.     }    else   {
  11.         printf("input example-- %s channel period duty \n",argv[0]);
  12.         printf("channel : from 1 to 19 \n");
  13.         printf("period 10ms => 10000\n");
  14.         printf("duty 1500us => 1500\n");
  15.     }
  16.     return -1;
  17. }


  18. int InitServo(void){
  19.      int i;
  20.      for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++)
  21.      if(i<5 || i>10)  //RCSERVO_PINS5其實不等於5喔~RCSERVO_PINS10也不等於10!   這邊建議改成 if(i<RCSERVO_PINS5 || i>RCSERVO_PINS10 ) 喔   ^^
  22.            rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB);     // select the servo model as non-feedback servo
  23.      if (rcservo_Init(RCSERVO_USEPINS1TO24) == false)  // set PWM/GPIO  as Servo mode
  24.     {
  25.         printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
  26.         return -1;
  27.     }
  28.     return 0;
  29. }
  30. void BodyServoDrive(int channel, long period, long duty){
  31.     rcservo_EnterPWMMode();  // make all servo-mode pins go into PWM mode
  32.     printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
  33.     rcservo_SendCPWM(channel, period, duty);
  34.     printf("Press ENTER to stop.\n");
  35.     getchar();
  36.     rcservo_StopPWM(channel);
  37.     rcservo_Close();  // close RC Servo lib  //rcservo_Close()最好要放在程式結束的地方
  38. }   
複製代碼





魔人修過的code
  1. //程式使用PIN S1~S4 及 S11~S24  為Servo-Mode PIN
  2. #define USEDPINS  (RCSERVO_USEPINS1+RCSERVO_USEPINS2+RCSERVO_USEPINS3+RCSERVO_USEPINS4+RCSERVO_USEPINS11+RCSERVO_USEPINS12+RCSERVO_USEPINS13+RCSERVO_USEPINS14+RCSERVO_USEPINS15+RCSERVO_USEPINS16+RCSERVO_USEPINS17+RCSERVO_USEPINS18+RCSERVO_USEPINS19+RCSERVO_USEPINS20+RCSERVO_USEPINS21+RCSERVO_USEPINS22+RCSERVO_USEPINS23+RCSERVO_USEPINS24)

  3. int InitServo(void);
  4. void BodyServoDrive(int channel, long period, long duty);
  5. int main(int argc, char **argv)
  6. {
  7.     roboio_SetRBVer(RB_100);// first set the correct RoBoard version
  8.     if(InitServo())
  9.        return -1;
  10.     if(argc == 4)
  11.    {
  12.        BodyServoDrive((atoi(argv[1]) - 1),atol(argv[2]),atol(argv[3]));
  13.     }
  14.     else if(argc == 3)
  15.    {
  16.         if((atoi(argv[1]) -1) >=  RCSERVO_PINS5 && (atoi(argv[1]) -1) <=  RCSERVO_PINS10 )
  17.              rcservo_OutPin((atoi(argv[1]) -1), atoi(argv[2]));
  18.         }else
  19.    {
  20.         printf("input example-- %s channel period duty \n",argv[0]);
  21.         printf("channel : from 1 to 19 \n");
  22.         printf("period 10ms => 10000\n");
  23.         printf("duty 1500us => 1500\n");
  24.     }
  25.     rcservo_Close();
  26.     return -1;
  27. }

  28. int InitServo(void)
  29. {
  30.      int i;
  31.      for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++)
  32.           if(i< RCSERVO_PINS5 || i> RCSERVO_PINS10 )
  33.                 rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB);     // select the servo model as non-feedback servo
  34.      if (rcservo_Init(USEDPINS) == false)  // set PWM/GPIO  as Servo mode
  35.     {
  36.         printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
  37.         return -1;
  38.     }
  39.     return 0;
  40. }

  41. void BodyServoDrive(int channel, long period, long duty)
  42. {
  43.     rcservo_EnterPWMMode();  // make all servo-mode pins go into PWM mode
  44.     printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
  45.     rcservo_SendCPWM(channel, period, duty);
  46.     printf("Press ENTER to stop.\n"); getchar();
  47.     rcservo_StopPWM(channel);
  48. }

  49.   
複製代碼
試過基本上是沒問題
有問題在提出來吧^^~
作者: roboardgod    時間: 2012-1-13 12:21
哇  魔人駕到..... 請受小弟一拜
lucrece_lu 發表於 2012-1-13 09:36



   不不不~ lu大駕到.....  請受小魔一拜
作者: miaoichi    時間: 2012-1-13 22:31
回復 12# mzw2008


   我是RB-100,所以我要分開供電?(主板一個電源,全部馬達一個電源,接地共接這樣嗎?)
如果是,我想應該是這個問題。那我再修改一下電路再來試試。

謝謝
作者: miaoichi    時間: 2012-1-13 22:33
程式有些小問題

M大的code




魔人修過的code
試過基本上是沒問題
有問題在提出來吧^^~
roboardgod 發表於 2012-1-13 10:43


感謝魔人大的指正,小的馬上再來試試。等結果上po上來吧
謝謝
作者: mzw2008    時間: 2012-1-13 23:47
回復  mzw2008
   我是RB-100,所以我要分開供電?(主板一個電源,全部馬達一個電源,接地共接這樣嗎? ...
miaoichi 發表於 2012-1-13 22:31

因為我之前常有這種問題
而且因為接多種不同電壓的馬達
這樣做也可以徹底搞定
畢竟RB-100 要驅動馬達太容易了
理論上應該是隨便作都會動啊
作者: mzw2008    時間: 2012-1-13 23:48
RB 100 才需要這樣
RB 110 因為SERVO電源已經獨立一組
可直接接
作者: miaoichi    時間: 2012-1-14 00:25
請問一下,可以說明RB100獨立電源怎麼接?
pwm三個腳
- => 共地
+ => 獨立電源
P => 從rb拉pwm出來嗎? (若是,但因為pwm的電源位準不同,這樣接對嗎?)
不對的話,請指正。謝謝
作者: mzw2008    時間: 2012-1-14 01:16
本帖最後由 mzw2008 於 2012-1-14 01:20 編輯

就這樣接啊
都共地了

不過一般若是用電池(要大號一點的)
且SERVO沒很多顆或是同時啟動
也不需要這麼麻煩

但我之前看安東尼他們展出時都沒這樣做
都直接一顆電池接機器人照樣可以玩
這就要有請魔人解惑了
作者: roboardgod    時間: 2012-1-16 09:35
本帖最後由 roboardgod 於 2012-1-16 09:49 編輯

回鯨魚大
就RB100來說PWM的三個腳位為GND,VXX,GPXX
所以電源給多少伏的電   VXX那根腳位就會出來一樣的電歐
基本上電池超過6V   放電能力不要太差   基本上是不會有問題的^^

回M大
至於獨立電源...   M大你的馬達應該不會都不一樣吧?   (電壓一樣的話是不用特別這樣做的呦)
然後你說的方法是正確的歐~



馬達亂動本魔猜測應該是跟電源沒什麼關係
請檢查下15樓, 16樓回覆的那些要件
如果還不行的話再提出來吧^^!
作者: miaoichi    時間: 2012-1-16 21:27
感謝各位大大的相助。
目前已經可以了,也不需要獨立電源。
原因是我初始化的地方弄錯了~~
謝謝大家




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2