第9章 モータードライブ ― フィジカルAIに「動く身体」を与える
前章で、私たちのSoCは耳(マイク)と口(スピーカ)を得ました。本章では、いよいよ動く身体――モーターを与えます。フィジカルAIの時代、ボードが現実世界に働きかける最も直接的な手段が、モーターです。ただしここには、これまでの章と同じはっきりした線引きがあります。FPGAは「どう動かすか」の信号を作るだけ。実際にモーターを回す大きな電流は、外部のドライバICに委ねる――この役割分担を土台に、DCモータ・ステッピング・サーボの3種を、設計判断とともに扱います。
9.1 なぜ「足回り」なのか ― 身体に動きを与える
本講座の旗印は「ボードはフィジカルAIの身体、頭脳はネット越しのAI」でした。第8章までで身体には感覚(センサ・音声)と神経(通信)が通いました。残るのは運動です。モーターは、AIの判断を現実の動きに変える出力装置――ロボットの車輪、アームの関節、カメラの首振り、バルブの開閉。ここを持つことで、本ボードは「見る・聞く・話す」から「動く」へと踏み出します。
9.2 鉄則 ― FPGAのピンから、大きな電流は流せない
最初に、絶対に外せない物理を確認します。FPGAのI/Oピンが流せる電流はごくわずか(一般に数mA〜十数mA程度とされる)で、モーターが必要とする電流(数百mA〜数A、起動時はさらに大きい)にはまったく足りません。ピンに直結してモーターを回そうとすれば、FPGAを壊します。だからあいだに「力の増幅器」=モータードライバICを必ず挟みます。
9.3 Hブリッジとは ― 方向と速度を、外部ICに作らせる
DCモーターを「正転・逆転・速度可変」で回す定番回路がHブリッジです。4つのスイッチをH字に組み、電流を流す向きを切り替えることで回転方向を、オン/オフの比率(PWM)で速度を決めます。この大電流スイッチングを1チップにまとめたのがモータードライバICです。私たちのFPGAは、その入力ピンに「方向の2線」と「速度のPWM」を渡すだけで済みます。
┌──────── 我々のSoC(FPGA)=「神経」────────┐ 外部ドライバIC モーター │ PicoRV32 ── Wishbone ── motor_dc │ ─IN1/IN2(方向)→ [ Hブリッジ ] ─→ ( DCモータ ) │ (PWM=第3章の発想) │ ─PWM(速度)────→ (大電流側) └────────────────────────────────────────────┘ ↑モーター電源(別系統) FPGAは小電流の論理だけ。力(大電流)は外部ICとモーター電源が受け持つ。
9.4 DCモータ ― PWM(速度)+方向2線
最も基本のDCモーターは、第3章のPWMをそのまま速度制御に再利用できます。新しく要るのは「方向の2線」だけ。これらを束ねた薄い制御ブロックを、Wishboneスレーブとしてバスに足します。
骨格・未検証
// motor_dc.v ― DCモータ1個分の制御(方向+PWM・骨格・未検証)
// FPGAは「方向2線(in1/in2)+速度(pwm)」を出すだけ。
// 大電流のスイッチングは外部Hブリッジ・ドライバICが行う。
module motor_dc #(parameter W = 8) (
input clk,
input dir, // 0=正転 / 1=逆転
input [W-1:0] duty, // 速度(0..最大)。第3章PWMと同じ「比率で大きさ」
output in1, // 外部ドライバへ:方向
output in2, // 外部ドライバへ:方向
output pwm // 外部ドライバへ:速度(enable をPWMで叩く)
);
reg [W-1:0] cnt = 0;
always @(posedge clk) cnt <= cnt + 1'b1;
assign pwm = (cnt < duty); // 第3章PWMと同じ比較。duty が大きいほど速い
assign in1 = dir ? 1'b0 : 1'b1; // 方向の2線。
assign in2 = dir ? 1'b1 : 1'b0; // ※両方0/両方1(ブレーキ/フリー)の作法はドライバ依存・現物確認
endmodule
※「速度の比率」と「実際の回転数」は別物(断定回避)。 PWMのデューティは平均電圧の比率であって、回転数そのものではありません。負荷・電源電圧・モーター特性で実際の速さは変わります。正確な速度が要るなら、エンコーダで実回転を測ってフィードバックする話になりますが、それは用途が求めた段で改めて設計します。ブレーキ/空転の作法(in1・in2 の組み合わせ)もドライバICごとに異なるので、現物のデータシートで確認してください([改訂マーカー:ドライバの真理値表])。
9.5 ステッピングモータ ― 角度を「数えて」動かす
ステッピングモーターは、コイルを順に励磁して決まった角度ずつ回ります。位置をフィードバックなしに「ステップ数で」制御できるのが強みで、プリンタや3Dプリンタの軸でおなじみです。制御の道は大きく二つあります。
STEP/DIR 方式(ドライバICに任せる)
専用ドライバICにSTEPパルス1発=1ステップ、DIRで方向を渡す。相の細かな励磁やマイクロステップはIC側が面倒を見る。FPGAは正確なパルス列を作るだけ。
相を直接励磁(FPGAで作る)
2相/4相の励磁パターンをFPGAで生成し、各相を外部のパワー段(Hブリッジ×2等)で駆動。仕組みは透明だが、配線も生成ロジックも増える。
※ドライバICの固有名は断定しません。 STEP/DIR方式のステッピングドライバや、DC用のHブリッジドライバには、よく知られた定番ICが複数ある、とされます。ただし定格(電圧・電流)・マイクロステップ分解能・保護機能・入手性は版や流通で変わるため、本文では特定の型番を断定しません。要求(電圧・電流・分解能)を言語化してから、現物のデータシートで選びます(第3章・序章の調達7ステップの精神。[改訂マーカー:使用ドライバの現物])。
9.6 サーボ(RCサーボ)― パルス幅で「角度」を指示する
ラジコン用などのサーボは、内部に位置制御回路を持ち、パルス幅で目標角度を受け取ります。これも第3章PWMの応用ですが、パラメータが違います。一般に約20ms周期(およそ50Hz)で、パルス幅およそ1〜2msが角度の端から端に対応する、とされます(具体値はサーボごとに差があるので現物確認)。
サーボへのパルス(一例・値は現物で確認) ─────────────────────────────────────────────────────────────── 周期 ≈ 20ms(≈50Hz) ┌─┐ ┌─┐ │ │ パルス幅 ≈ 1ms → 一端 │ │ ──┘ └─────────────────────────┘ └── (幅 ≈ 1.5ms → 中央 / ≈ 2ms → 他端) └ 幅で角度を指示。FPGAはこの幅を正確に作るだけ(位置制御はサーボ内部)
周期と分解能が音声PWM(第8章)やDC用PWMと違うだけで、「カウンタとしきい値でパルスを作る」という芯は同じです。だから本講座では、PWM系の周辺を一族として捉え、用途ごとにパラメータ(周期・分解能・本数)を変えて使い回します。
9.7 【調達/自作の判断】信号は自作、力は調達
第3章の判断軸を、ここでも素直に適用できます。パルス・PWM・励磁パターンの生成は、単純で自分のメモリマップに密着=自作。大電流を扱うドライバICは、外部の部品として調達(=買う)。アナログ/大電力はFPGAの外、という線引きが、そのまま分担になります。
役割分担(モータードライブ) ─────────────────────────────────────────────────────────────── 自作(FPGA内・Wishboneスレーブ) 調達/外付け(部品) ・DC:方向2線+PWM ・Hブリッジ・ドライバIC(DC/双方向) ・ステッピング:STEP/DIR or 相生成 ・ステッピング・ドライバIC ・サーボ:20ms周期のパルス幅生成 ・モーター本体・モーター電源・保護部品 ─────────────────────────────────────────────────────────────── 「どう動かすか」はFPGA、「力をどう流すか」は外部IC。境界が綺麗に分かれる。
9.8 電源と安全 ― ここを侮ると壊れる
モーターは、これまでの周辺(LED・通信・音声小信号)と桁違いの電流とノイズを扱います。正直に、注意点を挙げます(いずれも一般論で、断定はしません。現物で確認してください)。
- 電源は分ける。 モーター用の電源と、FPGA/ロジックの電源は別系統にし、GNDだけ共通にするのが定石、とされる。モーターの大電流をロジック電源から取らない。
- 逆起電力(フライバック)に備える。 モーターはコイルなので、止める瞬間に逆向きの電圧が出る。保護(フライバックダイオード等)が要る。多くのドライバICは内蔵するが、現物で確認。
- ノイズと突入電流。 起動時の突入電流や、スイッチングノイズがロジックに回り込むと誤動作の元。デカップリング・配線分離に配慮する。
- 物理的な安全。 モーターは実際に動く。指・髪・配線の巻き込み、可動部の暴走、過熱に注意。最初は負荷を軽く・電流を絞って、安全を確かめながら段階的に。
9.9 FPGAの強みと、役割分担
ここでもFPGAの並列性が効きます。複数のモーターを同時に、それぞれ独立したPWM/パルスで制御できる――CPUの逐次処理では苦しい、多軸の同時制御が素直に書けます。ステッピングのマイクロステップ波形の生成や、正確なタイミングも、FPGAの得意分野です。
9.10 メモリマップに「モータ」を足す(設計案)
モータ制御も、これまでどおりWishboneに足します。ここで二つの設計案があり、これは判断です。
案ア:既存の再利用
速度は第3章PWM(0x4)、方向はGPIO(0x2)のビットで叩く。新規ハードを増やさず、第6章のmicroSD(SPI再利用)と同じ「持っているものを組み合わせる」発想。まず動かすのに最短。
案イ:専用ブロック
多軸・サーボ・ステッピングを本格的に扱うなら、専用のモータ制御スレーブを新ニブル(例:0xA)に新設。複数チャンネルのPWM/パルスを束ね、レジスタで一括制御。
メモリマップへの追記(設計案。番地は実装で確定)
───────────────────────────────────────────────────────────────
0x0〜0x9 既存(… UART2まで=M1〜M5)+ 0x9 音声(第8章・設計案)
0xA 〜 モータ制御(多チャンネルPWM/STEP/DIR/サーボ) ← 案イで新設(予約)
例:+0 制御 / +4 方向 / +8 ch0 duty / +C ch1 duty …
───────────────────────────────────────────────────────────────
※ 1〜2軸の小規模なら案ア(PWM+GPIO再利用)で足りる。規模で案ア/案イを選ぶ。
9.11 【確認】この章の最小確認
モーターは安全が第一なので、負荷を軽く・電流を絞って、シミュ→FPGA実機の順に段階的に確かめます。
- DC(シミュ→FPGA)。 motor_dc に方向とデューティを与え、in1/in2/pwm が期待どおり出ることをシミュで確認 → ドライバIC経由で、低速・無負荷から正転/逆転/速度可変を確認。
- サーボ(FPGA)。 20ms周期のパルス幅を変え、サーボが端〜中央〜端へ動くことを確認(具体の幅は現物で調整)。
- ステッピング(FPGA)。 STEP/DIRで、指定ステップ数だけ回り、方向が反転することを確認。1回転に必要なステップ数を実測。
9.12 この章のまとめ
- 身体に「動き」を与えた: 感覚・神経・音声に続き、モーターで現実世界に働きかける出力を得た。
- 鉄則を守った: FPGAのピンから大電流は流せない。力は外部ドライバICへ――第3章・第8章と同じ線引き。
- 3種を整理した: DC(PWM+方向2線)、ステッピング(STEP/DIR or 相生成)、サーボ(20ms周期のパルス幅)。芯はどれも「カウンタとしきい値」。
- 調達/自作を判断した: 信号生成は自作、大電流のドライバICは調達。境界が綺麗に分かれる。
- 安全を最優先にした: 電源分離・逆起電力・ノイズ・物理的危険。負荷を軽く、段階的に。
- 役割分担を守った: 正確・並列・低レイテンシな駆動は身体(FPGA)、動きの判断は頭脳(CPU/ネット越しAI)。誇張しない。
これで身体は、見て・聞いて・話し・動くところまで来ました。次章は、感覚の最後の難関――カメラと表示です。帯域も処理も重い領域なので、何ができて、どこからが基板化・上位連携の話かを、正直に線を引きながら進めます――第10章:カメラ・表示。