ADS

2013年4月28日 星期日

[Raspberry Pi] I2C with C connect Arduino DUE

本篇將介紹PI(Maste)如何使用I2C與Arduino DUE(Slave)做資料的傳輸,在Pi的函式庫是使用WiringPi,Arduino上使用wire,關於PI上的I2C安裝設定請參考上篇 [Raspberry Pi]Read MPU6050陀螺儀資料use WiringPi libraries

上圖跟上篇一樣SCL 跟SDA都接到Raspberry的SCL跟SDA但有一點要特別注意的是他們的GND必須相接不然I2C是抓不到的。

下載wire libraries並且把libraries放至Arduino libraries底下之後就可以打開example

在這介紹一下receive code
  Wire.begin(0x4);                // 這裡輸入的引數將會成為你從Raspberry上看到的位址
  Wire.onReceive(receiveEvent); //當你收到值時會值時下面的函式


send的code要稍微改一下

  Wire.begin(0x4);             //引數改成0x4或是你想設定的位置
  Wire.write(cont++); //我把引數改成value而不是字串因為我在Raspberry收的是數值

以上是兩支不同的Arduino code欲要整合請自行整合。



接下來介紹Raspberry上的程式,Arduino兩支程式都用這個就可以了。

#include<wiringPiI2C.h>
#include<stdio.h>

int main(){
int fd;
fd = wiringPiI2CSetup(0x4); //在Arduino上設定的地址是0x4
int cont=0;

while(1){
wiringPiI2CWrite(fd,cont++);//送值給Arduino
delay(1000);
printf("readValue:%d\n",wiringPiI2CRead(fd));//接收值從Arduino
delay(1000);
}
return 0;
}
編譯時請輸入gcc 檔名.c -lwiringPi
執行程式請輸入 ./a.out
上圖是Arduino送值給Raspberry
上圖是Raspberry送值給Arduino

PS:因為Arduino DUE是3.3V的IO,如果你板子不是DUE的話有可能不能Work(我沒做過實驗我不確定),如果不行Work的話你可以參考這個網站有教學。



參考網站:
https://projects.drogon.net/raspberry-pi/wiringpi/i2c-library/
http://neophob.com/2013/04/i2c-communication-between-a-rpi-and-a-arduino/
http://arduino.cc/en/Reference/Wire Arduino Wire
http://binerry.de/post/27128825416/raspberry-pi-with-i2c-arduino-slave arduino slave

沒有留言:

張貼留言