CH LEGO BLOG
於 2013.12.1 由Yahoo Blog轉移
2011-05-06
以Mindsensors NumericPad作為Arduino的輸入裝置
這是我的第一個
Arduinocase
。
因為手中有一些
NXT
數位感應器,因此希望能夠結合
Arduino
豐富多樣的應用,在往後會有更多有趣的題材可以嘗試。
<
Arduino_I 2C _NP_05.jpg
>
而在這個以
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
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)
的方式來處理。
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)
,同時傳入
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);
(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));
(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圈內人
沒有留言:
張貼留言
較新的文章
較舊的文章
首頁
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言