設為首頁收藏本站

艾歐踢論壇

 找回密碼
 立即註冊

QQ登錄

只需一步,快速開始

搜索
熱搜: 活動 交友 discuz
查看: 922|回復: 0
打印 上一主題 下一主題

韌體 | I2C通訊:樹莓派與Arduino---使用Python

[複製鏈接]
跳轉到指定樓層
樓主
發表於 2020-1-18 19:56:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
樹莓派環境作業系統:Raspbian
硬體:樹莓派3B


Arduino環境硬體:Mega 2560開發板



步驟使用Python中的I2C模組操作樹莓派當作Master(主機)與Arduino作為Slave(從機)進行通訊。


1.前期作業樹莓派必須開啟I2C裝置,若不清楚如何開啟與設置,可以參考前文<>。


2.注意事項樹莓派(3.3v)與Arduino(5v)的電位水平(邏輯准位)不一樣,不過經參考資料得知,當樹莓派作為Master,Arduino作為Slave是能夠直接通訊的,
可以工作的原因為Arduino開發板沒有上拉電阻,而樹莓派上有1.8K歐姆的上拉電阻,恰好能夠進行通訊,若是要在I2C總線上加入新的裝置,記得要拔下上拉電阻。


3.硬體設置
樹莓派與Arduino進行I2C線路連接,請見下表。


樹莓派腳位
Arduino Mega2560
SDA
SDA
SCL
SCL
GND
GND


4.樹莓派端Python程式
1.Python相關程式設定並執行
2.測試Python程式

Python程式是由參考資料中的程式碼加以修改而來,原先的程式碼適用於Python2.7,黑修斯將之改為Python3,詳細程式碼如下:
  1. import smbus

  2. import time



  3. # 設定樹莓派I2C的總線

  4. bus = smbus.SMBus(1)



  5. # 設定Arduino 的I2C位置

  6. address = 0x04



  7. # 傳送訊息

  8. def writeNumber(value):

  9.     bus.write_byte(address, value)

  10.     return -1



  11. # 讀取訊息

  12. def readNumber():

  13.     number = bus.read_byte(address)

  14.     return number



  15. while True:

  16.     # 指定var接受使用者輸入的指令

  17.     var = int(input('Enter 1 – 9: '))

  18.    

  19.     #寫入使用的輸入的指令Var

  20.     writeNumber(var)

  21.     print ('RPI: Hi Arduino, I sent you ', var)

  22.    

  23.     # 等待1秒

  24.     time.sleep(1)

  25.    

  26.     #接收Arduino回傳的訊息

  27.     number = readNumber()

  28.     print ('Arduino: Hey RPI, I received a digit ', number)
複製代碼
5.Arduino端C/C++程式 1.C/C++相關程式設定並執行
2.測試C/C++程式

Arduino 的程式碼,同樣是由參考資料中的程式碼加以修改而來,主要的程式碼作用為接收I2C訊號與回傳接收過的訊號,程式碼如下:
  1. #include <Wire.h>



  2. #define SLAVE_ADDRESS 0x04    // 設定Arduino開發板I2C的位址

  3. int number = 0;

  4. int state = 0;



  5. void setup() {

  6. pinMode(13, OUTPUT);  // 設定pin13為輸出模式

  7. Serial.begin(9600);   // Serial通訊埠通訊設為9600速率

  8. Wire.begin(SLAVE_ADDRESS);  // 初始化Arduino的I2C位址



  9. Wire.onReceive(receiveData); //I2C訊號接收時,啟用函式

  10. Wire.onRequest(sendData);  //主機要求讀取時,啟用函式



  11. Serial.println("Ready!");

  12. }



  13. void loop() {

  14. delay(100);

  15. }



  16. // callback for received data

  17. void receiveData(int byteCount){

  18. while(Wire.available()) {  //當I2C的buffer中有資料時進入迴圈

  19.   number = Wire.read();   //指定nubmer 等於讀取的訊息

  20.   Serial.print("data received: ");

  21.   Serial.println(number);



  22.   if (number == 1){  

  23.     if (state == 0){

  24.       digitalWrite(13, HIGH); // 致使 LED on

  25.       state = 1;

  26.     }else{

  27.       digitalWrite(13, LOW); // 致使 LED off

  28.       state = 0;

  29.     }

  30.   }

  31.   }

  32. }



  33. // callback for sending data

  34. void sendData(){

  35. Wire.write(number);

  36. }
複製代碼
6.整合性測試 1.透過樹莓派Master(主機)經由I2C通訊發送指令給Arduino開發板slave(從機),並透過監測視窗觀看結果:
將樹莓派與Arduino開發板的程式都搞定後,便可以進行整合性測試,利用樹莓派的遠端桌面操作Python執行程式碼,而Arduino與電腦連接後開啟序列埠通訊視窗監測訊號,最終結果如下圖。

2.透過樹莓派Master(主機)發送指令控制Arduino開發板slave(從機)的LED開關:
這邊將樹莓派的5V電源供應給Arduinod開發板,直接透過樹莓派操作指令,輸入1可進行Arduinod開發板上的LED開關,如下圖。

當樹莓派輸入1,Arduino開發板的LED會亮起;再輸入一次1,Arduino開發板的LED會熄滅。





本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?立即註冊

x
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 轉播轉播 分享分享 分享淘帖
回復

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

小黑屋|Archiver|手機版|艾歐踢創新工坊    

GMT+8, 2024-4-29 17:20 , Processed in 0.277121 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表