維基少年:樹莓派/樹莓派 LED 生日蠟燭
由安德魯·奧克利撰寫教程
公有領域 2015 年 4 月 17 日
www.cotswoldjam.org
本教程將向您展示如何使用樹莓派計算機構建一個基於 LED(光)和光電二極體(光檢測器)的生日蠟燭。
您將能夠“吹滅”LED - 它將關閉並播放一首曲子!
Words you will see on the screen are highlighted like this
Words you need to type in are highlighted and underlined在每行末尾,您通常需要按 ↵ Enter 鍵。
您的導師應該已經為您準備好了您的樹莓派。如果沒有,請參閱文末的“準備”部分。
| LED 始終需要與電阻一起連線。如果您在沒有電阻的情況下連線它們,它們會燒壞,並且可能無法再次使用。 |

LED(發光二極體)有一個短腿和一個長腿。如果您在邊緣周圍摸摸,您還會發現一個平坦的邊緣。短腿和平坦的邊緣始終連線到負極(接地)。

電阻可以以任何方式連線。我們使用的是 270 歐姆(紅紅棕)電阻,但 220-470 歐姆之間的任何電阻都可以正常工作。

光敏電阻 (LDR) 也稱為光電二極體或光敏電阻,可以以任何方式連線。當有更多光線時,它們讓更多電流透過。我們使用的是一個額定值為 2 到 20,000 歐姆的電阻,但大多數在愛好者工具包中找到的光電二極體都可以正常工作。
| 電容器如果接線錯誤,可能會斷裂。請務必仔細檢查正負聯結器是否正確! |

電容器有一個短腿和一個長腿,以及一側的條紋。與 LED 一樣,它們必須使用短腿和條紋連線到負極(接地)。我們使用的是 1 微法拉電容器,您也應該使用它。
電容器儲存少量的電荷,然後當它充滿時,它會釋放所有電荷。
- 如果您將其連線到強電荷,它會更快地釋放電荷。
- 如果您將其連線到弱電荷,它需要更長時間才能釋放電荷。

跳線(也稱為 DuPont 線)將電子元件連線到 GPIO 引腳。您還應該有兩根短跳線和一根長跳線(全部為“母對母” - 兩端都有孔)。
| 重要 - 將光電二極體彎曲以朝向光線。您需要彎曲光電二極體的頂部,使其“面向”LED。請參閱照片以獲取示例。 |
按照以下步驟構建電路。首先放置元件,最後放置跳線。不用擔心回形針,現在還不需要。

以下是您在插入跳線之前面包板應該是什麼樣子的。

