Arduino I2C教程|如何在Arduino上使用I2C通信?

在本教程中,我们将看到如何在Arduino上设置和使用I2C通信。这个Arduino I2C教程解释了Arduino中的I2C引脚,配置Master和Slave,最后是一个简单的演示,其中两个Arduino UNO板通过I2C通信。

I2C-On-Arduino-1

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沟通大师奴隶的基础知识

有两种类型的设备连接到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设备。

I2C-On-Arduino-2

当我调整连接到主Arduino的电位器,它捕获来自锅的模拟读数,将其转换为数字值(在0 - 1023的范围内),将其映射到适当的PWM值(在0的范围内- 255)并通过I2C总线将此值传输到从arduino。

奴隶arduino在接收到PWM值时调整其LED的亮度。此外,Slave Arduino将其自己的电位计值转换为PWM号码到Master Arduino(根据主站请求)。

然后Master Arduino从Slave Arduino读取PWM值,并根据该值调整其LED的亮度。这种通信在I2C总线上无缝地继续和重复。

I2C-On-Arduino-3

这是一个简单的电路,只是为了了解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-Communication-Circuit

代码

为了在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-On-Arduino-4

结论

在本教程中展示了使用I2C通信的两个Arduino板之间的简单双向通信。您了解了Arduino I2C外设,i2C通信的重要基础知识,电线库以及如何设置和使用Arduino I2C通信。

留下一个回复

您的电子邮件地址不会被公开。必需的地方已做标记*