Gravitech的Arduino
7SEG Shield為具有三個I2C裝置的Arduino擴充板,包含:
(1) 以SAA1064晶片驅動的4位數7段LED (I2C address: 0x38)、
(2) TMP75數位溫度感應器 (I2C address:0x49)、
(3) 24LC128 EEPROM (I2C address:0x50)。
關於各I2C裝置的用法,可參考原廠Datasheet,同時也可以參照Gravitech所提供的Sample
Code ,示範由TMP75讀取溫度值然後顯示在LED的作法。
Arduino多功能I2C裝置實作
在前篇” NXT與Arduino多重I2C Master之實作測試”對於Arduino Wire.h Library I2C Multi-Master功能的實作,這裡再以相同的應用方式改以Arduino UNO加上這個Shield組合而成為一個”多功能I2C裝置”作為實作範例,
並規劃UNO兼具以下之I2C Slave與Master雙角色功能:
※由UNO擔任Slave角色,負責接收與回應來自其他外部裝置對於”多功能I2C裝置”的I2C操作需求。
※當UNO處理外部I2C訊息時,若需要控制擴充板裝置(SAA1064、TMP75)的運作, 則UNO轉換成為Master角色,傳送I2C指令操作指定裝置。
因此就”多功能I2C裝置”而言,UNO就如同擔任代理人(Delegate) 角色,負責處理外部使用需求的介面。
依據這樣的應用,規劃”多功能I2C裝置”的功能如下:
(1) 於UNO Sketch setup()先進行TMP75及SAA1064的初始化設定(Master角色),
完成之後以0x31
address加入I2C bus, 在loop()即進入接收外部I2C通訊的待命狀態(Slave角色)。
(2) 於receiveEvent ()處理外部裝置使用LED顯示數字(Register
address: 0x42) 與 字串(Register
address: 0x43)的功能,包含:數字、字母的LED字型轉換,以及字串以跑馬燈方式顯示。
(3) 於requestEvent()處理回復裝置資訊的需求(Register
address: 0x00)。
(4) 對於TMP75數位溫度計考慮讀取效率,由外部裝置直接以Slave address(0x49)進行讀取(回復2個Bytes),不間接透過UNO處理。
Arduino I2C
Slave Device處理Master request須知
以Arduino UNO作為Slave device,對於處理與回應外部I2C request的Sketch程式碼,需要留意以下注意事項:
(1) 在loop()中,應該專職於Slave的角色,除非是要處理來自Master的要求,不要主動去啟始對其他Slave Device的I2C通訊,否則會造成外部裝置(Master)無法通訊的狀況。
(2) 在receiveEvent ()中,只進行資料的接收,後續的需求處理,應該在接收完成後回到loop()再進行,以免干擾整體的通訊過程。
(3) 在requestEvent()中,只處理資料的回復,必須維持以Slave角色完成通訊過程的完整性,如果要求回復的資料需要去向另一個Slave Device request,就必須拆分成兩次通訊過程來完成。
以NANO作為外部裝置測試
(1) 要求UNO Slave (0x31)
回傳它的裝置資訊 (Register address: 0x00) ,會觸發requestEvent() 回傳”UNO-Ox31”的字串。
(2) 要求TMP75 (0x49)
回傳所測量的溫度值。
(3) 要求UNO Slave (0x31)
在LED顯示數值資料(Register
address: 0x42),會觸發receiveEvent() 接收顯示指令及數值,先判斷設定status flag (isDisplayNumber=true) 之後,回到loop () 即依據status flag啟始對SAA1064的數字顯示要求。
(4) 要求UNO Slave (0x31)
在LED以跑馬燈方式顯示字串(Register
address: 0x43),會觸發receiveEvent () 接收顯示指令及字串,先判斷設定status flag (isDisplayText=true) 之後,回到loop () 即啟始對SAA1064的字串顯示要求。
Sketch程式:
(1) Arduino I2C Slave Device - Arduino_I2C_Device.pde
(2) NANO外部裝置 - NANO_CTRL_4SEG7.pde
沒有留言:
張貼留言