維基少年:樹莓派/樹莓派 GPIO Zero 反射計時器
教程作者:Andrew Oakley
公有領域 2016 年 2 月 1 日
www.cotswoldjam.org
本 Python 程式設計教程向您展示瞭如何使用 LED 燈和按鈕以及新的 GPIO Zero 庫。
Words you will see on the screen, or that you need to type in, are highlighted like this.在每行末尾,您通常需要按下↵ Enter鍵。
您的導師應該已經為您準備好了樹莓派,並給了您一袋元件。如果沒有,請參閱末尾的“準備工作”部分。
| LED 始終需要與電阻器一起連線。如果您在沒有電阻器的情況下連線它們,它們會燒燬,而且很可能無法再次使用。 |

發光二極體 (LED) 是一種燈泡,具有短腳和長腳。如果您摸摸邊緣,還會發現一個平邊。短腳和平邊總是連線到負極(接地)。

電阻器 可以以任何方式連線。較低值(較低歐姆)的電阻器將允許更多電流透過,並使 LED 更亮;較高值將允許更少的電流透過,並使 LED 更暗。我們使用的是 270 歐姆電阻器,但 220-470 歐姆之間的任何電阻器都可以正常工作。

開關 可以以任何方式連線。按下時,它允許電流流動;鬆開時,電流停止。這種型別的按鈕稱為“瞬時按下接通開關”。
您還應該有一個麵包板和一些跳線。您應該有 3 根長的公對母線(一端突出,另一端凹陷),以及 1 根短的公對公線(兩端突出)。


