2011-05-06

以Mindsensors NumericPad作為Arduino的輸入裝置

這是我的第一個Arduinocase
因為手中有一些NXT數位感應器,因此希望能夠結合Arduino豐富多樣的應用,在往後會有更多有趣的題材可以嘗試。
<Arduino_I 2C _NP_05.jpg>

而在這個以NumericPad作為Arduino輸入裝置的case中,會由Arduino boardI 2C通訊功能來寫入與讀取Mindsensors NumericPadregister,並將偵測到的按鍵狀態經由7-segment LED作為視覺化的輸出。
記錄的影片如下:




/video/

接下來是進行這個case所整理、記錄的資料:
Arduino UNONXT 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
Arduino I2C Communication Library為:<Wire.h>,撰寫操作NXT I 2C裝置的Arduino程式即可以運用這個Librarymethods
不過目前有一組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,如同NXCleJOS進行I 2C通訊的呼叫方式一樣,比起直接使用<Wire.h>相對較為便利與熟悉。
(2)  部份NXT數位感應器專屬之Device Class:提供使用者程式可以直接呼叫裝置功能的methods,而不須處理Register的讀寫動作,就如同leJOS Device Class的使用方式。
目前已提供的共有11Mindsensors數位裝置,如:NXTMMXNXTHIDNXTServoNXTCam以及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
程式用法摘要如后:

(1)   呼叫 NXTI 2C Device
class
的建構子(constructor),同時傳入NumericPadI 2C address(0xB4),來宣告及建立NumericPadinstance(numpadinstance 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);
(3)   loop()中呼叫readInteger() method讀取NumericPad的按鍵狀態值(2 Bytes,以Integer type回傳)加上adjustbitSeq()的原因是為了要調整回傳值中bit 6/7bit 10/11的順序,讓它能夠與layout一致,方便後續對應led pattern陣列的index
numpad_keyValue = adjustBitSeq(numpad.readInteger(NUMPad_Register));
(4)   bit 0開始逐一比對按鍵狀態,並輸出到7-segment LED作顯示。
範例程式:Here
Summary

7-segment LED作為輸出將會囿於只能顯示一個按鍵值的限制,而無法展現NumericPad可以回應多重觸控的功能,我在另外一個Arduino程式使用Serial Monitor就可以顯示出所有的觸控按鍵值。
不過,因為Arduino擁有豐富的電子聲光週邊,所以用來發揮多樣化的視覺、聽覺效果應該會比NXT容易。




  • 留言者: CAVE教育團隊
  • Email: zero.five@msa.hinet.net
  • 網址:
  • 日期: 2011-05-09 00:08:44
CH_Lego:

   This is a good topic for MAKE magazine, if you like.

                                                       CAVE






  • 留言者: 探奇自然科學教室
  • Email: touch_classroom@yahoo.com.tw
  • 網址:
  • 日期: 2011-05-07 16:54:34
謝謝ch lego先生的好文,我會盡快發文介紹,分享給大家知道。

順便說一下,這個Team的成員除了Deepak外,Clinton是RobotC for Arduino的人。

所以就聚在一起了!

[版主回覆05/07/2011 17:19:49]
謝謝邱老師,
剛開始玩arduino, 現在有如好奇寶寶, 到處找資料

昨天發mail問Deepak 如何寫arduino library,
他問我是否要加入 Develop team, 若有意願的話可以發信給 Clinton,
果然這一組team都是 NXT圈內人

沒有留言:

張貼留言