Robofun 機器人論壇

標題: [Roboard機器人實習計畫]-投籃機器人 [打印本頁]

作者: derrick    時間: 2011-3-31 23:08
標題: [Roboard機器人實習計畫]-投籃機器人
這一次我們嘗試利用Roboard提供的API來產生PWM訊號,進而控制伺服馬達
我們使用的伺服馬達型號為GWS servo S35/STD。除此之外,我們還把影像
的部份加了進來,希望能夠完成電腦視覺加驅動器的雛形。

首先我們先把伺服馬達與全向輪結合。



這裡要注意先把白色的塑膠片與全向輪黏合



把伺服馬達原來附塑膠片拆下,再把全向輪卡榫上去,在鎖上螺絲,輕鬆完成!

再來是程式部份,伺服馬達需要PWM訊號來控制Roboard提供了API rcservo_SendPWM
可以方便的產生PWM訊號,但這次我們選用最新版本的RoBoIO 1.7 for BCB
才有的API rcservo_SendCPWM 來產生PWM訊號,此API用法可以在Include檔裡面的
rcservo.h裡面找到說明,這兩個API都在rcservo_EnterPWMMode()下。


用法如下
rcservo_SendPWM(int channel, unsigned long period, unsigned long duty, unsigned long count)
rcservo_SendCPWM(int channel, unsigned long period, unsigned long duty);


這兩個API最大的不同在於 rcservo_SendPWM 裡面的count參數可以設定產生的PWM有幾個方波,
直到此參數的值為0時才會停止。而 rcservo_SendCPWM 只友執行後就會無限的產生訊號
直到呼叫強制停止PWM的API為止。

以下為利用rcservo_SendCPWM產生訊號的code:

roboio_SetRBVer(RB_110);
rcservo_SetServo(0, RCSERVO_SERVO_DEFAULT);

if (rcservo_Initialize(RCSERVO_USECHANNEL0))
{
rcservo_EnterPWMMode();
unsigned long PWM_period = 10000L ;
unsigned long PWM_duty = 9000L;

rcservo_SendCPWM(0,PWM_period, PWM_duty);

}
相關的用法在官網提供的範例教學PDF有說明,就不再另述。

如果成功啟動伺服馬達轉動之後,想要把馬達停止下來可以利用 rcservo_Close()
來停止,如此一來便可隨心所欲的控制馬達轉動與否。另外Roboard也提供了API rcservo_StopPWM(int channel)來停止訊號,
但是實做結果卻無法如預期的一樣,能夠控制馬達轉動,原因是一但執行到 rcservo_StopPWM後
就再也無法產生PWM,我們目前還不知道問題出在哪,希望各位看倌能夠指點迷津一下:)

目前為止控制碼達部份已經大致完成,另外需要與視覺結合,我們一樣用Webcam當作視覺感測器

因為我們的Webcam的影像壓縮格式為YUYV,所以一開始我們先轉到熟悉的RGB格式
然後再把24位元全彩的影像降為8位元灰階影像,公式為:

Y = 0.299*R + 0.587*G + 0.114*B

之後可以再做二值化處理,加強你要追蹤的物體訊號。

以上都完成後就可以把兩個部份結合在一起,可以執行由雷射光點觸發伺服馬達轉動的任務。
在這裡要特別注意一下,如果是參考官網上的pdf檔的範例程式,記得要把下列code砍掉,不然
只要PWM送出後,程式就會在此迴圈裡打轉,導致影像的部份會停止運作,切記小心!

while(!rcservo_IsPWMCompleted(channel))
{

}




我們可以利用這個雛形完成衍生的小任務,例如當把雷射光點指向 "快" 時,馬達會快速轉動,
指向"慢" 時會用慢速轉動,影片分享給大家:)





最後,可以看的出來從雷射光點觸發到馬達轉動靈敏度不太好,但是光點消失後馬達可以立刻停止轉動,
這部分未來會再繼續研究加強改善,讓靈敏度提升達到平滑的效果!




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