本文詳細說明如何使用 Raspberry Pi 控制 LED 燈條、Unicorn HAT RGB LED 矩陣、電子紙顯示器 Inky pHAT 和設定音訊輸出。每個裝置的控制都包含程式碼範例、電路連線說明以及軟體安裝步驟,讓讀者可以快速上手。此外,文章也提供圖表和程式碼解說,幫助讀者理解程式碼的邏輯和運作方式,並針對不同硬體裝置的特性提供最佳的控制策略。
Raspberry Pi LED 燈條控制
硬體需求
- Raspberry Pi
- LED 燈條(最多 10 個 LED)
- 跳線(公對母)
- 電源供應(可選)
安裝軟體
為了控制 LED 燈條,我們將使用 Adafruit 的軟體。安裝步驟如下:
$ pip3 install adafruit-blinka
$ sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel
LED 燈條連線
LED 燈條有三個連線點:GND、DI(Data In)和 5V。將跳線的一端連線到這些點,另一端連線到 Raspberry Pi 的對應 GPIO 腳位:GND、GPIO 18 和 5V。
程式碼
以下程式碼(ch_14_neopixel.py)將使 LED 燈條的每個 LED 以紅色亮起,依次從左到右:
import time
import board
from neopixel import NeoPixel
led_count = 5 # LED 數量
red = (100, 0, 0) # 紅色
no_color = (0, 0, 0) # 無色
strip = NeoPixel(board.D18, led_count, auto_write=False)
def clear():
"""清除所有 LED 顏色"""
for i in range(0, led_count):
strip[i] = no_color
strip.show()
i = 0
while True:
clear()
strip[i] = red
strip.show()
i = (i + 1) % led_count # 移至下一個 LED
time.sleep(0.5) # 暫停 0.5 秒
解說
- 我們使用
NeoPixel類別來控制 LED 燈條。 clear函式用於清除所有 LED 的顏色。- 主迴圈中,我們先清除所有 LED 的顏色,然後將目前的 LED 設為紅色,並顯示變化。
- 我們使用
time.sleep(0.5)暫停 0.5 秒,然後移至下一個 LED。
圖表翻譯:
flowchart TD
A[開始] --> B[初始化 LED 燈條]
B --> C[設定 LED 顏色]
C --> D[顯示變化]
D --> E[暫停 0.5 秒]
E --> F[移至下一個 LED]
F --> C
內容解密:
led_count變數用於設定 LED 數量。red和no_color變數用於設定顏色。strip物件用於控制 LED 燈條。clear函式用於清除所有 LED 顏色。- 主迴圈中,我們使用
strip.show()顯示變化。
使用 Pimoroni Unicorn HAT 的 RGB LED 矩陣顯示
問題描述
您想要為您的 Raspberry Pi 建立一個 RGB LED 矩陣顯示。
解決方案
使用 Pimoroni Unicorn HAT 提供 8x8 LED 矩陣(如圖 14-9 所示)。
安裝 Unicorn HAT
開始安裝之前,您需要確認您的 Raspberry Pi 已經更新到最新版本。然後,按照以下步驟安裝 Unicorn HAT:
- 開啟終端機並執行以下命令:
sudo apt-get update
sudo apt-get install python3-pip
- 安裝 Unicorn HAT 的 Python 函式庫:
sudo pip3 install unicornhat
- 重新啟動您的 Raspberry Pi。
示例程式
當您完成安裝後,可以執行以下程式(ch_14_unicorn.py)來測試 Unicorn HAT:
import time
import unicornhat as unicorn
from random import randint
unicorn.set_layout(unicorn.AUTO)
unicorn.rotation(0)
unicorn.brightness(1)
while True:
x = randint(0, 7)
y = randint(0, 7)
r = randint(0, 255)
g = randint(0, 255)
b = randint(0, 255)
unicorn.set_pixel(x, y, r, g, b)
unicorn.show()
time.sleep(0.1)
這個程式會不斷地設定隨機畫素的顏色為隨機顏色。
執行程式
執行程式使用以下命令:
sudo python3 ch_14_unicorn.py
討論
Unicorn HAT 是一個很有趣的元件,可以用來建立各種有趣的 LED 矩陣顯示。您可以使用它來建立自己的 RGB LED 矩陣顯示,並使用 Python 程式來控制它。
圖表翻譯
flowchart TD
A[開始] --> B[安裝 Unicorn HAT]
B --> C[執行示例程式]
C --> D[設定隨機畫素顏色]
D --> E[顯示 Unicorn HAT]
E --> F[重複設定隨機畫素顏色]
這個圖表顯示了使用 Unicorn HAT 的流程,從安裝開始,到執行示例程式,然後設定隨機畫素顏色,顯示 Unicorn HAT,最後重複設定隨機畫素顏色。
使用 Raspberry Pi 控制電子紙顯示器
電子紙顯示器(ePaper)是一種特殊的顯示器,能夠提供高對比度和低功耗的顯示效果。下面,我們將介紹如何使用 Raspberry Pi 控制電子紙顯示器。
硬體需求
- Raspberry Pi
- Inky pHAT 或 Inky wHAT 模組
- 電子紙顯示器
軟體需求
- Pimoroni 軟體
- Python 3.x
安裝 Pimoroni 軟體
您可以使用以下命令安裝 Pimoroni 軟體:
sudo apt-get update
sudo apt-get install python3-pip
pip3 install inky
如果您想要下載範例程式和檔案,請接受提示以進行下載。
範例程式
以下是使用 Inky pHAT 顯示 Raspberry Pi 的 IP 地址的範例程式:
from inky import InkyPHAT
from PIL import Image, ImageFont, ImageDraw
from font_fredoka_one import FredokaOne
import subprocess
inky_display = InkyPHAT("red")
# 取得 Raspberry Pi 的 IP 地址
ip_address = subprocess.check_output(["hostname", "-I"]).decode("utf-8").strip()
# 建立影像和繪圖物件
img = Image.new("P", (inky_display.WIDTH, inky_display.HEIGHT))
draw = ImageDraw.Draw(img)
# 載入字型
font = ImageFont.truetype(FredokaOne, 24)
# 繪製 IP 地址
draw.text((10, 10), ip_address, font=font, fill=inky_display.RED)
# 顯示影像
inky_display.set_image(img)
inky_display.show()
這個程式使用 subprocess 模組取得 Raspberry Pi 的 IP 地址,然後使用 PIL 函式庫建立影像和繪圖物件。最後,使用 InkyPHAT 類別顯示影像。
內容解密:
- 我們使用
subprocess模組取得 Raspberry Pi 的 IP 地址。 - 我們使用
PIL函式庫建立影像和繪圖物件。 - 我們使用
InkyPHAT類別顯示影像。 - 我們使用
FredokaOne字型繪製 IP 地址。
圖表翻譯:
flowchart TD
A[取得 IP 地址] --> B[建立影像]
B --> C[繪製 IP 地址]
C --> D[顯示影像]
這個流程圖描述了程式的執行流程:取得 IP 地址、建立影像、繪製 IP 地址、顯示影像。
圖表說明:
A[取得 IP 地址]:取得 Raspberry Pi 的 IP 地址。B[建立影像]:建立影像和繪圖物件。C[繪製 IP 地址]:繪製 IP 地址。D[顯示影像]:顯示影像。
使用 Inky pHAT 顯示器顯示 Raspberry Pi 的 IP 位址
在這個範例中,我們將使用 Inky pHAT 顯示器來顯示 Raspberry Pi 的 IP 位址。首先,我們需要安裝必要的套件和模組,包括 Pillow 和 inky。
import subprocess
from PIL import Image, ImageDraw, ImageFont
import inky
# 設定 Inky pHAT 顯示器的邊框顏色
inky_display = inky.InkyPHAT('red')
inky_display.set_border(inky_display.WHITE)
# 建立一個新的圖片
img = Image.new("P", (inky_display.WIDTH, inky_display.HEIGHT))
# 建立一個 ImageDraw 物件
draw = ImageDraw.Draw(img)
# 載入字型
font = ImageFont.truetype('FredokaOne', 22)
# 取得 Raspberry Pi 的 IP 位址
message = str(subprocess.check_output(['hostname', '-I'])).split()[0][2:]
# 計算文字的寬度和高度
w, h = font.getsize(message)
# 計算文字的 x 和 y 座標
x = (inky_display.WIDTH / 2) - (w / 2)
y = (inky_display.HEIGHT / 2) - (h / 2)
# 在圖片上繪製文字
draw.text((x, y), message, inky_display.RED, font)
# 設定 Inky pHAT 顯示器的圖片
inky_display.set_image(img)
# 顯示圖片
inky_display.show()
這個程式碼會顯示 Raspberry Pi 的 IP 位址在 Inky pHAT 顯示器上。Inky pHAT 顯示器是一種電子紙顯示器,可以保持顯示的內容,即使在斷電後。
內容解密:
- 我們首先載入必要的模組,包括
subprocess、Pillow和inky。 - 我們設定 Inky pHAT 顯示器的邊框顏色為白色。
- 我們建立一個新的圖片,大小為 Inky pHAT 顯示器的寬度和高度。
- 我們建立一個 ImageDraw 物件,用於繪製圖片。
- 我們載入字型,使用 FredokaOne 字型,大小為 22。
- 我們取得 Raspberry Pi 的 IP 位址,使用
hostname命令。 - 我們計算文字的寬度和高度,使用
font.getsize()方法。 - 我們計算文字的 x 和 y 座標,使用寬度和高度的計算結果。
- 我們在圖片上繪製文字,使用
draw.text()方法。 - 我們設定 Inky pHAT 顯示器的圖片,使用
inky_display.set_image()方法。 - 我們顯示圖片,使用
inky_display.show()方法。
圖表翻譯:
flowchart TD
A[載入模組] --> B[設定 Inky pHAT 顯示器]
B --> C[建立圖片]
C --> D[載入字型]
D --> E[取得 IP 位址]
E --> F[計算文字寬度和高度]
F --> G[計算文字 x 和 y 座標]
G --> H[繪製文字]
H --> I[設定 Inky pHAT 顯示器的圖片]
I --> J[顯示圖片]
這個流程圖顯示了程式碼的執行流程,從載入模組到顯示圖片。
組態Raspberry Pi的音訊輸出
為了讓Raspberry Pi播放音訊,需要將音訊輸出設定為音訊視訊介面(audiovisual socket),而不是HDMI。以下是組態步驟:
步驟1:連線音訊裝置
您可以使用像圖15-1所示的電源擴音器來連線Raspberry Pi。或者,您也可以使用為Raspberry Pi設計的音訊套件,例如圖15-2所示的MonkMakes Speaker Kit for Raspberry Pi。
步驟2:組態音訊輸出
為了讓Raspberry Pi透過音訊視訊介面播放音訊,需要使用Recipe 15.2進行組態。
步驟3:測試音訊輸出
Raspbian系統中有一個方便的程式可以用來測試音訊輸出。您可以在Terminal中輸入以下命令:
speaker-test -t wav -c 2
這個命令會播放一個WAV檔案,以測試您的音訊裝置是否正常工作。
程式碼解釋:
speaker-test:這是一個用來測試音訊輸出的程式。-t wav:指定要播放的檔案型別為WAV。-c 2:指定要播放的通道數為2(立體聲)。
輸出結果:
speaker-test 1.1.3
Playback device is default
Stream parameters are 48000Hz, S16_LE, 2 channels
WAV file(s)
Rate set to 48000Hz (requested 48000Hz)
Buffer size range from 256 to 32768
Period size range from 256 to 32768
Using max buffer size 32768
Periods = 4
was set period_size = 8192
was set buffer_size = 32768
0 - Front Left
1 - Front Right
Time per period = 2.411811
這個輸出結果顯示了音訊播放的詳細資訊,包括播放裝置、流引數、WAV檔案資訊等。
圖表翻譯:
flowchart TD
A[開始] --> B[連線音訊裝置]
B --> C[組態音訊輸出]
C --> D[測試音訊輸出]
D --> E[播放WAV檔案]
E --> F[顯示輸出結果]
這個流程圖顯示了組態Raspberry Pi的音訊輸出的步驟,包括連線音訊裝置、組態音訊輸出、測試音訊輸出、播放WAV檔案和顯示輸出結果。
音訊輸出控制與音訊播放
15.1 測試立體聲音訊設定
當您執行特定命令時,會聽到一個聲音說「前左」、「前右」等,這是為了測試立體聲音訊設定而設計的。這個功能可以幫助您確保您的音訊裝置是否正常工作。
15.2 控制音訊輸出位置
如果您想要控制Raspberry Pi在播放聲音時使用哪個輸出選項,可以使用右擊桌面右上角的喇叭圖示的選擇器。這個選擇器可以讓您輕鬆地在不同的音訊輸出裝置之間切換,例如HDMI、模擬音訊或藍牙喇叭。
如果您正在無頭模式(headless)執行Raspberry Pi,則可以使用raspi-config命令列工具來控制音訊輸出位置。只需開啟終端會話並輸入以下命令:
$ sudo raspi-config
然後選擇「Advanced」選項,接著選擇音訊輸出裝置選項。
15.3 從命令列播放音訊
如果您想要從命令列播放音訊檔案,可以使用特定的命令。這個命令可以讓您輕鬆地播放音訊檔案,而無需使用圖形使用者介面。
內容解密:
以下是從命令列播放音訊檔案的示例:
$ aplay /path/to/audio/file.wav
這個命令會播放指定路徑下的音訊檔案。您可以替換 /path/to/audio/file.wav 為您要播放的音訊檔案的路徑。
圖表翻譯:
flowchart TD
A[命令列] --> B[aplay 命令]
B --> C[播放音訊檔案]
C --> D[音訊輸出]
這個流程圖展示了從命令列播放音訊檔案的過程。首先,使用者在命令列中輸入 aplay 命令,接著指定要播放的音訊檔案路徑。然後,系統會播放指定的音訊檔案,並將音訊輸出到指定的裝置中。
15.4 播放測試音訊
如果您想要播放測試音訊,可以使用特定的命令。這個命令可以幫助您確保您的音訊裝置是否正常工作。
內容解密:
以下是播放測試音訊的示例:
$ speaker-test
這個命令會播放測試音訊,以幫助您確保您的音訊裝置是否正常工作。
圖表翻譯:
flowchart TD
A[命令列] --> B[speaker-test 命令]
B --> C[播放測試音訊]
C --> D[音訊輸出]
這個流程圖展示了播放測試音訊的過程。首先,使用者在命令列中輸入 speaker-test 命令,接著系統會播放測試音訊,並將音訊輸出到指定的裝置中。
播放音訊檔案
問題描述
您想要在 Raspberry Pi 上播放音訊檔案。
解決方案
您可以使用 OMXPlayer 這個內建的軟體來播放音訊檔案。首先,找到名為 school_bell.mp3 的檔案,它位於本文的下載資料中,位於 python 目錄下。您可以使用以下命令來播放這個音訊檔案:
omxplayer -o local /home/pi/raspberrypi_cookbook_ed3/python/school_bell.mp3
這個命令會透過耳機孔播放音訊檔案。如果您想要透過 HDMI 連線播放音訊,可以使用 -o hdmi 代替 -o local。
討論
OMXPlayer 可以播放多種音訊檔案格式,包括 MP3、WAV、AIFF、AAC 和 OGG。然而,如果您只想要播放未壓縮的 WAV 檔案,您也可以使用更輕量的 aplay 命令:
aplay school_bell.wav
參考資料
您可以在這裡閱讀更多關於 OMXPlayer 的資訊。同時,也可以在這裡找到 aplay 的檔案。
從使用者經驗視角來看,Raspberry Pi 提供了多元的音訊與視覺輸出控制方案,從簡潔的 LED 燈條控制到精細的電子紙顯示器和 Unicorn HAT 矩陣,滿足了不同層級的開發需求。分析 LED 燈條、Unicorn HAT 和電子紙顯示器的程式碼,可以發現 Python 程式函式庫的應用極大簡化了硬體控制的複雜度,讓開發者能更專注於創意實作。然而,硬體連線和驅動程式安裝仍是潛在的挑戰,尤其對於初學者而言。
技術限制深析顯示,電子紙顯示器的重新整理速度和色彩表現仍有提升空間,而 Unicorn HAT 的解析度限制了其應用場景。整合價值分析則表明,結合這些輸出裝置與感測器資料,可以創造出更具互動性和資訊豐富的應用,例如環境監控顯示、客製化通知面板等。
展望未來,隨著硬體效能的提升和軟體生態的持續發展,預計 Raspberry Pi 在物聯網、邊緣計算等領域將扮演更重要的角色。更低功耗、更高解析度的顯示技術,以及更易用的開發工具,將進一步降低開發門檻,激發更多創新應用。玄貓認為,深入理解這些硬體控制原理並掌握相關程式函式庫,將有助於開發者更好地利用 Raspberry Pi 的強大功能,創造出更具價值的應用方案。