在嵌入式系統開發的學習路徑中,從控制單一 LED 或按鈕的基礎 I/O 操作,進階到整合多個複雜周邊裝置,是提升實務能力的關鍵一步。本專案不僅是硬體組裝,更著重於軟體層面的挑戰,特別是在資源受限的微控制器環境下,如何建立穩健的除錯機制與撰寫可維護的硬體驅動程式。本文將以建構智慧安全鎖為例,系統性地展示序列埠通信作為除錯骨幹的應用,並深入剖析矩陣鍵盤的掃描演算法。此過程不僅能鞏固開發者對底層硬體互動的理解,也為後續開發更複雜的物聯網應用奠定堅實的理論與實踐基礎。

智慧安全鎖的建構:TinyGo、鍵盤與伺服馬達的整合

玄貓深信,高科技養成不僅止於理論,更在於實踐與創新。在掌握了LED和按鈕的基礎控制後,本章將引導開發者進入更具挑戰性的領域:建構一個智慧安全鎖。這將結合4x4鍵盤的輸入、伺服馬達的精確控制,並深入探討序列埠通信在除錯中的關鍵作用。最終目標是實現一個能透過密碼解鎖的實用裝置。

核心技術與學習目標

本章將涵蓋以下關鍵主題:

  • 序列埠通信:學習如何向微控制器序列埠寫入資訊,以及如何在電腦端監控這些資訊,這對於除錯和狀態監測至關重要。
  • 鍵盤輸入監測:掌握從4x4矩陣鍵盤讀取按鍵輸入的方法,並為其編寫驅動程式。
  • 伺服馬達控制:理解伺服馬達的工作原理,並學習如何透過TinyGo精確控制其角度,以實現鎖定/解鎖功能。
  • 整合應用:將上述技術整合,建構一個完整的密碼安全鎖系統。

技術要求與所需組件

為了完成這個專案,玄貓將需要以下硬體組件:

  • 一個Arduino Uno開發板
  • 一個4x4薄膜鍵盤
  • 一個SG90伺服馬達
  • 一個紅色LED(用於指示錯誤或鎖定狀態)
  • 一個綠色LED(用於指示正確或解鎖狀態)
  • 14條跳線
  • 兩個220歐姆電阻(用於LED限流)
  • 一個麵包板

序列埠通信:微控制器除錯的利器

在微控制器開發中,由於缺乏傳統的圖形化除錯介面,序列埠通信成為了除錯程式和監測運行狀態最直接有效的方法。透過向序列埠輸出文字訊息,玄貓可以追蹤程式執行流程、變數值,甚至模擬簡單的用戶介面。

寫入序列埠

玄貓將從一個簡單的程式開始,學習如何向序列埠寫入訊息。

  1. 專案結構:在Chapter03資料夾下,建立一個名為writing-to-serial的新資料夾,並在其中建立main.go檔案。
your_project_root/
├── Chapter03/
│ └── writing-to-serial/
│ └── main.go
  1. 程式碼範例
package main

import (
"time"
)

func main() {
// 1. 輸出啟動訊息
print("啟動中 ") // print 不會自動換行
print("程式\n") // \n 用於手動換行

// 2. 無限循環,每秒輸出 "Hello World"
for {
println("Hello World") // println 會自動換行
time.Sleep(1 * time.Second)
}
}

注意

  • print()函數僅將文字寫入序列埠,不會自動添加換行符。
  • println()函數在輸出文字後會自動添加換行符。
  1. 燒錄程式:使用tinygo flash命令將程式燒錄到Arduino Uno。
tinygo flash --target=arduino Chapter03/writing-to-serial/main.go

燒錄成功後,微控制器將開始向其序列埠發送這些訊息。

監控序列埠

為了查看微控制器發送的訊息,玄貓需要在電腦端使用序列埠監控工具。PuTTY是一個跨平台且功能強大的工具,非常適合此用途。

