NXShield的硬體配置分成兩種介面:
(1) 使用Arduino IO pins:含Buttons、RGB LED、6組3-pin的RC Servo接腳.
(2) 使用I2C界面:含兩個Port Banks(BANK-A、BANK-B,各有兩個NXT motor
ports與sensor ports) ,以及一對4-pin的I2C接腳.
(1) 使用Arduino IO pins:含Buttons、RGB LED、6組3-pin的RC Servo接腳.
(2) 使用I2C界面:含兩個Port Banks(BANK-A、BANK-B,各有兩個NXT motor
ports與sensor ports) ,以及一對4-pin的I2C接腳.
NXShield firmware內建對於兩個port banks的控制功能,兩個Port banks各有預設的I2C位址(0x06與0x08)以及一組registers,作為控制Motor ports (M1、M2)動作與讀取Sensor ports (S1、S2)類比式感應器Raw Value(10 bits)的I2C操作界面.※Registers相關資料:Advance Development Guide.※Motor ports的控制功能與NXTMMX一樣,參考資料:Mindsensors NXTMMX的功能特性.※Arduino的I2C bus腳位只有一組A5、A4 pin (SCL,SDA),NXShield串接在I2C bus的界面有:BANK-A、BAN-B、4-pin的I2C接腳以及BANK-A的S1 port(BAS1).所以,BAS1 port是可以接NXT的數位感應器.
而NXT也可以使用BAS1 port來控制NXShield.
因為這4個介面串接在同一個I2C bus上,所以彼此的I2C address必須唯一.而其他的三個sensor ports就只能接類比式感應器.
[版主回覆12/05/2011 21:56:13]OK, 沒問題 : )
而NXT也可以使用BAS1 port來控制NXShield.
因為這4個介面串接在同一個I2C bus上,所以彼此的I2C address必須唯一.而其他的三個sensor ports就只能接類比式感應器.
NXShield API為了克服Arduino單一I2C Bus的限制,讓NXShield具備充分使用NXT週邊的能力,因此,引用了SoftI2CMaster library,以6個腳位為其他三個sensor ports(BAS2、BBS1、BBS2)建立I2C buses,這樣一來,所有4個sensor ports都可以連接NXT的I2C週邊.
不過,因為NXT的超音波感應器無法相容於Arduino Wire I2C library,為了讓它也能夠連接在BAS1 port,因此,NXShield API也可以將A5、A4 pin設定成使用SoftI2CMaster protocol.不過,這樣會造成在同一個I2C bus上的BANK-A與BANK-B也都同樣套用相同的protocol,可能會影響馬達控制功能的效能,使用時需要斟酌.
(NXShield IO pins mapping table)
(NXShield IO pins mapping table)
NXShield API的架構摘要
(2) NXShield控制馬達以及類比式感應器的功能建立在BANK-A與BANK-B的I2C registers,所以操作的methods都定義在NXShieldBank與NXShieldBankB.此外,另外定義了一個NXShieldAGS作為類比式感應器class的父類別,如:NXTLight、NXTTouch等都是它的子類別,不過因為實作的methods都在NXShieldBank與NXShieldBankB,因此也可以直接呼叫BANK的methods.
(3) I2C的基礎功能定義在BaseI2CDevice與SoftI2CMaster,前者是使用Wire I2C library,同時定義了一個NXShieldI2C class,繼承這兩個classes,並作為所有I2C Device classes的父類別(含NXShieldBank與NXShieldBankB,但NXUS超音波感應器除外而是直接繼承SoftI2CMaster).
(4) NXShield.h程式庫定義了三個classes:NXShield、NXShieldBank、NXShieldBankB,初始化程序定義在NXShield的init() method,參數為I2C protocol (SH_HardwareI2C或SH_SoftwareI2C,設定值會存在m_protocol全域變數):
NXShield nxshield; //呼叫建構子,建立nxshield物件
nxshield.init( I2Cprotocol ); //初始化Banks這是宣告以A5、A4 pins的I2C bus要使用那一個protocol的library (BaseI2CDevice或SoftI2CMaster),若要將超音波感應器連接在BANK-A S1 port,則需要宣告為SH_SoftwareI2C.
接下來init() method會建立NXShieldBank與NXShieldBankB兩個Bank classes的物件(bank_a與bank_b),並呼叫I2C Device父類別NXShieldI2C init() method初始化這兩個子物件的I2C bus,之後應用程式就可以引用BANK物件的馬達與類比式感應器methods:
nxshield.bank_a/bank_b.method().
NXShield nxshield; //呼叫建構子,建立nxshield物件
nxshield.init( I2Cprotocol ); //初始化Banks這是宣告以A5、A4 pins的I2C bus要使用那一個protocol的library (BaseI2CDevice或SoftI2CMaster),若要將超音波感應器連接在BANK-A S1 port,則需要宣告為SH_SoftwareI2C.
接下來init() method會建立NXShieldBank與NXShieldBankB兩個Bank classes的物件(bank_a與bank_b),並呼叫I2C Device父類別NXShieldI2C init() method初始化這兩個子物件的I2C bus,之後應用程式就可以引用BANK物件的馬達與類比式感應器methods:
nxshield.bank_a/bank_b.method().
(5) 所有I2C數位感應器都是透過父類別NXShieldI2C init() method初始化I2C bus,在I2C數位感應器的Device class中需要定義init() method:
bool init(NXshield * shield, SH_BANKPORT bp);當在應用程式中呼叫上述Device class的初始化method時,即會呼叫父類別NXShieldI2C 的init() method初始化I2C bus. 之後就可以引用裝置物件的methods.
bool init(NXshield * shield, SH_BANKPORT bp);當在應用程式中呼叫上述Device class的初始化method時,即會呼叫父類別NXShieldI2C 的init() method初始化I2C bus. 之後就可以引用裝置物件的methods.
- 留言者: Yean
- Email: drlego.tw@yahoo.com.tw
- 網址:
- 日期: 2011-12-05 21:13:23
[版主回覆12/05/2011 21:56:13]OK, 沒問題 : )
沒有留言:
張貼留言