Raspberry Pi HAT 標準定義了擴充板的規格,包含尺寸、形狀以及必要的 EEPROM 晶片。EEPROM 連線到 GPIO 介面的 ID_SD 和 ID_SC 引腳,未來可供 Raspberry Pi 進行組態和軟體自動載入。Perma-Proto Pi HAT 是一款根據 HAT 標準的原型板,方便開發者建立和測試擴充板。它具備標準 HAT 尺寸、形狀和 EEPROM 晶片,並提供原型區域和電源軌道。程式設計 EEPROM 需要啟用 I2C 埠,並使用 i2cdetect 命令確認 EEPROM 連線。接著,使用 eepmake 工具將設定檔轉換為二進位制檔案,再使用 eepflash 工具將檔案寫入 EEPROM。最後,可以使用 eepdump 工具驗證寫入結果。除了 HAT 標準,文章也介紹了 Raspberry Pi Zero 和 Pi Zero W 的設定,以及如何使用 Python 和 gpiozero 函式庫控制 LED 燈,並提醒讀者注意 GPIO 操作的安全性。

Raspberry Pi HAT標準介紹

Raspberry Pi HAT(Hardware Attached on Top)是一種為了讓開發者能夠輕鬆地建立和安裝擴充板而制定的標準。這個標準定義了擴充板的大小、形狀,以及必須包含一個電可擦可程式唯讀記憶體(EEPROM)晶片。這個EEPROM晶片連線到GPIO介面的ID_SD和ID_SC引腳,未來將允許對Raspberry Pi進行一些組態,甚至可以在啟動時自動載入軟體。

Perma-Proto Pi HAT介紹

Perma-Proto Pi HAT是一種根據HAT標準的原型板,提供了一個便捷的方式來建立和測試您的Raspberry Pi擴充板。這個板子具有標準的HAT尺寸和形狀,並且包含了一個EEPROM晶片。原型區域由一些電源軌道和一組類別似麵包板的佈局組成,包括兩行五個孔以及兩側的電源軌道。

程式設計EEPROM

如果您想要在EEPROM中新增自定義資訊,您需要程式設計EEPROM。首先,您需要啟用隱藏的I2C埠,用於存取EEPROM。為此,您需要編輯/boot/config.txt檔案,並新增以下內容:

dtparam=i2c_vc=on

然後重新啟動您的Raspberry Pi。重新啟動後,您可以使用i2c工具來檢測EEPROM是否已經連線到I2C匯流排:

$ i2cdetect -y 0

這個命令將顯示I2C匯流排上的裝置列表,包括EEPROM。

Mermaid 圖表:HAT標準架構

  flowchart TD
    A[EEPROM] --> B[I2C匯流排]
    B --> C[GPIO介面]
    C --> D[Raspberry Pi]
    D --> E[HAT擴充板]

圖表翻譯:

上述Mermaid圖表展示了HAT標準的架構,包括EEPROM、I2C匯流排、GPIO介面、Raspberry Pi和HAT擴充板之間的關係。這個圖表說明瞭EEPROM如何連線到I2C匯流排,然後透過GPIO介面連線到Raspberry Pi,最終實作HAT擴充板的功能。

使用 I2C 通訊協定與 EEPROM 的互動

在進行 I2C 通訊協定與 EEPROM 的互動時,瞭解裝置的地址是非常重要的。透過 i2cdetect 命令,可以發現 EEPROM 的 I2C 地址為 50。注意到,這裡使用了 -y 0 選項,而不是通常的 -y 1,因為這不是標準的 I2C 匯流排(位於 pin 2 和 3),而是一條專門為 HAT EEPROM 裝置的 I2C 匯流排。

讀寫 EEPROM 的步驟

要讀寫 EEPROM,需要下載並使用一些工具。首先,切換到 hats/eepromutils 目錄,並編譯工具:

$ cd hats/eepromutils
$ make

寫入 EEPROM 是一個三步驟的過程。第一步,編輯 eeprom_settings.txt 檔案,至少修改 product_idproduct_versionvendorproduct 欄位,以反映您的公司名稱和產品名稱。注意,這個檔案中還有許多其他選項,包括指定反向供電選項、使用的 GPIO 引腳等,這些都很好地被檔案本身所檔案化。

第二步,在編輯完檔案後,執行以下命令將文字檔案轉換為適合寫入 EEPROM 的檔案(rom_file.eep):

$./eepmake eeprom_settings.txt rom_file.eep

這個命令會開啟 eeprom_settings.txt 檔案進行讀取,然後生成一個可以寫入 EEPROM 的二進位制檔案 rom_file.eep

內容解密:

上述命令 ./eepmake eeprom_settings.txt rom_file.eep 的作用是將文字格式的設定檔案轉換為二進位制格式,以便寫入 EEPROM。這一步驟非常重要,因為它確保了設定資訊可以被 EEPROM 正確地理解和儲存。

圖表翻譯:

  flowchart TD
    A[編輯 eeprom_settings.txt] --> B[執行./eepmake]
    B --> C[生成 rom_file.eep]
    C --> D[寫入 EEPROM]

