Skip to main content
< All Topics
Print

【制動】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 兩路訊號,負責控制正反轉。

核心功能說明

  1. 運動組合控制 GoSUMO.act(): 這是一個高層次的控制函式,會自動計算四個馬達應有的轉向與速度。
    • 運動模式:支援 FORWARD(前進)、BACKWARD(後退)、LEFT(左移/旋轉)、RIGHT(右移/旋轉)等指令。
    • 速度設定:透過第二個參數(0-1023)直接給定馬達出力大小,數值越高扭力與轉速越大。
  2. 單體馬達控制 mX.act(): 當需要更細膩的非典型動作(如原地繞圈或特定機構運動)時,可以直接操作個別馬達物件。
    • 轉向定義:使用 CW(順時針)與 CCW(逆時針)進行控制。
  3. 安全停止機制 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); 
}
Table of Contents