2010-06-11

Mindsensors NXTMMX的功能特性

Mindsensors NXTMMX的主要功能是提供NXT可以增加兩個馬達的輸出。
這是一個I 2C裝置,外觀上共具有四個RJ12 Ports以及一個外部電源輸入端子:



用途分別為:


l   M1/M2:連接兩個馬達輸出。
NXTMMX
所設計的輸出控制功能主要是以NXT Servo Motor為對象,提供運轉角度、時間與速度的控制,而同時也適用於Firgelli L12-NXT線性致動器,此外,透過適當的轉接線,PF MotorLampTechnic Motor等同樣都可以連接使用,差別只在於沒有角度控制功能,所以,在運用上具有如同NXT Output Ports一樣的彈性。


l   NXT:連接NXT Input Ports
NXT透過I 2C通訊方式操控裝置。


l   Sensor:串接其他I 2C裝置(數位感應器)
NXTMMX
出廠預設I 2C Address0x06,而串接在同一個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 57,而以下為依據用途所作的整理分類:


l   讀取裝置狀態值 / 寫入指令:
0x41 -
存放目前外部電源的電壓值(Voltage) 寫入所要執行的控制指令
讀取這個位址可以判斷外接電源的供電狀態,若極性接錯,回傳值為0,馬達即無法運轉。
目前已提供的控制指令清單在Users GuidePage7,而較常用的是:
R
Reset所有馬達參數設定值與狀態值,可以作為初始化Ports的動作。
S
:讓兩個Motor的參數設定值同時生效,用來啟動同步運轉。


l   設定M1/M2 Port馬達運轉參數
透過將馬達運轉設定值寫入以下控制參數的Registers位址,可以對馬達進行運轉控制:
旋轉角度設定參數 - M1 0x420x45M2 0x 4A0x4D
輸出速度設定參數 - M1 0x46     
M2 0x4E
運轉時間設定參數 - M1 0x47      M2 0x4F(以秒為單位
)
控制功能設定參數 - M1 0x49      M2 0x51(參考Users GuidePage8)

控制功能設定參數的作用就如同NXT Output ModuleUpdateFlags 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) – 設定記住前次旋轉後位置,下次運轉前若有因外力影響而移位時,會先回復後再運轉。
M1M 2Ports所有運轉參數的Registers位址正好連續(0x420x51) 且為16Bytes,符合NXT I 2C Buffer的最大資料寫入量,因此可以全部一次寫入,然後執行S指令,來同步生效並啟動M1M2 Port的馬達運轉。


l   回饋M1/M2運轉工作狀態:
透過讀取以下回應值所存放之Registers位址,可以取得馬達目前的執行狀態:
旋轉角度位置 - M1 0x620x65M2 0x660x69
■馬達運轉狀態 - M1 0x72      M2 0x73(參考
Users GuidePage9)
工作執行狀態 - M1 0x76      M2 0x77
旋轉角度位置回應值就如同NXT Output ModuleMotorRotationCount()函數。

而運轉回饋狀態則讀取目前馬達運轉工作的執行情形,一旦按照設定目標完成,則所有的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
馬達問題雖然解決了..但我還是搞不懂Sensor Port 怎麼用.....

只能接另一塊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


2010-06-04

No Starch Press即將出版 五十川芳仁 的三本Technic 新書

這是由Eurobricks得到的消息,


No starch Press即將於9月份出版五十川芳仁的三本Technic新書:
"The Unofficial LEGO TECHNIC Idea Book"



與之前的日文版一樣,分成Gears' Vehicles' Walkers等三種類型的作品,


由封面的圖片看來,幾乎都是原來日文版的作品,


因此也許只是改編成英文版的方式出版,
不過還真希望能有新作品內容的加入。


Amazon也上架預購了,價格比No starch便宜許多,
三本一起買共USD 49.41


 



  • 留言者: 探奇自然科學教室
  • Email: touch_classroom@yahoo.com.tw
  • 網址:
  • 日期: 2010-06-05 21:53:29
