如果你一直在做 覆盆子π或者Arduino项目中,你可能会遇到I2C这个术语,或者至少看到设备上的I2C引脚,想知道它们是干什么的。简单地说,I2C是用于板上和板外设备的点到多点串行通信总线。I2C仅通过两根导线就能以每秒400千比特的速度运行。它工作在一个主/从设计,通常有一个单一的主和多达1023个从设备。当然, 覆盆子π到Arduino的I2C通信是合乎逻辑的事情做这个技术!让你的 覆盆子π来控制无数arduino。我在我的R2-D2构建

连接一个 覆盆子π通过I2C连接Arduino真的很酷

设置的原因有很多 覆盆子π到Arduino I2C通信通道。例如, 覆盆子π有有限数量的PWM引脚(而且坦率地说,它们不是很干净相比Arduino的PWM引脚)。连接一个或多个Arduino到你的电脑 覆盆子π提供了看似无限数量的GPIO连接,以控制设备和系统的世界。在我的R2-D2架构中,我将其整合到机器人身上,以运行所有的伺服器、led、继电器等。

它还允许我在Arduino上写自主代码 覆盆子π可以简单地发送一个命令来启用或禁用。例如,我可以通过I2C总线发送一个命令,告诉圆顶Arduino进入自动模式。这意味着Arduino将随机移动圆顶,打开面板,闪烁灯等。它可能会对运动传感器做出反应,如果一个孩子走向R2,他会自动看着孩子并吹口哨!这种活动将继续运行,甚至在 覆盆子π被关掉了。I2C总线上的另一个简单命令当然会将droid返回到完全手动模式。这是I2C的完美用例。

连接一个 覆盆子π连接到Arduino进行I2C通信

让我们从布线的过程开始 覆盆子πArduino。我将展示两个例子。一个直接的I2C连接,一个与三个arduino共享的总线。注意,当将RPi连接到Arduino时,RPi是master,你需要上拉电阻。这是一个常见的误解,许多在线教程都是错误的。的 覆盆子π3在I2C引脚上内置上拉电阻。如果你在过去尝试过这个项目,但没有成功,这可能是你沮丧的根源。重要的是,所有的董事会都有一个共同点。如果您不确定是这种情况,请从RPi接地(GND)连接一个电路板线到Arduino接地(GND)。

覆盆子π到Arduino I2C通讯:单Arduino

  • 覆盆子πSDA- > ArduinoSDA
  • 覆盆子π症状自评量表- > Arduino症状自评量表
  • 覆盆子π接地- > Arduino接地

覆盆子π到Arduino I2C通讯:多个Arduino

将多个arduino连接到一个 覆盆子π对于I2C,您需要一个试验板(或定制板)将所有SDA、SCL和GND引脚连接在一起。

  • 覆盆子πSDA- >共享SDA在电路试验板
  • 覆盆子π症状自评量表- >共享症状自评量表在电路试验板
  • 覆盆子π接地- >共享接地在电路试验板
  • 所有ArduinoSDA- >共享SDA在电路试验板
  • 所有Arduino症状自评量表- >共享症状自评量表在电路试验板
  • 所有Arduino接地- >共享接地在电路试验板

在本教程中,我不打算介绍I2C的电工作原理。网上有很多关于这个话题的资源。然而,我确实想为您定义一些术语,以帮助您更好地理解这些大头针在做什么,以及它们为什么以这种方式连接。

  • 接地是接地针脚。重要的是,所有设备共享一个I2C正常工作的公共接地。
  • 症状自评量表是串行时钟引脚。主控机在这一行上创建一个定时脉冲,使所有设备保持同步。
  • SDA是串行数据引脚。这是在总线上读取和写入数据的引脚。
  • I2C的主人是拥有SCL线路的设备,它启动和停止总线上的所有通信。
  • I2C奴隶总线上的一个设备,用于侦听和响应来自主机的通信。这些设备有单独的地址,这些地址是通过硬件或软件静态分配的。

覆盆子π到Arduino I2C通讯:连接设备

从这里你可以将设备连接到Arduinos。这可以是继电器,伺服器,led,运动传感器,或者你能想到的任何其他设备。在Arduino方面,它们的控制与没有I2C的情况完全相同。对于我们的小演示,我们将只是控制内部板上LED引脚13。但请随时更改密码,并连接自己的LED或其他设备。(如果你是Arduinos的新手,有一个表面安装的LED连接到板上的引脚13。)

覆盆子πI2C的Python代码

在你的 覆盆子π,使用下面的代码集初始化I2C通信作为从机。我们要求输入设备号,然后在…上.根据你的输入 覆盆子π会告诉特定的Arduino打开或关闭其引脚13上的LED。

# <关键词data-keyword-id = " 246 " >覆盆子π> < /关键字Arduino I2C通信# Python代码导入smbus #奴隶地址Arduino ARDUINO_1_ADDRESS = 0 x04 # Arduino的I2C地址1 ARDUINO_2_ADDRESS = 0 x05 # Arduino的I2C地址2 ARDUINO_3_ADDRESS = 0 x06 # Arduino的I2C地址3 #创建I2C总线I2Cbus = smbus.SMBus (1)aSelect =输入(“这Arduino(1 - 3):”)bSelect =输入(“打开或关闭(开/关):”)如果aSelect = = 1: SlaveAddress = ARDUINO_1_ADDRESS elif aSelect = = 2: SlaveAddress = ARDUINO_2_ADDRESS elif aSelect = = 3: SlaveAddress =其他ARDUINO_3_ADDRESS: #如果你搞砸了辞职辞职()#也退出如果你搞砸了,如果bSelect ! =””或bSelect ! =“关闭”:I2Cbus. quit() by睾丸发送= ConvertStringsToBytes(bSelect) I2Cbus. quit() by睾丸发送= ConvertStringsToBytes(bSelect) I2Cbus. quit()write_i2c_block_data(SlaveAddress, 0x00, bytestsend) print("Sent " + SlaveAddress + " the " + bSelect + " command.") #该函数将一个字符串转换为一个字节数组。在src: convert .append(ord(b))返回convert </pre>

I2C的Arduino代码

在每个Arduino上使用下面的代码。确保更改每个设备的从地址,使它们是唯一的。如果两个设备共享相同的地址,事情将无法工作。

//Arduino code to receive I2C communication from Raspberry Pi #include &//定义该设备的从地址。#define SLAVE_ADDRESS 0x04 // #define SLAVE_ADDRESS 0x05 // #define SLAVE_ADDRESS 0x06 // string存储RPi发送的内容string str_recieved_from_RPi = "";void setup(){//设置LED pinMode(LED_BUILTIN, OUTPUT);//在指定的地址上开始作为I2C从服务器运行//创建事件接收数据Wire.onReceive(receiveData);} void loop(){//这里不需要任何东西,因为我们正在做基于事件的代码}} //打开或关闭LED if (str_recieved_from_RPi == "on") {digitalWrite(LED_BUILTIN, HIGH);} if (str_recieved_from_RPi == "off") {digitalWrite(LED_BUILTIN, LOW);} str_recieved_from_RPi = ""; }

产品从Amazon.com