センサー・アクチュエータ

モーター(DC / ステッピング / サーボ)

回転・位置制御に使うアクチュエータ。

概要

モーターは電気エネルギーを回転運動(または直線運動)に変換するアクチュエータです。組み込みシステムでは主に以下の3種類が使われます。

**DCモーター(直流モーター)**は最もシンプルなモーターで、直流電圧を印加すると回転します。PWMで電圧を制御して回転速度を調整します。ブラシ付きDCモーター(有ブラシ)とブラシレスDCモーター(BLDC)があります。構造が単純で安価ですが、位置制御にはエンコーダーとフィードバック制御が必要です。

**ステッピングモーター(Stepper Motor)**は、パルス信号1つごとに一定の角度(ステップ角:1.8°が標準)だけ回転します。パルス数を管理することでエンコーダーなしで位置制御できる(オープンループ制御)ため、3Dプリンター・CNCに広く使われます。ただし高速・高負荷時に脱調(ステップミス)するリスクがあります。

**サーボモーター(Servo Motor)**はモーター+エンコーダー+ドライバーをパッケージ化したシステムです。フィードバック制御(クローズドループ)により、正確な位置・速度・トルク制御が可能です。ラジコン用の低コストサーボ(PWM制御)から、産業用ACサーボまで幅広いラインナップがあります。

歴史・背景

電気モーターは1831年のマイケル・ファラデーによる電磁回転実験が起源で、1880〜90年代にテスラが交流誘導モーターを実用化しました。ステッピングモーターは1950〜60年代に航空宇宙・計算機機器向けに開発され、1970〜80年代のフロッピーディスクドライブ・プリンターの普及とともに量産化されました。

ブラシレスDCモーター(BLDC)は1960年代に実用化が始まり、1990年代以降はハードディスクドライブ・CDドライブで大量生産されました。2000年代後半のマルチコプタードローン(DJI等)の普及が組み込み向けBLDCモーターの進化を大幅に加速させ、現在では安価で高性能なBLDCとESC(電子スピードコントローラー)が容易に入手できます。

産業用サーボモーターは1960〜70年代から発展し、日本のファナック・安川電機・三菱電機等が高性能製品を開発。1980〜90年代のデジタルサーボ化により制御精度が飛躍的に向上しました。

技術仕様

DCモーターの主要スペック

パラメータ説明
定格電圧(V)正常動作する印加電圧
定格電流(A)定格負荷時の電流
ストール電流(A)停止時の最大電流(定格の5〜10倍)
無負荷回転数(RPM)無負荷時の最大回転数
ストールトルク(N·m)停止直前の最大トルク
逆起電力定数 Kv(RPM/V)BLDCの特性値(1V印加時のRPM)
モーター定数 Km(N·m/√W)電力あたりのトルク効率

ステッピングモーターの主要スペック

パラメータ 代表値
ステップ角
マイクロステッピング
保持トルク
相電流(A/相)
コイル抵抗(Ω/相)
インダクタンス(mH/相)
相数

代表的なモータードライバICの比較

IC対応モーター最大電流電源電圧インターフェース
L298NDC/ステッパー(2ch)2A/ch5〜35VPWM + DIR
DRV8833DC(2ch)/ステッパー(1ch)1.5A/ch2.7〜10.8VPWM(2本/ch)
TB6612FNGDC(2ch)/ステッパー1.2A(3.2Apeak)2.5〜13.5VPWM + DIR
A4988ステッパー2A(35V以下)8〜35VSTEP/DIR
DRV8825ステッパー2.5A(45V以下)8.2〜45VSTEP/DIR
TMC2209ステッパー(静音)2A4.75〜29VSTEP/DIR+UART
VESCBLDC/ACサーボ100A+8〜100VCAN/UART

動作原理

DCモーターの電気的モデル

DCモーターの動作は電気方程式と機械方程式で記述されます。

電気方程式:
V = R×I + L×(dI/dt) + Ke×ω

機械方程式:
J×(dω/dt) = Kt×I - B×ω - T_load

V: 印加電圧[V]
R: 電機子抵抗[Ω], L: インダクタンス[H]
I: 電流[A], ω: 角速度[rad/s]
Ke: 逆起電力定数[V·s/rad] ≈ Kt(SI単位系では等しい)
Kt: トルク定数[N·m/A]
J: 慣性モーメント[kg·m²], B: 粘性摩擦[N·m·s/rad]

定常状態(dI/dt = 0, dω/dt = 0):
ω = (V - R×I) / Ke
T = Kt × I = Kt × (V - Ke×ω) / R

ステッピングモーターの駆動方式

バイポーラ型2相ステッピングモーターの各駆動方式:

1-2相励磁(ハーフステップ):
ステップ:  1    2    3    4    5    6    7    8
A相電流:  +I   +I    0   -I   -I   -I    0   +I
B相電流:   0   +I   +I   +I    0   -I   -I   -I
→ ステップ角: 1.8° / 2 = 0.9°(滑らかな動き)