的確只是改成英文版。

2010-05-09

以陀螺儀 (HiTechnic Gyro)推算物體的旋轉角度的實作測試


陀螺儀的功能是用來測量物體旋轉時的角速度,亦即角度位置對時間的變化率,以數學方式來表示,角速度就是角度位置對時間的微分,而積分是微分的逆運算,因此就可以使用陀螺儀所測量的角速度來推算特定時間內物體進行旋轉運動的位移角度(參考1.)

(GyroAngularDisplacement)
如何計算圖1.中的陰影面積
可以運用幾何的方式,將測量期間切割成數個連續的取樣週期,再利用梯形面積的求算公式,計算出每一期間內角度位移的近似值(參考2.),經累加所有的計算結果之後即可得出總旋轉角度的估計值。
至於取樣頻率的選定則須要適當的調整,若次數太頻繁將容易累積誤差,間隔太長則會降低對角速度變化的處理能力,而在這一次的實測中則是取
32ms,得到的結果還算可以接受。


(GyroSampleMove)

設定陀螺儀的基準值
使用陀螺儀首先須決定靜止狀態下的基準值(Zero point),用來作為計算角速度時的相對參照,由以下的角速度計算方式即可以瞭解基準值的用途:
角速度
(/) = 感應器回傳值基準值
**
回傳值範圍0 ~ 1023,當逆時針旋轉時回傳值>基準值,所以角速度為正。
由於感應器相當敏感且易受到環境的影響,所以設定穩定且足夠精確的基準值並不容易,以常用的簡單平均法(Simple-average method),可預期的將很容易受到雜訊的干擾而影響計算結果的穩定性,如此在計算位移的過程必定會造成誤差的大量累積,所以對於本次的測試將會採行兩種方式來改善基準值計算的精確性:

l   首先增加Gyro回傳值的有效位數,以降低除法運算所造成的捨位誤差,於是會將每次所讀取到的回傳值都乘以64(增加6bits)。此外,也可以使用NXT 2.0所新增的浮點運算功能,不過相較於整數的bit operation,執行效率並不好。

l   其次採用加權平均法(Weighted-average method)來消弭突發雜訊的影響,這樣能夠在計算的過程中讓基準值的變化逐漸趨於穩定而得到理想的結果。所以會以128作為權值,並使用以下的計算方式:
Step 1.
先將目前記錄的基準值減掉128分之1
Step 2.
再將讀取值乘以放大係數64之後累加至基準值

Step 3.
觀察基準值的變化若趨於穩定則結束,否則繼續Step 1~Step2

3.為設定基準值的NXC程式碼

(Get_GyroZero)
由於讀取HiTechnic Gyro回傳值僅需約3ms,因此程式範例中計算基準值的週期(ZERO_SAMPLE_PERIOD)即取4ms。而經執行程式後所得到之穩定的基準值(5004385)即可拿來作為計算角速度的參照,擷取的畫面如下:

(GyroZeroPoint)

計算角度位移
由於基準值在計算設定的過程中已經透過放大有效位數(64)以及加權(128)等兩個步驟,所以在計算角速度時,也一樣須先將所讀取的感應器回傳值乘以64128,以維持相同的精確度:
currVal = SensorRaw(GYRO_PORT) * SCALE * WEIGHT - gyroZero;至於角度位移(Angular displacement)的計算,就如同前面所說明的一樣,以取樣週期內的平均速度乘以期間長度,再經累加之後即可以得到:
gyroMove  += (currTick - sampleTick) * (currVal + lastVal) / 2;
此外在上面程式碼的計算式中,角速度的單位是:度/秒,而時間的單位是ms,所以當要還原成為以度(degree)來顯示位移時,須要將結果除以64*128*1000
NumOut (54, LCD_LINE4, gyroMove / (SCALE * WEIGHT * 1000));