此圖表展示了從編輯設定檔案到生成可寫入 EEPROM 的二進位制檔案的過程,最後一步是將這個二進位制檔案寫入 EEPROM。

使用EEPROM工具寫入ROM檔案

為了將ROM檔案寫入EEPROM,玄貓使用了以下命令:

sudo./eepflash.sh -w -f=rom_file.eep -t=24c32

這個命令會將rom_file.eep檔案寫入EEPROM中,地址為0x50。寫入完成後,需要重新啟動系統。

驗證寫入結果

為了驗證寫入結果,玄貓使用了以下命令:

$ sudo./eepflash.sh -r -f=read_back.eep -t=24c32
$./eepdump read_back.eep read_back.txt

第一個命令會從EEPROM中讀取資料並儲存到read_back.eep檔案中。第二個命令會將read_back.eep檔案轉換成文字檔案read_back.txt

Raspberry Pi HAT設計

如果您想要設計自己的Raspberry Pi HAT,可以參考Raspberry Pi HAT設計。市場上也有許多現成的HAT模組,例如Adafruit的Stepper Motor、Capacitive Touch和16-Channel PWM HATs,以及Pimoroni的Explorer HAT Pro。

Raspberry Pi Zero和Pi Zero W

Raspberry Pi Zero和Pi Zero W是小型且低成本的單板電腦,非常適合嵌入式電子專案。Pi Zero W增加了WiFi和Bluetooth功能,使其適合於小型IoT專案。下圖顯示了一個Raspberry Pi Zero。

設定Pi Zero和Pi Zero W

Pi Zero和Pi Zero W通常不附帶header pins,需要自己焊接。可以購買Pi Zero啟動套件,包含適合的header pins。也可以購買預先焊接header pins的版本,但價格較高。另外,也有所謂的hammer pins,不需要焊接即可使用。

設定Pi Zero的USB連線

由於Pi Zero只有一個USB連線口,需要使用USB介面卡和USB hub才能同時連線WiFidongle、鍵盤和滑鼠,以便設定Pi Zero。

Raspberry Pi 的 GPIO 控制

Raspberry Pi 的通用輸入輸出(GPIO)聯結器允許使用者控制電子元件。為了維持與舊款 26 針 Raspberry Pi 模型的相容性,本章節中的所有麵包板範例僅使用 26 個與兩種 GPIO 佈局都相同的頂部針腳。

連線 LED

問題:您想知道如何將 LED 連線到 Raspberry Pi。 解決方案:使用 470Ω 或 1kΩ 的串聯電阻限制電流,將 LED 連線到其中一個 GPIO 針腳。為了完成這個食譜,您需要以下元件:

  • 麵包板和跳線(見「原型裝置和套件」)
  • 470Ω 電阻(見「電阻和電容」)
  • LED(見「光電子元件」)

圖 10-1 顯示如何使用無焊麵包板和公對母跳線將 LED 線接。

圖 10-1. 將 LED 連線到 Raspberry Pi 連線 LED 後,我們需要使用 Python 命令來控制它的開關。 從終端啟動 Python 控制檯並輸入以下命令:

$ sudo python3
>>> from gpiozero import LED
>>> led = LED(18)
>>> led.on()
>>> led.off()

這將在 led.on() 命令後開啟 LED,然後在 led.off() 命令後關閉它。

討論:LED 是產生光的非常有用、廉價且高效的方式,但您必須小心使用它們。如果它們直接連線到電壓源(如 GPIO 輸出),且電壓大於約 1.7 伏,則會吸收大量電流。這通常足以損壞 LED 或提供電流的裝置——如果您的 Raspberry Pi 提供電流,這不是一件好事。

您應該始終在 LED 和電壓源之間使用串聯電阻,以限制透過 LED 的電流量,從而確保 LED 和驅動它的 GPIO 針腳的安全。

Raspberry Pi 的 GPIO 針腳保證只提供約 3mA 或 16mA 的電流(取決於板卡和使用的針腳數量),請參考食譜 9.1。

內容解密:

上述 Python 程式碼使用 gpiozero 函式庫來控制 LED。LED 類別代表一個 LED 元件,on()off() 方法分別用於開啟和關閉 LED。LED(18) 建立了一個連線到 GPIO 針腳 18 的 LED 物件。

圖表翻譯:

此圖示展示瞭如何將 LED 連線到 Raspberry Pi 的 GPIO 針腳。LED 的正極(長腿)連線到 GPIO 針腳,負極(短腿)透過串聯電阻連線到地線。這個串聯電阻限制了透過 LED 的電流,防止損壞。

  flowchart TD
    A[LED 正極] -->|連線到|> B[GPIO 針腳]
    B -->|透過串聯電阻|> C[地線]
    C -->|連線到|> D[LED 負極]

此圖表顯示了 LED、GPIO 針腳、串聯電阻和地線之間的連線關係。

LED 燈控制

LED 燈是一種常見的電子元件,廣泛應用於各種電子裝置中。在 Raspberry Pi 上控制 LED 燈的亮滅可以透過 GPIO 引腳實作。

