两块UNO通过IIC进行板间通讯#

From: www.taichi-maker.com

主设备读取,从设备发送#

在这个示例中,将使用两块开发板通过I2C通讯协议在主设备读取/从设备发送的方式进行通信。

Arduino UNO主设备通过使用Wire库, 可以请求并读取从唯一寻址的从设备 Arduino UNO发送来的6字节数据。 收到该消息后,便可以在Arduino IDE 串口监视器窗中进行查看。

所需硬件#

  • 2块Arduino或Genuino开发板

  • 杜邦线

电路连接#

将主设备开发板的引脚4(或SDA数据引脚)和引脚5(或SCL时钟引脚)连接到从设备开发板的对应引脚上。图示电路图以两块UNO为例进行连接

为了保证串口通信的运行,必须通过USB将开发板连接到计算机上并保证各个开发板的供电。

Wire板间通讯电路图Arduino

程序#

主设备读取#

/**********************************************************************
程序名称/Program name     : Wire Master Reader
团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author               : Dapenson
日期/Date(YYYYMMDD)     : 2020/06/30
程序目的/Purpose          : 
演示了Wire库的使用
从I2C / TWI从设备读取数据
-----------------------------------------------------------------------
修订历史/Revision History  
日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
-----------------------------------------------------------------------
其它说明:
本示例程序来源于以下链接, 由Dapenson整理注释, 
旨在使初学者更好的理解Wire库的学习和应用
https://www.arduino.cc/en/Reference/Wire
***********************************************************************/

// 引入Wire库文件
#include <Wire.h>

void setup()
{
    // Wire初始化, 加入i2c总线
    // 如果未指定,则以主机身份加入总线。
    Wire.begin();
    // 初始化串口并设置波特率为9600
    Serial.begin(9600);
}

void loop()
{
    // 向从设备#8请求6个字节
    Wire.requestFrom(8, 6);
    // 当从从设备接收到信息时值为true
    while (Wire.available())
    {
        // 接受并读取从设备发来的一个字节的数据
        char c = Wire.read();
        // 向串口打印该字节
        Serial.print(c);
    }
    // 延时500毫秒
    delay(500);
}

从设备发送#

/**********************************************************************
程序名称/Program name     : Wire Slave Sender
团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author               : Dapenson
日期/Date(YYYYMMDD)     : 2020/07/01
程序目的/Purpose          : 
演示了Wire库的使用
作为I2C / TWI从设备发送数据给主设备
-----------------------------------------------------------------------
修订历史/Revision History  
日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
-----------------------------------------------------------------------
其它说明:
本示例程序来源于以下链接, 由Dapenson整理注释, 
旨在使初学者更好的理解Wire库的学习和应用
https://www.arduino.cc/en/Reference/Wire
***********************************************************************/

// 引入Wire库文件
#include <Wire.h>

void setup()
{
    // Wire初始化, 并以从设备地址#8的身份加入i2c总线
    Wire.begin(8);
    // 注册请求响应事件
    Wire.onRequest(requestEvent);
}

void loop()
{
    delay(100);
}

// 每当接收到来自主机的数据时执行的事件函数
// 此函数被注册为事件,调用请见setup()
void requestEvent()
{
    // 用6个字节的消息进行响应
    Wire.write("hello ");
    // 以此回应主设备的请求
}

效果演示

Wire板间通讯 主设备读取,从设备发送 Arduino IIC协议 Wire 太极创客

通过主设备UNO硬件串口打开的串口监视器窗口视图

主设备写入, 从设备接受#

在这个示例中,将使用两个开发板通过I2C同步串行协议以主机写入从机接受的方式相互通信。

Arduino UNO(主设备)经过编程,每半秒向唯一寻址的从设备发送6个字节的数据。 从设备收到该消息后,可以在Arduino IDE 的串口监视器窗口中查看该数据。

所需硬件#

  • 2块Arduino或Genuino开发板

  • 杜邦线

电路连接#

将主设备开发板的引脚4(或SDA数据引脚)和引脚5(或SCL时钟引脚)连接到从设备开发板的对应引脚上。图示电路图以两块UNO为例进行连接

为了保证串口通信的运行,必须通过USB将开发板连接到计算机上并保证各个开发板的供电。

Wire板间通讯电路图Arduino IIC协议 Wire 太极创客

Wire板间通讯电路图Arduino

原理图#

Wire板间通讯电路原理图 Arduino IIC协议 Wire 太极创客

Code#

主设备写入#

/**********************************************************************
程序名称/Program name     : Wire Master Writer
团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author               : Dapenson
日期/Date(YYYYMMDD)     : 2020/07/01
程序目的/Purpose          : 
演示Wire库的使用
将数据写入到I2C / TWI从设备
-----------------------------------------------------------------------
修订历史/Revision History  
日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
-----------------------------------------------------------------------
其它说明:
本示例程序来源于以下链接, 由Dapenson整理注释, 
旨在使初学者更好的理解Wire库的学习和应用
https://www.arduino.cc/en/Reference/Wire
***********************************************************************/

// 引入Wire库文件
#include <Wire.h>

void setup()
{
    // Wire初始化, 加入i2c总线
    // 如果未指定,则以主机身份加入总线。
    Wire.begin();
}

// 定义一个byte变量以便串口调试
byte x = 0;

void loop()
{
    // 将数据传送到从设备#8
    Wire.beginTransmission(8);
    // 发送5个字节
    Wire.write("x is ");
    // 发送一个字节
    Wire.write(x);
    // 停止传送
    Wire.endTransmission();

    x++;
    delay(500);
}

从设备接受#

/**********************************************************************
程序名称/Program name     : Wire Slave Receiver
团队/Team                 : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author               : Dapenson
日期/Date(YYYYMMDD)     : 2020/07/01
程序目的/Purpose          : 
演示Wire库的使用
作为I2C / TWI从设备接收主设备写入的数据
-----------------------------------------------------------------------
修订历史/Revision History  
日期/Date    作者/Author      参考号/Ref    修订说明/Revision Description
-----------------------------------------------------------------------
其它说明:
本示例程序来源于以下链接, 由Dapenson整理注释, 
旨在使初学者更好的理解Wire库的学习和应用
https://www.arduino.cc/en/Reference/Wire
***********************************************************************/

// 引入Wire库文件
#include <Wire.h>

void setup()
{
    // Wire初始化, 并以从设备地址#8的身份加入i2c总线
    Wire.begin(8);
    // 注册接受事件函数
    Wire.onReceive(receiveEvent);
    // 初始化串口并设置波特率为9600
    Serial.begin(9600);
}

void loop()
{
    delay(100);
}

// 每当接收到来自主机的数据时执行的事件函数
// 此函数被注册为事件,调用请见setup()
void receiveEvent(int howMany)
{
    // 循环读取数据(除了最后一个字符)
    while (1 < Wire.available())
    {
        // 接收字节数据并赋值给变量c(char)
        char c = Wire.read();
        // 打印该字节
        //太极创客团队 / Taichi-Maker (www.taichi-maker.com)
        Serial.print(c);
    }
    // 以int整数的形式接受字节数据并赋值给x(int)
    int x = Wire.read();
    // 打印该int变量x
    Serial.println(x);
}

效果演示#

Wire板间通讯 主设备写入,从设备接收Arduino IIC协议 Wire 太极创客