マイクロステッピング(1/16ステップの場合):
A相: sin(θ) × I_max
B相: cos(θ) × I_max
θ を 360°/200/16 ≈ 0.113° ずつ変化させる
→ TMC2209等のドライバICがストレート電流波形を生成

BLDCモーター(ブラシレスDC)の制御

BLDCモーターはブラシの代わりに電子的に位相を切り替える必要があります(ESC: Electronic Speed Controller)。

3相BLDCの6ステップ転流(トラペゾイダル制御):
    U相  V相  W相
1:   +    -    0
2:   +    0    -
3:   0    +    -
4:   -    +    0
5:   -    0    +
6:   0    -    +

ホールセンサー(3個)で回転子位置を検出 → 転流タイミングを決定

FOC(Field Oriented Control):
より高性能な制御方式
クラーク変換 + パーク変換でd-q軸制御
→ 低速・高トルク・効率が大幅に向上

PID制御によるDCモーター速度制御

typedef struct {
    float Kp, Ki, Kd;
    float integral;
    float prev_error;
    float output_min, output_max;
} PID_t;

float pid_update(PID_t *pid, float setpoint, float measured, float dt) {
    float error = setpoint - measured;
    
    pid->integral += error * dt;
    // インテグレータワインドアップ防止
    if (pid->integral > pid->output_max / pid->Ki)
        pid->integral = pid->output_max / pid->Ki;
    if (pid->integral < pid->output_min / pid->Ki)
        pid->integral = pid->output_min / pid->Ki;
    
    float derivative = (error - pid->prev_error) / dt;
    pid->prev_error = error;
    
    float output = pid->Kp * error + pid->Ki * pid->integral + pid->Kd * derivative;
    
    // 出力クリッピング
    if (output > pid->output_max) output = pid->output_max;
    if (output < pid->output_min) output = pid->output_min;
    
    return output;
}

// モーター速度制御ループ
void motor_control_loop(void) {
    static PID_t pid = {.Kp=1.0f, .Ki=0.1f, .Kd=0.05f,
                         .output_min=-100, .output_max=100};
    
    float setpoint_rpm = 500.0f;
    float measured_rpm = encoder_get_rpm();
    float dt = 0.001f;  // 1ms制御周期
    
    float duty = pid_update(&pid, setpoint_rpm, measured_rpm, dt);
    motor_set_pwm_percent(duty);  // -100%〜+100%(正逆転)
}

用途・ユースケース

3Dプリンター・CNC加工機

ステッピングモーター(通常NEMA 17、1.8°/step)をA4988/DRV8825/TMC2209等のドライバーでマイクロステッピング制御します。RepRapファームウェア(Marlin)がSTM32/AVR上で動作し、G-codeを解釈してモーターを制御します。

3Dプリンターの軸解像度例:
ステップ角: 1.8°, マイクロステッピング: 1/16
ベルト/プーリー: GT2ベルト(2mm/周), 20歯プーリー(40mm/回転)

1ステップの移動量:
= (40mm / 200ステップ) × (1/16)
= 0.0125mm/ステップ = 12.5μm

ドローン・マルチコプター

BLDCモーター(KV値数百〜数千RPM/V)をESC(PWM信号で制御)で駆動します。4軸ドローンでは4個のモーターの回転数差で姿勢・移動を制御します。IMUセンサーフュージョンによるPID制御が不可欠です。

自律走行ロボット

差動駆動(2輪)または全方位駆動(メカナムホイール)に直流モーター+エンコーダーを使います。エンコーダーのパルスカウントでオドメトリ(距離・方向推定)を行い、IMUと組み合わせた位置推定で自律走行します。

産業用ロボットアーム

6軸垂直多関節ロボットに各軸1台のACサーボモーター(エンコーダー内蔵)を使います。CANbusまたはEtherCATでモーションコントローラーと接続します。位置分解能は数十万カウント/回転が一般的です。

電動補助自転車(e-Bike)・電動スクーター

ハブモーター(ホイール内蔵BLDCモーター)またはミッドドライブモーター(クランク付近のBLDC)にFOC制御を適用します。バッテリー管理・踏力センサーとのセンサーフュージョンでアシスト量を制御します。

実装・開発のポイント

ステッピングモーター(A4988)の基本制御

#include "stm32f4xx_hal.h"

#define STEP_PIN  GPIO_PIN_0  // PA0
#define DIR_PIN   GPIO_PIN_1  // PA1
#define EN_PIN    GPIO_PIN_2  // PA2(LOW=有効)

void stepper_init(void) {
    HAL_GPIO_WritePin(GPIOA, EN_PIN, GPIO_PIN_RESET);  // 有効化
}