安裝PuTTY
  • Linux:透過套件管理器安裝。
sudo apt install putty
  • macOS:透過Homebrew安裝。
brew install putty
  • Windows:從官方網站下載.msi安裝檔並執行。
使用PuTTY監控序列埠
  1. 確保程式已燒錄並連接:確認之前編寫的程式已成功燒錄到Arduino Uno,並且Arduino Uno透過USB線連接到電腦。
  2. 啟動PuTTY並配置
  • 啟動PuTTY。
  • 在「Session」類別中,選擇「Serial」作為「Connection type」。
  • 配置序列埠參數
  • Serial line:這是最關鍵的設定。
  • Windows:通常是COMx(例如COM0COM5)。可以在「裝置管理員」的「連接埠(COM 和 LPT)」部分找到正確的COM埠。
  • Linux/macOS:通常是/dev/ttyACM0/dev/ttyUSB0
  • Speed:通常設定為115200(這是Arduino預設的序列埠通訊速率)。
  • 開啟連接:點擊「Open」按鈕。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

actor "開發者 (玄貓)" as Developer

rectangle "電腦端" as PC {
component "PuTTY" as Putty
component "TinyGo IDE/終端" as IDE
}

rectangle "微控制器端" as Microcontroller {
component "Arduino Uno" as Arduino
component "TinyGo 應用程式" as TinyGoApp
component "序列埠硬體" as SerialHardware
}

Developer -- IDE : 編寫/燒錄程式
IDE --> Arduino : 燒錄 TinyGoApp

TinyGoApp --> SerialHardware : 輸出 `print()`/`println()`
SerialHardware --> PC : USB 連接
PC --> Putty : 讀取序列埠數據

Developer -- Putty : 監控除錯訊息

note right of Putty
配置 PuTTY:
- 連線類型: Serial
- 序列埠: COMx (Win) /dev/ttyACM0 (Linux/Mac)
- 速率: 115200
end note

@enduml

看圖說話:

此圖示描繪了透過序列埠進行微控制器除錯的流程。開發者(玄貓)在電腦端使用TinyGo IDE或終端編寫並將TinyGo應用程式燒錄到Arduino Uno微控制器。燒錄完成後,TinyGo應用程式會透過微控制器內建的序列埠硬體輸出除錯訊息(例如使用print()println()函數)。這些訊息透過USB連接傳輸到電腦端。在電腦端,開發者使用PuTTY等序列埠監控工具來讀取並顯示這些訊息,從而實現對微控制器運行狀態的即時監控和除錯。圖中也特別標註了PuTTY的關鍵配置參數,如連線類型、序列埠名稱和通訊速率。

一旦成功連接,PuTTY視窗將顯示Arduino Uno發送的「啟動中 程式」和每秒一次的「Hello World」訊息。這證明了序列埠通信的建立,為玄貓的除錯工作提供了強大的工具。

智慧安全鎖的建構:TinyGo、鍵盤與伺服馬達的整合(續)

玄貓深信,高科技養成不僅止於理論,更在於實踐與創新。在掌握了LED和按鈕的基礎控制後,本章將引導開發者進入更具挑戰性的領域:建構一個智慧安全鎖。這將結合4x4鍵盤的輸入、伺服馬達的精確控制,並深入探討序列埠通信在除錯中的關鍵作用。最終目標是實現一個能透過密碼解鎖的實用裝置。

序列埠通信:微控制器除錯的利器(續)

監控序列埠(續)

玄貓已經學會了如何啟動PuTTY並配置序列埠參數。為了方便日後重複使用,我們可以儲存這個配置。

  1. 儲存配置
  • 在「Saved Sessions」欄位中輸入一個名稱,例如「Microcontroller」。
  • 點擊「Save」按鈕。 這個動作將把當前的序列埠設定(COM埠、速率等)儲存起來,下次可以直接載入使用。
  1. 載入並開啟會話
  • 在「Saved Sessions」列表中選擇「Microcontroller」。
  • 點擊「Open」按鈕。 這樣就可以快速啟動一個已配置好的序列埠監控會話。
  1. 查看程式輸出: 開啟會話後,將彈出一個新的終端視窗,顯示Arduino Uno透過序列埠發送的訊息,例如「啟動中 程式」和每秒一次的「Hello World」。

