Mindsensors NXTMMX的主要功能是提供NXT可以增加兩個馬達的輸出。
這是一個I 2C裝置,外觀上共具有四個RJ12 Ports以及一個外部電源輸入端子:
用途分別為:
l M1/M2:連接兩個馬達輸出。
NXTMMX所設計的輸出控制功能主要是以NXT Servo Motor為對象,提供運轉角度、時間與速度的控制,而同時也適用於Firgelli L12-NXT線性致動器,此外,透過適當的轉接線,PF Motor、Lamp、Technic Motor等同樣都可以連接使用,差別只在於沒有角度控制功能,所以,在運用上具有如同NXT Output Ports一樣的彈性。
l NXT:連接NXT Input Ports。
由NXT透過I 2C通訊方式操控裝置。
l Sensor:串接其他I 2C裝置(數位感應器)。
NXTMMX出廠預設I 2C Address為0x06,而串接在同一個Input Port的裝置位址須不一樣,還好除了NXTMMX之外,應該沒有其他數位裝置的位址是0x06,而若需要變更I 2C位址設定,可以使用Mindsensors所提供的程式修改。
l 9V電源輸入端子:連接外部電源供電給M1/M2 Ports的馬達。
外部電源的連接方式,在Mindsensors NXTMMX的產品網頁上有9V電池盒供選購,而我是使用舊款的Technic電源線。
再加上PF電源延長線(L8886)連接PF電池盒(L8881)作為供電
電源輸入的極性必須正確,否則無法正常供電,所以若NXTMMX能夠提供電源指示燈,使用上應該會更便利。
NXTMMX的馬達操控
比較NXT Output Module對於Servo Motors的控制功能,NXTMMX同樣可以分別控制連接在M1/M2 Ports兩個Servo Motors的運轉角度與輸出速度,此外還增加了運轉時間的設定。
而不同於Output Module所使用的OnFwd()、RotateMotor()等指令, NXTMMX是透過I 2C通訊方式來操控馬達;在撰寫程式時,也許沒有那麼直覺與精簡,不過,若能瞭解清楚NXTMMX的特性與用法,相較於Output Module的主要功能大都具備了,同時還多了一些友善的輔助設計,所以應該是相當實用且好玩的裝置。
而運用I 2C通訊操控NXTMMX,首先即須要瞭解裝置的Register Layout與內建指令的用法。
NXTMMX Register Layout 與 指令用法
NXTMMX Register的主要用途為提供對兩個Output Ports的控制功能所需之設定值與馬達運轉過程中回饋的狀態值,所以用到的Registers數目並不少,因此須要先組織與整理Register Layout的配置與用法,這樣才有助於掌握各種運用情況下所相關之Register的設定方式以及內建指令的使用時機。
NXTMMX Register Layout說明文件可以參考Mindsensors所提供之Users Guide Page 5~7,而以下為依據用途所作的整理分類:
l 讀取裝置狀態值 / 寫入指令:
0x41 - 存放目前外部電源的電壓值(Voltage) 或 寫入所要執行的控制指令
讀取這個位址可以判斷外接電源的供電狀態,若極性接錯,回傳值為0,馬達即無法運轉。
目前已提供的控制指令清單在Users GuidePage7,而較常用的是:
R:Reset所有馬達參數設定值與狀態值,可以作為初始化Ports的動作。
S:讓兩個Motor的參數設定值同時生效,用來啟動同步運轉。
l 設定M1/M2 Port馬達運轉參數:
透過將馬達運轉設定值寫入以下控制參數的Registers位址,可以對馬達進行運轉控制:
■旋轉角度設定參數 - M1 0x42~0x45,M2 0x 4A~0x4D
■輸出速度設定參數 - M1 0x46 ,M2 0x4E
■運轉時間設定參數 - M1 0x47 ,M2 0x4F(以秒為單位)
■控制功能設定參數 - M1 0x49 ,M2 0x51(參考Users GuidePage8),
控制功能設定參數的作用就如同NXT Output Module的UpdateFlags Field Constant,用來確認所要使用的馬達控制方式,如:速度控制(bit 0)、角度控制(bit 3)、時間控制(bit 6)等。
必須要將對應的控制位元設成ON(1),馬達才會依據設定的目標值運轉,若同時設定角度與時間目標,則會以時間為優先,亦即如果沒有在指定的時間期限內旋轉至設定的角度目標,就會中止運轉的工作;而若同時將角度與時間控制位元設成OFF(0),則會連續運轉直到下一次改變設定值為止。
bit 7為設定讓控制方式生效,也可以使用S指令來讓M 1’ M 2兩個控制功能設定參數同時生效。
而由控制功能設定參數,可以使用兩個NXT Output Module所沒有的輔助功能:
※相對位置旋轉(bit 2) – 設定以目前位置作為參考點進行相對位移運轉。
※守住目前位置(bit 5) – 設定記住前次旋轉後位置,下次運轉前若有因外力影響而移位時,會先回復後再運轉。
而M1與M 2兩個Ports所有運轉參數的Registers位址正好連續(0x42~0x51) 且為16個Bytes,符合NXT I 2C Buffer的最大資料寫入量,因此可以全部一次寫入,然後執行S指令,來同步生效並啟動M1與M2 Port的馬達運轉。
l 回饋M1/M2運轉工作狀態:
透過讀取以下回應值所存放之Registers位址,可以取得馬達目前的執行狀態:
■旋轉角度位置 - M1 0x62~0x65,M2 0x66~0x69
■馬達運轉狀態 - M1 0x72 ,M2 0x73(參考Users GuidePage9)
■工作執行狀態 - M1 0x76 ,M2 0x77
旋轉角度位置回應值就如同NXT Output Module的MotorRotationCount()函數。
而運轉回饋狀態則讀取目前馬達運轉工作的執行情形,一旦按照設定目標完成,則所有的bit都會設成0,所以較為實用的用法是作為判斷馬達是否處於遲滯狀態(Stalled),詳細說明可以參考Users GuidePage11。
而工作執行狀態則作為判斷馬達是否按照目標設定完成運轉,功能有點重複。
l PID控制設定值:
分別有對於角度位置與輸出速度的PID控制參數以及微調參數,至於實際用法有待測試,希望Mindsensors能夠有進一步的說明文件。
簡單的測試結論
相較於NXT Output Module的四種控制模式,較確定的是synchronized mode沒有提供,而speed regulation mode因為沒有回饋Actual Speed,所以無法檢測,除此之外Tachometer limited Mode對於NXT Servo Motor的控制相當精確。
唯一到目前還沒搞定的是Firgelli L12-NXT線性致動器的位置控制功能不太正常,以50mm為例,完全伸展的設定值應該是-100,不過這樣的設定只伸展到-90就停止了,須要設成-125才會完全伸展,而且不同Speed狀況還不一樣,有待將問題回報原廠解決。
►範例程式:NXTMMX-tst01.nxc
<<>>
- 留言者: !....QOO....!
- Email:
- 網址:
- 日期: 2011-05-11 13:34:06
只能接另一塊MMX 還是能接其他Sensors??
[版主回覆05/11/2011 23:15:08]這我還沒試過,
依據NXTMMX使用手冊的說明, Sensor port可以串接的為數位感應器,
所以, 使用上就如同接在NXT 的Input port一樣,
唯一的限制應該就是所串接的數位感應器, 它的I2C位址不能和NXTMMX一樣(x06),
因為它與NXTMMX使用NXT的同一個Input port.
- 留言者: !....QOO....!
- Email:
- 網址:
- 日期: 2011-04-26 14:22:09
[版主回覆04/26/2011 23:26:51]
應該不致於才是,
建議先檢查一下外接電源, 可以讀 0x41位址的值, 乘以 37 就等於它的電壓值,
我使用 9V 的電池盒, 並不會有出力不足的情形(Speed設成最大 100)
- 留言者: 瘋ㄍ
- Email: a901300@yahoo.com.tw
- 網址:
- 日期: 2011-04-21 09:00:13
因為我想要兩顆馬達一起動作
可是方向是不同的
請問要怎麼做呢??
[版主回覆04/21/2011 22:18:05]
NXTMMX兩個Motor Port各有5個控制參數且長度為8 Bytes,
它的位址連續,總長度16 bytes,剛好符合NXT I2C buffer的長度限制,
所以可以同時設定並且一起寫入NXTMMX,
接著再對於 Command register(0x41) 寫入”S”指令,
這樣就可以做到兩個馬達以不同方向同時運轉的動作。
以你的需求,需要設定的參數分別為:
(1) 輸出速度參數:Motor 1 - 0x46, Motor 2 - 0x4E,
將這兩個參數分別設成不同方向,如: 100 與 -100
(2) 控制功能參數的:Motor 1 - 0x49, Motor 2 - 0x51
將這兩個參數的 bit0設成1
沒有留言:
張貼留言