Robofun 機器人論壇
標題: Roboard 的 PWM 好像會干擾? [打印本頁]
作者: miaoichi 時間: 2012-1-8 17:29
標題: Roboard 的 PWM 好像會干擾?
以下範例程式是輸入要執行的pin,channel, period, duty 來控制某一個pwm
但是一執行,很多其他的pwn好像也都會有信號送到其他馬達,
請問是哪裡有問題?是軟體還是硬體?
-
- int main(int argc, char **argv)
- {
- int i;
- roboio_SetRBVer(RB_100;
- for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++) //只初始 1~4 , 11~24的pwm
- if(i<RCSERVO_PINS5 || i>RCSERVO_PINS10)
- rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB); // select the servo model as non-feedback servo
- if (rcservo_Init(RCSERVO_USEPINS1TO24) == false) // set PWM/GPIO pin 1~4 , 11~24 as Servo mode
- {
- printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
- return -1;
- }
-
- rcservo_EnterPWMMode(); // make all servo-mode pins go into PWM mode
- printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
- rcservo_SendCPWM((atoi(argv[1]) - 1),atol(argv[2]),atol(argv[3]));
- printf("Press ENTER to stop.\n"); getchar();
- rcservo_StopPWM(channel);
- rcservo_Close(); // close RC Servo lib
- }
複製代碼
作者: 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大幫忙,我把程式重貼了,請幫我再看一下。謝謝
- int main(int argc, char **argv)
- {
- roboio_SetRBVer(RB_100);// first set the correct RoBoard version
- if(InitServo())
- return -1;
- if(argc == 4)
- {
- BodyServoDrive((atoi(argv[1]) - 1),atol(argv[2]),atol(argv[3]));
- return 0;
- }
- else if(argc == 3)
- {
- rcservo_OutPin((atoi(argv[1]) -1), atoi(argv[2]));
- }
- else
- {
- printf("input example-- %s channel period duty \n",argv[0]);
- printf("channel : from 1 to 19 \n");
- printf("period 10ms => 10000\n");
- printf("duty 1500us => 1500\n");
- }
- return -1;
- }
- int InitServo(void)
- {
- int i;
- for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++)
- if(i<5 || i>10)
- rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB); // select the servo model as non-feedback servo
- if (rcservo_Init(RCSERVO_USEPINS1TO24) == false) // set PWM/GPIO as Servo mode
- {
- printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
- return -1;
- }
- return 0;
- }
- void BodyServoDrive(int channel, long period, long duty)
- {
- rcservo_EnterPWMMode(); // make all servo-mode pins go into PWM mode
- printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
- rcservo_SendCPWM(channel, period, duty);
- printf("Press ENTER to stop.\n"); getchar();
- rcservo_StopPWM(channel);
- rcservo_Close(); // close RC Servo lib
- }
複製代碼
作者: 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- int main(int argc, char **argv){
- roboio_SetRBVer(RB_100);// first set the correct RoBoard version
- if(InitServo())
- return -1;
- if(argc == 4) {
- BodyServoDrive((atoi(argv[1]) - 1),atol(argv[2]),atol(argv[3]));
- return 0;
- } else if(argc == 3) {
- rcservo_OutPin((atoi(argv[1]) -1), atoi(argv[2])); //你在前面InitServo()這個function就已經把所有PWM切成Servo-Mode PIN了 所以這個 GPIO-Mode PIN function :rcservo_OutPin() 在這使用會沒有效果喔~
- } else {
- printf("input example-- %s channel period duty \n",argv[0]);
- printf("channel : from 1 to 19 \n");
- printf("period 10ms => 10000\n");
- printf("duty 1500us => 1500\n");
- }
- return -1;
- }
- int InitServo(void){
- int i;
- for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++)
- if(i<5 || i>10) //RCSERVO_PINS5其實不等於5喔~RCSERVO_PINS10也不等於10! 這邊建議改成 if(i<RCSERVO_PINS5 || i>RCSERVO_PINS10 ) 喔 ^^
- rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB); // select the servo model as non-feedback servo
- if (rcservo_Init(RCSERVO_USEPINS1TO24) == false) // set PWM/GPIO as Servo mode
- {
- printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
- return -1;
- }
- return 0;
- }
- void BodyServoDrive(int channel, long period, long duty){
- rcservo_EnterPWMMode(); // make all servo-mode pins go into PWM mode
- printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
- rcservo_SendCPWM(channel, period, duty);
- printf("Press ENTER to stop.\n");
- getchar();
- rcservo_StopPWM(channel);
- rcservo_Close(); // close RC Servo lib //rcservo_Close()最好要放在程式結束的地方
- }
複製代碼
魔人修過的code
- //程式使用PIN S1~S4 及 S11~S24 為Servo-Mode PIN
- #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)
- int InitServo(void);
- void BodyServoDrive(int channel, long period, long duty);
- int main(int argc, char **argv)
- {
- roboio_SetRBVer(RB_100);// first set the correct RoBoard version
- if(InitServo())
- return -1;
- if(argc == 4)
- {
- BodyServoDrive((atoi(argv[1]) - 1),atol(argv[2]),atol(argv[3]));
- }
- else if(argc == 3)
- {
- if((atoi(argv[1]) -1) >= RCSERVO_PINS5 && (atoi(argv[1]) -1) <= RCSERVO_PINS10 )
- rcservo_OutPin((atoi(argv[1]) -1), atoi(argv[2]));
- }else
- {
- printf("input example-- %s channel period duty \n",argv[0]);
- printf("channel : from 1 to 19 \n");
- printf("period 10ms => 10000\n");
- printf("duty 1500us => 1500\n");
- }
- rcservo_Close();
- return -1;
- }
- int InitServo(void)
- {
- int i;
- for(i=RCSERVO_PINS1;i<=RCSERVO_PINS24;i++)
- if(i< RCSERVO_PINS5 || i> RCSERVO_PINS10 )
- rcservo_SetServo(i, RCSERVO_SERVO_DEFAULT_NOFB); // select the servo model as non-feedback servo
- if (rcservo_Init(USEDPINS) == false) // set PWM/GPIO as Servo mode
- {
- printf("ERROR: fail to init RC Servo lib (%s)!\n", roboio_GetErrMsg());
- return -1;
- }
- return 0;
- }
- void BodyServoDrive(int channel, long period, long duty)
- {
- rcservo_EnterPWMMode(); // make all servo-mode pins go into PWM mode
- printf("Send PWM pulses of period %ldus duty %ldus on pin %d...\n",period,duty,channel+1);
- rcservo_SendCPWM(channel, period, duty);
- printf("Press ENTER to stop.\n"); getchar();
- rcservo_StopPWM(channel);
- }
-
複製代碼 試過基本上是沒問題
有問題在提出來吧^^~
作者: 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 |