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

在本教程中,我们将看到如何在Arduino上设置和使用I2C通信。此Arduino I2C教程解释了Arduino中的I2C引脚,配置了主设备和从站,最后是一个简单的演示,其中两个Arduino Uno Board通过I2C通信。

I2C-On-Arduino-1

什么是i2c?

I2C或I.2C对于集成电路间隙短,由Phillips开发的同步串行通信协议,用于使用只有两根线的快速微控制器和相对慢的外围设备(如存储器或传感器)之间的通信。因此,它有时也称为TWI(两个线界面)。

使用I2C,您可以在速率100 kbit / s(时钟100 kHz - 标准模式),400 kbit / s(时钟400 kHz - 快速模式),1 Mbit / s(时钟1 MHz - Fast Mode Plus)和3.4Mbit / s(时钟3.4 MHz - 高速模式)。

这似乎似乎不是很大,而是足以接口传感器,记忆和在小距离上显示。

I2C总线

I2C总线由两根称为串行数据(SDA)和串行时钟(SCL)组成。数据通过SDA线传输,而SCL线用于将设备与时钟信号同步。

这两个总线都是敞篷漏极驱动器,因此您必须使用上拉电阻使它们保持高。

I2C沟通大师奴隶的基础知识

有两种类型的设备连接到I2C总线:Master和Slave。公交车大师负责发送和接收到从设备和从从设备发送数据。时钟信号也由主设备提供。

I2C网络支持多个Master和多个从站(但我们通常会看到单个主站和多个从站)。连接到I2C总线的每个从设备具有唯一的7位地址。

使用此地址,主机选择特定的从站进行数据传输(发送或接收),并且所选从站根据请求响应。

我对基础知识进行了广泛的教程2C通信。有关这一点的更多信息,请访问“I2C通信的基础知识“。

I2C在Arduino

Arduino支持I2C通信。如果你从教程看一下Arduino Uno的引脚“Arduino uno引脚向前“,模拟输入引脚A4和A5具有I2C的替代功能。

A4引脚充当SDA,而A5引脚充当SCL。在原始Arduino Uno的R3中,数字IO引脚13(USB插座附近)附近有两种销,专用于SDA和SCL。

如果您使用的是任何其他板,则下表对您有用,因为它描述了所有流行的Arduino板上的I2C引脚。

木板 SDA和SCL引脚
Arduino Uno. A4和A5
Arduino Nano. A4和A5
Arduino Mega 2560. 20和21
Arduino Micro. 2和3.
arduino leonardo 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 LCD,EEPROM IC,BMP180气压传感器等,(带有数据记录的气象站)。

需要组件

  • arduino uno x 2
  • 10kΩ电位器x 2
  • 5mm LED x 2
  • 330Ω电阻x 2
  • 面包板
  • 连接电线
  • 面包板电源(可选)

电路图

以下图像显示了两个Arduino UNO板之间的Arduino I2C示范的电路图。

Arduino-I2C-Communication-Circuit

代码

为了在Arduino中编程I2C外设,您需要了解电线库。这是主库,允许您通过I2C总线(SDA和SCL线)与I2C或TWI设备通信。

电线库

它配有Arduino IDE,您不必额外下载任何内容。您所要做的就是包括在Arduino中使用I2C的线路库。

#include

电线库为您提供了用于开发I2C相关应用程序的10个功能。他们是:

  • Wire.begin()
  • wire.requestfrom()
  • Wire.BegintRansmission()
  • wire.endtransmission()
  • Wire.Write()
  • wire.available()
  • wire.read()
  • Wire.setClock()
  • wire.onreceive()
  • wire.onrequest()

让我们详细了解现在的一些重要的电线库功能。欧宝官网app苹果下载

电线库功能

Wire.begin()

使用此功能启动I2C通信。如果将7位设备地址作为参数传递给此功能,那么设备将加入I2C总线作为从其他设备连接它将加入Master。

  • Wire.Begin() - 大师
  • Wire.Begin(地址) - 奴隶

Wire.BegintRansmission(地址)

使用此函数将数据传输开始于具有指定地址的从设备。

Wire.Write()

使用上面的功能开始传输后,您现在可以使用Wire.write()函数开始发送实际数据。

当主使用Wire.RequestFrom()函数时,您还可以使用此功能将来自从机到Master的数据写入Master。

  • Wire.write(价值)- 发送单个字节值
  • Wire.write(String)- 以字符串的形式发送一系列字节
  • Wire.write(数据,长度)- 发送一系列指定长度的数据数组

wire.endtransmission()

要结束I2C数据传输,请使用Wire.endtransmission()函数。

wire.read()

使用此函数读取从主站到从站或从从站传输到主机的数据字节,当主站呼叫Wire.Requestfrom()函数时。

wire.requestfrom()

Master I2C设备使用此函数从从设备请求数据字节。使用wire.read()函数来检索数据。

  • friquestfrom(地址,数量)- 请求从从设备中指定的地址中提到的数量的数量字节的数据。

wire.onreceive()

这是用于定义从主机接收数据时调用的函数的处理函数。

wire.onrequest()

这是用于定义函数的处理程序函数,当主设备从从机请求数据时调用。

主码

使用上述功能,我为Master Arduino写了一个简单的代码来发送PWM值,并请求来自从机的数据字节。

从代码

在奴隶arduino代码中,我将从地址定义为0x14。它可以是少于128的任何值。关于Arduinoi2c线库I的重要点,它在没有读/写位置的情况下使用7位I2C地址。欧宝官网app苹果下载

因此,如果您有一个8位地址(包括R / W位),请右移1按1将地址移位,然后在线库中使用它。库将根据读取或写入操作自动调整地址。

此外,请确保从地址是唯一的,没有两个从站应该具有相同的地址。

返回代码,我声明了两个函数“DataReceive”和“DatareQuest”,在从站或从从站请求数据时要调用。DataReceive函数中的从站接收的数据包含主服务器发送的PWM值。

要通过DaterAquest函数传输的数据是从从站到MASTER的PWM值。

I2C-On-Arduino-4

结论

在本教程中展示了使用I2C通信的两个Arduino板之间的简单双向通信。您了解了ob直播appArduino 欧宝官网app苹果下载I2C外设,i2C通信的重要基础知识,电线库以及如何设置和使用Arduino I2C通信。

发表评论

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