在本教程中,我们将看到如何在Arduino上设置和使用I2C通信。这个Arduino I2C教程解释了Arduino中的I2C引脚,配置Master和Slave,最后是一个简单的演示,其中两个Arduino UNO板通过I2C通信。
I2C是什么?
I2C或I.2C对于集成电路间隙短,由Phillips开发的同步串行通信协议,用于使用只有两根线的快速微控制器和相对慢的外围设备(如存储器或传感器)之间的通信。因此,它有时也称为TWI(两个线界面)。
使用I2C,可以传输100kbit /s(时钟100khz -标准模式)、400kbit /s(时钟400khz - Fast模式)、1mbit /s(时钟1mhz - Fast Mode Plus)和3.4 Mbit/s(时钟3.4 MHz -高速模式)的数据。
这看起来可能不多,但对于小距离连接传感器、存储器和显示器已经足够了。
I2C总线
I2C总线由两条线组成,分别是串行数据(SDA)和串行时钟(SCL)。数据通过SDA线传输,而SCL线用于使设备与时钟信号同步。
这两条母线都是开路排水驱动器,因此你必须使用上拉电阻保持他们高。
有两种类型的设备连接到I2C总线:Master和Slave。公交车大师负责发送和接收到从设备和从从设备发送数据。时钟信号也由主设备提供。
I2C网络支持多个主节点和多个从节点(但我们通常看到的是单个主节点和多个从节点)。每个连接到I2C总线的从设备都有一个独特的7位地址。
使用此地址,主机选择特定的从站进行数据传输(发送或接收),并且所选从站根据请求响应。
我对基础知识进行了广泛的教程2C通信。欲知详情,请访问“I2C通信基础“。
I2C在Arduino
Arduino支持I2C通信。如果你从教程看一下Arduino Uno的引脚“ARDUINO UNO引出线“,模拟输入引脚A4和A5具有I2C的替代功能。
A4引脚作为SDA,而A5引脚作为SCL。在原始Arduino UNO的R3中,在Digital IO Pin 13(靠近USB插座)附近有两个额外的引脚,专用于SDA和SCL。
如果您正在使用任何其他板,那么下表将对您有用,因为它描述了所有流行的Arduino板上的I2C引脚。
木板 | SDA和SCL引脚 |
Arduino UNO | A4和A5 |
Arduino纳米 | A4和A5 |
Arduino Mega 2560. | 20和21 |
Arduino微 | 2和3. |
Arduino达芬奇 | 2和3. |
ATMEGA328P在Arduino UNO和Nano中使用的微控制器支持I2C数据传输速度高达400 kHz。
如何使用Arduino I2C接口?
为了演示I2C在Arduino中的工作,让我们搭建一个小电路。在这个演示中,我连接了两个Arduino UNO板,通过I2C总线进行通信。为了让事情变得有趣并真正看到交流,我添加了两个led和电位器(每个UNO板一组)。
电位器连接到相应的模拟输入引脚(A0),并且LED连接到具有PWM(引脚9)的数字IO引脚。一个UNO板配置为I2C总线主站,另一个UNO配置为从设备。
当我调整连接到主Arduino的电位器,它捕获来自锅的模拟读数,将其转换为数字值(在0 - 1023的范围内),将其映射到适当的PWM值(在0的范围内- 255)并通过I2C总线将此值传输到从arduino。
奴隶arduino在接收到PWM值时调整其LED的亮度。此外,Slave Arduino将其自己的电位计值转换为PWM号码到Master Arduino(根据主站请求)。
然后,主arduino然后从奴隶arduino读取pwm值,并根据该值调整其LED的亮度。此通信继续在I2C总线上无缝重复。
这是一个简单的电路,只是为了了解Arduino的I2C通信。您可以修改电路,使复杂的I2C总线网络与不同的从设备,如I2C液晶显示器,EEPROM IC, BMP180气压传感器等(一个气象站的数据记录)。
需要组件
- arduino uno x 2
- 10kΩ电位器x 2
- 5mm LED x 2
- 330Ω电阻x 2
- 面包板
- 连接电线
- 实验板电源(选配)
电路图
下图是Arduino I2C在两块Arduino UNO板之间的演示电路图。
代码
为了在Arduino中编程I2C外设,您需要了解电线库。这是主库,允许您通过I2C总线(SDA和SCL线)与I2C或TWI设备通信。
线库
它配有Arduino IDE,您不必额外下载任何内容。您所要做的就是包括在Arduino中使用I2C的线路库。
#include
Wire库提供了10个用于开发I2C相关应用程序的函数。它们是:
- Wire.begin ()
- Wire.requestFrom ()
- Wire.beginTransmission ()
- Wire.endTransmission ()
- Wire.write ()
- Wire.available ()
- wire.read()
- Wire.SetClock ()
- wire.onreceive()
- wire.onrequest()
现在让我们详细了解一些重要的Wire Library函数。
线库函数
Wire.begin ()
使用此功能启动I2C通信。如果将7位设备地址作为参数传递给此功能,那么设备将加入I2C总线作为从其他设备连接它将加入Master。
- Wire.Begin() - 大师
- Wire.Begin(地址) - 奴隶
Wire.BegintRansmission(地址)
使用此功能开始数据传输到指定地址的从设备。
Wire.write ()
一旦使用上面的函数开始传输,现在就可以使用Wire.write()函数开始发送实际数据。
当主使用Wire.RequestFrom()函数时,您还可以使用此功能将来自从机到Master的数据写入Master。
- Wire.write(价值)—发送单个字节值
- Wire.write(字符串)—以字符串的形式发送一系列字节
- 电线。写(数据长度)- 发送一系列指定长度的数据数组
Wire.endTransmission ()
要结束I2C数据传输,请使用Wire.endtransmission()函数。
wire.read()
使用此函数读取从主站到从站或从从站传输到主机的数据字节,当主站呼叫Wire.Requestfrom()函数时。
Wire.requestFrom ()
主I2C设备使用这个功能从从设备请求字节的数据。使用Wire.read()函数检索数据。
- 电线。requestFrom(地址、数量)- 请求从从设备中指定的地址中提到的数量的数量字节的数据。
wire.onreceive()
这是一个处理器函数,用于定义一个函数,当从主机接收数据时调用它。
wire.onrequest()
这是用于定义函数的处理程序函数,当主设备从从机请求数据时调用。
主代码
使用上述功能,我为Master Arduino写了一个简单的代码来发送PWM值,并请求来自从机的数据字节。
从代码
在奴隶arduino代码中,我将从地址定义为0x14。它可以是少于128的任何值。关于Arduinoi2c线库I的重要点,它在没有读/写位置的情况下使用7位I2C地址。
所以,如果你有一个8位地址(包括R / W位),右移地址1,然后在Wire Library中使用它。库将根据读或写操作自动调整地址。
另外,确保从服务器地址是唯一的,并且不应该有两个相同的从服务器地址。
返回代码,我声明了两个函数“DataReceive”和“DatareQuest”,在从站或从从站请求数据时要调用。DataReceive函数中的从站接收的数据包含主服务器发送的PWM值。
通过DataRequest函数传输的数据是从Slave到Master的PWM值。
结论
本教程演示了两个Arduino板之间使用I2C通信的简单双向通信。您了解了Arduino I2C外围设备,I2C通信的一些重要基础知识,电线库,以及如何设置和使用Arduino I2C通信。