在本教程中,我们将看到如何在PCF8574 IO Expander board的帮助下扩展Arduino UNO板的IO功能。通过将PCF8574与Arduino UNO接口,您可以增加Arduino的IO引脚的数量,这样您就不必担心连接几个IO设备,如led, LCD显示,电机,传感器等。
介绍
Arduino UNO已经成为电子领域初学者和爱好者实现各种应用程序的首选板。我看到过几个使用Arduino开发的项目,从简单的电机控制到使用图形OLED显示屏完成气象站。
Arduino UNO的一个主要问题是我们项目中可用的数字IO引脚的数量。我们知道Arduino UNO板有13个数字IO引脚和5个模拟输入引脚。
对于简单的项目来说,这可能就足够了,但如果你想开发一个包含许多传感器、一个显示单元(LCD或OLED)、电机控制和通信(如Serial,它会减少两个IO引脚)的复杂项目,那么你就得稍微担心一下了。
如果你有Arduino超级委员会,那么这将不是一个问题,因为你有过多的IO引脚。问题只存在于像UNO和Nano这样较小的电路板上。
可以使用PCF8574 IO Expander Module。我已经使用这个IC接口16×2 LCD显示器与Arduino使用I2C引脚。查看这个项目在这里.
PCF8574集成电路简介
PCF8574是一种I2C总线到8-bot并行总线的IO扩展IC,它以一种简单而经济的方式为许多微控制器提供GPIO扩展。该IC的接口是I2C(或I2C)使用SDA(数据)和SCL(时钟)线。所以,如果你的微控制器有数量有限的IO引脚,并具有I2C能力,那么你可以使用这个IC来扩展IO引脚。
下面是SOIC封装中PCF8574 IC的引脚图。
它有16个引脚在这个包和下表给出一个简单的引脚描述。
密码 |
销的名字 | 描述 |
1、2、3 | A0, A1, A2 | 地址输入 |
4 5 6 7, 9 10 11 12 |
P0 - P7 | 输入/输出端口 |
8 |
接地 | 地面 |
13 |
INT | 中断输出(必须被拉高到VCC) |
14 |
sci | I2C串行时钟(必须高拉至VCC) |
15 |
SDA | I2C串行数据(必须高拉至VCC) |
16 |
VCC | 电压供应 |
当你购买基于PCF8574 IC的IO扩展模块时,你必须小心,因为市场上有两种类型的板使用PCF8574 IC。一种是完整的IO扩展模块,可以访问所有的端口引脚,INT引脚和地址引脚。这个模块如下图所示。这是我们将在项目中使用的模块。
还有另一个板,配置为与16×2或20×4字符液晶显示器接口。在这个板,地址引脚拉高,你没有访问所有的IO引脚和INT引脚。所以,在购买之前要检查两次。
实现PCF8574与Arduino的接口
由于PCF8574模块的工作是扩展微控制器的IO能力,我们可以使用它与我们的Arduino UNO板增加数字IO计数到21。模块的IO端口引脚可以用作输入或输出
下面是一个简单的框图,PCF8574与微控制器的接口,其中两个IO端口引脚配置为输入,一个引脚是驱动一个LED,其余引脚作为几个外部外设的控制引脚(输出)。
我们可以在Arduino UNO板和PCF8574 IO Expander board上使用类似的设置来控制各种外设。
线路图
下面是PCF8574与Arduino UNO板接口控制8个led的电路图。
组件的要求
- Arduino UNO(或任何Arduino板)
- PCF8574 IO扩展板
- 连接电线
- 5 v电源
- 8 x发光二极管
- 8 x 330Ω电阻
连接解释
因为PCF8574模块工作I2C通信,我们必须使用Arduino的I2C引脚来控制模块的IO引脚。Arduino UNO的A4和A5是I2C引脚,A4是SDA (Data)引脚,A5是SCL (Clock)引脚。
将这些引脚连接到PCF8574板对应的SDA和SCL引脚。现在,将模块的VCC和GND引脚连接到Arduino的+5V和GND引脚上。
为了测试这个项目,让我们将一些led连接到PCF8574模块的IO端口,这样我们就可以使用Arduino来控制它们。因此,在VCC和IO端口之间连接8个led和相应的限流电阻。
注意:我没有将电路图中的串联限流电阻连接起来。但我建议你把它们联系起来,以防万一。
注意:建议为led使用外部5V电源,不要从Arduino板上为led供电。
代码
用于解析I2C从地址
首先,我们需要确定PCF8574模块的I2C总线从地址。使用下面的代码计算模块的地址。在我的例子中,当A0, A1和A2引脚连接到LOW时,地址是0x20。我将在实际代码中使用这个地址。
# include < Wire.h >
无效的设置()
{
Wire.begin ();
Serial.begin (9600);
而(串行);
}
无效循环()
{
字节错误,地址;
int I2CDevices;
系列。println("正在扫描I2C设备…");
I2CDevices = 0;
For (address = 1;地址< 127;地址+ +)
{
Wire.beginTransmission(地址);
错误= Wire.endTransmission ();
If (error == 0)
{
系列。print("在地址0x找到的I2C设备");
If (address < 16)
并同时(“0”);
系列。打印(地址、十六进制);
系列。println(“!”);
I2CDevices + +;
}
Else if (error == 4) Else if (error == 4)
{
系列。print("未知错误地址0x ");
If (address < 16)
并同时(“0”);
系列。println(地址、十六进制);
}
}
if (I2CDevices == 0)
系列。println(“没有I2C设备找到\n”);
其他的
以“* * * * \ n”);
延迟(5000);
}
用于控制IO端口
在实际的项目中,你不需要任何额外的库,除了“Wire”库,它是Arduino IDE自带的。使用下面的代码来切换备用led。
# include < Wire.h >
无效的设置()
{
Wire.begin ();
}
无效循环()
{
Wire.beginTransmission (0 x20);
Wire.write (0 xaa);
Wire.endTransmission ();
延迟(1000);
Wire.beginTransmission (PCF8574_ADDR);
Wire.write (0 x55);
Wire.endTransmission ();
延迟(1000);
}
工作
这个项目的工作很简单。我使用I2C通信将PCF8574与Arduino接口。在确定PCF8574模块的从地址后,我们必须使用这个地址开始I2C通信。
由于LED连接到IO端口,您所要做的就是以十六进制格式发送不同模式的LED切换代码。
由于I2C不使用任何现有的Arduino的Digital IO引脚,您在Arduino UNO板上共有21个IO引脚(Arduino UNO上有13个,PCF8574 IO Port上有8个),可以用于更大的项目。
总结
这里植入了一个简单的项目,通过将PCF8574与Arduino接口,增加Arduino UNO板的IO pin数。使用这个IO扩展模块,您可以连接许多IO设备,如温度传感器,湿度传感器,16×2液晶显示器,状态led,继电器,电机等,而无需担心IO引脚的数量。