在樹莓派上使用 Python 進行音訊處理和 GPIO 控制,可以實作多種互動應用。本文介紹瞭如何使用 subprocess 模組呼叫 omxplayerpygame 播放音訊檔案,以及如何使用 arecordaplay 錄製和播放聲音。此外,還示範瞭如何使用 Python 控制 GPIO 輸出,例如控制 LED 燈和蜂鳴器,並進一步探討瞭如何構建網頁介面來控制 GPIO 埠,實作更便捷的互動體驗。

從 Python 程式播放音訊

問題描述

您想要從 Python 程式中播放音訊檔案。

解決方案

如果您需要從 Python 程式中播放音訊檔案,您可以使用 Python 的 subprocess 模組(例如 ch_15_play_sound.py):

import subprocess
sound_file = '/home/pi/raspberrypi_cookbook_ed3/python/school_bell.mp3'
sound_out = 'local'
subprocess.run(['omxplayer', '-o', sound_out, sound_file])

就像本文中的所有程式範例一樣,您也可以下載這個程式(請參考配方 3.22)。

討論

您也可以使用 pygame 函式庫來播放音訊檔案(例如 ch_15_play_sound_pygame.py):

import pygame
sound_file = '/home/pi/raspberrypi_cookbook_ed3/python/school_bell.wav'
pygame.mixer.init()
pygame.mixer.music.load(sound_file)

內容解密:

在上述程式碼中,我們使用 subprocess 模組來執行 omxplayer 命令,並傳遞相關引數來指定音訊檔案和輸出裝置。或者,我們使用 pygame 函式庫來初始化混音器,載入音訊檔案,並進行播放。這兩種方法都可以用於在 Python 程式中播放音訊檔案。

使用USB麥克風在Raspberry Pi上捕捉聲音

問題描述

您想要將麥克風連線到Raspberry Pi,以捕捉聲音。

解決方案

使用像圖15-5所示的USB麥克風,或是品質更好的麥克風。這些裝置有各種形狀和大小,有些可以直接插入USB插槽,有些有USB線連線,有些是耳機套件的一部分。

步驟1:安裝麥克風

將USB麥克風插入Raspberry Pi的USB插槽。

步驟2:檢查Raspbian是否識別麥克風

使用以下命令檢查Raspbian是否識別麥克風:

$ arecord -l

這將列出可用的錄音裝置。

步驟3:選擇麥克風作為音訊裝置

開啟Raspberry Pi桌面的偏好設定,然後選擇音訊裝置設定。選擇您的USB麥克風作為音訊裝置,如圖15-6所示。

步驟4:新增麥克風增益控制

點選“選擇控制”按鈕,然後勾選“麥克風”方塊。這將新增一個滑動條來控制麥克風的增益,以及一個紅色按鈕來開啟或關閉麥克風,如圖15-7所示。

步驟5:調整麥克風增益

將麥克風增益滑動條調整到約75%的水平。

步驟6:錄製聲音

使用以下命令錄製聲音:

$ arecord -D plughw:1,0 -d 3 test.wav

其中 -D 引數指定了裝置外掛 hw:1,0,它參考了我們之前發現的卡號(1)和子裝置(0)。

步驟7:播放錄製的聲音

使用以下命令播放錄製的聲音:

$ aplay test.wav

這將播放您剛剛錄製的聲音。

討論

我曾經使用過像圖15-5所示的小型推入式麥克風,結果很混亂。有些工作,有些不工作。如果您遵循了這裡的指示,仍然無法讓您的麥克風錄製任何東西,請嘗試使用不同的麥克風。

arecord 命令有可選引數,可以控制您錄製的音訊的取樣率和格式。例如,如果您想以16,000個樣本每秒的速度錄製音訊,而不是預設的8,000個樣本每秒,您可以使用以下命令:

$ arecord -r 16000 -D plughw:1,0 -d 3 test.wav

當您播放聲音時,aplay 將自動檢測取樣率,因此您可以直接使用以下命令:

$ aplay test.wav

使用 Raspberry Pi 產生蜂鳴聲

在本文中,我們將探討如何使用 Raspberry Pi 來產生蜂鳴聲。這個功能可以透過連線一個壓電蜂鳴器到 Raspberry Pi 的 GPIO 引腳來實作。

硬體需求

  • Raspberry Pi
  • 壓電蜂鳴器
  • Female-to-female 接頭
  • 470Ω 電阻(可選)

連線壓電蜂鳴器

壓電蜂鳴器可以直接連線到 Raspberry Pi 的 GPIO 引腳,如下圖所示。

  flowchart TD
    A[Raspberry Pi] --> B[GPIO 引腳]
    B --> C[壓電蜂鳴器]
    C --> D[470Ω 電阻]

圖表翻譯:

上述圖表顯示了壓電蜂鳴器連線到 Raspberry Pi 的過程。首先,壓電蜂鳴器的一端連線到 Raspberry Pi 的 GPIO 引腳,另一端連線到地線。若要增加安全性,可以在 GPIO 引腳和壓電蜂鳴器之間新增一個 470Ω 電阻。

程式碼實作

以下是使用 Python 來控制壓電蜂鳴器的程式碼:

from gpiozero import Buzzer
buzzer = Buzzer(18)

def buzz(pitch, duration):
    period = 1.0 / pitch
    delay = period / 2
    cycles = int(duration * pitch)
    buzzer.beep(on_time=period, off_time=period, n=int(cycles/2))

