2011-12-03

NXShield arduino API 摘要整理

NXShieldAPI(下載點)是以它的硬體配置以及Firmware功能作為發展基礎,使用的是C++語言,整體架構具結構化與彈性,運用時非常直覺,同時也很容易增加新的Device Class或擴充功能,對於NXT users不會覺得陌生且很容易上手。
NXShield的硬體配置分成兩種介面
(1)
使用Arduino IO pins:含ButtonsRGB LED63-pinRC Servo接腳.
(2)
使用I2C界面:含兩個Port Banks(BANK-ABANK-B各有兩個NXT motor
ports
sensor ports) ,以及一對4-pinI2C接腳.
NXShield firmware內建對於兩個port banks的控制功能兩個Port banks各有預設的I2C位址(0x060x08)以及一組registers,作為控制Motor ports (M1M2)動作與讀取Sensor ports (S1S2)類比式感應器Raw Value(10 bits)I2C操作界面.Registers相關資料:Advance Development Guide.Motor ports的控制功能與NXTMMX一樣,參考資料:Mindsensors NXTMMX的功能特性.ArduinoI2C bus腳位只有一組A5A4 pin (SCLSDA)NXShield串接在I2C bus的界面有:BANK-ABAN-B4-pinI2C接腳以及BANK-AS1 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(BAS2BBS1BBS2)建立I2C buses,這樣一來,所有4sensor ports都可以連接NXTI2C週邊.
不過,因為NXT的超音波感應器無法相容於Arduino Wire I2C library,為了讓它也能夠連接在BAS1 port,因此,NXShield API也可以將A5A4 pin設定成使用SoftI2CMaster protocol.不過,這樣會造成在同一個I2C bus上的BANK-ABANK-B也都同樣套用相同的protocol,可能會影響馬達控制功能的效能,使用時需要斟酌.
(NXShield IO pins mapping table)

NXShield API的架構摘要
(1)  Class階層架構,參考API文件
(NXShield API class hierarchy)
(2)  NXShield控制馬達以及類比式感應器的功能建立在BANK-ABANK-BI2C registers,所以操作的methods都定義在NXShieldBankNXShieldBankB.此外,另外定義了一個NXShieldAGS作為類比式感應器class的父類別,如:NXTLightNXTTouch等都是它的子類別,不過因為實作的methods都在NXShieldBankNXShieldBankB,因此也可以直接呼叫BANKmethods.
(3) I2C的基礎功能定義在BaseI2CDeviceSoftI2CMaster,前者是使用Wire I2C library,同時定義了一個NXShieldI2C class,繼承這兩個classes,並作為所有I2C Device classes的父類別(NXShieldBankNXShieldBankB,但NXUS超音波感應器除外而是直接繼承SoftI2CMaster).
(4)  NXShield.h程式庫定義了三個classesNXShieldNXShieldBankNXShieldBankB,初始化程序定義在NXShieldinit() method,參數為I2C protocol (SH_HardwareI2CSH_SoftwareI2C設定值會存在m_protocol全域變數)
NXShield  nxshield; //
呼叫建構子,建立nxshield物件
nxshield.init( I2Cprotocol );  //
初始化Banks這是宣告以A5A4 pinsI2C bus要使用那一個protocollibrary (BaseI2CDeviceSoftI2CMaster),若要將超音波感應器連接在BANK-A S1 port,則需要宣告為SH_SoftwareI2C.
接下來init() method會建立NXShieldBankNXShieldBankB兩個Bank classes的物件(bank_abank_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, 沒問題 : )

沒有留言:

張貼留言