在物聯網應用中,結合 Raspberry Pi 的運算能力和 Arduino 的硬體控制能力,能實作更豐富的功能。本文將詳細說明如何透過串列通訊建立兩者之間的橋樑,並以控制 LED 和伺服馬達為例,示範實際的程式碼撰寫和操作步驟。讀者將學習如何在 Raspberry Pi 上設定串列通訊,使用 Python 程式碼傳送指令,以及在 Arduino 端接收指令並執行相應的硬體控制動作。

Arduino 與 Raspberry Pi 之間的互動與程式撰寫

Arduino 與 Raspberry Pi 是兩種廣受歡迎的開發板,分別擁有各自的特點與應用場景。Arduino 以其簡單易用的硬體介面和豐富的模組函式庫聞名,適合用於各種嵌入式控制和自動化應用。而 Raspberry Pi 則以其強大的處理能力和多功能性,適合用於更複雜的計算任務和網路應用。這篇文章將探討如何在 Arduino 和 Raspberry Pi 之間進行互動,並提供具體的程式碼範例及詳細解說。

安裝 Arduino IDE 於 Raspberry Pi

首先,我們需要在 Raspberry Pi 上安裝 Arduino IDE。這個過程相對簡單,只需在終端機中輸入以下指令即可:

sudo apt-get install arduino

完成安裝後,我們還需要安裝 pyserial 函式庫,這個函式庫可以方便地透過序列埠與 Arduino 進行通訊。以下是安裝 pyserial 的步驟:

  1. 開啟瀏覽器,前往 pyserial 官方網站 下載 pyserial
  2. 下載完成後,解壓縮並進入解壓縮後的資料夾。
  3. 在終端機中輸入以下指令進行安裝:
gunzip pyserial-2.7.tar.gz
tar -xvf pyserial-2.7.tar
cd pyserial-2.7
sudo python setup.py install

撰寫與測試 Arduino 程式碼

接下來,我們將撰寫一段簡單的 Arduino 程式碼來測試與 Raspberry Pi 的通訊。開啟 Arduino IDE,並在編輯視窗中輸入以下程式碼:

int ledPin = 13;

void setup() {
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
}

void loop() {
    Serial.println("Hello, Raspberry Pi!");
    delay(1000);
}

內容解密:

  • 變數宣告int ledPin = 13; 宣告一個整數變數 ledPin,並將其值設為 13。這表示我們將使用 Arduino 的第 13 號腳位來控制 LED。
  • setup 函式setup() 函式在程式啟動時執行一次。它設定第 13 號腳位為輸出模式(pinMode(ledPin, OUTPUT)),並初始化序列埠通訊(Serial.begin(9600))。
  • loop 函式loop() 函式是 Arduino 主要的執行迴圈,會不斷重複執行。它每秒向序列埠傳送一次訊息 “Hello, Raspberry Pi!"(Serial.println("Hello, Raspberry Pi!");),並延遲一秒(delay(1000);)。

與 Raspberry Pi 的連線與測試

將 Arduino 與 Raspberry Pi 用 USB 線連線,並在 Arduino IDE 中選擇正確的板子和連線埠。接下來,我們可以嘗試上傳 Blink 樣本程式來測試連線是否正常:

  1. 在 Arduino IDE 中選擇 File > Examples > 01.Basics > Blink
  2. 上傳程式碼到 Arduino。
  3. 若連線正常,Arduino 的內建 LED 應該會一閃一閃。

Python 與 Arduino 的互動

確認連線正常後,我們可以使用 Python 做為橋樑來與 Arduino 談話。以下是 Python 檔案範例:

import serial

ser = serial.Serial('/dev/ttyUSB0', 9600)

while True:
    print(ser.readline().decode('utf-8'))

內容解密:

  • 匯入序列埠函式庫import serial 用來匯入 pyserial 函式庫。
  • 初始化序列埠ser = serial.Serial('/dev/ttyUSB0', 9600) 初始化序列埠連線,設定連線埠為 /dev/ttyUSB0,波特率為 9600。
  • 讀取序列埠資料:使用無限迴圈不斷從序列埠讀取資料並輸出到終端機上。

