如果你一直在做
连接一个
覆盆子π 通过I2C连接Arduino真的很酷
设置的原因有很多
它还允许我在Arduino上写自主代码
连接一个
覆盆子π 连接到Arduino进行I2C通信
让我们从布线的过程开始
覆盆子π 到Arduino I2C通讯:单Arduino
-
覆盆子π SDA- > ArduinoSDA -
覆盆子π 症状自评量表- > Arduino症状自评量表 -
覆盆子π 接地- > Arduino接地
覆盆子π 到Arduino I2C通讯:多个Arduino
将多个arduino连接到一个
-
覆盆子π 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代码
在你的
# <关键词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 fromRaspberry 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 = ""; }
我在不同的论坛上看到很多关于RPI和Arduino之间逻辑级别转换的评论,因为它们的VCC是不同的。你看起来一点也不担心。有什么原因吗?
这取决于你在做什么。有时需要,有时不需要。
嗨,迈克,
非常感谢这篇有趣的文章。
我认为html代码有一个小问题。我想这一行
#包括“一些html代码”
应该说:
# include
顺致敬意,
安德烈亚斯