19・25章
最終課題
学習した機能を組み合わせ、実際のマイコンプログラムを設計する。
目的
これまで学習した機能を組み合わせ、実際のマイコンプログラムを設計する。
課題例
「簡易自律ロボット」を作る。
必要な機能
- LED
- モータ
- 距離センサ
- 状態管理
- センサの抽象化
クラス構成例
Robot │ ├── Sensor │ ├── DistanceSensor │ └── IMU │ ├── Motor │ └── Controller
ファイル構成
src/ ├── main.cpp ├── Robot.cpp ├── Motor.cpp ├── Controller.cpp ├── IMU.cpp └── DistanceSensor.cpp include/ ├── Robot.hpp ├── Motor.hpp ├── Controller.hpp ├── Sensor.hpp ├── IMU.hpp └── DistanceSensor.hpp
必須要件
クラス
最低でも以下を使用する。
Robot Motor Controller Sensor IMU DistanceSensor
カプセル化
内部データは原則としてprivateにする。
継承
Sensor ├── IMU └── DistanceSensor
virtual / override
class Sensor {
public:
virtual void update() = 0;
};enum class
enum class RobotState {
STOP,
MOVE,
ERROR
};講座終了時の目標コード
最終的に、受講者が以下のようなコードを「写経」ではなく、自分で設計して書けることを目指す。
#include "Robot.hpp"
Robot robot;
void setup() {
robot.initialize();
}
void loop() {
robot.update();
}内部では、
Robot │ ├── Controller │ ├── Sensor │ ├── IMU │ └── DistanceSensor │ └── Motor
のように責務を分離する。この段階で、
「main.cppには何を書けばいいのか」 「この変数はどのクラスが持つべきか」 「この処理はどのクラスの責務なのか」 「このクラスはprivateにすべきか」 「共通インターフェースが必要か」
を自分で考えられる状態を目標とする。
評価の観点
| 観点 | 確認すること |
|---|---|
| クラス分割 | 1クラス1責務になっているか |
| カプセル化 | 内部データがprivateになっているか |
| 継承 | Sensorを継承する意味を説明できるか |
| ポリモーフィズム | Sensor*で扱えているか |
| 状態管理 | 状態がenum classで表現されているか |
| ファイル分割 | .hppと.cppが適切に分かれているか |
main.cpp | 短く保たれているか |
提出前に到達度チェックで自己確認させるとよい。