while True:
    pitch_s = input("Enter Pitch (200 to 2000): ")
    pitch = float(pitch_s)
    duration_s = input("Enter Duration (seconds): ")
    duration = float(duration_s)
    buzz(pitch, duration)

內容解密:

上述程式碼使用 gpiozero 函式庫來控制壓電蜂鳴器。Buzzer 類別用於初始化壓電蜂鳴器,buzz 函式用於產生蜂鳴聲。buzz 函式接受兩個引數:pitchduration,分別代表蜂鳴聲的頻率和持續時間。程式碼使用 beep 方法來產生蜂鳴聲,方法接受三個引數:on_timeoff_timen,分別代表蜂鳴聲的開啟時間、關閉時間和週期數。

執行結果

執行上述程式碼後,系統將提示使用者輸入蜂鳴聲的頻率和持續時間。輸入後,系統將產生相應的蜂鳴聲。

控制GPIO輸出使用網頁介面

問題描述

您想要使用網頁介面來控制樹莓派(Raspberry Pi)的通用輸入/輸出(GPIO)埠。

解決方案

使用Bottle Python網頁伺服器函式庫(參考配方7.17)來建立一個HTML網頁介面,以控制GPIO埠。

所需材料

-麵包板和跳線(參考「原型裝置和套件」)

  • 三個1kΩ電阻器(參考「電阻器和電容器」)
  • 三個LED(參考「光電子元件」)
  • 觸控按鈕(參考「雜項」)

實作步驟

  1. 安裝Bottle函式庫:在您的樹莓派上安裝Bottle Python網頁伺服器函式庫。
  2. 建立網頁介面:使用HTML和CSS建立一個簡單的網頁介面,包含按鈕或其他控制元件,以控制GPIO埠。
  3. 編寫Python指令碼:編寫一個Python指令碼,使用Bottle函式庫來啟動網頁伺服器,並定義路由以控制GPIO埠。
  4. 連線硬體:根據圖16-1的麵包板佈局,連線LED、電阻器和觸控按鈕到樹莓派的GPIO埠。
  5. 執行指令碼:執行Python指令碼,啟動網頁伺服器,並透過網頁介面控制GPIO埠。

程式碼示例

from bottle import route, run
import RPi.GPIO as GPIO

# 初始化GPIO
GPIO.setmode(GPIO.BCM)

# 定義GPIO埠
led_ports = [17, 23, 24]

# 設定LED為輸出模式
for port in led_ports:
    GPIO.setup(port, GPIO.OUT)

@route('/led/<port>/<state>')
def control_led(port, state):
    # 控制LED狀態
    if state == 'on':
        GPIO.output(int(port), GPIO.HIGH)
    else:
        GPIO.output(int(port), GPIO.LOW)

run(host='0.0.0.0', port=8080)

討論

此解決方案使用Bottle函式庫建立了一個簡單的網頁伺服器,允許您透過網頁介面控制樹莓派的GPIO埠。您可以透過存取http://<樹莓派IP>:8080/led/<port>/<state>來控制LED的狀態,其中<port>是GPIO埠號,<state>是’on’或’off’。

圖表翻譯

  flowchart TD
    A[使用者] --> B[存取網頁]
    B --> C[傳送請求]
    C --> D[樹莓派網頁伺服器]
    D --> E[控制GPIO埠]
    E --> F[更新LED狀態]

此圖表展示了使用者如何透過網頁介面控制GPIO埠的流程。

從 Python 程式播放音訊、使用 USB 麥克風捕捉聲音、產生蜂鳴聲,以及透過網頁介面控制 GPIO 輸出,這些看似獨立的功能,實則展現了 Raspberry Pi 作為嵌入式系統的強大應用潛力。深入剖析這些功能的實作細節,可以發現它們都圍繞著硬體與軟體的協同運作。從底層的硬體驅動到高階的 Python 程式函式庫,技術堆疊的各層級協同運作中體現了 Raspberry Pi 的靈活性與可擴充套件性。

透過多維度效能指標的實測分析,可以看出 omxplayerpygame 提供了不同的音訊播放方案,各有其優劣。omxplayer 更貼近硬體層,效能更佳,而 pygame 則更易於與遊戲開發整合。使用 USB 麥克風捕捉聲音,則需要仔細組態音訊引數,例如取樣率和裝置編號,才能確保錄音品質。至於壓電蜂鳴器的控制,則需要精確控制 GPIO 輸出的時序和頻率,才能產生預期的蜂鳴聲。最後,透過網頁介面控制 GPIO 輸出,則展現了物聯網應用開發的潛力,結合網路技術,可以遠端監控和控制 Raspberry Pi 的各種功能。

展望未來,隨著嵌入式系統的普及和物聯網技術的發展,預計會有更多創新的應用場景出現。例如,結合機器學習技術,可以實作語音辨識和控制,進一步提升 Raspberry Pi 的互動性和智慧化程度。此外,隨著邊緣運算的興起,Raspberry Pi 也將扮演更重要的角色,成為連線雲端和終端的橋樑。

玄貓認為,Raspberry Pi 作為一個低成本、易於上手的開發平臺,對於想要學習嵌入式系統和物聯網技術的開發者來說,是一個非常好的選擇。技術團隊應著重於掌握這些核心技術,才能充分釋放 Raspberry Pi 的完整潛力,並在未來的科技浪潮中佔據先機。