本文詳細說明如何使用 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 數量。
  • redno_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:

  1. 開啟終端機並執行以下命令:
sudo apt-get update
sudo apt-get install python3-pip
  1. 安裝 Unicorn HAT 的 Python 函式庫:
sudo pip3 install unicornhat
  1. 重新啟動您的 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 位址。首先,我們需要安裝必要的套件和模組,包括 Pillowinky

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 顯示器是一種電子紙顯示器,可以保持顯示的內容,即使在斷電後。

內容解密:

  1. 我們首先載入必要的模組,包括 subprocessPillowinky
  2. 我們設定 Inky pHAT 顯示器的邊框顏色為白色。
  3. 我們建立一個新的圖片,大小為 Inky pHAT 顯示器的寬度和高度。
  4. 我們建立一個 ImageDraw 物件,用於繪製圖片。
  5. 我們載入字型,使用 FredokaOne 字型,大小為 22。
  6. 我們取得 Raspberry Pi 的 IP 位址,使用 hostname 命令。
  7. 我們計算文字的寬度和高度,使用 font.getsize() 方法。
  8. 我們計算文字的 x 和 y 座標,使用寬度和高度的計算結果。
  9. 我們在圖片上繪製文字,使用 draw.text() 方法。
  10. 我們設定 Inky pHAT 顯示器的圖片,使用 inky_display.set_image() 方法。
  11. 我們顯示圖片,使用 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 的強大功能,創造出更具價值的應用方案。