在物聯網應用中,結合 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 的步驟:
- 開啟瀏覽器,前往 pyserial 官方網站 下載
pyserial。 - 下載完成後,解壓縮並進入解壓縮後的資料夾。
- 在終端機中輸入以下指令進行安裝:
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 樣本程式來測試連線是否正常:
- 在 Arduino IDE 中選擇
File > Examples > 01.Basics > Blink。 - 上傳程式碼到 Arduino。
- 若連線正常,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。
準備工作
- 連線樹莓派與Arduino:
- 使用USB線將Arduino連線到樹莓派。
- 安裝Python的pyserial函式庫來進行序列通訊。
pip install pyserial
- 編寫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閃爍LEDn次。
- 編寫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上的伺服馬達。這個範例展示瞭如何透過序列通訊來控制伺服馬達的旋轉角度。
準備工作
- 編寫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控制伺服馬達旋轉角度。
- 編寫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晶片進行互動,這裡有一些基本步驟。請注意,這需要一些額外的軟體安裝和組態。
準備工作
安裝必要的軟體:
- 安裝Gertboard軟體套件。
- 組態Raspberry Pi和Arduino的組態檔案。
編寫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或伺服馬達等外設。這種架構可以靈活地擴充套件來滿足更多複雜的需求。