在本教程中,我们将看到如何在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 Nano. | A4和A5 |
Arduino超级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连接到一个数字IO引脚与PWM(引脚9)。一个UNO板配置为I2C总线Master和另一个UNO配置为Slave设备。
当我调整连接到主Arduino的电位器,它捕获来自锅的模拟读数,将其转换为数字值(在0 - 1023的范围内),将其映射到适当的PWM值(在0的范围内- 255)并通过I2C总线将此值传输到从arduino。
奴隶arduino在接收到PWM值时调整其LED的亮度。此外,Slave Arduino将其自己的电位计值转换为PWM号码到Master Arduino(根据主站请求)。
然后Master Arduino从Slave Arduino读取PWM值,并根据该值调整其LED的亮度。这种通信在I2C总线上无缝地继续和重复。
这是一个简单的电路,只是为了了解Arduino的I2C通信。您可以修改电路,使复杂的I2C总线网络与不同的从设备,如I2C液晶显示器,EEPROM IC, BMP180气压传感器等(一个气象站的数据记录)。
需要组件
- Arduino UNO x 2
- 10 kΩ电位器x 2
- 5mm LED x 2
- 330Ω电阻x 2
- 电路试验板
- 连接电线
- 实验板电源(选配)
电路图
以下图像显示了两个Arduino UNO板之间的Arduino I2C示范的电路图。
代码
为了在Arduino中编程I2C外设,您需要了解Wire库。这是允许您通过I2C总线(SDA和SCL线路)与I2C或TWI设备通信的主库。
电线库
它配有Arduino IDE,您不必额外下载任何内容。您所要做的就是包括在Arduino中使用I2C的线路库。
# include < Wire.h >
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位的设备地址作为参数传递给这个函数,那么这个设备将作为Slave加入I2C总线,否则它将作为Master加入I2C总线。
- Wire.Begin() - 大师
- Wire.Begin(地址) - 奴隶
Wire.beginTransmission(地址)
使用此函数将数据传输开始于具有指定地址的从设备。
Wire.write()
一旦使用上面的函数开始传输,现在就可以使用Wire.write()函数开始发送实际数据。
当主服务器使用Wire.RequestFrom()函数时,也可以使用此函数将数据从从服务器写入主服务器。
- Wire.write(价值)—发送单个字节值
- Wire.write(字符串)—以字符串的形式发送一系列字节
- 电线。写(数据长度)—发送指定长度的数据数组
Wire.endTransmission ()
要结束I2C数据传输,请使用Wire.endtransmission()函数。
wire.read()
当Master调用Wire.requestFrom()函数时,使用此函数读取从Master传输到Slave或从Slave传输到Master的一个字节的数据。
Wire.requestFrom ()
主I2C设备使用这个功能从从设备请求字节的数据。使用Wire.read()函数检索数据。
- 电线。requestFrom(地址、数量)- 请求从从设备中指定的地址中提到的数量的数量字节的数据。
Wire.onReceive ()
这是一个处理器函数,用于定义一个函数,当从主机接收数据时调用它。
Wire.onRequest ()
这是一个处理器函数,用于定义一个函数,当主服务器向从服务器请求数据时调用该函数。
主码
使用上述功能,我为Master Arduino写了一个简单的代码来发送PWM值,并请求来自从机的数据字节。
奴隶的代码
在奴隶arduino代码中,我将从地址定义为0x14。它可以是少于128的任何值。关于Arduinoi2c线库I的重要点,它在没有读/写位置的情况下使用7位I2C地址。
因此,如果您有一个8位地址(包括R / W位),请右移1按1将地址移位,然后在线库中使用它。库将根据读取或写入操作自动调整地址。
此外,请确保从地址是唯一的,没有两个从站应该具有相同的地址。
返回代码,我声明了两个函数“DataReceive”和“DatareQuest”,在从站或从从站请求数据时要调用。DataReceive函数中的从站接收的数据包含主服务器发送的PWM值。
要通过DaterAquest函数传输的数据是从从站到MASTER的PWM值。
结论
在本教程中展示了使用I2C通信的两个Arduino板之间的简单双向通信。您了解了Arduino I2C外设,i2C通信的重要基础知识,电线库以及如何设置和使用Arduino I2C通信。