透過這些步驟,玄貓現在已經完全掌握了如何監控微控制器程式的序列埠輸出,這為未來的除錯工作提供了極大的便利。

監測鍵盤輸入:自訂驅動程式的實踐

接下來,玄貓將學習如何從4x4鍵盤讀取輸入,並將按下的按鈕訊息列印到序列埠。由於TinyGo目前可能沒有內建的4x4鍵盤驅動程式,這將是一個絕佳的機會來學習如何為不受支援的硬體創建自訂驅動程式。玄貓將透過這個過程深入理解硬體互動的底層原理。

建構鍵盤電路

首先,玄貓需要將4x4鍵盤連接到Arduino Uno。雖然可以直接用跳線連接,但透過麵包板連接更便於日後擴展。

所需組件

  • 一個4x4薄膜鍵盤
  • 八條跳線

連接步驟

  1. 連接鍵盤行線至Arduino數位引腳(輸出)
  • Arduino數位引腳D3連接到麵包板A32。
  • Arduino數位引腳D4連接到麵包板A31。
  • Arduino數位引腳D5連接到麵包板A30。
  • Arduino數位引腳D6連接到麵包板A29。
  1. 連接鍵盤列線至Arduino數位引腳(輸入)
  • Arduino數位引腳D7連接到麵包板A28。
  • Arduino數位引腳D8連接到麵包板A27。
  • Arduino數位引腳D9連接到麵包板A26。
  • Arduino數位引腳D10連接到麵包板A25。
  1. 將鍵盤的引腳連接到麵包板
  • 鍵盤引腳0連接到麵包板E32。
  • 鍵盤引腳1連接到麵包板E31。
  • 鍵盤引腳2連接到麵包板E30。
  • 鍵盤引腳3連接到麵包板E29。
  • 鍵盤引腳4連接到麵包板E28。
  • 鍵盤引腳5連接到麵包板E27。
  • 鍵盤引腳6連接到麵包板E26。
  • 鍵盤引腳7連接到麵包板E25。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

actor "開發者 (玄貓)" as Developer

rectangle "Arduino Uno" as Arduino {
port "D3" as D3
port "D4" as D4
port "D5" as D5
port "D6" as D6
port "D7" as D7
port "D8" as D8
port "D9" as D9
port "D10" as D10
}

rectangle "4x4 鍵盤" as Keypad {
port "Pin 0 (Row 0)" as K_R0
port "Pin 1 (Row 1)" as K_R1
port "Pin 2 (Row 2)" as K_R2
port "Pin 3 (Row 3)" as K_R3
port "Pin 4 (Col 0)" as K_C0
port "Pin 5 (Col 1)" as K_C1
port "Pin 6 (Col 2)" as K_C2
port "Pin 7 (Col 3)" as K_C3
}

rectangle "麵包板" as Breadboard {
junction J_A32 as A32
junction J_A31 as A31
junction J_A30 as A30
junction J_A29 as A29
junction J_A28 as A28
junction J_A27 as A27
junction J_A26 as A26
junction J_A25 as A25

junction J_E32 as E32
junction J_E31 as E31
junction J_E30 as E30
junction J_E29 as E29
junction J_E28 as E28
junction J_E27 as E27
junction J_E26 as E26
junction J_E25 as E25
}

D3 -- A32
D4 -- A31
D5 -- A30
D6 -- A29
D7 -- A28
D8 -- A27
D9 -- A26
D10 -- A25

