在 Raspberry Pi 3 Model B 建立 Python 3.6 環境 這篇文章的第二部分中,我們建立了一個簡單的 LED 燈泡電路,並利用 Python 程式控制其明滅。但是除了控制明滅之外,是否也可以控制其明亮程度,以達到不一樣的應用?在這篇文章中,我們將分別利用電位器 (即俗稱的可變電阻) 以及 Python 程式搭配 PWM 的功能來控制 LED 燈泡的亮度,並討論兩者之差異。如果透過程式規律地控制 LED 燈泡的明亮程度,就是一般所謂的呼吸燈,可用來作用訊息提示或其他用途。

電位器

在早期常見的鎢絲燈泡檯燈中,往往附有一個璇紐,可以用來控制燈泡的亮度。如果是比較便宜的產品,很可能裡面就是一個電位器的元件。電位器有許多不同的樣子,我們這次使用的 B10K 是一般蠻常見的形式。

B10K 電位器

B10K 電位器

B10K 中的 10K,表示此電位器所能提供的最大電阻為 10K 歐姆,而 B 則表示這是 B 類電位器。既然有 B 類電位器,那是否有  A 類電位器呢? 答案是有的。B 類電位器的電阻值變化是線性的,而 A 類電位器則是非線性,所以我們在此使用 B 類的電位器。

電位器通常有三個接腳,其中兩端的電阻值是固定的。以 B10K 為例,兩端的電阻值固定就是 10K 歐姆。而隨者旋鈕位置的改變,中間與兩端接腳之間的電阻值也就隨之變化。如果中間接腳與其中一端接腳的電阻值為 8K 歐姆,則中間接腳至另一端接腳的電阻值就是 2K (10K – 8K) 歐姆。而根據歐姆定律,兩邊的電位差也就依電阻值的比例分配,所以稱為電位器。

電位器電位分配說明

電位器電位分配說明

不過在這次的範例中,我們需要的不是電位的改變,而且電阻值的變化,所以使用的接線方式有所不同。我們將一端接在中間接腳,另外一端則接在兩側任一接腳,也就是只使用了其中的兩個接腳,而這也是可變電阻名稱的由來。

這邊特別強調電位器與可變電阻兩個名稱,主要是可變電阻其實有很多種形式,像是光敏、熱敏、濕敏電阻都可以算是可變電阻的一種。雖然在中文上,可變電阻常常指的就是電位器。但是在其他文件 (尤其是英文文件),可變電阻所指的可能並不光是電位器一種,所以要小心解讀其意思。電位器的英文為 potentiometer,或者可以縮寫為 Pot。

因為這個範例一樣是控制 LED 燈泡,所以準備工作與 在 Raspberry Pi 3 Model B 建立 Python 3.6 環境 一致。如果你還沒有完成相關的準備,請務必先行完成再繼續進行後面的工作。

B10K 電位器線路圖

Raspberry Pi Model 3 B 利用電位器控制 LED 燈泡

Raspberry Pi Model 3 B 利用電位器控制 LED 燈泡

說明如下:

  • 如之前的說明,電位器兩端接腳間的電阻是固定的,所以我們在連結時須注意使用的是中間與左側的接腳。
  • LED 燈泡正極 (長腳) 連結至 Raspberry Pi GPIO 實體編號 7的腳位 (BCM 編號 4)。而負極  (短腳) 則先連結至電位器左側接腳,後再透過電位器的中間接腳連結至 GPIO 實體編號 6 的腳位 (接地)。

程式代碼

利用文字編輯器 (如 nano) 新增 Python 程式 potentiometer_led.py

內容如下

程式說明如下:

  1. 這個程式很簡單,就是讓 LED 燈泡正極 (長腳) 所接的腳位維持輸出在高電位,直到使用者中斷程式。

程式完成後,輸入下列指令執行程式

順利的話,就可以看到 LED 燈泡的開始發亮,此時我們可以透過旋轉電位器旋鈕來改變燈泡的亮度,如以下影片中所示:

電位器的缺點

雖然電位器簡單易用,但是使用時仍有以下缺點:

  • 首先,也就是最重要的問題是電位器很難用程式加以控制。電位器透過旋轉的動作改變其電阻,而這種動作並不是一般程式就可以容易達成的功能。
  • 利用電位器控制 LED 燈泡亮度時,只要穩定轉動旋鈕,產生的亮度就會穩定變化,而不會有忽然”跳耀”的情況發生。但是如果要精準地控制其亮度,通常就不是那麼容易達成了。
  • 一個電位器僅能用來控制一個 LED 燈泡,當我們需要獨立控制多個 LED 燈泡時就必須使用多個電位器。如此一來,不但增加電路的複雜度,再加上電位器通常擁有較大的體積,也使得電路無法有效的縮小。
  • 電位器是一個相對耗電的元件,在講求環保的時代,這往往不是一個最好的作法。

所以接下來我們就來看看如何利用 PWM 功能來達成同樣的目的。

PWM 脈衝寬度調變

Raspberry Pi 提供的 GPIO 接腳屬於數位類型,也就是只能輸出高電位 (3.3V) 與低電位 (0V)。而透過 PWM 的功能,可以提供 3.3V 與 0V 之間的模擬電壓。除了模擬電壓,PWM 也可以用來跟一些元件進行溝通,並控制其行為。像是伺服馬達 (Servo) 就是利用 PWM 來控制其旋轉角度。此外,PWM 也可以用在通訊協定上,應用範圍其實相當廣泛。

