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纳米 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配置为从设备。

I2C-on-Arduino-2

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

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

然后,主arduino然后从奴隶arduino读取pwm值,并根据该值调整其LED的亮度。此通信继续在I2C总线上无缝重复。

I2C-on-Arduino-3

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

代码

为了在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值。

I2C-on-Arduino-4

结论

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

发表评论

您的电子邮件地址不会被公开。必填字段被标记*