K_R0 -- E32
K_R1 -- E31
K_R2 -- E30
K_R3 -- E29
K_C0 -- E28
K_C1 -- E27
K_C2 -- E26
K_C3 -- E25

A32 -- E32
A31 -- E31
A30 -- E30
A29 -- E29
A28 -- E28
A27 -- E27
A26 -- E26
A25 -- E25

note "鍵盤行線 (Pin 0-3) 連接 Arduino D3-D6" as NoteRows
note "鍵盤列線 (Pin 4-7) 連接 Arduino D7-D10" as NoteCols
NoteRows -[hidden]-> NoteCols

@enduml

看圖說話:

此圖示詳細展示了4x4鍵盤與Arduino Uno之間的電路連接。鍵盤的八個引腳(四行四列)透過麵包板連接到Arduino Uno的數位引腳D3到D10。其中,鍵盤的行引腳(Pin 0-3)連接到Arduino的D3-D6,將在程式中被配置為輸出;而鍵盤的列引腳(Pin 4-7)連接到Arduino的D7-D10,將被配置為輸入。麵包板作為中間橋樑,使得連接更加整潔有序,並為未來可能添加的元件預留了空間。這種連接方式是實現鍵盤矩陣掃描的基礎。

理解4x4鍵盤的工作原理

在編寫驅動程式之前,玄貓需要深入理解4x4鍵盤的內部結構和工作方式。

  • 物理結構:一個4x4鍵盤由四行和四列組成,總共有16個按鈕。它通常有八個引腳,其中四個用於連接行,另外四個用於連接列。
  • 矩陣掃描:鍵盤內部,行線和列線是相互連接的。當一個按鈕被按下時,它會閉合對應的行線和列線之間的電路。
  • 讀取機制:微控制器透過矩陣掃描技術來檢測哪個按鈕被按下。其基本原理是:
  1. 設定行線為輸出:一次將一行設定為高電平(或低電平),而其他行設定為低電平(或高電平)。
  2. 讀取列線為輸入:同時監測所有列線的狀態。
  3. 檢測按鍵:如果某列線的電平發生變化(例如,當行線為高電平時,某列線也變為高電平),則表示該行與該列交叉點的按鈕被按下。
  • 供電:由於鍵盤本身不直接連接到GND和VCC,微控制器需要透過GPIO引腳提供電源(高電平)來驅動行線,並讀取列線的電平變化。這就是為什麼有四個引腳作為輸出(驅動行),四個引腳作為輸入(讀取列)的原因。

例如,按鈕「1」位於第0行第0列。當第0行被設定為高電平,並且微控制器檢測到第0列也變為高電平時,就表示按鈕「1」被按下了。

透過理解這個矩陣掃描原理,玄貓就可以著手編寫程式碼,透過逐行掃描和逐列讀取的方式,精確判斷哪個按鈕被按下。這將是建構鍵盤驅動程式的核心邏輯。

評估此發展路徑的長期效益後,本章的技術實踐不僅是完成一個專案,更是對高階技術人才核心能力的深度投資。建立序列埠監控,相當於為職涯發展植入一套精準的自我覺察與反思機制,確保前進的每一步都清晰可控。

其真正的價值分野,在於挑戰自訂鍵盤驅動程式。相較於直接調用現成函式庫的「應用者」思維,親手解構矩陣掃描原理並轉化為程式碼,是從「知其然」到「知其所以然」的根本性跨越。這個過程所磨練出的,是一種超越特定框架、可遷移的系統建構能力,這正是區分資深架構師與一般工程師的關鍵。

展望未來,隨著軟硬整合趨勢深化,能夠跨越抽象層、直接與硬體高效對話的人才將具備高度策略價值。今日在鍵盤驅動上的深度修煉,正是為明日應對更複雜系統整合挑戰的必要儲備。

玄貓認為,這種刻意繞過捷徑、回歸本質的實踐路徑,是建立系統性解決方案思維的必要投資,更是通往真正技術領導力的基石。