2011-09-15

使用NXT控制Arduino Network Device



Arduino
I2C Wire.h Multi-Masters功能實作
中以Arduino+Gravitech
7-SEG Shield
組合成為一個I2C Slave Device,可以提供其它的Arduino使用I2C Master方式控制LED的顯示,藉以驗證Wire.h具備多重I2C Master的處理功能。


而原先的構想是任何可以進行I2C通訊的裝置,應該都可以控制這個I2C Slave Device,包含NXT在內,而事實上NXTArduinoI2C通訊也經由實際測試,運作正常。

不過經由多次的測試,NXT始終無法如同Arduino一般能夠正常的存取這個I2C Salve
Device
,而比較之前的測試Case,唯一的差別就在於Gravitech 7-SEG
Shield
擴充板所內建對於SDASCL4.7k ohm pull-up,實在是百思不解問題真正所在。




Arduino Network Device建構

(Photo)



而為了讓NXT可以使用Gravitech 7-SEG Shield的功能,所以改造原來的I2C Slave
Device
成為Network Device


不再使用I2C而改為Ethernet TCP/IP方式,:

(1).
Arduino UNO + Gravitech 7-SEG Shield +
Arduino Ethernet
Shield
組合成為 Telnet Server


(2).
另外使用 Arduino UNO + Arduino Ethernet Shield組合成為Telnet Client

至於NXT則透過I2C傳送指令與資料給Telnet Client,由ClientUNO組合成封包之後經由網路線傳送至Telnet Server接收,而Server端的UNO解析之後再以I2C控制Gravitech 7-SEG Shield執行指定的功能,有點複雜但可玩性十足。

(
架構圖)



(Demo Video)









NXT對於Network Device控制流程

整體架構共分成三個部份:

(1). NXT to Telnet Client


Telnet Client作為I2C Slave Device,規劃相關功能對應的Register AddressData需求:

0x00
-
回傳裝置資訊,這是用來測試I2C通訊功能是否正常。

0x41+
三色LED顯示指令(R/G/B)  -
控制Gravitech 7-SEG
Shield
顯示指定顏色。


0x42+
英數字串 - 控制Gravitech 7-SEG
Shield
將字串顯示在七段式LED


0x43+
整數值字串 - 控制Gravitech 7-SEG
Shield
將數字顯示在七段式LED


因此,NXT即將前述的指令以LowspeedWrite()傳送給Client端的UNO,而對於UNO即會觸發onReceive()handler進行接收。



(2). Telnet Client to Server


ClientUNO負責將接收到的NXT
request
解析並製作成資料封包後,使用Ethernet.h library的功能,透過Arduino Ethernet Shield以網路線傳送至Server端,而Server端的UNO同樣也是以Ethernet.h的功能接收封包資料。




(3). Telnet Server to
Gravitech 7-SEG Shield

Server端經解析來自Client端的資料之後,即分別使用Digital I/O控制三色LED的顏色顯示以及以I2C方式控制七段式LED顯示字串資料。






後記

(1).
Ethernet.h雖然區分成serverclient兩個classes的功能,但不是限制只能在個別角色中才能使用的methods,尤其在server端反而會用到很多Client
class
的功能來控制資料的接收,這一點是官方說明文件比較陽春的地方。

(2).
除了本case所使用的telnet(port 23)協定之外,外部很常見的http協定(port 80)就可以讓NXT結合Web server應用透過browser來控制,這是另外一個有趣的應用領域。



範例程式

(1) NXT
端程式:NXT_7SEG_DEMO.nxc

(2) Telnet Client
端程式:TelnetClient_I2CSlave.pde

(3) Telnet Server
端程式:TelnetServer_7SEGLED.pde

  • 留言者: ㄚ仁
  • Email: pciahb@yahoo.com.tw
  • 網址:
  • 日期: 2012-07-14 01:14:22
您好 想請教您一個問題 我將ethernet shield 接到Hub 然後把Arduino的範例程式(Web Server)燒進去我的Arduino UNO 後 輸入IP到網址列 卻沒有辦法連結到那個IP 請問是我IP輸入錯誤嗎? 如果是 那請問我應該如何得知我的IP應該輸入甚麼才恰當呢? 另外 範例程式裡有一個Web Client 程式碼裡面有一個IP是http://173.194.33.104/ 我有看到youtube裡的影片有關Ethernet的介紹 也看到他將http://173.194.33.104/這個IP輸入到網址列後 會連到GOOGLE 但是我自己測試卻不會 請問這兩件事之間有關連嗎? 我知道這和您這篇文章可能沒有任何關係 很抱歉 但我看了許多網站 都沒有辦法解決我的問題 因此請教您 煩請您撥空指教 感激不盡!
[版主回覆07/14/2012 12:30:59]Google的IP常常在變, 所以先使用命令提示字元去ping www.google.com, 就可以解析到正確的IP.
我剛才ping 到的IP是 74.125.31.147

沒有留言:

張貼留言