Robofun 機器人論壇

標題: 要如何讓馬達動呢? [打印本頁]

作者: miaoichi    時間: 2010-5-16 12:16
標題: 要如何讓馬達動呢?
目前可以開始寫程式了,但是要如何讓馬達動呢?
我裝了一個servo在第0個位置,然後寫了下面的code
但看了文件,好像還不會讓它動起來~~~
請問有人可以教一下嗎?
謝謝

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "userio.h"
#include "demofile.h"
#include <roboard.h>

int main(int argc, char* argv[])
{
    //初始化
    if (rcservo_Initialize(RCSERVO_USECHANNEL0) == true)
{
  showmsg("...success\n");
  //設定servo no feedback
  rcservo_SetServo(RCSERVO_USECHANNEL0, RCSERVO_SERVO_DEFAULT_NOFB);

  //關閉servo lib
  rcservo_Close();
        showmsg("press any key to ending \n");
  keyboard_waitkey();
  return 1;
}


}
作者: mzw2008    時間: 2010-5-18 01:19
首先確認showmsg("...success\n");
這行到底有沒有跑到, 至少要看初始化到底有過了沒

使用RC Servo lib
有這三種模式 Capture mode,  Action playing mode,  PWM mode
第一種給高級貨用的, 第二種為"動作"播放,  標準來講使用最後一種, 便宜貨沒辦法...

PWM模式使用以下作法
把你那行....
rcservo_SetServo(RCSERVO_USECHANNEL0, RCSERVO_SERVO_DEFAULT_NOFB);
改為
rcservo_EnterPWMMode();
unsigned long PWM_period = 20000; //20000us
unsigned long PWM_duty = 1500; // PWM 0.15 ms 置中
unsigned long count = 100;
rcservo_SendPWMPulses(channel, 20000, 1500, 100); <=後三個參數就是上面那三個
while (!rcservo_IsPWMCompleted(channel));

其實roboard的PWM很精確...可以做到1us , 可以做很搞笑的應用喔
作者: miaoichi    時間: 2010-5-18 09:09
我的showmsg("rcservo_Initialize success.\n")有印出來,但是馬達都沒有動~~~~

int main(int argc, char* argv[])
{
    unsigned long usedchannels = 0x00ffff80L; //default to use channels 7~23
    if(rcservo_Initialize(usedchannels))
    {
     showmsg("rcservo_Initialize success.\n");
     unsigned long PWM_period = 20000L; //20000us
     unsigned long PWM_duty_middle = 1500L; // PWM 1.5 ms 置中
     unsigned long PWM_duty_left = 800L; // PWM 0.8 ms 置中
     unsigned long PWM_duty_right = 2200L; // PWM 2.2 ms 置中
     unsigned long count = 100;      
      rcservo_EnterPWMMode();
      while(true)
   {
         rcservo_SendPWMPulses(usedchannels, PWM_period, PWM_duty_left,1);
   showmsg("playing PWM_duty_left .\n");
         while (!rcservo_IsPWMCompleted(usedchannels));
   showmsg("finishing PWM_duty_left .\n");
   Sleep(2000);
         rcservo_SendPWMPulses(usedchannels, PWM_period, PWM_duty_middle,1);
   showmsg("playing PWM_duty_middle .\n");
         while (!rcservo_IsPWMCompleted(usedchannels));
   showmsg("finishing PWM_duty_middle .\n");
   Sleep(2000);
         rcservo_SendPWMPulses(usedchannels, PWM_period, PWM_duty_right,1);
   showmsg("playing PWM_duty_right .\n");
         while (!rcservo_IsPWMCompleted(usedchannels));
   showmsg("finishing PWM_duty_right .\n");
   Sleep(2000);
      }
   }   
   rcservo_Close();
}
作者: acen2008    時間: 2010-5-18 13:41
本帖最後由 acen2008 於 2010-5-18 14:21 編輯

HI~
rcservo_SendPWMPulses和rcservo_SetServo是設定單一channel的函數
所以channel參數只能輸入0、1、2、3...、23喔 (要使用到23以上要小改一下RoBoard)
而rcservo_Initialize()中的channel是可設定為複數的,假如你要使用channel 0、1、4
輸出PWM,則channel = RCSERVO_USECHANNEL0 + RCSERVO_USECHANNEL1 +
RCSERVO_USECHANNEL4,假如只要用到channel 1的話,
channel = RCSERVO_USECHANNEL1 就可以了。

下面的code是我測過可動的,不妨參考一下:)

#include <stdio.h>
#include <conio.h>
#include <roboard.h>

