How can we help you today?
【制動】DC馬達 | Motor
簡介
直流馬達(DC Motor)是機器人最強勁的「雙腿」,負責提供移動所需的動力。在日常生活中,舉凡電動機車的驅動、掃地機器人的行走,甚至是工廠裡的傳動輸送帶,都是直流馬達的應用。透過調整電力輸出(PWM),我們可以精確控制馬達的轉速與前進、後退方向。本文件將帶領你掌握四輪驅動底盤的控制邏輯,讓你的機器人能像真實車輛一樣流暢地馳騁與旋轉,實現從簡單移動到複雜競技的無限可能。
直流馬達控制是建立移動機器人的基礎。dual2s 函式庫不僅提供單一馬達(Motor 類別)的精細控制,更進一步開發了 GoSUMO 運動控制類別,專為四輪驅動(4WD)底盤設計。透過這個架構,開發者可以輕鬆處理多個馬達之間的協同動作,無論是使用高抓地力胎進行推力競技,或是搭配麥克納姆輪進行全向移動,都能透過直覺的指令完成。
硬體配置
- 驅動通道:
dual2s支援 4 組獨立的 DC 馬達輸出(M1, M2, M3, M4)。 - 控制方式:採用高解析度的 PWM(脈衝寬度調變)技術,數值範圍為 0 到 1023。
- 腳位定義:直接引用
DUAL2S_HW預設腳位,確保硬體相容性:- M1 ~ M4:每組包含 A、B 兩路訊號,負責控制正反轉。
核心功能說明
- 運動組合控制
GoSUMO.act(): 這是一個高層次的控制函式,會自動計算四個馬達應有的轉向與速度。- 運動模式:支援
FORWARD(前進)、BACKWARD(後退)、LEFT(左移/旋轉)、RIGHT(右移/旋轉)等指令。 - 速度設定:透過第二個參數(0-1023)直接給定馬達出力大小,數值越高扭力與轉速越大。
- 運動模式:支援
- 單體馬達控制
mX.act(): 當需要更細膩的非典型動作(如原地繞圈或特定機構運動)時,可以直接操作個別馬達物件。- 轉向定義:使用
CW(順時針)與CCW(逆時針)進行控制。
- 轉向定義:使用
- 安全停止機制
stop(): 無論是個別馬達或是整合底盤,皆具備stop()函式。在程式初始化(setup)或邏輯切換間,呼叫停止指令是確保機器人不會因異常訊號而意外暴衝的重要習慣。
開發重點建議
- 動力平衡:直流馬達會因電量、齒輪箱摩擦力差異導致四輪轉速不完全一致,若發現車體前進時偏向,可微調各輪 PWM 數值補償。
- 電源管理:四顆馬達同時運作時電流消耗極大。測試高負載動作(如相撲推擠)時,請務必確認電池電壓充足,避免系統因欠壓而重啟。
- 阻斷 vs 非阻斷:範例中使用
delay()進行計時運動,在實戰開發中建議改用millis()邏輯,以便在移動的同時持續讀取超音波或紅外線感測器。
dual2s控制器與環境
AI學伴
互動(1):基於函數庫 – dual2s
互動(2):基於範例程式
👉 你也可以在dual2s函數庫(./example/basic)中找到此範例程式。
/*=====================================================================================
yesio.net / 2026.03.12 / by nick
# Filename:06_dcMotors.ino
# Function:4通道直流(DC)馬達與GoSUMO車體運動之使用範例,
Examples of dual2S's application in 4 DC-Motors & GoSUMO motion control.
# Toolchain & Libs:ESP32 Arduino Core v3.3.5 (ESP-IDF v5.1), dual2s
======================================================================================*/
#include "dual2s.h"
// 引用 M1 ~ M4 的預設 A/B 腳位
Motor m1(DUAL2S_HW::M1A, DUAL2S_HW::M1B);
Motor m2(DUAL2S_HW::M2A, DUAL2S_HW::M2B);
Motor m3(DUAL2S_HW::M3A, DUAL2S_HW::M3B);
Motor m4(DUAL2S_HW::M4A, DUAL2S_HW::M4B);
//GoSUMO為四驅運動模式(抓地胎 or 麥克納姆倫)
//將宣告完成的4個DC-Motor物件指向GoSUMO物件中使用。
GoSUMO GoSUMO(&m1, &m2, &m3, &m4);
void setup() {
// 停止所有馬達確保安全
GoSUMO.stop();
}
void loop() {
//馬達轉速以PWM控制, PWM數值範圍 0-1023
//參數順序:轉向, PWM數值
GoSUMO.act(GoSUMO::FORWARD, 600); // 以 600 速度前進 2 秒
delay(2000);
// 停止
GoSUMO.stop();
delay(1000);
//指定單顆DC-Motor轉動
//參數順序:轉向, PWM數值
m1.act(Motor::CW, 900); //Motor-1 PWM 800 順時針旋轉
m3.act(Motor::CCW, 200); //Motor-3 PWM 200 逆時針旋轉
delay(3000);
//旋轉3秒後停止
m1.stop();
m3.stop();
while(1);
}