選擇適合的電阻

當使用 LED 燈時,需要一個電阻來限制流經 LED 的電流。表 10-1 列出了不同型別的 LED 燈和適合的電阻值。

LED 型別電阻值電流 (mA)
紅色470Ω3.5
紅色1kΩ1.5
橙色、黃色、綠色470Ω2
橙色、黃色、綠色1kΩ1
藍色、白色100Ω3
藍色、白色270Ω1

控制 LED 燈的亮滅

要控制 LED 燈的亮滅,可以使用 Python 程式。以下是使用 gpiozero 函式庫控制 LED 燈的範例:

from gpiozero import LED
from time import sleep

led = LED(18)
while True:
    led.on()
    sleep(0.5)
    led.off()
    sleep(0.5)

這個程式會使 LED 燈每秒亮滅一次。

LED 類別也有一個 blink 方法,可以用來控制 LED 燈的亮滅。以下是範例:

from gpiozero import LED

led = LED(18)
led.blink(0.5, 0.5, background=False)

blink 方法的第一個引數是亮滅時間,第二個引數是暗滅時間。第三個引數 background 是選擇性的,如果設為 True,則程式會在背景執行,允許其他命令在前景執行。

背景執行

如果要在背景執行 LED 燈的亮滅,可以使用 background=True 引數。以下是範例:

from gpiozero import LED

led = LED(18)
led.blink(0.5, 0.5, background=True)

這樣可以讓程式在背景執行,同時允許其他命令在前景執行。

內容解密:

以上程式碼使用 gpiozero 函式庫控制 LED 燈的亮滅。LED 類別提供了 onoffblink 方法,用來控制 LED 燈的狀態。blink 方法可以用來控制 LED 燈的亮滅時間和暗滅時間。

圖表翻譯:

以下是 LED 燈控制程式的流程圖:

  flowchart TD
    A[開始] --> B[初始化 LED]
    B --> C[設定亮滅時間]
    C --> D[設定暗滅時間]
    D --> E[開始亮滅]
    E --> F[等待亮滅時間]
    F --> G[關閉 LED]
    G --> H[等待暗滅時間]
    H --> E

這個流程圖展示了 LED 燈控制程式的執行流程。

使用Python控制LED燈

背景

在使用Raspberry Pi進行電子製作時,控制LED燈是一個基本的應用。透過使用Python語言和gpiozero函式庫,可以輕鬆地控制LED燈的狀態。

控制LED燈

以下是一個簡單的範例,展示如何使用Python控制LED燈:

from gpiozero import LED

led = LED(18)  # 將LED燈連線到GPIO 18

led.blink(0.5, 0.5, background=True)  # 讓LED燈以0.5秒的間隔閃爍
print("Notice that control has moved away - hit Enter to continue")

input()  # 等待使用者輸入

print("Control is now back")

led.off()  # 關閉LED燈

input()  # 等待使用者輸入

在這個範例中,LED燈被設定為以0.5秒的間隔閃爍,並且在背景中執行。當使用者按下Enter鍵時,程式會繼續執行,並列印預出"Control is now back"。最後,LED燈被關閉。

安全考慮

在使用GPIO引腳時,需要注意安全問題,以避免意外短路損壞Raspberry Pi。幸運的是,gpiozero函式庫會自動將GPIO引腳設為安全的輸入狀態當程式離開。

與以前的方法比較

以前的方法,例如RPi.GPIO函式庫,需要手動呼叫清理函式來設定GPIO引腳為安全的輸入狀態。否則,當程式離開後,GPIO引腳可能仍然保持輸出狀態,從而導致意外短路。

內容解密:
  • led = LED(18):建立一個LED物件,並將其連線到GPIO 18。
  • led.blink(0.5, 0.5, background=True):讓LED燈以0.5秒的間隔閃爍,並在背景中執行。
  • input():等待使用者輸入。
  • led.off():關閉LED燈。

圖表翻譯:

  flowchart TD
    A[開始] --> B[設定LED燈]
    B --> C[讓LED燈閃爍]
    C --> D[等待使用者輸入]
    D --> E[關閉LED燈]
    E --> F[結束]

這個流程圖展示了程式的執行流程,從設定LED燈到關閉LED燈。

Raspberry Pi HAT標準的出現,大幅降低了開發者建立客製化硬體擴充的門檻。分析Raspberry Pi HAT的架構與EEPROM的整合方式,可以發現此標準巧妙地利用了I2C通訊協定和GPIO介面,簡化了硬體組態的流程,同時也為未來的軟體自動載入和系統組態預留了空間。然而,目前HAT標準的普及度仍受限於市場上HAT模組的種類別和數量。雖然Adafruit和Pimoroni等廠商已推出一些HAT產品,但要建構更完整的生態系統,仍需更多廠商和社群的共同投入。玄貓認為,隨著Raspberry Pi Zero等低成本、易於整合的產品線的普及,HAT標準將在嵌入式系統和物聯網領域扮演越來越重要的角色,未來可望見到更多創新應用和商業模式的誕生。