| 不要擔心線的顏色 - 本教程的作者是色盲。 |
按照所示連接面包板。
麵包板允許我們快速構建電子電路的原型(即測試)。該板具有頂部部分和底部部分。每部分的所有垂直孔都相互連線,因此如果您將東西插入垂直列,它們將形成連線。
樹莓派使用兩組編號來指代通用輸入輸出引腳(GPIO 引腳)。
“板編號”只是從左下角的 1 開始,一直向上和向右,一直到 40。
“BCM 編號”(Broadcom 編號)是樹莓派處理器識別引腳連線的方式。
GPIO Zero 使用 BCM 編號。
- 將 LED 的短腳連線到接地連線。
- 將電阻器連線到 LED 的長腳。
- 將電阻器的另一端連線到引腳16 (GPIO 23)。
開啟樹莓派電源,進入桌面。
從選單中選擇程式設計 - Python 3。然後使用檔案,新建視窗建立新程式。
輸入以下程式,或者您可以使用檔案,開啟開啟 python/reaction 資料夾中的 led.py 程式。
from gpiozero import LED
from time import sleep
led=LED(23)
led.on()
sleep(2)
led.off()
使用檔案,儲存將此程式儲存為 led.py,然後透過選擇執行選單,執行模組來執行它。
您應該看到 LED 亮起 2 秒,然後熄滅。
不工作?檢查一下:
- GPIO引腳是否正確
- LED的正負極是否正確;短腿接地 (GND)
- 元件是否在麵包板上的正確垂直列上
- 沒有拼寫錯誤,沒有缺少括號,並且你使用了圓括號而不是尖括號、花括號或方括號
這個程式在做什麼?
[edit | edit source]from gpiozero import LED
from time import sleep
前兩行告訴計算機學習一個新東西。計算機可以從其他人編寫的程式中學習,我們稱這些其他程式為“庫”。我們的指令告訴計算機從 GPIOZero 庫學習關於 LED 的知識,並從 time 庫學習關於休眠的知識。
led=LED(23)
然後,我們建立一個 LED 物件。我們說 LED 連線到 GPIO 23。
led.on()
sleep(2)
led.off()
開啟 LED,等待 2 秒,然後關閉 LED。
檢測按鈕
[edit | edit source]電路
[edit | edit source]
現在新增按鈕和連線線。
短跳線應從與現有接地線相同的列,到連線到按鈕一條腿的列。
剩下的長跳線應從連線到按鈕另一條腿的列,到 **引腳 18 (GPIO 24)** Raspberry Pi 上。
程式
[edit | edit source]在 Python 3 中,使用 檔案,新建視窗 建立一個新程式。鍵入以下程式,或者也可以使用 檔案,開啟 開啟 python/reaction 資料夾中的 button.py 程式。
from gpiozero import Button
from signal import pause
def press():
print ( "Button PRESSED!" )
def unpress():
print ( "Button unpressed!" )
button = Button(24)
button.when_released = unpress
button.when_pressed = press
pause()
縮排在 Python 中很重要。例如,你必須在 print 單詞之前鍵入兩個空格。這些縮排定義了一個程式碼塊,因此有了 def 這個詞。
使用 檔案,儲存 將此程式儲存為 button.py,然後透過選擇 執行 選單,執行模組 來執行它。
按住按鈕。Python 3 shell 視窗中應該顯示 "Button PRESSED!" 。
鬆開按鈕。應該顯示 "Button unpressed!" 。你可以多次按住並鬆開按鈕。
透過選擇 Shell 選單,重啟 shell 來停止程式。
這個程式在做什麼?
[edit | edit source]def press():
print ( "Button PRESSED!" )
def unpress():
print ( "Button unpressed!" )
這些稱為函式。它們定義 (def) 應該發生的事情,併為該操作命名。程式碼縮排以表明它屬於該函式。press() 函式顯示 "Button PRESSED!" ,unpress() 函式顯示 "Button unpressed!" 。
button = Button(24)
button.when_released = unpress
button.when_pressed = press
在這裡,我們設定一個按鈕物件並告訴計算機它連線到 GPIO 24。
我們還告訴計算機,當按鈕被按下或鬆開時該怎麼做。
pause()
這告訴計算機等待事件發生,例如按鈕按下。
按鈕和 LED 結合
[edit | edit source]在 Python 3 中,使用 檔案,新建視窗 建立一個新程式。
鍵入以下程式,或者也可以使用 檔案,開啟 開啟 python/reaction 資料夾中的 led-button.py 程式。
from gpiozero import Button, LED
from signal import pause
def press():
print ( "Button PRESSED!" )
led.on()
def unpress():
print ( "Button unpressed!" )
led.off()
led=LED(23)
led.off()
button=Button(24)
button.when_released=unpress
button.when_pressed=press
pause()
使用 檔案,儲存 將此程式儲存為 led-button.py,然後透過選擇 執行 選單,執行模組 來執行它。
按下按鈕,LED 應該亮起;鬆開按鈕,它應該熄滅。
透過選擇 Shell 選單,重啟 shell 來停止程式。
反應時間器
[edit | edit source]在 Python 3 中,使用 檔案,新建視窗 建立一個新程式。
鍵入以下程式,或者也可以使用 檔案,開啟 開啟 python/reaction 資料夾中的 reaction.py 程式。
from gpiozero import LED, Button
from signal import pause
from random import uniform
from time import time, sleep
timestarted=None
def press():
global timestarted,led,button
print ( "Reaction time: %.3f" % (time()-timestarted) )
led.off()
sleep(2)
reset()
def reset():
global timestarted,led
sleep(uniform(0.5,3))
led.blink(0.1,0.4,4,False)
led.on()
timestarted=time()
led=LED(23)
led.off()
button=Button(24)
button.when_pressed=press
reset()
pause()
使用 檔案,儲存 將此程式儲存為 reaction.py ,然後透過選擇 執行 選單,執行模組 來執行它。
LED 將閃爍四次,然後在第五次閃爍時,它將保持亮起,直到你按下按鈕。
嘗試在第五次閃爍亮起時儘快按下按鈕。
你將看到你的反應時間,以秒為單位。
你可以玩多少次都可以,嘗試挑戰你的朋友看看誰的反應最快。玩夠了之後,透過選擇 Shell 選單,重啟 shell 來停止程式。
這個程式在做什麼?
[edit | edit source]我們在反應程式中引入了幾個新概念。
我們使用一個名為 timestarted 的值來記錄第五次閃爍開始的時間。然後,我們可以將它與使用者按下按鈕的時間進行比較,這將告訴我們反應時間。
像 timestarted 這樣被命名的值稱為 **變數**,因為它們包含的實際值可能會改變。
有些變數是 **全域性** 的。這意味著它們可以在程式的任何地方使用。
print ( "Reaction time: %.3f" % (time()-timestarted) )
%.3f 告訴計算機列印一個小數,小數點後有 3 位小數。
我們要列印的數字是現在的時間值減去最後一次閃爍開始的時間值。這是以秒為單位測量的。
sleep(uniform(0.5,3))
uniform 命令在這裡用於在 0.5 到 3 之間選擇一個隨機數。它可能會選擇一個小數而不是整數。該命令稱為 uniform ,因為如果你呼叫它足夠多次,你將得到一個均勻的隨機數分佈,你最終將獲得該範圍內所有可能的數字。
led.blink(0.1,0.4,4,False)
此命令告訴 LED 閃爍 0.1 秒,然後等待 0.4 秒,然後重複 4 次。
最後一個值 False 告訴它在繼續執行下一個命令之前等待完成。如果你使用 True ,它會在繼續閃爍的同時開始執行下一個命令!我們在這裡不希望這樣。
你可以在以下網站找到更多關於 GPIO Zero 命令的資訊:http://pythonhosted.org/gpiozero
準備工作
[edit | edit source]本教程需要以下電子元件
- 1× 麵包板 - 迷你 170 點
- 1× LED - 5mm 漫射通孔,紅色
- 1× 電阻 - 碳膜 270 歐姆通孔
- 1× 開關 - 2 針觸覺按鈕通孔
- 3× 公對母跳線 - 20 釐米
- 1× 公對公跳線 - 10 釐米
本教程的檔案可以在以下網站找到:http://www.cotswoldjam.org/downloads/2016-01/
你需要 Raspbian Jessie,包括 Python 3、IDLE 和 GPIO Zero。一旦你安裝了 Raspbian Jessie 並連線了網際網路,你可以透過進入 選單,附件,終端 並鍵入以下命令來確保所有其他檔案都已安裝:
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install python3-gpiozero wget
mkdir –p ~/python
cd python
wget http://www.cotswoldjam.org/downloads/2016-01/reaction-timercode.zip
unzip reaction-timer-code.zip
exit
dist-upgrade 可能需要一段時間,如果你的系統最近沒有更新,可能需要半小時。如果 apt-get 告訴你已經安裝了軟體包,不要擔心。
檔案
[edit | edit source]本教程的原始 PDF 檔案位於 Wikicommons 上:Cjam-reaction-tutorial.pdf
button.py
[edit | edit source]from gpiozero import Button
from signal import pause
def press():
print ( "Button PRESSED!" )
def unpress():
print ( "Button unpressed!" )
button = Button(24)
button.when_released = unpress
button.when_pressed = press
pause()
led.py
[edit | edit source]from gpiozero import LED
from time import sleep
led=LED(23)
led.on()
sleep(2)
led.off()
from gpiozero import Button, LED
from signal import pause
def press():
print ( "Button PRESSED!" )
led.on()
def unpress():
print ( "Button unpressed!" )
led.off()
led=LED(23)
led.off()
button=Button(24)
button.when_released=unpress
button.when_pressed=press
pause()
from gpiozero import LED, Button
from signal import pause
from random import uniform
from time import time, sleep
timestarted=None
def press():
global timestarted,led,button
print ( "Reaction time: %.3f" % (time()-timestarted) )
led.off()
sleep(2)
reset()
def reset():
global timestarted,led
sleep(uniform(0.5,3))
led.blink(0.1,0.4,4,False)
led.on()
timestarted=time()
led=LED(23)
led.off()
button=Button(24)
button.when_pressed=press
reset()
pause()