progFocusチュートリアル Vol.5:実践!システムを「機能」でカプセル化する(大規模システム編)


実践!システムを「機能」でカプセル化する

これまでのチュートリアルでは、キャンバス上にノードを並べて線でつなぐ方法を学んできました。 小規模なアプリならそれで十分ですが、ロボット制御システムのように数百のパーツが絡み合う大規模システムになってくると、フラットに並べるだけでは全体像が掴めなくなってしまいます。

今回は、progFocusの強力な機能である「機能ノード(Feature Node)」を使った、本格的な階層化設計に挑戦します。

1. トップダウン設計:まず「枠組み」から作る

プロフェッショナルな設計の第一歩は、細かい計算式やデバイスの制御を考えることではありません。 まずはシステムを大きな機能の塊(モジュール)として整理し、キャンバスのトップレベルに配置することから始めます。

今回は「操縦ロボット」を例に、以下の3つの主要機能を配置してみましょう。

  1. [入力] コントローラー入力
    • 無線信号を受け取り、扱いやすいデータに変換する役割。
  2. [処理] モーター制御 / 取得機構制御
    • 入力された情報を元に、具体的にどう動くかの方針を決めるロジックの役割。
  3. [出力] 駆動ユニット / 取得機構
    • 実際のモーターやシリンダーを制御するハードウェアに近い役割。

機能ノードによるトップレベル設計機能ノードによるトップレベル設計

このように、最初に「何が必要か」を箱(機能ノード)で置くことで、設計の全体像が俯瞰できるようになります。

2. インターフェース設計:データの流れを定義する

次に、配置した機能ノード同士を線でつなぎ、「どんなデータが流れるか」を定義します。 progFocusの接続線は単なる線ではなく、「情報の契約(インターフェース)」だと考えてください。

今回のロボットでは、以下のようなデータの流れをイメージします。

  • コントローラー入力 → (スティック情報) → モーター制御
  • モーター制御 → (PWM, GPIO) → 駆動ユニット
  • 出力ユニット → (電流検出・リミットセンサー) → 制御ロジック(フィードバック)

接続線にラベル(例:• スティック情報)をつけることで、その線が何を運んでいるのかが明確になります。

3. ドリルダウン:詳細なロジックを作り込む

全体像とインターフェースが決まったら、いよいよ各機能の中身を作り込みます。 作成した機能ノードをShift+クリックして、その内部(詳細レイヤー)に入りましょう。

1. コントローラー入力:信号を意味あるデータへ

まずは入力部分です。「コントローラー」からの無線信号を受け取り、扱いやすいデータ形式に変換してシステム全体に渡す役割を担います。

コントローラー入力の内部コントローラー入力の内部

  1. 入力: 「コントローラー」からの無線信号を受け取ります。
  2. 処理: 「無線信号をデータに起こす」ノードで、生の信号を解析可能なデータに変換します。
  3. 出力: 後続のノードが使いやすい「入力データ構造体」として出力します。

2. モーター制御:入力から動きを決定する

次に、このシステムの頭脳となる制御部分です。入力データを元に、実際にモーターをどう回すかを計算します。

モーター制御の内部モーター制御の内部

  1. 入力: データ入力ノードから「スティック情報」を受け取ります。
  2. ベクトル計算: スティックのXY座標を、ロボットが進むべき方向と強さ(ベクトル)に変換します。
  3. PWM算出: メカナムホイールなどの特性に合わせて、各モーターに与えるべき回転数(PWM)を算出し、過電流チェックも行います。
  4. 出力: 具体的な電気信号の指示として「GPIO, PWM出力」ポートへ送ります。

3. 駆動ユニット:物理世界への働きかけ

最後に、実際のハードウェアを動かす出力部分です。

駆動ユニットの内部駆動ユニットの内部

  1. 入力: 制御ノードからの「PWM, GPIO」信号を受け取ります。
  2. 増幅: マイコンからの微弱な信号を、「ゲートドライバー」と「FET」を使って大電流に増幅します。
  3. 出力: 実際に「モーター」を回転させ、ロボットを動かします。

4. 取得機構制御:複雑な通信生成

移動機能だけでなく、アームやハンドなどの「取得機構」も並列して制御します。

取得機構制御の内部取得機構制御の内部

  1. 入力: コントローラーからの「ボタン入力情報」を受け取ります。
  2. 通信生成: 多数のモーターやセンサーを扱うため、I²Cなどの通信プロトコル(SDI, SCK)を生成します。
  3. 出力: 後続の出力ノードへ信号を送ります。

5. 取得機構:多様なデバイスの一括管理

サーボモーターやエアシリンダーなど、性質の異なる複数のアクチュエータを一つの箱にまとめます。

取得機構の内部取得機構の内部

  1. 入力: 制御ノードからの通信信号を受け取ります。
  2. 分配: 「I/Oエキスパンダー」を使って信号を振り分けます。
  3. 駆動: 「サーボモーター」や「エアシリンダー」を実際に動かします。
  4. 安全確認: 「リミットセンサー」の値を読み取り、行き過ぎて壊れないように監視します。

このように、機能を大枠から考え、細かい内部の実装をその後に詳しく考えて、プロジェクトに対する解像度を少しずつ高めていくことが、複雑なシステムを破綻させずに設計する極意です。

まとめ:解像度を上げれば、コードは自然と書ける

この手順で設計を進めると、以下のような本質的なメリットがあります。

  • 思考の順序が整う: いきなり細部に入り込まず、まずは「機能」という大枠から考える習慣が身につく。
  • 解像度が高まる: 全体像から徐々に内部ロジックへと焦点を合わせていくことで、プロジェクトに対する理解度(解像度)を確実にあげていける。
  • 実装がスムーズになる: 最終的にコードを書く段階になったとき、すでに構造とロジックが整理されているため、迷いなくスムーズに実装に入れる。

progFocusを使うことで、「頭の中の整理」から「具体的な実装の指針」までを一気通貫で表現できるのです。

次回からはAI活用編です。これまで作った設計図を元に、最新のAIを活用して構造の拡張やコード生成まで持っていく「未来の開発フロー」を体験します。


次の記事はこちら 👉