2011-12-03

NXShield arduino API 摘要整理

NXShield的API(下載點)是以它的硬體配置以及Firmware功能作為發展基礎,使用的是C++語言,整體架構具結構化與彈性,運用時非常直覺,同時也很容易增加新的Device Class或擴充功能,對於NXT users不會覺得陌生且很容易上手。
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接腳.
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就只能接類比式感應器.
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 API的架構摘要
(1)  Class階層架構,參考API文件
(NXShield API class hierarchy)
(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().
(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.

  • 留言者: Yean
  • Email: drlego.tw@yahoo.com.tw
  • 網址:
  • 日期: 2011-12-05 21:13:23
可以借分享嗎?
[版主回覆12/05/2011 21:56:13]OK, 沒問題 : )

沒有留言:

張貼留言