因為手中有一些NXT數位感應器,因此希望能夠結合Arduino豐富多樣的應用,在往後會有更多有趣的題材可以嘗試。
<Arduino_I 2C _NP_05.jpg>
而在這個以NumericPad作為Arduino輸入裝置的case中,會由Arduino board以I 2C通訊功能來寫入與讀取Mindsensors NumericPad的register,並將偵測到的按鍵狀態經由7-segment LED作為視覺化的輸出。
而在這個以NumericPad作為Arduino輸入裝置的case中,會由Arduino board以I 2C通訊功能來寫入與讀取Mindsensors NumericPad的register,並將偵測到的按鍵狀態經由7-segment LED作為視覺化的輸出。
記錄的影片如下:
/video/
接下來是進行這個case所整理、記錄的資料:
Arduino UNO與NXT I 2C裝置的腳位對應
Arduino UNO board I 2C通訊所使用的腳位為A4(SDA)及A5(SCL),
對應NXT則為Pin 6(藍色)(SDA) 及 Pin 5(黃色)(SCL),以及以下兩個腳位的對應:
NXT Pin 4(綠色)(4.3V Power) à Arduino 5V,
NXT Pin2/3(黑/紅)(GND) à Arduino GND,
如下圖:
<Arduino_I 2C _PinMap.JPG>
<Arduino_NXT_Pinout_Map.JPG>
Arduino NXT I 2C Device Library對應NXT則為Pin 6(藍色)(SDA) 及 Pin 5(黃色)(SCL),以及以下兩個腳位的對應:
NXT Pin 4(綠色)(4.3V Power) à Arduino 5V,
NXT Pin2/3(黑/紅)(GND) à Arduino GND,
如下圖:
<Arduino_I 2C _PinMap.JPG>
<Arduino_NXT_Pinout_Map.JPG>
Arduino I2C Communication Library為:<Wire.h>,撰寫操作NXT I 2C裝置的Arduino程式即可以運用這個Library的methods。
不過目前有一組NXT I2C Device Library DevTeam成員正以<Wire.h>發展NXT I2C Devices的專屬程式庫,相關資訊可參考本專案的網址,同時可以由這個下載點取得最新版本的Library檔案,裡面附有相當齊全的說明文件與範例程式,非常有參考價值。
在這個專案的Library,共包含兩個部分:
(1) NXT I 2C Devices通用程式庫<NXTI2CDevice.h>:具備符合NXT register layout的基本I 2C methods,如同NXC、leJOS進行I 2C通訊的呼叫方式一樣,比起直接使用<Wire.h>,相對較為便利與熟悉。
(2) 部份NXT數位感應器專屬之Device Class:提供使用者程式可以直接呼叫裝置功能的methods,而不須處理Register的讀寫動作,就如同leJOS Device Class的使用方式。
目前已提供的共有11個Mindsensors數位裝置,如:NXTMMX、NXTHID、NXTServo、NXTCam以及PSPNX等。
至於只有mindsensors Device Class的原因,我想是因為Mr.
Deeptak Patil也是NXT I2C Device Library Dev Team專案成員之一的緣故,不過其他的數位裝置,還是可以利用(1)的方式來處理。
目前已提供的共有11個Mindsensors數位裝置,如:NXTMMX、NXTHID、NXTServo、NXTCam以及PSPNX等。
至於只有mindsensors Device Class的原因,我想是因為Mr.
Deeptak Patil也是NXT I2C Device Library Dev Team專案成員之一的緣故,不過其他的數位裝置,還是可以利用(1)的方式來處理。
Arduino程式
NumericPad並沒有專屬之Device Class,所以需要以(1) 的I 2C access methods來讀寫registers。
使用前須先留意一個在NumericPad User’s Guide中所沒有提到的初始化動作,我也是參考了NXC範例程式庫(np-lib.nxc)之後才發現的,所以同樣在Arduino程式中的setup()也需要先執行NumericPad的初始化程序。
Arduino程式用法摘要如后:
Arduino程式用法摘要如后:
(1) 呼叫 NXTI 2C Device
class的建構子(constructor),同時傳入NumericPad的I 2C address(0xB4),來宣告及建立NumericPad的instance:(numpad為instance variable)
NXTI 2C Device numpad(0xB4);
class的建構子(constructor),同時傳入NumericPad的I 2C address(0xB4),來宣告及建立NumericPad的instance:(numpad為instance variable)
NXTI 2C Device numpad(0xB4);
(2) 在setup()中呼叫writeRegisters() method執行初始化動作:
numpad.writeRegisters(0x41, 9, Group1);
numpad.writeRegisters(0x 4A , 8, Group2);
numpad.writeRegisters(0x7D, 3, Group7);
numpad.writeRegisters(0x41, 9, Group1);
numpad.writeRegisters(0x 4A , 8, Group2);
numpad.writeRegisters(0x7D, 3, Group7);
(3) 在loop()中呼叫readInteger() method讀取NumericPad的按鍵狀態值(2 Bytes,以Integer type回傳),加上adjustbitSeq()的原因是為了要調整回傳值中bit 6/7與bit 10/11的順序,讓它能夠與layout一致,方便後續對應led pattern陣列的index:
numpad_keyValue = adjustBitSeq(numpad.readInteger(NUMPad_Register));
numpad_keyValue = adjustBitSeq(numpad.readInteger(NUMPad_Register));
(4) 由bit 0開始逐一比對按鍵狀態,並輸出到7-segment LED作顯示。
範例程式:Here
Summary
以7-segment LED作為輸出將會囿於只能顯示一個按鍵值的限制,而無法展現NumericPad可以回應多重觸控的功能,我在另外一個Arduino程式使用Serial Monitor就可以顯示出所有的觸控按鍵值。
不過,因為Arduino擁有豐富的電子聲光週邊,所以用來發揮多樣化的視覺、聽覺效果應該會比NXT容易。
不過,因為Arduino擁有豐富的電子聲光週邊,所以用來發揮多樣化的視覺、聽覺效果應該會比NXT容易。
- 留言者: CAVE教育團隊
- Email: zero.five@msa.hinet.net
- 網址:
- 日期: 2011-05-09 00:08:44
This is a good topic for MAKE magazine, if you like.
CAVE
- 留言者: 探奇自然科學教室
- Email: touch_classroom@yahoo.com.tw
- 網址:
- 日期: 2011-05-07 16:54:34
順便說一下,這個Team的成員除了Deepak外,Clinton是RobotC for Arduino的人。
所以就聚在一起了!
[版主回覆05/07/2011 17:19:49]
謝謝邱老師,
剛開始玩arduino, 現在有如好奇寶寶, 到處找資料
昨天發mail問Deepak 如何寫arduino library,
他問我是否要加入 Develop team, 若有意願的話可以發信給 Clinton,
果然這一組team都是 NXT圈內人
沒有留言:
張貼留言