ここでは,メインマイコンボード搭載ボードにメインマイコンボードを接続し,タクトスイッチが押されたことを検知するプログラムをC++で書きましょう.そのためにマイコンとタクトスイッチの接続状況を示して具体的な操作方法について述べます.最終的には,赤色タクトスイッチを押すとLED7が点灯し,緑色タクトスイッチを押すとLED8が点灯し,青色タクトスイッチを押すとLED7およびLED8が消灯するプログラムを作成します.

  1. クラスの構成

    下図に今回作成するクラスの関係を表します.TactSwitchクラスをスーパクラスとし,RedTactSwitchなど3個のクラスがサブクラスとしてあります.TactSwitchはisPressedメンバ関数があり,この関数は純粋仮想関数になっております.そのため,サブクラスではすべてisPressedメンバ関数を実現しております.また,RedTactSwitchクラスなどはシングルトンになっており,クラス1個に対して1個のオブジェクトしか存在しないようになっております.下記のクラス図からスケルトンコードを生成できるようにするため,こちらにastah*のファイルを置いておきます.スケルトンコードを生成しデフォルトプロジェクトを流用した新たに作成するプロジェクトにそのファイルを追加しておいてください.ついでに,ソースおよびヘッダを整形しておくことをお勧めします.
    ClassDiagram
  2. コンストラクタ,代入演算子,デストラクタおよびgetInstanceのプログラミング

    RedTactSwitch等にあるコンストラクタと代入演算子,デストラクタおよびgetInstanceについて,最初にプログラミングしておきましょう.シングルトンで書かれているため,基本的な書き方はどれも一緒です.なお,スケルトンコードを生成した段階では代入演算子の戻り値が0となっているためコンパイルエラーが発生してしまいます.まずはコンパイルが問題なくできるようにするためにも,実装をしてしまいましょう.下に,RedTactSwitchのコンストラクタ,代入演算子,デストラクタおよびデストラクタのプログラミング例を示します.
    RedTactSwitch::RedTactSwitch(){
    }
    
    RedTactSwitch::RedTactSwitch(const RedTactSwitch& src){
    	_singleton = src._singleton;
    }
    
    RedTactSwitch& RedTactSwitch::operator=(const RedTactSwitch& src){
    	_singleton = src._singleton;
    	return *this;
    }
    
    RedTactSwitch::~RedTactSwitch(){
    	delete _singleton;
    }
    
    RedTactSwitch* RedTactSwitch::getInstance(){
    	if(_singleton == NULL){
    		_singleton = new RedTactSwitch();
    		_singleton->_initialize();
    	}
    	return _singleton;
    }
    

    演習


    GreenTactSwitchおよびBlueTactSwitchクラスのコンストラクタ,代入演算子,デストラクタおよびgetInstanceを作成してください.

  3. マイコンとタクトスイッチの接続状況

    下の回路図にはタクトスイッチがマイコンに接続されている様子を示しています.「TS_R」は赤色のタクトスイッチを表しており,マイコンと接続されています.タクトスイッチには,離されているときにはマイコンにHigh,押されているときにはLowを伝えるための抵抗(R7)が設置されています.また,チャタリングをある程度防止する目的で抵抗(R4)とコンデンサ(C5)が設置されています.このように抵抗とコンデンサを入れることで,押されたときには徐々にからLowに信号が変化し,離されたときには徐々にLowからHighに変化します.これにより,チャタリング時に発生するHighとLowのバタツキを抑えることができます.
    Schematic01

    さて,3個のタクトスイッチがマイコンのどの端子に接続されているか確認しましょう.下の回路図にはタクトスイッチがマイコンに接続状況が分かるよう,端子名に印を付けました.ポート名および番号を確認しておきましょう.赤色タクトスイッチはポート5ビット4,緑色タクトスイッチはポート5ビット5,青色タクトスイッチはポート3ビット5に接続されています.
    Schematic02

  4. 端子の初期化

    マイコンからみるとタクトスイッチは入力デバイスですので,端子を汎用入力に設定します.初期化を担当するメンバ関数は_initializeです.

    演習

    RedTactSwitchの_initialize関数ではポート5ビット4,GreenTactSwitchの_initialize関数ではポート5ビット5,BlueTactSwitchの_initialize関数ではポート3ビット5を入力端子にするようプログラミングしてください.
    ヒント:端子の入出力を決定するレジスタはDDRです.また,BlueTactSwitchの端子は入力専用端子ですので….

  5. 押されているか確認する

    押されているか確認するメンバ関数がisPressedです.各クラスにありますので実装する必要があります.タクトスイッチが押されているとLow,離されているとHighとなります.

    演習

    押されていたら真,離されていたら偽を返すようにプログラミングしてください. ヒント:入力を確認するレジスタはPORTです.

  6. LEDを点灯および消灯する

    最後に,すべてのタクトスイッチの動作を確認するプログラムを作成しましょう.赤色タクトスイッチが押されたらLED7を点灯し,緑色タクトスイッチが押されたらLED8が点灯し,青色タクトスイッチが押されたらLED7とLED8を消灯するプログラムを作成します.下の図はプログラムの流れを表しています.
    SequenceDiagram

    演習

    上記のシーケンス図を読み解きながらプログラムを作成してください.