因為 Raspberry Pi 的 GPIO 輸出電壓是固定的 (3.3V),所以使用 PWM 功能時通常只有兩個需要調整的參數,也就是頻率跟所謂的 Duty Cycle。Duty Cycle 有很多種不同的中文翻譯,其中 “工作週期” 算是比較常見的說法,簡單來說,就是高電位佔用整個波形周期的比例。下圖分別呈現工作週期為 50% 與 25% 時的電位波形。

PWM 脈衝寬度調變

PWM 脈衝寬度調變

如果對於 PWM 的概念不是很能理解也別太緊張。在控制 LED 燈泡方面,只要記得工作週期越大燈泡就越亮,而工作週期越小時燈泡就越暗。

因為這個範例一樣是控制 LED 燈泡,所以準備工作與 在 Raspberry Pi 3 Model B 建立 Python 3.6 環境 一致。如果你還沒有完成相關的準備,請務必先行完成再繼續進行後面的工作。

PWM 控制 LED 燈泡電路圖

Raspberry Pi 3 Model B 與 LED 燈泡

Raspberry Pi 3 Model B 與 LED 燈泡

說明如下:

  • 在 Raspberry Pi 3 Model B 建立 Python 3.6 環境 這篇文章裡,我們直接將 LED 燈泡連結至 Raspberry Pi 的接腳時我提到那並不是一個安全的接法。一般比較建議的接法如此接線圖一般,也就是將 LED 燈泡串聯一個保護用的限流電阻。在這個範例中,我們使用的是 220  歐姆的電阻。
  • 請注意在上一個電位器的電路圖中,B10K 電位器雖然被當作可變電阻來使用,但並不算是限流用的電阻。因為其電阻值可能在 0~10K 歐姆之間變化,所以當電阻為 0 時,其實並沒有任何限流保護作用。
  • 電阻跟 LED 燈泡不一樣,是一個沒有方向性的元件。也就是連結時方向對調也沒有關係,不一定要依照色碼的方向,只要兩端連結至正確的接點即可。
  • LED 燈泡正極 (長腳) 連結至 Raspberry Pi GPIO 實體編號 12 的腳位 (BCM 編號 18)。而負極  (短腳) 則先連結至電阻後再透過電阻另一端連結至 GPIO 實體編號 6 的腳位 (接地)。

程式代碼

利用文字編輯器 (如 nano) 新增 Python 程式 pwm_led.py

內容如下

程式說明如下:

  1. 我們在此跳過與之前範例相同的部分,僅針對不同的地方加以說明。
  2. 第 1 行引入我們之前安裝過的 RPi.GPIO,此套件可提供 PWM 功能。
  3. 第 4 行定義 LED 正極所連結之腳位 BCM 編號。
  4. 第 5 行定義 PWM 所使用之頻率。
  5. 第 7 行定義使用 BCM 編號方式。
  6. 第 8 行將 LED 正極所連結之腳位定義為輸出。
  7. 第 10 行初始化一個 PWM 控制物件,並指定使用之腳位 (LED_PIN) 與頻率 (PWM_FREQ)。
  8. 第 11 行開始控制 PWM,其參數 0 表示工作週期為 0,也就是 LED 燈泡為熄滅的狀態。
  9. 第 16~21 行利用 pwm 物件的 ChangeDutyCycle() 函數設定工作週期進而改變 LED 燈泡的亮度。透過兩個 for 迴圈,讓 LED 燈泡先由熄滅逐漸增加亮度,然後再逐漸減低亮度直到熄滅。
  10. 第 25 行停止 pwm 功能。
  11. 第 26 行將程式所使用到的腳位回復至預設狀態,也就是輸入模式。

程式完成後,輸入下列指令執行程式

順利的話,就可以看到 LED 燈泡的開始發亮,並且亮度會不斷地增強並減弱,如以下影片中所示:

在這次的範例中,我們看到了如何在 Raspberry Pi 上利用 PWM 功能來控制 LED 燈泡的亮度。因為燈泡亮度變化有如人的呼吸一般有一定的節奏,所以這種應用又被稱為呼吸燈。呼吸燈常用於提醒功能,可以利用改變”呼吸”頻率來代表不同的訊息種類或重要程度。如果搭配全彩 LED 燈泡,更可以利用顏色的變化來提示不同種類的訊息。除此之外,透過與其他資訊的結合 (如撥放的音樂類型),亦可以達成情境光的應用。

Facebook 留言
Print Friendly, PDF & Email
Summary
在 Raspberry Pi 3 Model B 利用 PWM 控制 LED 亮度
Article Name
在 Raspberry Pi 3 Model B 利用 PWM 控制 LED 亮度
Description
在這篇文章中,我們將分別利用電位器 (即俗稱的可變電阻) 以及 Python 程式搭配 PWM 的功能來控制 LED 燈泡的亮度,並討論兩者之差異。如果透過程式規律的控制 LED 燈泡的明亮程度,就是一般所謂的呼吸燈,可用來作用訊息提示或其他用途。
Author
Publisher Name
Everlearn Studio
Publisher Logo