研究筆記 - GaussToys
Mini GaussSense - ONE sensor for ALL
我們期待極速自造工具能精巧便攜、具有許多功能、可以重覆使用、可以自由擴展來適應不同的需求,最重要的,我們當然希望它很容易使用。
Mini GaussSense是值得您期待的優雅解決方案。小盒子裡的微型磁場感應器和磁鐵,正是極速自造的獨門配方。小小一顆便支援多種功能,足以取代滿滿一箱的傳統電子零件!連接Arduino和下載免費的軟件開發工具包後,一切神奇運作!兼容麵包板的設計,不僅能夠重覆使用、自由擴展,也節省您的時間!
Mini GaussSense,簡潔有力的自造工具箱。
Youtube 介紹(以一打十)Mini GaussSense - The Simplest Maker's Toolkit, Ever!
基本資料
媒體
介紹文
- 生活中的磁鐵怎麼連結實體和虛擬世界?你想不到的 GaussSense 應用方式
- [隆重介紹Mini GaussSense]
- Pizg 開箱文: http://pizgchen.blogspot.tw/2016/03/gausstoys.html
- 林東成 Scratch 的玩法: https://www.facebook.com/groups/1077704815614249/permalink/1105713559480041/
研究論文
- 關於GaussBricks樂磁積木與GaussBits樂磁公仔,有興趣的伙伴們可以參考以下這兩篇論文,可以在過去研究論文專頁獲得詳細資訊,包含GaussBits所使用的銣鐵硼磁鐵類型與GaussBricks需要的雷切檔案。
- GaussBits: Magnetic Tangible Bits for Portable and Occlusion-Free Near-Surface Interactions
- http://www.cmlab.csie.ntu.edu.tw/~howieliang/GaussBits.html
- GaussBricks: Magnetic Building Blocks for Constructive Tangible Interactions on Portable Displayshttp://www.cmlab.csie.ntu.edu.tw/~howieliang/GaussBricks.html
社群支援
YouTube頻道影片
*
- Mini GaussSense - #1: Ceramic Flappy Bird, #2: Table Basketball Meter
- Mini GaussSense - #3: Domino Playback
- Mini GaussSense - #4: Compact Disc Jockey
- Mini GaussSense - #5: Zombie, Beat It!
- Mini GaussSense - #6: Merry-'Oh!' Xmas
- Mini GaussSense - #7: Darth Vadar's Defense [Best]
- Mini GaussSense - #8: Go-Go-Roll!
- Mini GaussSense #9: Clown's Escape
- Mini GaussSense #10: Prosperity through the Years!
Bring up
開箱
按官網步驟走一次
- 開始使用 GaussSense
- 下載 Arduino Code, 並上傳(驗證使用 Fayaduino Uno +Arduino 1.6.5 )
- 下載 Processing 並按指示安裝(驗證使用 Processing 2..2.1 )
- Example/Basic/* 都執行正常
- UI 工作正常
- Console 會輸出類似
- South: ~ 30 gauss. (x,y)= (213,54)
- North: ~ 17 gauss. (x,y)= (378,378)
- 照片
基礎研究
- PIN : A0, D2/D3/D4/D5
- 簡述整體
- UI 在每一次 draw 一開始,就先 readSerialData, 就是往 serial 發出 'a', 拿回 16 int, 持續將資料收下來,讓後面UI library 中提供的演算法就算,然後畫出來
- Arduino Code:
- Serial port 有來要東西就 sense 然後吐到 serial port
- Serial protocol spec?
- In: ‘a' , out: 16 個 int
- void loop()
- {
- if (checkSerialPort()) {
- getGaussSenseData(); // Get data from all GaussSense modules
- sendGaussSenseData(); // Write data to the serial port
- }
- }
- in: 'w' 就會依照命令設定對任意設定的 port, 做 digital write('d'), or analog write('a'), or servo write('s')
- 編碼是 wxxxxxxxx\n,
- dPPV : digital write, (PP) port (V) value
- aPPVVV: analog write, (PP) port (VVV) analog value
- sPPVVV: servo write, (PP) port (VVV) servo value
- Processing:
- 主物件初始化
- gs = new GaussSense(this, GaussSense.GSType.GAUSSSENSE_MINI, 1, 1, Serial.list()[Serial.list().length - 1], 115200);
- 主要物件
GaussSense/src/gausstoys/core/GaussSense.java
- public class GaussSense
- //Method that's called just after beginDraw()
public void pre() {
if(this.serialManager.isConnected()) {
this.serialManager.readSerialData();
- public class SerialManager
public void readSerialData() {
this.serialData.clear();
while( this.serial.available() > 0) {
int data = (byte)this.serial.read();
this.serialData.add(data);
}
this.serial.clear();
this.serial.write('a');
}
Arduino 跟 GaussSense 之間如何運作
- GaussSense 內部應有 16 個感測元件,用 4 個 GPIO 選擇是哪一個,而 Analog output 則是那個單一元件的 analog output
- 感測值被預減 512, 又被限制在 +-127 (不知為何)
- RH: 預減 512是將sensor值置中並把值限定在255階。當沒有任何外部磁場時,檢出電壓會約位於供電電壓的一半。ATMega32U4內建的10-bit ADC提供1024階解析度,故需要將值預先減半。點陣圖一般為256階,所以我們將感測值限制在 +-127。如果不需要點陣圖輔助,可以使用完整的1024階。
感測值如何轉換成有意義的訊息
- 個別的感測值,其實對應用不是那麼方便使用,需要聯合所有的感測值,再經過個別特殊的演算法,才能知道發生了什麼事情。
- 目前這些演算法在 Processing 的 library 中
- 先 study 個別範例
- e1: e1_HelloGaussSense
- 根據目前 16 個感測值,經過 UpSampling, 特殊演算法,對應到螢幕上來顯示
- gs.drawRawData2D(width, height);
- drawUpsampledData2D
- 先做 Upsampling, 然後將每個 sample, 畫出來。 width, height 就是 Upsampling 的參數, sampleRate default = 1
- upSampleRawData(int imgWidth, int imgHeight, int sampleRate)
- this.upSampleData = Upsampler.upSampling(this.hallSensorData, sampleRate);
LinkItONE 也能用?
- 是的,簡單的範例已驗證
- Arduino code 看起來應該在簡單的範例是能用的,但是第一次試 Processing 中, Demo 不能動。再確定 Arduino 也能動的時候,再試一次
- 原因是 Processing code 中,固定找最後一個 serial port 來使用
gs = new GaussSense(this, GaussSense.GSType.GAUSSSENSE_MINI, 1, 1, Serial.list()[Serial.list().length - 1], 115200);
- 在 LinkItONE 接入時, 正確要使用 [4] /dev/cu.usbmodem1421 (此為 mac 環境)
- Serial.list()[Serial.list().length - 1] => Serial.list()[3]
- 就可以正常了
Found 10 serial device(s).
[1] /dev/cu.ARD_SPP-
[2] /dev/cu.Bluetooth-Incoming-Port
[3] /dev/cu.EV3-SerialPort
[4] /dev/cu.usbmodem1421
[5] /dev/cu.usbmodem1423
[6] /dev/tty.ARD_SPP-
[7] /dev/tty.Bluetooth-Incoming-Port
[8] /dev/tty.EV3-SerialPort
[9] /dev/tty.usbmodem1421
[10] /dev/tty.usbmodem1423
純 Arduino Sensor 值觀察
磁鐵放在上面,藍面向上,置中
66 127 127 49 127 127 127 127 127 127 127 127 53 127 127 41
66 127 127 49 127 127 127 127 127 127 127 127 54 127 127 42
66 127 127 49 127 127 127 127 127 127 127 127 54 127 127 42
66 127 127 49 127 127 127 127 127 127 127 127 54 127 127 41
66 127 127 49 127 127 127 127 127 127 127 127 53 127 127 42
=> 藍上是127
=> index 1,4,13,16 應該在角落
磁鐵放在上面,紅面向上,置中
-18 -127 -127 -53 -127 -127 -127 -127 -127 -127 -127 -127 -13 -127 -127 -44
-18 -127 -127 -53 -127 -127 -127 -127 -127 -127 -127 -127 -13 -127 -127 -44
-18 -127 -127 -53 -127 -127 -127 -127 -127 -127 -127 -127 -13 -127 -127 -44
-18 -127 -127 -53 -127 -127 -127 -127 -127 -127 -127 -127 -13 -127 -127 -44
-17 -127 -127 -53 -127 -127 -127 -127 -127 -127 -127 -127 -12 -127 -127 -44
=> 紅上是-127
=> index 1,4,13,16 應該在角落
磁鐵距離約一公分,藍面向上,置中
55 57 51 37 38 71 63 54 36 76 43 27 35 29 43 21
55 57 51 37 37 72 63 54 36 76 43 27 35 29 42 21
55 57 51 37 38 72 64 55 37 77 43 27 35 29 43 21
55 57 52 37 38 72 64 55 37 77 43 27 35 29 43 21
55 58 52 38 38 72 64 55 36 77 44 28 35 29 43 21
磁鐵距離約一公分,紅面向上,置中
-7 -26 -31 -19 -39 -32 -39 -19 -35 -19 -54 -36 -9 -33 -15 -16
-7 -26 -32 -20 -39 -32 -39 -19 -35 -19 -54 -36 -9 -33 -16 -17
-7 -27 -32 -20 -40 -32 -40 -19 -35 -19 -54 -36 -9 -33 -15 -17
-7 -27 -32 -20 -39 -32 -40 -20 -35 -19 -54 -36 -9 -33 -15 -16
-7 -27 -32 -20 -39 -32 -40 -20 -35 -19 -55 -36 -9 -33 -15 -16
磁鐵放在上面,藍面向上,放左下角 (靠 Power PIN)
-6 33 127 127 -29 -4 127 127 -23 -3 -27 17 -3 -23 -10 -22
-6 33 127 127 -29 -4 127 127 -24 -3 -26 17 -3 -23 -11 -23
-6 33 127 127 -29 -4 127 127 -23 -3 -27 17 -3 -23 -10 -22
-6 33 127 127 -30 -5 127 127 -23 -3 -27 17 -3 -23 -10 -22
-6 33 127 127 -30 -4 127 127 -23 -3 -27 17 -3 -23 -10 -22
=> index 4 在左下角
磁鐵放在上面,藍面向上,放右下角
127 127 6 -9 127 126 -11 2 -1 4 -29 -16 -15 -26 -2 -7
127 127 6 -8 127 126 -11 2 -1 4 -29 -16 -14 -25 -2 -6
127 127 6 -8 127 126 -11 2 0 4 -30 -16 -14 -25 -2 -6
127 127 6 -8 127 125 -11 2 0 4 -29 -16 -14 -26 -2 -6
127 127 6 -8 127 125 -11 2 -1 4 -30 -16 -14 -26 -2 -6
=> index 1 在右下角
磁鐵放在上面,藍面向上,放左上角
8 -7 -16 -17 -26 -12 35 127 -32 24 127 127 -19 31 127 127
8 -7 -16 -17 -26 -13 35 127 -32 24 127 127 -19 32 127 127
8 -7 -16 -17 -26 -12 35 127 -32 24 127 127 -19 32 127 127
8 -7 -16 -17 -26 -13 35 127 -32 24 127 127 -19 31 127 127
8 -7 -16 -17 -26 -12 35 127 -32 24 127 127 -19 31 127 127
=> index 16 在左上角
磁鐵放在上面,藍面向上,放右上角
-8 -12 -6 2 74 10 -13 5 127 127 -26 -22 127 127 14 -17
-8 -12 -6 2 75 10 -14 5 127 127 -26 -22 127 127 14 -18
-8 -12 -5 2 75 10 -14 4 127 127 -25 -23 127 127 14 -18
-8 -12 -6 2 74 11 -13 4 127 127 -26 -22 127 127 14 -18
-8 -12 -6 2 74 10 -14 5 127 127 -25 -22 127 127 14 -18
=>index 13 在右上角
=> 排列應該是這樣, 4 在 POWER PIN, 1 在 D3
16 15 14 13
12 11 10 9
8 7 6 5
4 3 2 1
地磁感測的觀察
思路是先將被限制的感測值放開,看看能夠觀察到什麼
- 最起碼試試可不可以當作指南針用
地表磁力約在 0.26 - 0.65 高斯,希望看到感測值在這附近,即使有 offset, 也希望能看到在八個方位能看到將近 2.65 的值差
0.26/(150.0/1024)
1.7749333333333335
>>> 0.65/(150.0/1024)
4.437333333333333
沒有下 constrain(v, -127, 127) 的值
21 14 11 13 -6 16 12 21 -6 24 -7 -3 9 -7 13 3
21 14 12 12 -6 16 12 21 -6 24 -7 -3 9 -6 13 3
21 14 12 13 -6 16 12 21 -6 24 -7 -3 9 -6 13 3
21 14 12 13 -6 16 13 22 -6 24 -7 -3 9 -7 13 3
21 14 12 13 -6 16 12 21 -6 24 -7 -2 9 -7 12 3
=> 沒看到預期接近 0, 在拿感測器轉 360 度的實驗中,觀測不到任何值有明顯的差2 的現象
RH:請使用processing example code e1 進行觀測,啟用後按enter可將所有值歸0
接著移動sensor,應該可以看到相當微小的差異,值在0-4之間
(您也可以在processing中使用用float[][] rawData = gs. getRawData() 後,再使用println(rawData)在console看到4x4的值)
然後您就可以自由將rawData乘上某個常數把值放大,或者使用更高解析度的ADC看到更細緻的結果。
不同磁鐵的觀察
- 做這個觀察是想了解是否所需要的磁鐵是特製的,是否隨便拿來的磁鐵都能使用,以及如果使用其他磁鐵是否有什麼東西需要注意的
- 隨便拿手上拿得到的先觀察一下
- 隨便的磁鐵都能讓 GaussSense 感測到磁場的變化 => 一般磁鐵也能用
- 磁鐵強一點,感測到的數值會比較高,無法感測的距離也比較長
- RH: 可以把Arduino code中的 +/-127的限制放寬成+/-512 就可以減輕飽和問題。ps. Arduino當中可看到放寬後數值,但是如果要用processing的範例,必須在把+/-512 map回 +/-127 (e.g. 512/4 = new value)
- 所附的磁鐵約和一般比較強的磁鐵是類似的
- RH: 所附的磁鐵應該是比較弱的喔 銀色的磁鐵才是比較強的
- 有一種按下去比較軟的磁鐵,磁力很弱,而且可以看出磁力的分布比較奇特
- RH: 軟磁鐵運用的是交叉沖磁法,製造較簡易,但feature較複雜,不適用我們的演算法。
自製磁力感測 study
- Arduino練習:霍爾效應感測器
- Arduino 可調線性霍爾磁力感測模組
- 一般找到的霍爾磁力感測模組,是 digital output, 拿來當開關用。
- 曹大寫的 Arduino 常用程式教學(常用模組篇) ,裡面有提到霍爾感測模組,有類比輸出 P365
- 利用霍爾元件49E試做金屬探測器
- Arduino 類比霍爾磁力感測模組
- Grove-霍爾傳感器
- 霍爾感測可以拿來測馬達轉速,Demo code 中有。原理是馬達轉動時會造成磁極正負翻轉,拿 digital output 的 sensor, 計算 on/off 的次數即可(可用 interrupt 的方式實現)
- Sparkfun 霍爾電流傳感器- ACS712
- Arduino練習:電容式麥克風與運算放大器LM358
- => 找不到含放大電路的霍爾感測器,用來做地磁感測,難道只能土砲解?
- RH:我們用的Winson WSH136就是內含放大電路的線性霍爾感測器,另有其他規格如連結