您肯定已经听说过 集成电路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():当从站接收到来自主站的传输时,调用一个函数。
- 根据要求 ():当从站向主站请求数据时,调用一个函数。
至 更多资料 有关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个设备。 地址(引脚A0,A1,A2)将为:
- 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() { }