2010-08-10

一個日本Lego Technic高手的YouTube頻道



上週日晚上將三個自由度機械手臂影片POYouTube,週一收mail時接到一個帳號為ssugawara1955的訂閱通知,到了他的頻道之後才發現這是一位日本的Technic高手,上傳的影片多達600部幾乎都是Lego Technic的作品。



而最近上傳的有新上市的2010  Technic sets,如:旗艦8043、重機車8051,最令人驚奇的是8051的影片






居然改成動力化,不僅能前進、後退,攏頭把手還可以轉向,真是太神奇了,如果要達到像這樣的功能至少要有兩顆馬達,還要裝上電池以及遙控接收器,不知道是如何辦到的。
還有從影片的1:12開始,可以觀察到控制轉向機構的運作方法,對於體積不大的機車是很實用的運用,與在這部古董車機械模型中為同樣的機構設計(0033開始)


看了一下ssugawara1955的自我介紹,果不其然是一位機械工程師,功力確實不一樣,具工業級的水準。



 

  • 留言者: 探奇自然科學教室
  • Email: touch_classroom@yahoo.com.tw
  • 網址:
  • 日期: 2010-08-11 20:41:34
根據作者的其他作品說明,是使用Tomy Aero Spider的馬達及紅外線遙控,

最重要的有兩點:

1. 能夠將馬達、控制器還有充電電池『藏』得很好。

2. 將馬達與樂高十字軸完美結合!!

(如果第二點可以輕易完成,那麼用這種輕量馬達取代樂高的9V馬達,是一個非常棒的主意喔!

[版主回覆08/12/2010 22:02:48]

日本的教育機械人產業相當發達, 原先以為會是使用這些零件, 原來是使用TOMY的零件, 想不到這類型的馬達扭力有這麼大, 我會找一個來試看看, 謝謝邱老師提供的資料.


這裡還有一個NXT 摩托車, 零件很少, 也可以組來玩玩


2010-08-09

3個自由度Lego機械手臂的機構設計摘要




如圖的機械手臂機構,是運用兩個Firgelli線性致動器控制機械抓手(Grabber)進行俯仰(Pitch)以及翻滾(Roll)的動作,再加上以NXT Servo Motor控制Grabber的張合動作,因此共具備了三個運動(Pitch’ Roll and Grip)的自由度(Degrees of Freedom),另一方面也可以說成 具有三個輸入的運動機構



多自由度的機構設計


對於兼具多個輸入來進行多自由度運動的機構,以Lego Technic最常見的方式是採用輸入堆疊的設計,例如車輛即是將轉向輸入 疊在驅動輸入上的典型機構,由於車輛通常是後輪驅動、前輪轉向(除非為四驅車),這兩種運動並不會相互干擾,所以這樣的方式是合理的。
而至於本例的機械手臂因為要讓Grabber能夠同時進行PitchRollGrip的動作,因此Grabber需要同時接受三個輸入,所以必定會相互干擾,而解決的方法則類似四驅車的前輪機構設計方式:


讓三個輸入軸彼此垂直於同一支點(Pivot Point)
這樣個別的動力傳輸方向就不會產生干擾,至於細節還是參考下圖的說明會比較清楚:




控制功能


Firgelli線性致動器作為控制GrabberPitchRoll運動是相當理想的選擇, 使用NXT Output Module可以做到精準定位,至於以NXT Servo Motor驅動Grabber的張合,因為透過齒輪系的關係並不好直接控制,所以須要先進行定位,分別將張開閉合兩個位置的Encoder值存起來再加以運用。



功能展示


示範影片:



[Video]


 


[Vodeo] 


**NXC程式範例


**BS圖片


**Yahoo相簿


 


 


2010-07-07

使用Firgelli線性致動器組合機械手抓取機構

Firgelli線性致動器具備低速高扭力的特性以及位置回饋功能,對於需要作線性運動控制的機構是很適合的選擇。例如可以用來直接驅動連桿,比起使用馬達既不需要減速齒輪系,也少了運動方式轉換機構,讓整體結構變得精簡,同時也降低組件間隙所產生的累積誤差,很合適作控制細緻動作的應用。
雖然Firgelli L12-NXT號稱是微型裝置,然而它伸展後的長度相對於Lego零件而言並不算小,如果應用在之前所作的抬舉裝時可以產生理想的操作範圍,是非常合適的選擇。




接著嘗試組合了三種類型的機械手抓取裝置:


第一種類型是以拉桿來控制抓取臂的張合,較適合水平操作,缺點是整體機構太長了點,如圖我是將伸縮桿裝在後端,這樣可以縮短機構的長度。



第二種類型與第三種類型差別在於與支點的相對位置,缺點為只適合垂直操作,水平時整體機構很明顯的不對稱,不是很好與其他機構作組合。






實際操作的影片:



 


**以上的影片在7/5放上YouTube,然而在7/6就看到Mindsensors已經放在產品網頁內,實在是很會做生意。



2010-06-16

dFlex以Light Sensor Mode簡單觀察測量值



就如同邱老師在超級有趣的NXT感應器!DexterdFlex所提到的, dFlex應該就是「變規(strain gauge)」,簡單講就是當感應器受力變形後影響電阻值產生變化,因此就可以用來反應彎曲的程度。

dFlex
外觀就如同被剪掉一半的NXT Cable,尾端就是可以彎曲扳動的感應區。

<<>>

因為測量值是為類比讀取方式,所以可以先用NXT內建的Light sensor來進行簡單測試,實際應用時還要要以Raw Value會比較精確。




2010-06-11

有日期版次的Bricxcc下載點



John Hansen最近更新BricxCC非常勤,即使同一版次每隔幾天就有新的更新,所以就應眾人要求增加了日期的標示,而下載點頁面也一樣有了個分日期版本的壓縮檔了。



在最近一次20100606的版本多了NXC Programmer's GuidePDF檔,非常大有兩千多頁,不過絕大多是API的清單。


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);


 }