关于树莓派与Arduino之间的通信,有三种方式:
1. USB串口通信
2. 通过GPIO的TCD,RXD接口进行通信
3. 用I2C总线
第一种方式最简单,网上的资料也很多,在这里不再赘述。第二种方式要将树莓派的TXD,RXD与Arduino的TXD,RXD相连接,再进行通信,也很简单。下面着重介绍第三种方式。
要想使树莓派可以与其他的i2c设备进行通信,先在树莓派上进行如下操作:
- 在树莓派命令行下输入 nano /etc/modules,在其中加上i2c-dev
- 安装I2C工具 sudo apt-get install i2c-tools
- 使pi用户获得i2c设备的访问权。sudo adduser pi i2c
重启树莓派 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
可以看到从设备的地址0x04
下面进行测试,将Arduino程序写入,接线连接好。在树莓派运行程序,打开Arduino工具的串口监视器。