改程式式碼以回應序列埠指令

為了讓這個系統更具互動性,我們可以改進 Arduino 的程式碼來回應來自 Raspberry Pi 的指令。修改 loop() 函式如下:

void loop() {
    if (Serial.available()) {
        int value = Serial.read() - '0';
        flash(value);
    }
}

內容解密:

  • 檢查序列埠資料if (Serial.available()) {} 檢查是否有來自序列埠的資料。
  • 讀取並轉換資料int value = Serial.read() - '0'; 読取資料並轉換成整數。
  • 呼叫 flash 函式:根據讀取到的值呼叫 flash() 函式。

未來趨勢與應用評估

隨著物聯網(IoT)技術的快速發展,Arduino 與 Raspberry Pi 的結合將會在未來擁有更多可能性。這些開發板可以用來構建智慧家庭、工業自動化、醫療裝置等各種應用。未來我們可以預見更多先進的感測器和模組將會推出市面上,讓我們能夠實作更複雜和智慧化的功能。

特殊處理:視覺化圖表使用規範

為了更好地理解流程,我們可以使用 Plantuml 語法來繪製流程圖示。

此圖示展示了 Arduino 和 Raspberry Pi 之間的互動流程:

內容解密:

  • Raspberry Pi 和 Python Script:Raspberry Pi 執行 Python 檔案進行序列埠通訊。
  • Serial Communication:Python 檔案透過序列埠與 Arduino 談話。
  • Arduino 和 LED Control:Arduino 接收指令並控制 LED。
  • Feedback to Raspberry Pi:Arduino 回傳狀態給 Raspberry Pi。

這篇文章展示瞭如何在 Arduino 和 Raspberry Pi 之間進行互動及進行基本的控制操作。希望這些內容能夠幫助你更好地理解和應用這兩種開發板的結合,進一步擴充套件你的技術技能和實務經驗。

使用樹莓派與Arduino進行互動

樹莓派與Arduino是兩款非常流行的開發板,各自有其獨特的優勢。樹莓派擁有強大的處理能力和豐富的外接選擇,而Arduino則以簡單易用和低成本著稱。將這兩者結合起來,可以實作更多有趣且實用的專案。以下是一些基本的互動範例,展示如何利用這兩款開發板進行通訊。

控制Arduino上的LED

首先,讓我們從一個簡單的範例開始,使用樹莓派控制Arduino上的LED。這個範例將展示如何透過序列通訊來控制Arduino。

準備工作

  1. 連線樹莓派與Arduino:
    • 使用USB線將Arduino連線到樹莓派。
    • 安裝Python的pyserial函式庫來進行序列通訊。
pip install pyserial
  1. 編寫Arduino程式碼:
int ledPin = 13; // LED連線到Arduino的引腳13

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    int value = Serial.read() - '0'; // 讀取第一個接收到的整數
    flash(value);
  }
}

void flash(int n) {
  for (int i = 0; i < n; i++) {
    digitalWrite(ledPin, HIGH);
    delay(100);
    digitalWrite(ledPin, LOW);
    delay(100);
  }
}

內容解密:

  • int ledPin = 13;:定義LED連線到Arduino的引腳13。
  • void setup():初始化函式,設定LED引腳為輸出模式,並啟動序列通訊。
  • void loop():主迴圈函式,檢查是否有序列資料可供讀取。如果有,則讀取第一個整數並傳遞給flash()函式。
  • void flash(int n):根據接收到的整數n閃爍LED n 次。
  1. 編寫Python程式碼:
import serial

ser = serial.Serial('/dev/ttyUSB0', 9600) # 請根據實際情況調整序列埠名稱
ser.write(b'4') # 傳送一個整數4給Arduino
ser.close()