陀螺儀(Gyro)與電子羅盤(Compass)本次測試另外以電子羅盤(Compass)作為對照,用來觀察陀螺儀所推算之角度位移與電子羅盤所回應之指向偏移間的差異,這樣就可以判斷本測試所使用的方式是否符合預期的功能,此外也可以使用NXT Servo Motor的角度感應器取代Compass作為對照。
而測試的機構如圖:
(HTGyroCompass-01)

而轉動的機構是以手搖方式以避免對電子羅盤的干擾,同時也較容易控制轉速以方便結果的觀察。


觀察測試過程

影片記錄共分成三個階段:基準值設定、由目前位置旋轉至-90度位置、再旋轉回原來位置,可以觀察到陀螺儀(Gyro)與電子羅盤(Compass)之間的差異(Diff(C-G))大致都維持在-3度以內,以結果而言,還算是符合預期的目標範圍:

(GyroCompassMove)

►NXC程式碼:
Compass作為比對:HTGyroCmps-Trvl.nxc
Compass比對功能:HTGyro-getTrvl.nxc






  • 留言者: Tim
  • Email: tg20317@yahoo.com.tw
  • 網址:
  • 日期: 2012-11-09 16:21:08
老師您好:
最近也有接觸Gyro, 想向您請問, 除了使用簡單平均做出一個基本值去消除掉零準位偏移量,
對Gyro自轉數圈, 量測到的角度發現不足360度, 轉了360度, 他卻只認得340度.

由於我使用的常數是對照DATASHEET上的數據(2.5mV/deg/s)再去積分,
請問Gyro除了零偏, 電壓角速度比值也會因為溫度而有偏差嗎?
如果有的話, 我該如何做出補償?
謝謝您的指教.
[版主回覆11/10/2012 17:05:00]
Gyro的測量值確實會受溫度影響而有偏差,
不過因為不是很清楚您是如何進行測量的, 若依據我的推測可能是累積誤差所造成,
也許可以試著在收集Gyro測量值時先不要換算成角度而直接使用電壓值積分,
等到要觀測時再轉換, 就可消除每次換算過程的誤差值
PS. 記得Zero Point也要先用電壓值






  • 留言者: 過客^_^
  • Email:
  • 網址:
  • 日期: 2011-11-07 19:18:21
老師你好:
雖然這文章有一段時間了,我還是來碰運氣問一下問題希望老師有看到。
我想請問一下,我大約知道加權平均法的應用,以及為何這樣使用,但是
我想請問一下這只針對基準值,但後來的傳回值並沒有做加權的動作只有提高
解析以及乘上128,這樣子傳回值不會因為陀螺儀的漂移產生誤差嗎??(傳回值 - 基準值)
因為我使用的是IDG500陀螺儀會有這樣的問題所以想請問老師更詳細的解說。

另外想請問老師的陀螺儀準確度到小數第幾位呢??
[版主回覆11/07/2011 23:06:54]一般商用的陀螺儀,尤其是導航用途的都會加上濾波的功能,用來平順化突波與漂移的現象, 建議可以用類似的方式, 控制讀取值的變化率若超過設定的門檻值, 就忽略掉。
這種控制方式算很常見, 尤其是應用在平衡機器人方面,應該可以從網路上找到不少資訊。







  • 留言者: Jimmy Hsu
  • Email: love750722@hotmail.com
  • 網址:
  • 日期: 2011-05-19 14:07:48
您好:

請教一下,WATCH_ZERO_PERIOD為何選擇256? 謝謝!

[版主回覆05/19/2011 21:30:45]WATCH_ZERO_PERIOD在Get_GyroZero()函式中是作為顯示結果的週期,
只要比讀取Gyro的取樣週期長就可以(4ms),  並沒有甚麼特別的考量





  • 留言者: yam
  • Email: dd901209@yahoo.com.tw
  • 網址:
  • 日期: 2011-03-15 11:00:09
請教老師

我目前用 VB2005 來寫陀螺儀轉速與時間的積分來取得角度

現在我已用VB 將 陀螺儀 的類比訊號轉換成轉速