以下是連線了跳線的麵包板。
當元件從工廠出來時,它們有長腿(線)。您的導師可能已經修剪了您元件的腿,在這種情況下,您無需再次修剪。如果您的元件有長腿,那麼在您剪斷它們之前,您應該透過將其連線到樹莓派並執行程式來試用您的電路。
如果您需要修剪腿部,您可以使用廚房剪刀或特殊的剪線工具。無論哪種方式,在剪斷元件的腿部時都要小心。
- 不要將腿部修剪得太短,以至於它們不伸入麵包板孔中。
- 對於 LED 和電容器,請記住您可以使用 LED 邊緣或電容器條紋來區分正負,即使您將兩條腿都修剪到相同的長度。
| 在切割時,金屬會飛出,並且在靠近眼睛時非常危險 - 在剪斷腿部時,請戴上護目鏡或將元件放在茶巾下。 |
按照圖表連線跳線。
Raspberry Pi 的 GPIO 埠上的引腳編號如下。在舊型號上,只有 26 個引腳,但它們仍然從左側的 1 和 2 開始。
頂行是偶數,底行是奇數。
啟動你的 Raspberry Pi,登入並進入桌面。如果你需要登入,預設使用者名稱是 pi,密碼是 raspberry。如果桌面仍然沒有出現,輸入 startx 並按下 ↵ Enter 鍵。
從選單中選擇程式設計 - Python 2(不是 Python 3)。然後使用檔案,新建視窗建立一個新程式。點選檔案,另存為並透過雙擊 python 然後雙擊 candle 進入 python/candle 資料夾。儲存為:mycandle.py
讓我們從點亮 LED 開始。輸入以下程式,或從示例資料夾中的 mycandle1.py 載入它
import RPi.GPIO as GPIO, time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
pin_write=7
GPIO.setup(pin_write, GPIO.OUT)
GPIO.output(pin_write, GPIO.HIGH)
time.sleep(2)
GPIO.output(pin_write, GPIO.LOW)
使用檔案 - 儲存儲存程式。現在保持 Python 視窗開啟,並透過進入主桌面選單 - 附件 - 終端啟動一個終端會話。你應該看到一個黑色視窗開啟。
在終端中,輸入
cd python/candle
sudo python mycandle.py
你應該看到 LED 亮起兩秒鐘,然後程式結束。你可以透過再次輸入 sudo python mycandle.py 來重複程式。
讓我們快速看看這個程式在做什麼。
import 命令告訴計算機使用由其他人編寫的另一個程式的部分。這些其他程式稱為庫。我們呼叫兩個庫;GPIO,它允許我們使用 GPIO 引腳,以及 time,它包含 sleep 命令,我們使用它來等待兩秒鐘。
如果程式卡住了,按住 CTRL 鍵並按 C。然後檢查你的接線和程式中的拼寫。
如果程式有效,它將點亮 LED 一秒鐘,然後開始計數。然後它會說出計數是多少。小計數表示亮,大計數表示暗。
嘗試用手指擋住光電管執行程式。嘗試使用一些黑色卡片將光電管置於陰影中。如果你在光線充足的房間裡嘗試這個,房間的燈光可能比 LED 更強大——稍後我們將使用回形針和卡片製作一個遮光罩。
在程式中,你可以看到,在我們使用 GPIO.setup(pin_read, GPIO.IN) 將其設定為輸入之前,我們短暫地(0.1 秒)將 pin_read 設定為輸出並將電壓設定為低,只是為了清除連線上的任何電壓。
然後我們開始計數。我們有一個新的變數 reading,我們將其設定為零。
然後程式迴圈執行,直到它檢測到來自電容器的高電壓,每次檢測到高電壓時都會將 reading 計數加一。當它檢測到高電壓時,它會結束迴圈並打印出 reading 的值。
我們將使用一小塊卡片擋板來檢測呼吸。我們將用回形針製作一個 U 形環,然後從它上面懸掛一小塊卡片。
我們將把那個環和卡片放在 LED 和光電管之間,並確保當我們吹它時,它可以被吹走。
我們還將在光電管上放一個罩子,這樣它只能看到來自 LED 的光。我們將使用另外兩個更大的回形針 U 形環來固定卡片。回形針在電子麵包板中非常方便,因為它們可以牢固地安裝在孔中!
仔細觀察下面的照片,並製作你自己的罩子與擋板。
你的導師可能已經將你的回形針彎曲並剪下到合適的尺寸。如果沒有,在你剪斷回形針到合適的長度時,要小心飛濺的金屬。
擋板由以下部分製成
- 一塊大約 2 釐米 × 1 釐米 的黑色卡片
- 一個大約 1.5 釐米 高、1.5 釐米 寬的回形針環
- 輕輕地彎曲卡片的一端(彎曲不要摺疊)放在環上,使用少量粘性膠帶將其鬆散固定。記住它必須是鬆散而精緻的,以便在你吹它時可以擺動。如果你把它粘得太緊,它就不會擺動,也不會起作用。
罩子由以下部分製成
- 一塊大約 4.5 釐米 × 2 釐米 的黑色卡片
- 兩個大約 2.5 釐米 高、1.5 釐米 寬的回形針環
- 只需輕輕地彎曲卡片,並用環固定住它
|
|
|
| 無法播放此檔案?請參閱 媒體幫助。 | |
最終程式基於第二個測試程式
- 它設定 GPIO 引腳並點亮 LED。
- 它進行一些“校準”——它會計算出“黑暗”的讀數,即擋板關閉時的讀數。
- 它迴圈執行,等待一個新的讀數,該讀數明顯低於校準讀數。這個較低的讀數應該意味著光電管上的光線要多得多——因此擋板已經被吹走了!
- 有一個變數
sensitivity控制讀數必須降低多少才能使程式檢測到擋板被吹走。預設情況下,它設定為 50%,但你可以更改它。記住,如果程式卡住了,你可以使用 CTRL+C 來停止你的程式。 - 當程式檢測到光線時,它會播放 1893 年的曲子“Good Morning To All”。這首曲子已經不受版權保護,但你可能決定自行承擔風險,用一些與生日相關的歌詞一起演唱。這個程式輸入起來比較長,所以如果你願意,可以從
examples資料夾中載入它,檔名是candle.py。
#!/usr/bin/env python
# Raspberry Pi GPIO Birthday Candles by Andrew Oakley aoakley.com Public Domain 2015
# Adapted from "Basic Photocell Reading" by Adafruit
# Import the libraries we will be using
import RPi.GPIO as GPIO, time, os
# RPi.GPIO - for controlling GPIO pins
# time - for waiting
# os - for calling the music program
# Set up the GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
pin_read=12 # GPIO 18
pin_write=7 # GPIO 4
# Sensitivity, in percent
sensitivity=50
def timeLowHigh ():
# This times how long it takes for a pin to go from low to high.
# It is handy for reading variable resistance using a capacitor.
# If the capacitor fills slowly, there is high resistance.
# Photocells are a type of variable resistor. When there is low light, then there is high resistance.
# Therefore long time = darker, short time = lighter
# Try using a 1 microfarad capacitor and a 2-20K ohm photocell.
# Reset the reading to zero
reading = 0
# Reset the pin to low - we briefly set it to output
GPIO.setup(pin_read, GPIO.OUT)
GPIO.output(pin_read, GPIO.LOW)
# Brief sleep just to let it settle on low
time.sleep(0.01)
# Now change the pin back to an input
GPIO.setup(pin_read, GPIO.IN)
# This takes about 1 millisecond per loop cycle
while (GPIO.input(pin_read) == GPIO.LOW):
reading += 1
return reading
def calibrate():
# This turns on the LED and works out what the
# "normal" level of dimness is with the LED on.
# Turn on the LED
GPIO.setup(pin_write, GPIO.OUT)
GPIO.output(pin_write, GPIO.HIGH)
# Read the dimness lots of times over 3 seconds
# and keep a running tally of the average
print ("Calibrating...")
dimness=timeLowHigh()
t=time.time()
while time.time() < t+2:
c=timeLowHigh()
print "calibration: %05d now: %05d" % (dimness, c)
dimness=( dimness+c )/2
return dimness
# Record what normal dimness is
normal_dimness=calibrate()
while True:
# Find out what the dimness is now
dimness_now=timeLowHigh()
# Print out the values
print("dimness normal: %05d now: %05d target: %05d" % (normal_dimness, dimness_now, normal_dimness*(sensitivity/100.0) ))
# Has the dimness fallen below the target?
if dimness_now < normal_dimness*(sensitivity/100.0) :
GPIO.output(pin_write, GPIO.LOW)
print ("Good Morning to All!")
os.system('omxplayer good-morning-to-all.ogg')
normal_dimness=calibrate()
和以前一樣,透過切換到終端視窗並輸入 sudo python candle.py 或 mycandle.py(取決於你的命名方式)來執行程式。
程式將以迴圈方式執行。要停止它,按住 CTRL 鍵並按 C。
如果您的輔導老師沒有為您準備樹莓派和裝置,或者您沒有輔導老師,您可以在開始之前按照以下說明進行設定。
您需要
- 執行Raspbian作業系統的樹莓派。本教程適用於迄今為止的所有型號,包括A,A+,B,B+和2B。
- 無焊麵包板 - 我們使用的是一個小型170點麵包板,但任何無焊麵包板都可以。
- 一個LED。我們使用的是一個5mm黃色的LED。它需要足夠亮以觸發光敏電阻,因此黃色、綠色或白色通常比紅色或藍色效果更好。
- 一個光敏電阻,也稱為光電阻。我們使用的是一個4mm 2-20k歐姆光敏電阻。
- 四根母對母跳線,每根至少20釐米長。
- 兩根短的公對公跳線,每根約2-6釐米。我們使用的是實心線。
- 三根曲別針,剪成U形。
- 兩小塊黑色卡片;一塊約4.5×2釐米,另一塊約2×1釐米。
請使用最新版本的Raspbian安裝。本教程編寫於2015年4月,當時最新推薦的Raspbian映象的日期為2015-02-16。您可以透過進入終端(選單 - 附件 - 終端)並輸入以下命令來建立資料夾結構並下載檔案
cd
mkdir python
cd python
curl -O http://www.cotswoldjam.org/downloads/2015-04/candle.tgz
tar xvzf candle.tgz
…其中-O是減號後面跟著大寫字母O(不是數字零)。
原始PDF在維基共享資源上:Cjam-led-candle-tutorial.pdf
#!/usr/bin/env python
import RPi.GPIO as GPIO, time, os
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
pin_write=7
GPIO.setup(pin_write, GPIO.OUT)
GPIO.output(pin_write, GPIO.HIGH)
time.sleep(2)
GPIO.output(pin_write, GPIO.LOW)
import RPi.GPIO as GPIO, time
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
pin_write=7
pin_read=12
GPIO.setup(pin_write, GPIO.OUT)
GPIO.output(pin_write, GPIO.HIGH)
time.sleep(1)
GPIO.setup(pin_read, GPIO.OUT)
GPIO.output(pin_read, GPIO.LOW)
time.sleep(0.01)
GPIO.setup(pin_read, GPIO.IN)
reading=0
while (GPIO.input(pin_read) == GPIO.LOW):
reading += 1
print "Reading: %d" % reading
GPIO.output(pin_write, GPIO.LOW)
|
|
|
| 無法播放此檔案?請參閱 媒體幫助。 | |