內容解密:

  • import serial:匯入pyserial函式庫。
  • ser = serial.Serial('/dev/ttyUSB0', 9600):建立序列連線物件,指定序列埠名稱和波特率。
  • ser.write(b'4'):傳送一個整數4給Arduino。
  • ser.close():關閉序列連線。

控制伺服馬達

接下來,我們來看看如何使用樹莓派控制Arduino上的伺服馬達。這個範例展示瞭如何透過序列通訊來控制伺服馬達的旋轉角度。

準備工作

  1. 編寫Arduino程式碼:
#include <Servo.h>

Servo myservo;
int servoPin = 9;

void setup() {
  myservo.attach(servoPin);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    int value = Serial.read() - '0';
    drive(value);
  }
  delay(1000);
}

void drive(int n) {
  if (n < 5) {
    myservo.write(50); // 轉到50度
  } else {
    myservo.write(250); // 轉到250度
  }
}

內容解密:

  • #include <Servo.h>:包含伺服馬達函式庫。
  • Servo myservo;:建立一個伺服馬達物件。
  • int servoPin = 9;:定義伺服馬達連線到Arduino的引腳9。
  • void setup():初始化函式,將伺服馬達附加到指定引腳,並啟動序列通訊。
  • void loop():主迴圈函式,檢查是否有序列資料可供讀取。如果有,則讀取第一個整數並傳遞給drive()函式。
  • void drive(int n):根據接收到的整數n控制伺服馬達旋轉角度。
  1. 編寫Python程式碼:
import serial

ser = serial.Serial('/dev/ttyUSB0', 9600) # 請根據實際情況調整序列埠名稱
ser.write(b'5') # 傳送一個整數5給Arduino
ser.close()

內容解密:

  • import serial:匯入pyserial函式庫。
  • ser = serial.Serial('/dev/ttyUSB0', 9600):建立序列連線物件,指定序列埠名稱和波特率。
  • ser.write(b'5'):傳送一個整數5給Arduino。
  • ser.close():關閉序列連線。

與Gertboard的Atmega晶片互動

如果你有一塊Gertboard並想要與其上的Atmega晶片進行互動,這裡有一些基本步驟。請注意,這需要一些額外的軟體安裝和組態。

準備工作

  1. 安裝必要的軟體:

    • 安裝Gertboard軟體套件。
    • 組態Raspberry Pi和Arduino的組態檔案。
  2. 編寫Python程式碼:

# 假設你已經安裝了必要的軟體並進行了組態
# 在這裡編寫與Gertboard Atmega晶片互動的Python程式碼

由於組態相對複雜且需要具體步驟,建議參考Gordon Henderson提供的教程(http://bit.ly/1fgEFeo),這位開發者還負責了WiringPi函式庫。

架構圖示

以下為簡單地說明架構圖示:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 樹莓派與 Arduino 互動程式設計與應用

package "物聯網架構" {
    package "感知層" {
        component [感測器] as sensor
        component [執行器] as actuator
        component [嵌入式裝置] as device
    }

    package "網路層" {
        component [閘道器] as gateway
        component [MQTT Broker] as mqtt
        component [邊緣運算] as edge
    }

    package "平台層" {
        cloud "IoT Platform" as platform
        database [時序資料庫] as tsdb
        component [規則引擎] as rules
    }

    package "應用層" {
        component [監控儀表板] as dashboard
        component [告警系統] as alert
        component [數據分析] as analytics
    }
}

sensor --> device : 資料採集
device --> gateway : 資料傳輸
gateway --> mqtt : MQTT 協議
mqtt --> edge : 邊緣處理
edge --> platform : 雲端上傳
platform --> tsdb : 資料儲存
platform --> rules : 規則處理
rules --> alert : 觸發告警
tsdb --> analytics : 資料分析
analytics --> dashboard : 視覺化

@enduml

內容解密:

此圖示展示了樹莓派透過串列通訊與Arduino進行互動,進而控制LED或伺服馬達等外設。這種架構可以靈活地擴充套件來滿足更多複雜的需求。