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_id
、product_version
、vendor
和 product
欄位,以反映您的公司名稱和產品名稱。注意,這個檔案中還有許多其他選項,包括指定反向供電選項、使用的 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 燈每秒亮滅一次。
使用 blink
方法
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
類別提供了 on
、off
和 blink
方法,用來控制 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標準將在嵌入式系統和物聯網領域扮演越來越重要的角色,未來可望見到更多創新應用和商業模式的誕生。