Raspberry Pi 作為一個功能強大的開發平臺,常被應用於控制各種硬體周邊。本文將介紹如何整合 OLED 顯示器、相機模組以及 DC 馬達、步進馬達和伺服馬達等裝置。透過 I2C 或 CSI 等介面,搭配 Python 程式語言及相關函式庫,即可實作硬體控制與資料擷取。文章提供詳細的程式碼範例、電路圖和流程圖,讓讀者能快速上手,並根據自身需求調整程式邏輯,打造客製化的硬體控制應用。

硬體連線

首先,我們需要將 OLED 顯示器連線到 Raspberry Pi。OLED 顯示器通常透過 I2C 通訊協議與 Raspberry Pi 通訊,因此我們需要使用 Raspberry Pi 的 I2C 引腳。具體連線步驟如下:

  1. 將 OLED 顯示器的 VCC 引腳連線到 Raspberry Pi 的 3.3V 引腳(引腳 1)。
  2. 將 OLED 顯示器的 SDA 引腳連線到 Raspberry Pi 的 SDA 引腳(引腳 3)。
  3. 將 OLED 顯示器的 SCL 引腳連線到 Raspberry Pi 的 SCL 引腳(引腳 5)。
  4. 將 OLED 顯示器的 GND 引腳連線到 Raspberry Pi 的 GND 引腳(引腳 9)。

啟用 I2C

在連線 OLED 顯示器之前,我們需要啟用 Raspberry Pi 的 I2C 功能。有兩種方法可以啟用 I2C:

方法 1:透過 Raspberry Pi 配置工具

  1. 點選 Raspberry Pi 的圖示(左上角),然後點選「偏好設定」。
  2. 在「偏好設定」視窗中,點選「Raspberry Pi 配置」。
  3. 在「Raspberry Pi 配置」視窗中,點選「介面」標籤。
  4. 在「介面」標籤中,勾選「I2C」選項。

方法 2:透過命令提示符

  1. 開啟命令提示符。
  2. 輸入以下命令:sudo raspi-config
  3. 使用箭頭鍵滾動到「介面選項」。
  4. 按下 Enter 鍵。
  5. 選擇「I2C」選項。
  6. 按下 Enter 鍵。

安裝 Adafruit_Python_SSD1306 庫

在啟用 I2C 之後,我們需要安裝 Adafruit_Python_SSD1306 庫,以便使用 OLED 顯示器。具體步驟如下:

  1. 更新和升級 Raspberry Pi:sudo apt updatesudo apt upgrade
  2. 安裝 Adafruit_Python_SSD1306 庫:在 Thonny IDE 中,選擇「工具」>「管理外掛」>「Adafruit_Python_SSD1306」,然後點選「搜尋 PyPi」。

驗證 I2C 地址

在安裝 Adafruit_Python_SSD1306 庫之後,我們需要驗證 OLED 顯示器的 I2C 地址。具體步驟如下:

  1. 開啟命令提示符。
  2. 輸入以下命令:i2cdetect -y 1

這將顯示 OLED 顯示器的 I2C 地址。

OLED 顯示器安裝與測試

安裝 OLED 顯示器庫

為了在 Raspberry Pi 上使用 OLED 顯示器,首先需要安裝適當的庫。這可以透過在終端機中執行安裝命令來完成。安裝過程中,系統會下載並安裝必要的庫檔,包括 OLED 顯示器的驅動程式。

執行範例程式

安裝完成後,下一步是執行一個範例程式來測試 OLED 顯示器。這個範例程式可以從 OLED 顯示器的範例檔案中找到,例如 shapes.py。這個程式示範瞭如何在 OLED 顯示器上顯示文字、矩形等圖形。

執行步驟

  1. 開啟範例程式:找到 shapes.py 範例程式並將其複製到 Thonny IDE 中。
  2. 執行程式:在 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 顯示器,顯示文字、矩形等圖形。

安裝步驟

  1. 開啟終端機,輸入以下命令安裝必要的庫:
sudo apt-get update
sudo apt-get install python3-pip
sudo pip3 install pillow
sudo pip3 install adafruit-ssd1306
  1. 安裝完成後,確認您的 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()

程式碼解說

  1. 我們首先匯入必要的庫,包括 PIL 用於影像處理和 adafruit_ssd1306 用於 OLED 顯示器控制。
  2. 我們初始化 OLED 顯示器,建立一個空白影像,並設定繪圖物件。
  3. 我們清除影像,然後繪製一些圖形,包括矩形和文字。
  4. 最後,我們顯示影像在 OLED 顯示器上。

Raspberry Pi 相機介面

Raspberry Pi 可以透過相機介面(Camera Serial Interface,CSI)連線相機模組,以拍照、錄製影片和應用影像效果。所有當前的 Raspberry Pi 模型都具有 CSI 埠,用於連線相機模組。

相機模組版本

有兩種版本的相機模組:

  • 標準版本:設計用於正常光線下的拍照。
  • NoIR 版本:具有紅外濾鏡,因此可以使用紅外光源在黑暗中拍照。

安裝 Picamera 庫

要安裝 Picamera 庫,請按照以下步驟進行:

  1. 更新套件列表:sudo apt-get update
  2. 安裝 Picamera 庫:sudo apt-get install python-picamera (適用於 Python 2)或 sudo apt-get install python3-picamera (適用於 Python 3)

或者,您也可以使用 Python 的 pip 工具安裝 Picamera 庫:

  1. 安裝 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 的步驟如下:

  1. 開啟 Camera Port:確保 Raspberry Pi 已經關機,然後找到 Camera Module 的埠。對於 Raspberry Pi 3 B+、2 和 3,Camera 埠位於 LAN 埠和 HDMI 埠之間。
  2. 插入 Camera Cable:將 Camera Cable 以正確的方向插入,藍色面向 Ethernet 埠,銀色面向 HDMI 埠。輕輕拉開 CSI 埠的夾子,然後插入 Camera Module 的 ribbon Cable。
  3. 關閉 Camera Port:將塑膠夾子的頂部推回原位。

啟用 Camera 介面

啟用 Camera 介面的步驟如下:

  1. 啟動 Raspberry Pi:開啟 Raspberry Pi。
  2. 開啟 Raspberry Pi Configuration 工具:前往主選單,然後開啟 Raspberry Pi Configuration 工具。
  3. 選擇 Interfaces 標籤:選擇 Interfaces 標籤,然後確保 Camera 已經啟用。

測試 Camera Module

測試 Camera Module 的步驟如下:

  1. 開啟 Terminal:開啟 Terminal 視窗。
  2. 輸入命令:輸入以下命令以拍攝一張靜態圖片並將其儲存在 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結合各種感測器和致動器的應用將更加普及。開發者除了精程序式設計能力外,更需培養跨領域的系統整合能力,才能在未來的科技浪潮中保持競爭力。