在嵌入式系統開發中,從輸入感知到物理致動的閉環控制是實現功能的核心。本篇文章接續前期鍵盤輸入的基礎,將焦點轉向輸出控制的關鍵組件——伺服馬達。我們將從理論層面解析脈衝寬度調變(PWM)的訊號機制,理解其如何將數位指令轉化為精確的機械運動。此過程不僅是單純的硬體操作,更是軟體定義硬體行為的體現。透過為 SG90 伺服馬達編寫專屬的 TinyGo 驅動程式,開發者將能深刻體驗底層驅動與硬體互動的細節,為建構更複雜的自動化與物聯網應用,如本文的智慧安全鎖,打下堅實的工程基礎。這種從理論到實作的整合能力,是高階硬體開發不可或缺的技能。
智慧安全鎖的建構:TinyGo、鍵盤與伺服馬達的整合(續)
玄貓深信,高科技養成不僅止於理論,更在於實踐與創新。在掌握了LED和按鈕的基礎控制後,本章將引導開發者進入更具挑戰性的領域:建構一個智慧安全鎖。這將結合4x4鍵盤的輸入、伺服馬達的精確控制,並深入探討序列埠通信在除錯中的關鍵作用。最終目標是實現一個能透過密碼解鎖的實用裝置。
尋找TinyGo驅動程式(續)
玄貓不應害怕在TinyGo的Gophers Slack頻道或GitHub Issue中提出問題。社群是一個寶貴的資源,可以幫助玄貓解決開發中遇到的困難。
重要提示:請勿在TinyGo官方頻道(如Slack或GitHub)中詢問任何與本書直接相關的問題。如果玄貓對本書內容有任何疑問,可以在配套的GitHub儲存庫中提出Issue,或直接透過電子郵件聯繫。
既然玄貓已經了解了鍵盤的工作原理以及如何尋找和貢獻驅動程式,接下來就可以進入安全鎖的下一個關鍵部分:控制伺服馬達。
控制伺服馬達
在能夠讀取鍵盤輸入之後,構建安全鎖還缺少一個關鍵組件:某種馬達。為此,玄貓將使用SG90伺服馬達。
儘管目前Arduino Uno上的時序精度對於SG90伺服馬達的精確角度控制可能不夠完美,但對於本專案的用途來說,這不是問題。玄貓只需要讓伺服馬達朝一個方向(例如順時針)移動即可。此外,目前TinyGo尚無SG90伺服馬達的官方驅動程式,因此玄貓將再次親手編寫一個!
理解SG90伺服馬達
SG90伺服馬達是透過**脈衝寬度調變 (PWM)**信號來控制的。其基本原理如下:
- PWM信號:SG90伺服馬達通常以50 Hz的頻率接收輸入信號,這意味著每個週期為20毫秒(1秒 / 50 Hz)。
- 脈衝寬度:在這個20毫秒的週期內,透過改變高電平脈衝的持續時間(即脈衝寬度或工作週期),可以告知伺服馬達調整到特定的角度。
- 角度與脈衝寬度對應:
- 1毫秒脈衝:通常對應於-90度(最左側)。
- 1.5毫秒脈衝:通常對應於0度(中心位置)。
- 2毫秒脈衝:通常對應於+90度(最右側)。
- 中間角度:透過調整脈衝寬度在1毫秒到2毫秒之間,可以實現伺服馬達在-90度到+90度之間的任何角度。對於本範例,玄貓不需要如此精確的控制。
SG90伺服馬達通常有三根線:
- 黑色/棕色線:接地 (GND)。
- 紅色線:電源 (VCC),通常為5V。
- 橙色/黃色線:PWM信號輸入。
建構伺服馬達電路
玄貓將在現有的鍵盤電路基礎上添加伺服馬達。
- 電源總線連接:
- 將Arduino Uno的5V引腳連接到麵包板的電源正極總線。
- 將Arduino Uno的GND引腳連接到麵包板的接地總線。
- SG90伺服馬達連接:
- 將SG90的GND線(黑色/棕色)連接到麵包板的接地總線。
- 將SG90的VCC線(紅色)連接到麵包板的電源正極總線。
- 將SG90的PWM信號線(橙色/黃色)連接到Arduino Uno的D11引腳。
@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 "5V" as Arduino5V
port "GND" as ArduinoGND
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
port "D11 (PWM)" as D11
}
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 "SG90 伺服馬達" as Servo {
port "VCC (紅)" as SVCC
port "GND (黑/棕)" as SGND
port "PWM (橙/黃)" as SPWM
}
rectangle "麵包板" as Breadboard {
junction P_Bus as PowerBus
junction G_Bus as GroundBus
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
}
Arduino5V -- PowerBus
ArduinoGND -- GroundBus
SVCC -- PowerBus
SGND -- GroundBus
SPWM -- D11
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
看圖說話:
此圖示展示了鍵盤與SG90伺服馬達共同連接到Arduino Uno的電路配置。麵包板的電源總線和接地總線分別由Arduino的5V和GND引腳供電。SG90伺服馬達的VCC和GND線連接到麵包板的電源總線,其PWM信號線則連接到Arduino的D11引腳。鍵盤的連接方式與之前相同,行引腳連接D3-D6,列引腳連接D7-D10。這個整合電路是實現智慧安全鎖的硬體基礎,D11引腳作為PWM輸出將用於控制伺服馬達的角度。
Arduino Uno上的PWM引腳
在Arduino Uno上,並非所有GPIO引腳都支援PWM功能。只有特定的引腳標有~符號,這些引腳才能產生PWM信號。
- Arduino Uno的PWM引腳:D3, D5, D6, D9, D10, D11。
玄貓選擇D11引腳來控制伺服馬達是符合要求的。
編寫伺服控制邏輯
玄貓需要為伺服馬達創建一個新的驅動程式套件。
- 專案結構:
- 在
Chapter03資料夾下,建立一個名為controlling-servo的新資料夾。 - 在
controlling-servo內部,建立main.go檔案(包含空的main函數)。 - 再建立一個名為
servo的子資料夾。 - 在
servo資料夾內,建立driver.go檔案,並將其套件名稱設定為servo。
your_project_root/
├── Chapter03/
│ └── controlling-servo/
│ ├── main.go
│ └── servo/
│ └── driver.go
注意:
- 目前TinyGo的PWM處理正在重構中。未來,處理PWM設備將會更加簡潔。
- 玄貓現在編寫的驅動程式主要目的是教學PWM的工作原理。它在非8位元AVR架構的微控制器上(如Arduino Uno上的ATmega328P)可能表現更好,因為AVR支援仍在實驗階段,但每次TinyGo發布都在改進。
- 一旦相關的Pull Request(如
tinygo-org/tinygo#1121)合併,玄貓建議使用基於硬體PWM支援的驅動程式來控制伺服馬達,以獲得更好的精度和穩定性。 - 在撰寫本文時,當伺服馬達到達最右側位置時,玄貓需要手動重置它。
在driver.go檔案中,玄貓將開始編寫讓伺服馬達轉動的邏輯。
解構從鍵盤輸入到伺服馬達控制的實踐路徑可以發現,真正的技術養成,並非僅是應用現成驅動程式,而是在面對如當前TinyGo在AVR架構上PWM支援的局限性時,親手將脈衝寬度調變(PWM)的理論轉化為具體控制邏輯。這種從抽象原理到硬體實踐的過程,不僅是解決問題,更是對系統底層運作一次深刻的內化。它迫使開發者跳脫單純的API呼叫,直面時序控制的核心挑戰,從而建立起更為扎實的工程思維。
未來,隨著TinyGo生態系的持續成熟與硬體抽象層的完善,軟體開發者駕馭硬體世界的門檻將顯著降低。這種軟硬整合的開發模式,將成為高階技術人才不可或缺的核心競爭力,讓創新不再受限於單一領域。
玄貓認為,這種在限制中尋求突破的實作修養,正是從「知道」邁向「做到」的關鍵一步,為未來應對更複雜的物聯網挑戰奠定堅實基礎。