您肯定已經聽說過 集成電路PCF8574,可以單獨購買或已像許多其他模塊一樣已安裝在模塊上的芯片 電子元器件 促進您與Arduino開發板的集成。 在這種情況下,它是輸入和輸出的擴展 I2C總線.
您可能會認為Arduino已經擁有了自己的 集成式I2C總線,的確如此。 但是PCF8574可以幫助將總線擴展到開發板的範圍之外,這對某些需要不僅僅是Arduino提供的功能的製造商有很大的幫助。
什麼是I2C總線?
I2C的名稱來自 集成電路間 或內部集成電路。 它的1.0版是由飛利浦在1992年創建的。 然後第二個2.1將於2000年問世,如今,它已成為標準(100 kbit / s,儘管最大允許3.4 Mbit / s),但該專利在2006年到期並可以免費使用。
目前在行業中被廣泛使用 溝通,也受到製造商的讚賞,因為他們的項目可以交流集成在一個IC中的不同微控制器和外圍設備。
El I2C是一輛公共汽車 從串行通信中眾所周知。 它使用只有2個通道的同步通信協議(有第三個通道,但它耦合到參考或GND),實際上它也被稱為TWI(兩線接口):
- 一為時鐘(SCL)。
- 其他用於數據(SDA)。
這意味著 主從 它們通過同一根電纜或軌道發送數據,該數據由第一個產生時鐘信號的電纜或軌道控制。 連接到I2C總線的每個外圍設備都將分配一個唯一的地址,以便引導傳輸。 但是,主機不必始終是同一主機(多主機),而是始終由他來發起傳輸。
正如我在文章中已經解釋的 Arduino的I2C 我之前提到過,每個板在不同的地方都有這些I2C連接。 您必須謹記要在每個平板版本中正確使用它:
- Arduino UNO:SDA在A4中,SCK在A5中
- Arduino納米:與上一個相同。
- Arduino迷你專業版: 相同的。
- Arduino的兆豐:SDA在引腳20上,SCK在21上。
- 有關板的更多信息。
您已經知道可以輕鬆地將I2C用於草圖,因為 Wire.h庫 具有用於此串行通信的各種功能:
- 開始 ():啟動Wire庫並指定它是主庫還是從庫
- requestFrom():由主服務器用於從屬服務器請求數據。
- beginTransmission():與從站開始傳輸。
- endTransmission():結束傳輸。
- 寫()-響應主服務器的請求,從服務器寫入數據,也可以將主服務器的傳輸排隊。
- 可用的 ():將返回要讀取的字節數。
- 讀():讀取從從機發送到主機的字節,反之亦然。
- onReceive():當從站接收到來自主站的傳輸時,調用一個函數。
- 根據要求 ():當從站向主站請求數據時,調用一個函數。
至 MAS INFORMACION 有關Arduino編程和功能的信息,您可以下載我們的 PDF教程.
什麼是PCF8574?
PCF8574是 I2C總線數字量輸入和輸出(I / O)擴展器。 除了可以在IC和模塊中使用外,它還可以由各種製造商製造。 無論如何,將其連接到Arduino板上並具有控制超過主板所允許的更多設備的能力是非常實用的。
El PCF8574引腳排列 很簡單,因為它僅包含 8松樹 准定向(用於通信的芯片連接所在的P0-P7),另一方面,您具有必須連接至Arduino板的SDA和SCL,以及VCC和GND才能為模塊供電。 並且不要忘記三個尋址引腳A0,A1,A2,以選擇將通信定向到哪個設備...
它有 其他功能 您應該知道:
- 它的連接是一個開放的排水口,可以是 既用作輸入又用作輸出.
- La 峰值電流 當它作為輸出時(漏電流,當電流流向PCF25時)為8574mA,而當它作為輸出時,則為300 µA(源,電流從PCF8574流過)。
- La 張力 電源為2.5和6v。 待機功耗非常低,僅為10 µA。
- 所有輸出 有閂鎖,無需外部動作即可維持狀態。 您只需要在要更改狀態時採取行動即可。
- 你可以獲得8 可能的方向, 也就是說,最多8個設備可與8個模塊進行通信或使用64個模塊將其擴展到0個設備。 地址(引腳A1,A2,AXNUMX)將為:
- 000:地址0x20
- 001:地址0x21
- 010:地址0x22
- 011:地址0x23
- 100:地址0x24
- 101:地址0x25
- 110:地址0x26
- 111:地址0x27
- 錄取 打斷 (INT)通過專用線來檢測數據而無需不斷監視。
與Arduino集成
與Arduino的連接非常簡單,只需將Vcc與Arduino板的5v引腳連接,將GND與Arduino的GND連接即可。 另一方面,PCF8574 SDA和SCL模塊的引腳可以是 用別針連接 14(A5 SCL)和15(A4 SDA)。 只有這樣,它才能開始工作,顯然,您可以使用Px連接要通信的設備...
然後它只會丟失 從示例草圖開始 在Arduino IDE中。 您可以執行此操作而無需使用其他庫,例如...
#include <Wire.h> const int address = 0x38; void setup() { Wire.begin(); Serial.begin(9600); } void loop() { for (short channel = 0; channel < 8; channel++) { // Escribir dato en cada uno de los 8 canales Wire.beginTransmission(address); Wire.write(~(1 << channel)); Wire.endTransmission(); // Lee dato del canal delay(500); } }
作為輸入:
#include <Wire.h> const int address = 0x38; void setup() { Wire.begin(); Serial.begin(9600); } void loop() { short channel = 1; byte value = 0; // Leer el dato del canal Wire.requestFrom(pcfAddress, 1 << channel); if (Wire.available()) { value = Wire.read(); } Wire.endTransmission(); // Mostrar el valor leido por el monitor serie Serial.println(value); }
或者也 使用圖書館,例如PCF8574 在這裡下載 並使用與此庫一起提供的示例本身中類似的代碼:
#include <Wire.h> #include "PCF8574.h" PCF8574 expander; void setup() { Serial.begin(9600); expander.begin(0x20); /* Setup some PCF8574 pins for demo */ expander.pinMode(0, OUTPUT); expander.pinMode(1, OUTPUT); expander.pinMode(2, OUTPUT); expander.pinMode(3, INPUT_PULLUP); /* Blink hardware LED for debug */ digitalWrite(13, HIGH); /* Toggle PCF8574 output 0 for demo */ expander.toggle(); /* Blink hardware LED for debug */ digitalWrite(13, LOW); } void loop() { }