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
};

講座終了時の目標コード

最終的に、受講者が以下のようなコードを「写経」ではなく、自分で設計して書けることを目指す。

main.cpp
#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短く保たれているか

提出前に到達度チェックで自己確認させるとよい。