1. 程式人生 > >樹莓派(pi3)和Arduino之間用I2C匯流排通訊

樹莓派(pi3)和Arduino之間用I2C匯流排通訊

關於樹莓派與Arduino之間的通訊,有三種方式:
1. USB串列埠通訊
2. 通過GPIO的TCD,RXD介面進行通訊
3. 用I2C匯流排
第一種方式最簡單,網上的資料也很多,在這裡不再贅述。第二種方式要將樹莓派的TXD,RXD與Arduino的TXD,RXD相連線,再進行通訊,也很簡單。下面著重介紹第三種方式。
要想使樹莓派可以與其他的i2c裝置進行通訊,先在樹莓派上進行如下操作:

  1. 在樹莓派命令列下輸入 nano /etc/modules,在其中加上i2c-dev
    這裡寫圖片描述
  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
這裡寫圖片描述

可以看到從裝置的地址0x04
下面進行測試,將Arduino程式寫入,接線連線好。在樹莓派執行程式,開啟Arduino工具的串列埠監視器。
這裡寫圖片描述