// steps: ステップ数(正=時計回り, 負=反時計回り)
// delay_us: 1ステップあたりの遅延(回転速度を決める)
void stepper_move(int32_t steps, uint32_t delay_us) {
    if (steps > 0) {
        HAL_GPIO_WritePin(GPIOA, DIR_PIN, GPIO_PIN_SET);  // CW
    } else {
        HAL_GPIO_WritePin(GPIOA, DIR_PIN, GPIO_PIN_RESET); // CCW
        steps = -steps;
    }
    
    for (int32_t i = 0; i < steps; i++) {
        HAL_GPIO_WritePin(GPIOA, STEP_PIN, GPIO_PIN_SET);
        delay_us_timer(delay_us / 2);
        HAL_GPIO_WritePin(GPIOA, STEP_PIN, GPIO_PIN_RESET);
        delay_us_timer(delay_us / 2);
    }
}

// 速度ランプ(台形加速)で滑らかに動かす
void stepper_move_trapezoidal(int32_t total_steps,
                               uint32_t accel_steps,
                               uint32_t max_speed_us,
                               uint32_t min_speed_us) {
    int32_t abs_steps = (total_steps > 0) ? total_steps : -total_steps;
    HAL_GPIO_WritePin(GPIOA, DIR_PIN,
                      total_steps > 0 ? GPIO_PIN_SET : GPIO_PIN_RESET);
    
    for (int32_t i = 0; i < abs_steps; i++) {
        uint32_t delay;
        if (i < accel_steps) {
            // 加速フェーズ
            delay = min_speed_us - (min_speed_us - max_speed_us) * i / accel_steps;
        } else if (i > abs_steps - accel_steps) {
            // 減速フェーズ
            delay = min_speed_us - (min_speed_us - max_speed_us) * (abs_steps - i) / accel_steps;
        } else {
            delay = max_speed_us;  // 定速フェーズ
        }
        
        HAL_GPIO_WritePin(GPIOA, STEP_PIN, GPIO_PIN_SET);
        delay_us_timer(delay / 2);
        HAL_GPIO_WritePin(GPIOA, STEP_PIN, GPIO_PIN_RESET);
        delay_us_timer(delay / 2);
    }
}

RCサーボモーターの制御(50Hz PWM)

// RCサーボ: 50Hz(20ms周期)のPWMで角度制御
// パルス幅: 1ms(0°) 〜 1.5ms(90°) 〜 2ms(180°)
void servo_set_angle(uint8_t angle_deg) {
    // パルス幅をμsで計算: 1000〜2000μs(0〜180°)
    uint32_t pulse_us = 1000 + (uint32_t)angle_deg * 1000 / 180;
    
    // TIMxのCCRを更新(PSC, ARRはサーボ用に設定済み)
    // ARR = 20000-1 (20ms周期, 1μsティック), PSC = 84-1
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, pulse_us);
}

エンコーダーによる速度計測

// TIM3をエンコーダーモードで設定(STM32 HAL)
// TIM3_CH1: A相, TIM3_CH2: B相 (相補入力)

int32_t encoder_read_count(void) {
    return (int32_t)__HAL_TIM_GET_COUNTER(&htim3);
}

void encoder_reset(void) {
    __HAL_TIM_SET_COUNTER(&htim3, 0);
}

// 速度計算(10msタイマー割り込みで呼び出す)
float encoder_get_rpm(void) {
    static int32_t last_count = 0;
    int32_t current_count = encoder_read_count();
    int32_t delta = current_count - last_count;
    last_count = current_count;
    
    const float PPR = 1000.0f;  // エンコーダー分解能(パルス/回転)
    const float DT_S = 0.01f;   // 10ms
    
    return (delta / PPR) * 60.0f / DT_S;  // RPM
}

他技術との比較

DCモーター vs ステッピングモーター vs サーボモーターの比較

比較項目DCモーターステッピングモーターサーボモーター
制御方式オープンループ(速度)/クローズドループ(位置)オープンループ(通常)クローズドループ
位置精度エンコーダー必要脱調しなければ高い非常に高い
脱調リスクなしあり(高速・高負荷)なし
停止時の発熱なし(電流なし)あり(保持電流が流れる)なし(フィードバック制御)
回転速度高い(数千RPM)低め(〜1000RPM実用域)中〜高(制御次第)
トルク特性速度に反比例低速高トルク、高速で急落全速域で安定
コスト安い安〜中(ドライバIC含む)高い
代表用途ファン・ポンプ・ドローン3Dプリンター・CNC産業ロボット

ブラシ付きDCモーター vs ブラシレスDCモーター(BLDC)

比較項目ブラシ付きDCブラシレスDC(BLDC)
構造ブラシ+整流子電子転流(ESC/ドライバ)
寿命短い(ブラシ摩耗)長い(接触部なし)
ノイズ・EMI多い(ブラシ放電)少ない
効率中(75〜85%)高い(85〜95%)
制御難易度容易(H-Bridge+PWM)高い(転流制御必要)
コスト安い中(ESCが必要)
代表用途おもちゃ・DIYロボットドローン・電動工具・EV

関連用語

参考リンク