再來就是時間的積分在VB 上要如何定義

[版主回覆03/15/2011 22:00:45]
如果已經能讀到陀螺儀的角速度值, 接下來可以參考本文的說明,
首先要先測得靜止狀態下陀螺儀的基準值,
作為計算運動狀態時角速度的offset值.
接下來, 因為無法知道角速度對時間的函數式,
所以才需要使用幾何的方式, 在極短的取樣週期內以平均速度 乘以 間隔時間
計算移動的角度, 再加以累計,
這樣就可以得到總角度位移的近似值.
這種計算方式也稱為黎曼積分(Riemann integral),
可以Google一下就查得到.
也因此, 這跟使用何種程式語言就無關,
至於我的範例程式(NXC), 就附在文章最後的連結中








  • 留言者: Flora
  • Email: yanhuasweet@hotmail.com
  • 網址:
  • 日期: 2011-02-15 00:01:28
請問一下,
計算零點值的時候
 zeroVal = zeroVal - (zeroVal/WEIGHT) + SensorRaw(GYRO_PORT) * SCALE;
因為有乘上SCALE(64),把數值放大了,所以顯示時要還原成原值.
可是還原回原值的時候(1.0000 * zeroVal / (SCALE * WEIGHT)),
為什麼是要除以(SCALE * WEIGHT),而不是除以SCALE(64)就好了呢?
謝謝!!

[版主回覆02/16/2011 22:33:04]
計算Gyro的基準值需要考量兩個因素:
1.
首先是因為使用整數運算,為消除捨位誤差所以在計算過程將讀取值乘上SCALE(64)
2.
其次,因為Gyro很容易受環境干擾而產生雜訊,亦即可能在計算過程讀取值偶而會有異常偏離(過高或過低)而影響結果,為克服此種現象所採用的方法就是“加權平均法”:
先設定一個權值(WEIGHT(128)),每次在累加讀取值前先減掉累計值的1/128後在加上讀取值,這樣偶發的雜訊對於整體累計值的影響就降低了,同時當讀取相當次數之後,累計值就會趨於穩定而不再受干擾,這時候的累計值就是基準值 * SCALE 128倍,這個可以用積分式去推算就可以瞭解。
舉一個例子作說明:
假設要量測開啟水龍頭流動中自來水的平均生菌數,我們可以準備一個可容納128單位的容器,並先裝滿無菌的蒸餾水,開始量測時先從容器中淆出一單位的水再倒入一單位的自來水,這樣每次倒入自來水的生菌數對容器平均生菌數的影響就降低到1/128而不致於受到偶發生菌數突然增加或減少的干擾,這樣的說明應該更清楚才是。







  • 留言者: simonapol
  • Email:
  • 網址:
  • 日期: 2010-12-06 15:45:32
那擷取時間假設25us一次很快的話我需要再將他累積加起來後在乘上回秒的單位嗎?

[版主回覆12/06/2010 21:42:40]應該不需要那麼複雜, 可以參考範例程式,
我是每32ms取樣一次, 再計算這段期間內的 平均速度 * 間隔時間 就可以得到移動的角度,
將所有取樣週期所計算得到的位移角度累加, 就可以得到總位移角度





  • 留言者: simonapol
  • Email:
  • 網址:
  • 日期: 2010-12-02 18:37:56
拜託老師講解

可否舉個例子看不出來計算過程搞不太懂弄混了
權重還有電壓變化量是什麼比例阿

數學可以交代清楚一點嗎?舉個實際例子例如角速度10度時或者傳回類比電壓1.5V時取樣下是怎麼計算出來的阿看不懂

不懂積分後是什麼值 看起來是指說我只要把現在的面積積分完就是角度/秒嗎?如果單位是秒

[版主回覆12/02/2010 22:43:09]讀取陀螺儀的值減掉靜止狀態下的基準值後就是角速度, 單位: 度/秒

