看到最近版上有很多大大對自製Servo 控制板有很大的研究,感覺到原來有這麼多同好,心中突然有股溫暖~~~咳咳 好像太肉麻了~~
其實在看了很多大大的文章之後,受到精神感召,也來介紹一塊控制Servo的版子,這塊版子可完完全全都是愛用國貨 核心是用盛群的HT46R24
程式也是國產的(此模組的規格還有程式架構是小弟我構思的 現醜囉:P)
就連Regulator和 版子上用來存frame的eeprom也全都是國產(盛群)的,那就是利基應用科技所推出的16CH ServoRunner A控制版
雖說這塊版子的ch數只有16個,但是若是配合利基應用科技開發程式的環境,最多可以接32塊ServoRunner A控制版,算一算做個一兩百支腳的馬陸應該不是問題了 呵呵
廢話不多說 我就直接轉入正題 就先來介紹這塊版子的feature吧
1.十六組伺服器輸出介面,可同時控制十六組伺服器。
2.可控制伺服器位置由0.5 ms 至2.5 ms。
3.軟體微調指令,不用機械拆裝,僅由軟體設定,就可以達到微調各個伺服器轉向角度的目的,可設定-128~127 μS 。
4.程式可以設定伺服器轉向速度,使用者可根據需求設定多段的伺服器轉向速度。(簡單說就是同時給個速度 還有角度的資料 模組就會自己幫你算好並把servo移到定位)
5. 使用者可以設定一個共同時間,讓各個伺服器在同時間達到不同的轉向角度。(這個跟上一條很像,不過速度被換成時間 了 也是一樣只要下時間還有腳度的參數 模組就幫你移到定位囉)
6.內建120 組伺服器記憶空間,每組可以儲存目前設定好的十六個伺服器目標位置,
與速度或時間參數,在需要時直接呼叫,可以免去重覆設定的動作,也可以快速組
合出多樣化的效果。(這個功能超好用)
7.設有四組事件提醒,讓使用者可以在判斷動作完成後,自動進行下一項操作。箇是
件可以設定任意1~16 各伺服器作為判斷依據。(基本上就是把大家在寫程式的Event的功能(在MCU上就是interrupt)讓user在等待動作完成之餘可以先去做其它事情之後又可以很精準的控制下個動作)
各種狀態取得指令,使用者可以隨時確認伺服器是否動作完成,取得現在位置,目
標位置,微調參數,或是設定的時間與速度值。
解析度可達2μS。(2us我想也夠了 之前跟廣營的林董聊,他說他們的servo解析度也只有做到3~4us而已)
再來聊到價格, ServoRunner A的價格(一千多一點) 這就由各位大大來決定是否劃不划算囉:p
要操作ServoRunner A 其實非常簡單 以下是操作的程式碼 利用利基應用的開發環境(軟體完全免費)
基本上程式碼跟VisualBasic是一樣的
ServoRunnerA在程式裡就如一個物件一樣
範例程式:
' 範例程式中的位址是以多數伺服器的範圍設定,
' 請根據所使用的伺服器可設定的位址做調整,以免造成伺服器毀損
Peripheral mySer As ServoRunnerA @ 0 ' 設定模組編號為0 (基本上可以接最多32個ServoRunnerA模組 做個蜈蚣吧 呵呵)
Dim EventEnd As Byte ' 儲存事件處理完成的判斷參數
Dim i As Byte ' 儲存迴圈的判斷值
Dim SerStatus As Byte 『 儲存Servo 的Status 值
Sub Main() ' 主程式
mySer.SetPosOffset(0, 0) ' 設定Servo0 的微調值為0 (在之前的程式碼已經把ServoRunnerA定義為MySer了)
mySer.SetPosAndRun(0, 1500) ' 啟動Servo0 移動到1500 的位址
Pause 1000 ' 暫停一段時間讓伺服器移動到固定位址
mySer.SetPos(0, 2200) ' 指定Servo0 目標位址為2200
mySer.SaveFrame(0) ' 將目前設定的伺服器動作存到Frame0 中(總共有120個frame可以存在ServoRunnerA裡 每個Frame都可以同時存住16ch的角度 速度還有時間資料)
mySer.Run1Servo(0) ' 讓Servo0 開始動作 (不僅是Run1Servo 還有Run2Servo一直到RunAllServo都可以讓servo同時動作,要動做的ch完全可以任意選擇)
Pause 500
mySer.SetPosSpdAndRun(0, 700, 1000) ' 啟動Servo0 以速度1000 移動到700 的位址
Pause 2000
mySer.SetPosTimeAndRun(0, 2200, 1000) ' 啟動Servo0 花一秒的時間移動到2200 的位址
Pause 1000
EventEnd=0
mySer.SetPosTime(0, 700, 1000) ' 設定Servo0 花一秒的時間一動到700 的位址
mySer.SaveFrame(1) ' 將目前設定的伺服器動作存到Frame1 中
mySer.Run1ServoWithEventA(0) ' 啟動Servo0 並於動作結束產生EventA
Do '(此部份在等待event回傳)
Pause 1
Loop Until EventEnd=1
' 下面的迴圈反覆讀取Frame0 與Frame1 的設定值,再啟動Servo0 執行
' Frame0 儲存的位址為2200,Frame1 儲存的位址為700
' Servo0 將在這兩個位址間來回移動四次
For i=0 To 3
mySer.LoadFrame(1) ' 讀取儲存於Frame1 的設定值
mySer.Run1Servo(0)
Pause 1000
mySer.LoadFrame(0) ' 讀取儲存於Frame0 的設定值
mySer.Run1Servo(0)
Pause 1000
Next
mySer. SetPosAndRun(0, 1500)
' 下面的迴圈反覆執行讀取Status 的動作,
' 在確定動作結束後,才會跳出迴圈
Do
mySer.Get1ServoReadyStatus(0, SerStatus) 『 讀取Servo0 的狀態存於SerStatus 中(這裡也一樣可以同時讀取1~16ch的共同的status ,例如 mySer.Get3ServoReadyStatus(2,4,13,serstatus) :此指令會告知ch2 ch4 ch13是否都已到定位)
Loop Until SerStatus>0
End Sub
Event mySer.ServoPosReadyEventA() (此部份就為event的寫法 基本上跟VC VB的寫法完全一模一樣 用法也一樣)
mySer.SetPosAndRun(0, 2200)
Pause 1000
EventEnd=1
End Event
其實小弟當初在構思這塊Servo控制模組時 花了很多時間在構思如何用簡單的指令 但是卻可以做出複雜的動作
若是各位大大還有興趣的話 可以參考附件裡的這塊模組的指令完整說明,看看是否還有些指令可以改進的
此外 做這模組也算是替國產IC爭口氣吧,因為總覺得國貨IC其實並不比國外M牌或A牌話T牌來的難用,
當然也希望各位大大也能多多支持小弟 (寫到這已經半夜頭昏中:p 快神智不清了 )
聯結裡的影片都是用這塊版子所做的機器人動作
小弟我下一次再介紹 另一個專為ServoRunnerA的Frame所做的Frame motion Editor 些這樣囉~~~
謝謝囉
VIDEO
VIDEO
VIDEO