int main(void)
{
        //使用的Library是V1.6版要呼叫roboio_SetRBVer(),不是則不用
        //使用的硬體是RB100,輸入參數=RB_100,使用RB110,輸入參數=RB_110
        //Note : RB110只有16組PWM
        roboio_SetRBVer(RB_100);
       
        //rcservo_SetServo是設定單一channel的函數,channel = 0 ~ 23
        //必須在rcservo_Initialize之前呼叫
        rcservo_SetServo(0, RCSERVO_SERVO_DEFAULT_NOFB);
        rcservo_SetServo(1, RCSERVO_SERVO_DEFAULT_NOFB);

        //初始化:把Channel 0和1切換成PWM輸出,其他channel為GPIO
        if(rcservo_Initialize(RCSERVO_USECHANNEL0 +
                                       RCSERVO_USECHANNEL1) == false)
        {
                //初始化失敗則印出錯誤訊息
                printf("%s",roboio_GetErrMsg());
                rcservo_Close();
                return -1;
        }

        //進入PWM Mode
        rcservo_EnterPWMMode();
       
        //將period = 10000us,duty = 1500us,count = 50 次的PWM從channel 0 輸出
        //將period = 10000us,duty = 1700us,count = 10 次的PWM從channel 1 輸出
        //rcservo_SendPWMPulses是設定單一channel的函數,channel = 0 ~ 23
        rcservo_SendPWMPulses(0,10000L,1500L,50L);
        rcservo_SendPWMPulses(1,10000L,1700L,10L);

        printf("Send PWM pulse.\n");

        //等channel 0 的PWM送完
        while (rcservo_IsPWMCompleted(0) == false);

        //結束程式
        rcservo_Close();
        return 0;
}
作者: mzw2008    時間: 2010-5-18 16:21
HI~
rcservo_SendPWMPulses和rcservo_SetServo是設定單一channel的函數
所以channel參數只能輸入0、1、2、 ...
acen2008 發表於 2010-5-18 13:41

咦?! 請教一下喔
Roboard不就24組PWM而已嗎?
為何會說要設定到24以上還需要另外的花樣?
哪來的24以上?
作者: miaoichi    時間: 2010-5-18 16:46
原廠文件有說
可使用 25~32 pwm -> 利用com1來改
作者: mzw2008    時間: 2010-5-18 17:39
com 1...那是要外接吧
我是說板子上的部份耶
外接等於是要多少都有了啊
像我用com接出來...上百顆都能接了---> 應用在遊樂場的跑馬台
作者: miaoichi    時間: 2010-5-18 23:01
回復 4# acen2008


    我將你的code整個貼上,然後執行,還是沒有反應~~~~~
另外偷偷問一下, pwm第一個是哪一邊呀??看了文件好像沒有說得很清楚`~~
作者: mzw2008    時間: 2010-5-18 23:30
http://www.roboard.com/Files/RB-100/RoBoard_RB-100_v2r0A.pdf
第七頁
S1從SPI右邊那個開始往"上"算
USB右邊那個是S16
板子上面也有標示喔
作者: miaoichi    時間: 2010-5-19 00:42
看起來我接的PWM位置沒錯,但是還是沒有動起來~~~~
還有沒有什麼可能??
作者: mzw2008    時間: 2010-5-19 01:01
聽起來就超怪
應該要會動了哩

板子電壓給多少?
作者: lucrece_lu    時間: 2010-5-19 08:06
S1 = channel 0
你再確認一下你有沒有接錯吧
還是你照起來 這樣也許快一點
作者: miaoichi    時間: 2010-5-19 08:44
我是接6V的電池(右邊供電),左邊(黑紅白)就是馬達(Futaba 3003) ,但是都沒反應






作者: acen2008    時間: 2010-5-19 10:03
HI~
圖中你的馬達接到channel 2了(S3)
請換到channel 0和1應該就可以了
另一種方法,你將程式中的channel改為channel 2也可以:)
作者: miaoichi    時間: 2010-5-19 10:32
原來0 和 1 是與 其他14個是分開的喔~~~~,害我一直以為那個就是第1個~~~
晚上再來試試~~~謝謝喔
作者: mzw2008    時間: 2010-5-19 13:55
哈哈哈....我昨天講的位置你沒仔細看喔
果然有圖有真相
真的是接錯
其實板上就有標示, 仔細看清楚喔
作者: mzw2008    時間: 2010-5-19 13:56
忽然發現你的VGA沒有貼散熱片喔...
快去貼一片吧
這樣用還滿危險
作者: miaoichi    時間: 2010-5-19 15:50
對呀,我的vga很熱~~~~~不知要貼哪一種的~~~~~還有
roboard好像會很耗電。我的2400mAh的很快就沒電了
作者: miaoichi    時間: 2010-5-19 22:28
= = 果然可以動了~~~~~感謝樓上諸位大大~~~
作者: mzw2008    時間: 2010-5-19 23:46
散熱片我就是去買電腦專門貼在RAM上面那種小片的而已
只要有貼就好
不用管是不是很大片
但要小心旁邊的零件比晶片高了一點點
散熱片貼的時候小心不要碰到

耗電的問題
板子: 5V*400mA 約是2W
VGA: 5V * 80mA =0.4W
其實...一顆SERVO就超過他了, 何況你一台機器人裝了十多顆SERVO, 所以其實還好,
而且硬要省電可以連VGA卡都拔掉不用裝, 一樣可以用
作者: miaoichi    時間: 2010-5-20 07:04
原來要貼散熱片呀~~~好幾次都覺得爆熱的,都用大台電風扇直接吹,還好沒熱掉。

不用插卡也可以開喔??那如果寫好的程式要run
也可以自動執行嗎?
作者: mzw2008    時間: 2010-5-20 16:13
天啊...風扇, 哈哈.....

roboard的特異功能還多著哩
DMP這家公司就專搞嵌入系統的
就是專門應用在一些奇怪的應用領域的啊
寫好的程式要run就是丟到啟動或是弄成service而已

但是不接VGA卡 , 其實對省電來講幫助不大...
我主要是看中他不接以後, 板子的體積會變小




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