因為, 陀螺儀很敏感, 為了要消除雜訊的干擾, 才會使用加權平均法的方式計算基準值,

知道角速度之後, 如果要測量一段期間內旋轉的 位移角度, 計算式 = 角速度 * 時間

所以, 角速度對時間的積分所得到的值就是位移的角度

所以, 結果不是 角速度 而是 角度 , 單位是 : 度

2010-04-20

4連桿機構(筆記摘要)

連桿組(linkage)是由連桿(link)接頭(joint)所構成的機構, 就如同齒輪系(Gear train)一樣, 主要功能為作用力的傳送 運動方式的轉換.


而常見的應用則是在於: 持續旋轉運動 往復線性運動 以及 往復搖擺運動之間的轉換.


而用途最廣泛的平面連桿組 (Planar Linkage) 所指的是連桿的運動方向垂直於接頭旋轉軸, 因此整體機構的運動範圍會限制於同一平面上.


以下是3種基本的平面連桿組機構:


   旋轉結/Revolute Joints機構


   滑件(稜柱)/Sliding(Prismatic) Joints機構


   旋轉結與滑件結之綜合機構


4-Bar Linkage/4連桿組


平面4連桿組機構中, 不作運動的桿稱為固定桿(fixed), 連結於固定桿之兩個側桿, 若能完全旋轉運動的稱為曲柄 (Crank), 只能往復搖擺的稱為搖桿(Rocker), 固定桿之相對應桿稱為聯結桿(Coupler).


 


Grashof Rule/葛拉索準則


若最短連桿長度為s, 最長連桿長度為l, 其餘兩個連桿長度分別為pq, 則若l + s < p + q條件成立時, 即為符合葛拉索準則(Grashof Rule)4連桿機構.


而依據最短桿之位置, 可以分成三種類型:


   曲柄搖桿機構(Crank-Rocker): 若最短桿為任一側桿, 則該最短側桿即可以完全旋轉, 而另一側桿則只能往復搖擺.
曲柄擺動時會有兩個變換方向的時機, 稱為機構的肘節位置(Toggle Position), 此時曲柄與聯結桿將分別以延伸或重疊的形式而成為一直線, 不過機構中搖桿移到這兩個肘節位置的速度不一定會相同, 此種狀況有時也稱為急回機構(Quick-Return)的特性.


   雙曲柄機構(Double-Crank/Drag-Link): 若最短桿為固定桿, 則兩個側桿皆可以完全旋轉.


   雙搖桿機構(Double-Rocker): 若最短桿為聯結桿, 則兩個側桿皆只能往復搖擺無法完全旋轉, 而且若不符葛拉索準則(Grashof Rule)4連桿機構也同屬於雙搖擺機構.




 



  • 留言者: robotman
  • Email: tslinb@hotmail.com
  • 網址:
  • 日期: 2010-05-20 16:22:25
目前是有在"想"把比賽設計過的機型跟經驗相關機構跟程式..統合成一本書..但最大問題是..要"有時間"能坐下來打字..雖然是"藉口"..呵..不過真的要寫一本"有用"的書真得不容易..





  • 留言者: robotman
  • Email: tslinb@hotmail.com
  • 網址:
  • 日期: 2010-05-19 09:35:02
好像回到大學時期修的機構學..呵..那時課程都只是"算"..現在很想把機構學的相關課程都改由樂高來實作..呵..齒輪也就不會在那邊算pitch跟curve..算到死..
[版主回覆05/19/2010 21:31:09]樂高關於機構的參考資料多半偏向在齒輪的應用, 很少有關於連桿運動學方面的著墨, 唯一較多的大概是五十川芳仁的幾本著作, 不過還是只有圖片而沒有說明, 而市面上關於機械原理的書多半是教科書, 對於業餘的人實在太沉重了些, 還真希望有人出一本以Lego technics為主觀於機構或運動方面的書,
林老師既然有這樣的專長, 要不要也出一本書和邱老師拼場一下

2010-04-18

