在樹莓派上使用 Python 進行音訊處理和 GPIO 控制,可以實作多種互動應用。本文介紹瞭如何使用 subprocess 模組呼叫 omxplayer 和 pygame 播放音訊檔案,以及如何使用 arecord 和 aplay 錄製和播放聲音。此外,還示範瞭如何使用 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 函式接受兩個引數:pitch 和 duration,分別代表蜂鳴聲的頻率和持續時間。程式碼使用 beep 方法來產生蜂鳴聲,方法接受三個引數:on_time、off_time 和 n,分別代表蜂鳴聲的開啟時間、關閉時間和週期數。
執行結果
執行上述程式碼後,系統將提示使用者輸入蜂鳴聲的頻率和持續時間。輸入後,系統將產生相應的蜂鳴聲。
控制GPIO輸出使用網頁介面
問題描述
您想要使用網頁介面來控制樹莓派(Raspberry Pi)的通用輸入/輸出(GPIO)埠。
解決方案
使用Bottle Python網頁伺服器函式庫(參考配方7.17)來建立一個HTML網頁介面,以控制GPIO埠。
所需材料
-麵包板和跳線(參考「原型裝置和套件」)
- 三個1kΩ電阻器(參考「電阻器和電容器」)
- 三個LED(參考「光電子元件」)
- 觸控按鈕(參考「雜項」)
實作步驟
- 安裝Bottle函式庫:在您的樹莓派上安裝Bottle Python網頁伺服器函式庫。
- 建立網頁介面:使用HTML和CSS建立一個簡單的網頁介面,包含按鈕或其他控制元件,以控制GPIO埠。
- 編寫Python指令碼:編寫一個Python指令碼,使用Bottle函式庫來啟動網頁伺服器,並定義路由以控制GPIO埠。
- 連線硬體:根據圖16-1的麵包板佈局,連線LED、電阻器和觸控按鈕到樹莓派的GPIO埠。
- 執行指令碼:執行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 的靈活性與可擴充套件性。
透過多維度效能指標的實測分析,可以看出 omxplayer 和 pygame 提供了不同的音訊播放方案,各有其優劣。omxplayer 更貼近硬體層,效能更佳,而 pygame 則更易於與遊戲開發整合。使用 USB 麥克風捕捉聲音,則需要仔細組態音訊引數,例如取樣率和裝置編號,才能確保錄音品質。至於壓電蜂鳴器的控制,則需要精確控制 GPIO 輸出的時序和頻率,才能產生預期的蜂鳴聲。最後,透過網頁介面控制 GPIO 輸出,則展現了物聯網應用開發的潛力,結合網路技術,可以遠端監控和控制 Raspberry Pi 的各種功能。
展望未來,隨著嵌入式系統的普及和物聯網技術的發展,預計會有更多創新的應用場景出現。例如,結合機器學習技術,可以實作語音辨識和控制,進一步提升 Raspberry Pi 的互動性和智慧化程度。此外,隨著邊緣運算的興起,Raspberry Pi 也將扮演更重要的角色,成為連線雲端和終端的橋樑。
玄貓認為,Raspberry Pi 作為一個低成本、易於上手的開發平臺,對於想要學習嵌入式系統和物聯網技術的開發者來說,是一個非常好的選擇。技術團隊應著重於掌握這些核心技術,才能充分釋放 Raspberry Pi 的完整潛力,並在未來的科技浪潮中佔據先機。