progFocusチュートリアル Vol.5:実践!システムを「機能」でカプセル化する(大規模システム編)
実践!システムを「機能」でカプセル化する
これまでのチュートリアルでは、キャンバス上にノードを並べて線でつなぐ方法を学んできました。 小規模なアプリならそれで十分ですが、ロボット制御システムのように数百のパーツが絡み合う大規模システムになってくると、フラットに並べるだけでは全体像が掴めなくなってしまいます。
今回は、progFocusの強力な機能である「機能ノード(Feature Node)」を使った、本格的な階層化設計に挑戦します。
1. トップダウン設計:まず「枠組み」から作る
プロフェッショナルな設計の第一歩は、細かい計算式やデバイスの制御を考えることではありません。 まずはシステムを大きな機能の塊(モジュール)として整理し、キャンバスのトップレベルに配置することから始めます。
今回は「操縦ロボット」を例に、以下の3つの主要機能を配置してみましょう。
- [入力] コントローラー入力
- 無線信号を受け取り、扱いやすいデータに変換する役割。
- [処理] モーター制御 / 取得機構制御
- 入力された情報を元に、具体的にどう動くかの方針を決めるロジックの役割。
- [出力] 駆動ユニット / 取得機構
- 実際のモーターやシリンダーを制御するハードウェアに近い役割。
機能ノードによるトップレベル設計
このように、最初に「何が必要か」を箱(機能ノード)で置くことで、設計の全体像が俯瞰できるようになります。
2. インターフェース設計:データの流れを定義する
次に、配置した機能ノード同士を線でつなぎ、「どんなデータが流れるか」を定義します。 progFocusの接続線は単なる線ではなく、「情報の契約(インターフェース)」だと考えてください。
今回のロボットでは、以下のようなデータの流れをイメージします。
- コントローラー入力 → (スティック情報) → モーター制御
- モーター制御 → (PWM, GPIO) → 駆動ユニット
- 出力ユニット → (電流検出・リミットセンサー) → 制御ロジック(フィードバック)
接続線にラベル(例:• スティック情報)をつけることで、その線が何を運んでいるのかが明確になります。
3. ドリルダウン:詳細なロジックを作り込む
全体像とインターフェースが決まったら、いよいよ各機能の中身を作り込みます。 作成した機能ノードをShift+クリックして、その内部(詳細レイヤー)に入りましょう。
1. コントローラー入力:信号を意味あるデータへ
まずは入力部分です。「コントローラー」からの無線信号を受け取り、扱いやすいデータ形式に変換してシステム全体に渡す役割を担います。
コントローラー入力の内部
- 入力: 「コントローラー」からの無線信号を受け取ります。
- 処理: 「無線信号をデータに起こす」ノードで、生の信号を解析可能なデータに変換します。
- 出力: 後続のノードが使いやすい「入力データ構造体」として出力します。
2. モーター制御:入力から動きを決定する
次に、このシステムの頭脳となる制御部分です。入力データを元に、実際にモーターをどう回すかを計算します。
モーター制御の内部
- 入力: データ入力ノードから「スティック情報」を受け取ります。
- ベクトル計算: スティックのXY座標を、ロボットが進むべき方向と強さ(ベクトル)に変換します。
- PWM算出: メカナムホイールなどの特性に合わせて、各モーターに与えるべき回転数(PWM)を算出し、過電流チェックも行います。
- 出力: 具体的な電気信号の指示として「GPIO, PWM出力」ポートへ送ります。
3. 駆動ユニット:物理世界への働きかけ
最後に、実際のハードウェアを動かす出力部分です。
駆動ユニットの内部
- 入力: 制御ノードからの「PWM, GPIO」信号を受け取ります。
- 増幅: マイコンからの微弱な信号を、「ゲートドライバー」と「FET」を使って大電流に増幅します。
- 出力: 実際に「モーター」を回転させ、ロボットを動かします。
4. 取得機構制御:複雑な通信生成
移動機能だけでなく、アームやハンドなどの「取得機構」も並列して制御します。
取得機構制御の内部
- 入力: コントローラーからの「ボタン入力情報」を受け取ります。
- 通信生成: 多数のモーターやセンサーを扱うため、I²Cなどの通信プロトコル(SDI, SCK)を生成します。
- 出力: 後続の出力ノードへ信号を送ります。
5. 取得機構:多様なデバイスの一括管理
サーボモーターやエアシリンダーなど、性質の異なる複数のアクチュエータを一つの箱にまとめます。
取得機構の内部
- 入力: 制御ノードからの通信信号を受け取ります。
- 分配: 「I/Oエキスパンダー」を使って信号を振り分けます。
- 駆動: 「サーボモーター」や「エアシリンダー」を実際に動かします。
- 安全確認: 「リミットセンサー」の値を読み取り、行き過ぎて壊れないように監視します。
このように、機能を大枠から考え、細かい内部の実装をその後に詳しく考えて、プロジェクトに対する解像度を少しずつ高めていくことが、複雑なシステムを破綻させずに設計する極意です。
まとめ:解像度を上げれば、コードは自然と書ける
この手順で設計を進めると、以下のような本質的なメリットがあります。
- 思考の順序が整う: いきなり細部に入り込まず、まずは「機能」という大枠から考える習慣が身につく。
- 解像度が高まる: 全体像から徐々に内部ロジックへと焦点を合わせていくことで、プロジェクトに対する理解度(解像度)を確実にあげていける。
- 実装がスムーズになる: 最終的にコードを書く段階になったとき、すでに構造とロジックが整理されているため、迷いなくスムーズに実装に入れる。
progFocusを使うことで、「頭の中の整理」から「具体的な実装の指針」までを一気通貫で表現できるのです。
次回からはAI活用編です。これまで作った設計図を元に、最新のAIを活用して構造の拡張やコード生成まで持っていく「未来の開発フロー」を体験します。
次の記事はこちら 👉