HiTechnic Gyro Sensor的教學文章(pbLua)



pbLua官方部落格中有一系列的教學文(Tutorial), 編寫的內容相當有條理且程度適中, 即使未曾使用過pbLua, 也很容易就能理解文章中範例程式的邏輯, 因此也算是具有參考價值的資源.


而其中一篇關於HiTechnic Gyro sensor的使用教學, 是以Gyro所具有的功能特性介紹起, 接著藉由四種Gyro裝置典型應用時的需求層級, 由淺入深且循序漸進的導引與講解如何達成的方法與技巧,
而這四種應用層級分別是:


1.          偵測物體是否正在轉動


2.          偵測物體正往那個方位轉動


3.          測量物體目前正在轉動的速度(角速度) 方位


4.          測量物體已轉動的位移角度


對於前三種應用, 很單純的只要將所讀取到感應器的回應值減掉Gyro靜止狀態時的基準值(Zero Point), 就可以得到測量當時之物體轉動的角速度, 藉以判斷出當下轉動的狀態與方位.


至於第四種應用, 則因為速度是單位時間內位移的變化率, 逆運算即是將速度乘以時間以得到位移, 所以即可以透過於固定的取樣周期來計算平均速度, 再乘以取樣週期時間長度以推算出位移角度, 然後累計每次計算的結果, 就可以估計出角度的總位移, 以下是測試時的NXC程式碼:


currTick = CurrentTick();


currSpeed = SensorRaw(GYRO_PORT) * BIAS_SCALE * BIAS_WEIGHT - biasSpeed;


sampleTick = currTick;


lastSpeed  = currSpeed;


do


{


  currTick  = CurrentTick();


  if  ((currTick - sampleTick) >= TRAVEL_SAMPLE_TICK)


  {


     currSpeed = SensorRaw(GYRO_PORT) * BIAS_SCALE * BIAS_WEIGHT -
                  biasSpeed;


     relTravel  + = (currTick - sampleTick) * (currSpeed + lastSpeed)/2;//位移計算


     lastSpeed  = currSpeed;


     sampleTick = currTick;


   }   


  } until (ButtonPressed(BTNCENTER, true));


 


最後所得到的結果雖然未必足夠精確, 不過拿來作為對Gyro sensor特性的教學說明, 還算是不錯的範例.


在實務上, 專業的導航系統確實也使用了第四種應用的概念來提供對GPS的輔助功能, 因為, 通常GPS會受到地理與天候等環境的影響, 並無法確保隨時隨地都能接收到衛星訊號來進行定位, 例如當天候不佳或處於都會區的大樓夾縫中以致衛星訊號收訊不良時, 這時候就需要透過Acceleration Gyro sensor的輔助, 對於前者可以推算出移動距離, 而後者可以推算方位偏向角度, 若在加上Compass來校正, 就可以達成慣性導航系統(Inertial Navigation System, INS)的功能.


而以上所提到的Acceleration’ Gyro’ Compass等三種sensor剛好HiTechnic都有賣, 所以是否有機會結合這些裝置做出慣性導航系統? 個人覺得可能想太多了, 首先, 要將Acceleration sensor所讀到的線性加速度值轉換成位移距離, 就必須對時間做兩次積分, 所以累積的誤差會失真的很嚴重, 再者它是一個I2C裝置, 回應速度對於要成為導航系統而言實在不夠快, 也許, 如果有廠商能開發出All-in-One的裝置, 將三種功能作在一起, 並兼具位移推算的功能, 也許就真的有機會讓NXT具有慣性導航的功能.


改善Gyro基準值的準確度


最後, 在本篇教學文中最重要的內容就是如何改善Gyro基準值(Zero Point)的準確度, 因為, Gyro sensor的測量值會受到外在溫度的影響, 所以須要在每次使用前的熱機過程中先測量出靜止狀態下穩定的基準值, 一般的做法就是持續讀取數次之後再求出平均值, 不過, 再以前面所提的四種應用層級來考量, 前三種應用對於基準值的參考時機是獨立的, 並不會有誤差累積的情況, 而第四種應用, 則因為每次取樣時都會參考基準值來計算位移, 所以若基準值不夠準確, 累積的誤差會讓結果失真, 因此, 在這篇文章中就提到了兩個改善的方法:


l   首先以人為的方式擴大所讀取到感應器回應值的精確位數, 這裡會將每次的讀取值乘以一個常數64, 因此, 當進行平均值計算時就不會因為整數運算的關係被捨棄太多的準確位數.


l   接著會透過加權平均的概念, 來抑制取樣過程中突發的Noise影響基準值計算的準確度, 意即降低每一次取樣影響計算結果的敏感性,
作法的概念是這樣
:
假設要針對流動中的水流測量出平均的生菌數, 為了避免突發的情況影響穩定的結果, 所以, 我們可以事先準備好一個一公升的容器, 然後裝滿純水(生菌數為0), 接著在固定的取樣週期時, 先從水桶中取出25ml的水之後, 再加入等量要測量之水流的水, 如此當取樣次數夠多時, 則水桶中平均的生菌數就會趨於穩定, 而同樣的概念若應用到基準值的計算過程, 就可以讓結果隨著取樣次數的增加而呈現平順的變動, 最後同樣會趨於穩定, 而得到了所需求的基準值了.


以下是NXC的程式碼範例:


long Get_Bias()


 {


    long biasVal, newVal, oldBias=0;


    long xtick=0, sampleTick=0, dispTick=0;   


    do


    {


       xtick = CurrentTick();


       if ((xtick - sampleTick) >= BIAS_SAMPLE_TICK)


       {


          newVal = SensorRaw(GYRO_PORT) * BIAS_SCALE;


          biasVal= biasVal - (biasVal/BIAS_WEIGHT) + newVal;


          sampleTick = xtick;


       }


       if ((xtick - dispTick) >= BIAS_WATCH_TICK)


       {


          NumOut(0, LCD_LINE3, biasVal);


          TextOut(0, LCD_LINE4, "            " );


          NumOut(0, LCD_LINE4, biasVal-oldBias);


          NumOut(0, LCD_LINE5, biasVal / (BIAS_SCALE * BIAS_WEIGHT));


          dispTick = xtick;


          oldBias = biasVal;


       }


    } until (ButtonPressed(BTNRIGHT, true));


    return (biasVal);


 }


 



 

2010-03-15

Mindsensors NXT Motor Multiplexer(NXTMMX)功能摘要(1)



Mindsensors的新裝置-NXT Motors Multiplexer(NXTMMX)


大約一週前, Mindsensors的網站公佈了即將上市的新裝置: NXTMMX, 而就在前不久也開始提供User GuideNXC程式庫與範例程式的下載, 於是利用週末整理了一下這個新裝置的相關資訊.


外觀 功能


NXTMMX具有四個RJ12Ports, 分別是:


M1 / M2 - 分別可以連接兩個NXT Servo Motors.
        NXT -
連接NXT Input Port, 所以它是一個I2C裝置
.
    Sensor -
可以連接額外的I2C裝置, 例如再多串接一個NXTMMX, 同時這樣也不會因此而少了一個Input port可以使用.


此外, 還有一個外接電源輸入端子, 額定是9V DC.


這裡我就有一個疑問, 對於串接的I2C裝置, 它的I2C Bus address是否須與NXTMMX不一樣? 假設是的話, 那如果要串接的是另一個NXTMMX, 則就必須要變更其中一個的出廠預設值(0x06).
對於這個問題, 已經寫mail去詢問Mr. Deepak, 可能在美東還是週末的關係, 所以尚未得到答覆.


特性摘要


NXTMMX主要的用途是由NXT透過對Input portI2C操作來控制額外多連接的兩個NXT Servo Motors, 所以NXT Firmware Output Module的所有功能都不能使用在這些多附加的NXT Servo Motors的操作, 反而NXTMMXFirmware必須重現這些功能, 而這也是這類型裝置通常較複雜的地方.




