树莓派(pi3)和Arduino之间用I2C总线通信

关于树莓派与Arduino之间的通信,有三种方式:
1. USB串口通信
2. 通过GPIO的TCD,RXD接口进行通信
3. 用I2C总线
第一种方式最简单,网上的资料也很多,在这里不再赘述。第二种方式要将树莓派的TXD,RXD与Arduino的TXD,RXD相连接,再进行通信,也很简单。下面着重介绍第三种方式。
要想使树莓派可以与其他的i2c设备进行通信,先在树莓派上进行如下操作:

  1. 在树莓派命令行下输入 nano /etc/modules,在其中加上i2c-dev
    树莓派(pi3)和Arduino之间用I2C总线通信_第1张图片
  2. 安装I2C工具 sudo apt-get install i2c-tools
  3. 使pi用户获得i2c设备的访问权。sudo adduser pi i2c
  4. 重启树莓派 sudo reboot
    然后查看I2C设备 ls /dev/i2c* -l

    这里写图片描述
    OK
    下面将Arduino配置成通信的从设备,地址是0x04
    代码如下,通过IDE写到Arduino板子中。

 #include <Wire.h>
#define SLAVE_ADDRESS 0x04
int data;
//int state = 0;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600); // start serial for output
// initialize i2c as slave
Wire.begin(SLAVE_ADDRESS);
// define callbacks for i2c communication
Wire.onReceive(receiveData);//从机 接收 主机 发来的数据
Wire.onRequest(sendData); //从机 请求 主机 发送数据
Serial.println("Ready");
}
void loop() {
 delay(100);
 }
// callback for received data
void receiveData(int byteCount){
while(Wire.available()) {
data = Wire.read();
Serial.print("data received: ");
Serial.println(data);
}
}
// callback for sending data
 void sendData(){
 Wire.write(data);
 }

再配置树莓派,先安装Python-SMBus
sudo apt-get install python-smbus
树莓派这边用python写的代码,如下:

import smbus
import time
bus = smbus.SMBus(1)
address = 0x04
def writeNumber(value):
 bus.write_byte(address, value)
 return -1
def readNumber():
 number = bus.read_byte(address)
 return number
while True:
  var=input("Enter1–9:")
  if not var:
     continue
  writeNumber(var)
  print "RPI: Hi Arduino, I sent you ", var
  # sleep one second
  time.sleep(1)
  number = readNumber()
  print "Arduino: Hey RPI,I received a digit", number
  print "======================================\n"

设置完毕,下面就是接线了,不同的Arduin版本I2C总线位置不同,如下所示:
Board : I2C / TWI pins
Uno, Ethernet: A4 (SDA), A5 (SCL)
Mega2560 : 20 (SDA), 21 (SCL)
Leonardo : 2 (SDA), 3 (SCL)
我用的是Mega2560,所以连线如下:
树莓派<—————>Arduino
GPIO 0 (SDA) <–> 20 (SDA)
GPIO 1 (SCL) <–> 21 (SCL)
Ground <–> Ground
3.3v引脚<———->3.3v引脚

然后输入以下命令确认I2C设备是工作的。
i2cdetect -y 1
树莓派(pi3)和Arduino之间用I2C总线通信_第2张图片

可以看到从设备的地址0x04
下面进行测试,将Arduino程序写入,接线连接好。在树莓派运行程序,打开Arduino工具的串口监视器。
树莓派(pi3)和Arduino之间用I2C总线通信_第3张图片

你可能感兴趣的:(树莓派)