Raspberry Pi 作為一個功能強大的開發平臺,常被應用於控制各種硬體周邊。本文將介紹如何整合 OLED 顯示器、相機模組以及 DC 馬達、步進馬達和伺服馬達等裝置。透過 I2C 或 CSI 等介面,搭配 Python 程式語言及相關函式庫,即可實作硬體控制與資料擷取。文章提供詳細的程式碼範例、電路圖和流程圖,讓讀者能快速上手,並根據自身需求調整程式邏輯,打造客製化的硬體控制應用。
硬體連線
首先,我們需要將 OLED 顯示器連線到 Raspberry Pi。OLED 顯示器通常透過 I2C 通訊協議與 Raspberry Pi 通訊,因此我們需要使用 Raspberry Pi 的 I2C 引腳。具體連線步驟如下:
- 將 OLED 顯示器的 VCC 引腳連線到 Raspberry Pi 的 3.3V 引腳(引腳 1)。
- 將 OLED 顯示器的 SDA 引腳連線到 Raspberry Pi 的 SDA 引腳(引腳 3)。
- 將 OLED 顯示器的 SCL 引腳連線到 Raspberry Pi 的 SCL 引腳(引腳 5)。
- 將 OLED 顯示器的 GND 引腳連線到 Raspberry Pi 的 GND 引腳(引腳 9)。
啟用 I2C
在連線 OLED 顯示器之前,我們需要啟用 Raspberry Pi 的 I2C 功能。有兩種方法可以啟用 I2C:
方法 1:透過 Raspberry Pi 配置工具
- 點選 Raspberry Pi 的圖示(左上角),然後點選「偏好設定」。
- 在「偏好設定」視窗中,點選「Raspberry Pi 配置」。
- 在「Raspberry Pi 配置」視窗中,點選「介面」標籤。
- 在「介面」標籤中,勾選「I2C」選項。
方法 2:透過命令提示符
- 開啟命令提示符。
- 輸入以下命令:
sudo raspi-config
- 使用箭頭鍵滾動到「介面選項」。
- 按下 Enter 鍵。
- 選擇「I2C」選項。
- 按下 Enter 鍵。
安裝 Adafruit_Python_SSD1306 庫
在啟用 I2C 之後,我們需要安裝 Adafruit_Python_SSD1306 庫,以便使用 OLED 顯示器。具體步驟如下:
- 更新和升級 Raspberry Pi:
sudo apt update
和sudo apt upgrade
- 安裝 Adafruit_Python_SSD1306 庫:在 Thonny IDE 中,選擇「工具」>「管理外掛」>「Adafruit_Python_SSD1306」,然後點選「搜尋 PyPi」。
驗證 I2C 地址
在安裝 Adafruit_Python_SSD1306 庫之後,我們需要驗證 OLED 顯示器的 I2C 地址。具體步驟如下:
- 開啟命令提示符。
- 輸入以下命令:
i2cdetect -y 1
這將顯示 OLED 顯示器的 I2C 地址。
OLED 顯示器安裝與測試
安裝 OLED 顯示器庫
為了在 Raspberry Pi 上使用 OLED 顯示器,首先需要安裝適當的庫。這可以透過在終端機中執行安裝命令來完成。安裝過程中,系統會下載並安裝必要的庫檔,包括 OLED 顯示器的驅動程式。
執行範例程式
安裝完成後,下一步是執行一個範例程式來測試 OLED 顯示器。這個範例程式可以從 OLED 顯示器的範例檔案中找到,例如 shapes.py
。這個程式示範瞭如何在 OLED 顯示器上顯示文字、矩形等圖形。
執行步驟
- 開啟範例程式:找到
shapes.py
範例程式並將其複製到 Thonny IDE 中。 - 執行程式:在 Thonny IDE 中執行
shapes.py
程式。
程式碼解析
以下是用於在 OLED 顯示器上顯示圖形的程式碼片段:
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
# Raspberry Pi 的 pin 配置
RST = 24
DC = 23
SPI_PORT = 0
SPI_DEVICE = 0
# 初始化 OLED 顯示器
disp1 = Adafruit_SSD1306.SSD1306_128_32(rst=RST)
disp1.begin()
# 清除顯示器
disp1.clear()
disp1.display()
# 載入必要的庫
import time
import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306
程式碼解說
- 匯入庫:程式開始時匯入必要的庫,包括
PIL
用於影像處理和Adafruit_SSD1306
用於控制 OLED 顯示器。 - 設定 Raspberry Pi 的 pin:定義 Raspberry Pi 上的 pin 配置,包括重置(RST)、資料命令(DC)等。
- 初始化 OLED 顯示器:使用
Adafruit_SSD1306
庫初始化 OLED 顯示器,設定其尺寸和重置 pin。 - 清除顯示器:清除 OLED 顯示器上的內容,並更新顯示器使變化生效。
顯示圖形流程
顯示圖形的流程包括初始化 OLED 顯示器、清除顯示器、繪製圖形和更新顯示器。以下是流程圖:
flowchart TD A[初始化 OLED 顯示器] --> B[清除顯示器] B --> C[繪製圖形] C --> D[更新顯示器]
流程解說
- 初始化 OLED 顯示器:設定 OLED 顯示器的引數,包括尺寸和 pin 配置。
- 清除顯示器:清除 OLED 顯示器上的所有內容。
- 繪製圖形:使用
PIL
庫繪製圖形,包括文字、矩形等。 - 更新顯示器:更新 OLED 顯示器,使繪製的圖形顯示出來。
OLED 顯示器介面
OLED(有機發光二極體)顯示器是一種薄、輕、低耗能的顯示技術,廣泛應用於各種電子裝置中。為了在 Raspberry Pi 上使用 OLED 顯示器,我們需要安裝適當的庫,並瞭解如何使用 Python 進行程式設計。
安裝 Adafruit_Python_SSD1306 庫
首先,我們需要安裝 Adafruit_Python_SSD1306 庫,這是一個為 SSD1306 晶片驅動的 OLED 顯示器提供的 Python 庫。這個庫允許我們控制 OLED 顯示器,顯示文字、矩形等圖形。
安裝步驟
- 開啟終端機,輸入以下命令安裝必要的庫:
sudo apt-get update
sudo apt-get install python3-pip
sudo pip3 install pillow
sudo pip3 install adafruit-ssd1306
- 安裝完成後,確認您的 OLED 顯示器是否正確連線到 Raspberry Pi。
OLED 顯示器程式設計
現在,我們可以開始使用 Python 進行 OLED 顯示器的程式設計。以下是一個簡單的範例,展示如何在 OLED 顯示器上顯示文字和圖形。
範例程式碼
from PIL import Image, ImageDraw
import adafruit_ssd1306
# 初始化 OLED 顯示器
disp1 = adafruit_ssd1306.SSD1306()
# 建立一個空白影像
width = disp1.width
height = disp1.height
image = Image.new('1', (width, height))
# 建立一個繪圖物件
draw = ImageDraw.Draw(image)
# 清除影像
draw.rectangle((0,0,width,height), outline=0, fill=0)
# 繪製一些圖形
padding = 2
shape_width = 20
top = padding
bottom = height-padding
# 左到右移動,繪製圖形
x = padding
while x < width:
draw.rectangle((x, top, x+shape_width, bottom), outline=1, fill=0)
x += shape_width + padding
# 顯示影像
disp1.image(image)
disp1.show()
程式碼解說
- 我們首先匯入必要的庫,包括
PIL
用於影像處理和adafruit_ssd1306
用於 OLED 顯示器控制。 - 我們初始化 OLED 顯示器,建立一個空白影像,並設定繪圖物件。
- 我們清除影像,然後繪製一些圖形,包括矩形和文字。
- 最後,我們顯示影像在 OLED 顯示器上。
Raspberry Pi 相機介面
Raspberry Pi 可以透過相機介面(Camera Serial Interface,CSI)連線相機模組,以拍照、錄製影片和應用影像效果。所有當前的 Raspberry Pi 模型都具有 CSI 埠,用於連線相機模組。
相機模組版本
有兩種版本的相機模組:
- 標準版本:設計用於正常光線下的拍照。
- NoIR 版本:具有紅外濾鏡,因此可以使用紅外光源在黑暗中拍照。
安裝 Picamera 庫
要安裝 Picamera 庫,請按照以下步驟進行:
- 更新套件列表:
sudo apt-get update
- 安裝 Picamera 庫:
sudo apt-get install python-picamera
(適用於 Python 2)或sudo apt-get install python3-picamera
(適用於 Python 3)
或者,您也可以使用 Python 的 pip 工具安裝 Picamera 庫:
- 安裝 Picamera 庫:
pip install picamera
使用相機模組
要使用相機模組,請先匯入 Picamera 庫,然後建立一個相機物件。您可以使用 capture()
方法拍照,或者使用 start_recording()
和 stop_recording()
方法錄製影片。
import picamera
# 建立相機物件
camera = picamera.PiCamera()
# 拍照
camera.capture('image.jpg')
# 錄製影片
camera.start_recording('video.h264')
camera.stop_recording()
影像處理
您可以使用 OpenCV 庫進行影像處理。首先,請安裝 OpenCV 庫:sudo apt-get install libopencv-dev
然後,匯入 OpenCV 庫,並使用 imread()
方法讀取影像,然後使用 imshow()
方法顯示影像。
import cv2
# 讀取影像
image = cv2.imread('image.jpg')
# 顯示影像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用 Raspberry Pi 和 Picamera 進行攝影
安裝 Picamera
要使用 Picamera,首先需要安裝 picamera
套件。可以使用以下命令進行安裝:
sudo pip install picamera
接下來,需要安裝 picamera
的 array 模組:
sudo pip install "picamera[array]"
最後,升級 picamera
到最新版本:
sudo pip install -U picamera
連線 Camera Module
連線 Camera Module 到 Raspberry Pi 的步驟如下:
- 開啟 Camera Port:確保 Raspberry Pi 已經關機,然後找到 Camera Module 的埠。對於 Raspberry Pi 3 B+、2 和 3,Camera 埠位於 LAN 埠和 HDMI 埠之間。
- 插入 Camera Cable:將 Camera Cable 以正確的方向插入,藍色面向 Ethernet 埠,銀色面向 HDMI 埠。輕輕拉開 CSI 埠的夾子,然後插入 Camera Module 的 ribbon Cable。
- 關閉 Camera Port:將塑膠夾子的頂部推回原位。
啟用 Camera 介面
啟用 Camera 介面的步驟如下:
- 啟動 Raspberry Pi:開啟 Raspberry Pi。
- 開啟 Raspberry Pi Configuration 工具:前往主選單,然後開啟 Raspberry Pi Configuration 工具。
- 選擇 Interfaces 標籤:選擇 Interfaces 標籤,然後確保 Camera 已經啟用。
測試 Camera Module
測試 Camera Module 的步驟如下:
- 開啟 Terminal:開啟 Terminal 視窗。
- 輸入命令:輸入以下命令以拍攝一張靜態圖片並將其儲存在 Desktop 上:
raspistill -o Desktop/image.jpg
當命令執行時,Camera 預覽將會開啟 5 秒鐘,然後拍攝一張靜態圖片。圖片檔案圖示將會出現在 Desktop 上,雙擊圖示即可開啟圖片。
Python 程式碼
以下是使用 Python 控制 Camera Module 的程式碼:
import picamera
# 建立 PiCamera 物件
camera = PiCamera()
# 設定解析度
camera.resolution = (1280, 720)
# 拍攝 5 張圖片,間隔 5 秒
for i in range(5):
sleep(5)
camera.capture("/home/pi/Desktop/img%s.jpg" % i)
print("Image taken")
流程圖
以下是使用 Picamera 拍攝圖片的流程圖:
flowchart TD A[啟動 Raspberry Pi] --> B[啟用 Camera 介面] B --> C[連線 Camera Module] C --> D[測試 Camera Module] D --> E[拍攝圖片] E --> F[儲存圖片]
此流程圖描述了使用 Raspberry Pi 和 Picamera 拍攝圖片的步驟。首先,啟動 Raspberry Pi,然後啟用 Camera 介面。接下來,連線 Camera Module,然後測試 Camera Module。最後,拍攝圖片並儲存圖片。
在攝影機捕捉的影像上新增文字
有時候,我們需要在攝影機捕捉的影像上新增一些文字,例如在影像上新增時間戳。以下是使用Python程式碼來實作這個功能的範例。
範例程式碼
from picamera import PiCamera
from time import sleep
# 設定影像檔案路徑
filepath = "/home/pi/Desktop/image.jpg"
# 初始化攝影機
camera = PiCamera()
# 設定攝影機解析度
camera.resolution = (2592, 1944)
# 設定攝影機幀率
camera.framerate = 15
# 啟動攝影機預覽
camera.start_preview()
# 設定要新增的文字
camera.annotate_text = "Hello Friends!"
# 設定文字大小
camera.annotate_text_size = 100
# 暫停5秒鐘
sleep(5)
# 捕捉影像
camera.capture(filepath)
# 停止攝影機預覽
camera.stop_preview()
執行結果
執行上述程式碼後,攝影機會捕捉一張影像,並在影像上新增指定的文字。影像會儲存到指定的檔案路徑中。
上述程式碼使用picamera
庫來控制攝影機,首先初始化攝影機物件,然後設定攝影機解析度和幀率。接著,啟動攝影機預覽,並設定要新增的文字和文字大小。然後,使用sleep
函式暫停5秒鐘,讓攝影機有足夠的時間來捕捉影像。最後,捕捉影像並停止攝影機預覽。
以下是上述程式碼的流程圖:
flowchart TD A[初始化攝影機] --> B[設定攝影機解析度] B --> C[設定攝影機幀率] C --> D[啟動攝影機預覽] D --> E[設定要新增的文字] E --> F[設定文字大小] F --> G[暫停5秒鐘] G --> H[捕捉影像] H --> I[停止攝影機預覽]
上述流程圖顯示了攝影機捕捉影像並新增文字的流程。
控制馬達(DC馬達、步進馬達和伺服馬達)
在這個章節中,我們將探討如何使用Raspberry Pi控制不同的馬達,包括DC馬達、步進馬達和伺服馬達。
DC馬達控制
DC馬達的工作原理是當磁場和電場相互作用時,會產生機械力,這被稱為馬達作用。有兩種型別的DC馬達:標準DC馬達和無刷DC馬達。
使用PWM技術控制DC馬達速度
DC馬達的速度與供應電壓成正比;如果電壓從12V降低到6V,則速度將變為原來的一半。但是在實踐中,為了改變DC馬達的速度,我們不能一直改變供應電壓。供應給DC馬達的電壓必須調整以控制速度在不同的扭矩水平(Weber 1965)。DC馬達的速度可以使用PWM技術控制。
import RPi.GPIO as GPIO
import time
# 設定GPIO模式
GPIO.setmode(GPIO.BCM)
# 設定PWM引腳
pwm_pin = 17
GPIO.setup(pwm_pin, GPIO.OUT)
# 設定PWM頻率
pwm_freq = 1000
pwm = GPIO.PWM(pwm_pin, pwm_freq)
# 設定DC馬達速度
def set_motor_speed(speed):
pwm.ChangeDutyCycle(speed)
# 啟動PWM
pwm.start(0)
try:
while True:
# 設定DC馬達速度為50%
set_motor_speed(50)
time.sleep(1)
# 設定DC馬達速度為100%
set_motor_speed(100)
time.sleep(1)
except KeyboardInterrupt:
# 停止PWM
pwm.stop()
# 關閉GPIO
GPIO.cleanup()
使用L293D馬達驅動IC控制DC馬達
L293D是一個強大的IC,可以控制兩個DC馬達的方向和速度,供應電壓範圍從4.5V到36V。為了避免對Raspberry Pi的處理器造成負載,通常使用一個單獨的電源供應DC馬達。
flowchart TD A[開始] --> B[初始化GPIO] B --> C[設定PWM引腳] C --> D[啟動PWM] D --> E[設定DC馬達速度] E --> F[停止PWM] F --> G[關閉GPIO]
此圖表展示了控制DC馬達的流程,從初始化GPIO到設定DC馬達速度,然後停止PWM和關閉GPIO。
步進馬達控制
步進馬達是一種可以精確控制旋轉角度的馬達。它的工作原理是透過控制電磁鐵的磁場來驅動馬達的旋轉。
import RPi.GPIO as GPIO
import time
# 設定GPIO模式
GPIO.setmode(GPIO.BCM)
# 設定步進馬達引腳
step_pin = 17
dir_pin = 23
GPIO.setup(step_pin, GPIO.OUT)
GPIO.setup(dir_pin, GPIO.OUT)
# 設定步進馬達速度
def set_motor_speed(speed):
# 設定步進馬達方向
if speed > 0:
GPIO.output(dir_pin, GPIO.HIGH)
else:
GPIO.output(dir_pin, GPIO.LOW)
# 設定步進馬達速度
for i in range(abs(speed)):
GPIO.output(step_pin, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(step_pin, GPIO.LOW)
time.sleep(0.001)
try:
while True:
# 設定步進馬達速度為100步
set_motor_speed(100)
time.sleep(1)
# 設定步進馬達速度為-100步
set_motor_speed(-100)
time.sleep(1)
except KeyboardInterrupt:
# 關閉GPIO
GPIO.cleanup()
伺服馬達控制
伺服馬達是一種可以精確控制旋轉角度的馬達。它的工作原理是透過控制電磁鐵的磁場來驅動馬達的旋轉。
import RPi.GPIO as GPIO
import time
# 設定GPIO模式
GPIO.setmode(GPIO.BCM)
# 設定伺服馬達引腳
servo_pin = 17
GPIO.setup(servo_pin, GPIO.OUT)
# 設定伺服馬達速度
def set_motor_speed(speed):
# 設定伺服馬達方向
if speed > 0:
GPIO.output(servo_pin, GPIO.HIGH)
else:
GPIO.output(servo_pin, GPIO.LOW)
# 設定伺服馬達速度
for i in range(abs(speed)):
GPIO.output(servo_pin, GPIO.HIGH)
time.sleep(0.001)
GPIO.output(servo_pin, GPIO.LOW)
time.sleep(0.001)
try:
while True:
# 設定伺服馬達速度為100步
set_motor_speed(100)
time.sleep(1)
# 設定伺服馬達速度為-100步
set_motor_speed(-100)
time.sleep(1)
except KeyboardInterrupt:
# 關閉GPIO
GPIO.cleanup()
此圖表展示了控制步進馬達和伺服馬達的流程,從初始化GPIO到設定馬達速度,然後停止馬達和關閉GPIO。
Raspberry Pi 的簡單應用:使用 L293D 驅動模組控制 DC 馬達
L293D 是一種中功率的 H-橋式馬達驅動器,適合用於驅動 DC 馬達。它包含兩個 H-橋式電路,用於控制每個馬達。H-橋式電路可以改變輸出的極性,以便 DC 馬達可以在兩個方向上控制。它可以驅動高達 12V 的馬達,總 DC 電流可達 600mA。L293D 的引腳圖如圖 3.18 所示,引腳描述如下:
- 啟用 1 和啟用 2 是啟用引腳。馬達只有在這些引腳為高電位時才會移動。
- Vs 是供應電壓。
- Vss 是邏輯供應電壓。
- 輸入 1、輸入 2、輸入 3 和輸入 4 是輸入引腳。
- 輸出 1、輸出 2、輸出 3 和輸出 4 是輸出引腳。馬達將連線到這些引腳。
- GND 引腳是用於裝置接地和散熱。
真值表
真值表 3.1 提供了邏輯條件,以便在順時針或逆時針方向旋轉馬達。表 3.2 顯示了馬達與 Raspberry Pi 的連線,後者具有 L293 馬達驅動器。圖 3.19a 和 3.19b 分別顯示了電路圖和馬達介面到 Raspberry Pi 的照片。圖 3.19c 給出了控制 DC 馬達的流程圖。
程式碼實作
以下是使用 Thonny IDE 執行的程式碼:
import RPi.GPIO as GPIO
import time
# 設定 GPIO 模式
GPIO.setmode(GPIO.BCM)
# 設定輸入和輸出引腳
input1 = 12 # GPIO18
input2 = 18 # GPIO24
enable = 23 # GPIO23
# 設定輸出引腳
GPIO.setup(input1, GPIO.OUT)
GPIO.setup(input2, GPIO.OUT)
GPIO.setup(enable, GPIO.OUT)
# 設定啟用引腳為高電位
GPIO.output(enable, GPIO.HIGH)
# 旋轉馬達
def rotate_motor(direction):
if direction == "clockwise":
GPIO.output(input1, GPIO.LOW)
GPIO.output(input2, GPIO.HIGH)
elif direction == "anti-clockwise":
GPIO.output(input1, GPIO.HIGH)
GPIO.output(input2, GPIO.LOW)
else:
GPIO.output(input1, GPIO.LOW)
GPIO.output(input2, GPIO.LOW)
# 測試馬達
rotate_motor("clockwise")
time.sleep(2)
rotate_motor("anti-clockwise")
time.sleep(2)
rotate_motor("stop")
time.sleep(2)
# 清除 GPIO 設定
GPIO.cleanup()
此圖示為 L293D 馬達驅動器的電路圖,展示瞭如何連線馬達和 Raspberry Pi。圖中顯示了 L293D 的引腳圖和真值表,説明瞭如何控制馬達的旋轉方向。
L293D 馬達驅動器是一種中功率的 H-橋式馬達驅動器,適合用於驅動 DC 馬達。它包含兩個 H-橋式電路,用於控制每個馬達。H-橋式電路可以改變輸出的極性,以便 DC 馬達可以在兩個方向上控制。真值表提供了邏輯條件,以便在順時針或逆時針方向旋轉馬達。程式碼實作使用 Thonny IDE 執行,設定 GPIO 模式,輸入和輸出引腳,啟用引腳為高電位,旋轉馬達等。
從整合與部署視角來看,本文涵蓋了Raspberry Pi與多種硬體介面的整合,包括OLED顯示器、攝影機和各式馬達。雖然文章提供了詳盡的硬體連線說明、程式碼範例以及流程圖,但在實務落地上仍需注意幾項關鍵挑戰。首先,不同廠牌的硬體規格可能存在差異,例如OLED顯示器的I2C地址或相機模組的版本,開發者需要根據實際情況調整程式碼。其次,文章雖提供基本程式碼,但缺乏對錯誤處理和例外狀況的說明,這在實際應用中至關重要。例如,I2C通訊錯誤或馬達驅動異常都可能導致系統不穩定。最後,文章對於更進階的應用場景,例如結合影像辨識與馬達控制,僅有簡略提及,缺乏更深入的探討。
對於想要快速上手Raspberry Pi硬體整合的開發者,本文提供的步驟和程式碼具有相當的參考價值。然而,要打造更穩健且功能豐富的應用,則需要更深入地研究各個硬體的規格書,並加強程式碼的錯誤處理和例外狀況處理機制。玄貓認為,隨著邊緣運算的興起,Raspberry Pi結合各種感測器和致動器的應用將更加普及。開發者除了精程序式設計能力外,更需培養跨領域的系統整合能力,才能在未來的科技浪潮中保持競爭力。