類似的如HitechnicSensor Multiplexer也是同樣的情形, 相較之下, NXTMMX也許還更複雜一些.

 


接下來摘要一些NXT Output Module所沒有的功能:


1.      多提供了對Motor運轉時間的控制(Time Control), 而如果與Tachometer Control一起使用, Time control具有較高的優先順序.


2.      Holding Tachometer position: 這個功能可以將前一次執行運轉完成後的位置儲存起來, 此時若Motor受到外力的影響以致改變位置時, 可以自動回復原來的位置後再繼續執行運轉.


3.      可以選擇使用相對位置 絕對位置方式來控制Motor的運轉


以上這些特性, 過去多半都是使用程式來進行控制, NXTMMX則已經加到Firmware的功能中, 所以理論上執行起來應該更有效率.


 


接下來, 將會繼續整理NXTMMXI2C操作方式, 因為還沒有實際的產品可以測試, 所以算是紙上談兵.


2010-03-13

Firgelli Linear Actuators for NXT( L12-NXT )簡單測試








Firgelli是位於加拿大專門生產微型線性致動器(Linear Actuators)的公司, 在今年初推出了兩款該公司L12系列相容於NXT的產品, 分別是50mm100mm伸縮臂行程的線性致動器, 型號為L12-NXT 50/100.


操作L12-NXT的方式就如同NXT Servo Motor一樣, NXT Cable連接Output ports再利用馬達控制指令就可以很容易的上手使用.


此外, 如果想要以手動方式操作, Firgelli也另外提供了兩種轉接線供選購, 分別可以連接PFTechnic的電池盒, 在應用方面算是相當的多樣化與彈性.



 


至於詳細的產品資訊可參考原廠的產品網頁.


 


外觀與機構


 


L12-NXTLego Parts的組合方式完全符合Lego的規格, 同時額外提供了一個活動接頭, 可以依據機構組合的需要, 彈性應用.




而本體的外殼以及伸縮臂都是鋁製金屬, 粗壯的延伸縮臂看起來應該相當耐操.



 


在收縮狀態L12-NXT 50mm總長度為15 FLU(Fundamental Lego Unit), 100mm21 FLU, 伸縮臂長度50mm6.5 FLU, 100mm13 FLU.



 


L12-NXT操作時, 一但停止供電, 伸縮臂會立即停止移動並鎖住在原來位置, 直到再次供電為止, 這應該是所有線性致動器共通的特性.


 


特性摘要


 


Firgelli提供了NXT-G Block以及DannyNXC libraryXanderRobotC library作為NXT程式的運用參考, 分別可以從這裡下載, 至於產品的User's Guide則尚未提供, 只有原來L12 Seriesdatasheet, 這一份文件比較屬於硬體規格說明, 並不適用於NXT users的參考, 還好, 就如同前面所說明的一樣, L12-NXT使用方式很類似NXT Servo Motor, 運用起來相當的容易.


L12-NXT具備位置回饋功能(Positional Feedback), 根據測試, 50mm回饋值的範圍最大是絕對值100, 100mm則是200, 所以解析度是0.5mm.


當伸縮臂延伸時回饋值遞減, 收縮時則遞增, 而回饋值可以使用MotorRotationCount(Output)函數讀取, 也可以使用ResetRotationCount(Output)歸零.


移動速度受Power level與負載影響, 實測在無負載並Full Power條件下, 50mm全部行程的時間約5.6, 100mm10.2



 


下面的測試影片可以觀察L12-NXT利用讀取位置回饋值, 來移動機械手臂到指定位置, 同時對於不同的Power Level, L12-NXT的運動情形(程式範例).



< >


以上以簡單的NXT Output指令(Un-regulated mode)來操作L12-NXT, 後續將計畫再進一步的測試其他三種控制模式(Speed Regulation’ Synchronized Motor Control’ Tachometer-Limited).