跳轉到內容

維基少年:樹莓派/樹莓派 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 根短的公對公線(兩端突出)。

點亮 LED

[編輯 | 編輯原始碼]

按照所示連接面包板。

麵包板允許我們快速構建電子電路的原型(即測試)。該板具有頂部部分和底部部分。每部分的所有垂直孔都相互連線,因此如果您將東西插入垂直列,它們將形成連線。

樹莓派使用兩組編號來指代通用輸入輸出引腳(GPIO 引腳)。

“板編號”只是從左下角的 1 開始,一直向上和向右,一直到 40。

“BCM 編號”(Broadcom 編號)是樹莓派處理器識別引腳連線的方式。

GPIO Zero 使用 BCM 編號。

  1. 將 LED 的短腳連線到接地連線。
  2. 將電阻器連線到 LED 的長腳。
  3. 將電阻器的另一端連線到引腳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()

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()

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()
華夏公益教科書