TKM-Hには,赤外線式距離センサが備わっており,前方の距離を計測することができます.距離は0~3.3[V]のアナログ値で表されますので,これをAD変換してマイコンで扱えるデジタル値にします.さらに,今回用いる距離センサGP2Y0A21YKには,下図のような特性があるため,電圧値を距離に変換するテーブルを用意します.なお,およそ5[mm]以下の距離については正しく読み取ることが出来ません.

Voltage-Distance


ジョイスティックと同様に距離センサも常に距離を取得するのではなく,一定間隔で行えるようにします.そのために今回はTimer4を利用することにします.

  1. 動作例

    下に距離センサの動作例を示します.TKM-Hの上側にかざしており,そこまでの距離をドットマトリクスディスプレイに表示しています.表示される数字の32倍したものが距離(単位は[mm])です.

     

  2. TKM-Hのジャンパ変更

    ドットマトリクスディスプレイ付き距離センサボードをメインマイコンボードのコネクタに接続して,距離センサを使用するには次に説明する2か所のジャンパを変更しなければなりません.
    まず,ドットマトリクスディスプレイ付き距離センサボード裏面にあるジャンパをPIC側に変更します.このジャンパは距離センサの出力をPIC16F1936へ送るか,RX62Nに送るか切り替えるためのものです.
    Jumper1

    次にメインマイコンボード搭載ボード裏側にあるジャンパです.メインマイコンボードを搭載するコネクタにドットマトリクスディスプレイ付き距離センサボードを接続したとき,距離センサへ電源を供給するためにこのジャンパを接続する必要があります.
    Jumper2



  3. IntervalTimerForDistanceSensor.c

    まず,Timer4を使ったインターバルタイマを作成しましょう.基本的にTimer2と同じです.違うところは,関数の接頭辞がIntervalTimerForJoystickからIntervaltimerForDistanceSensorに変わったこと,レジスタ名が「2」となっているところを「4」に変えることだけです.

  4. DistanceSensor.c

    ジョイスティックと同様に距離センサもAD変換をするため,Joystick.cと似ているところが多いですので,このファイルをもとにDistanceSensor.cを作成すると良いです.
    1. スタティックな変数・定数

      下図のように,距離センサはマイコンのチャネル1に接続されている.
      DistanceSensorAnalogChanel

      そこで,チャネル1をプログラムの冒頭で定義しておきます.
      /* 距離センサを読み取るチャネル番号 */
      #define _DISTANCE_SENSOR_CHANNEL (1)


      距離センサから得られた0~3.3[V]までの電圧をデジタル値0~255に変換できます.このデジタル値を距離に変換するためのテーブルを_DISTANCE_TABLEとします.添え字に距離のデジタル値を入れると,それに対応した距離を得られるようになっています.単位は[mm],最大値は2000ほどを想定しているため,型をunsigned shortにする.下にこのテーブルを示します.

      /* 電圧から距離に変換するテーブル */
      static const uint16_t _DISTANCE_TABLE[] = {
          1949, 1912, 1875, 1838, 1801, 1765, 1728, 1691, 1654, 1617, 1580, 1544, 1507, 1470, 1433, 1396,
          1360, 1323, 1286, 1249, 1212, 1175, 1139, 1102, 1065, 1028, 991, 954, 918, 881, 844, 807,
          738, 718, 674, 659, 644, 629, 614, 563, 553, 544, 534, 525, 515, 505, 468, 461,
          454, 447, 440, 434, 427, 420, 413, 406, 400, 358, 353, 349, 345, 341, 336, 332,
          328, 323, 319, 315, 311, 306, 302, 281, 278, 275, 273, 270, 267, 264, 262, 259,
          256, 253, 237, 235, 233, 231, 229, 227, 225, 223, 221, 219, 217, 215, 213, 211,
          209, 207, 205, 203, 201, 173, 172, 171, 170, 169, 168, 167, 166, 165, 164, 163,
          162, 161, 160, 159, 158, 157, 156, 155, 155, 154, 153, 152, 151, 150, 149, 147,
          146, 145, 144, 143, 143, 142, 141, 140, 139, 138, 137, 136, 135, 134, 133, 132,
          131, 130, 129, 128, 127, 126, 125, 124, 123, 122, 121, 120, 110, 110, 109, 109,
          108, 107, 107, 106, 106, 105, 105, 104, 103, 103, 102, 102, 101, 100, 100, 99,
          99, 98, 96, 95, 95, 94, 94, 93, 93, 92, 92, 91, 91, 90, 89, 89,
          88, 88, 87, 87, 86, 86, 85, 84, 84, 83, 83, 82, 82, 81, 81, 80,
          79, 79, 78, 78, 84, 83, 82, 81, 80, 79, 78, 77, 77, 76, 75, 74,
          73, 72, 71, 70, 69, 68, 67, 66, 65, 65, 64, 63, 62, 61, 60, 59,
          58, 57, 56, 55, 54, 53, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44,
      };


      最後に,距離を返す時に用いるコールバック関数を宣言します.引数はuint16_tとしますので,下のようになります.

      /* コールバック関数 */
      static void (*_callbackFunction)(uint16_t) = NULL;

       

    2. _measure関数

      この関数では,距離センサから0~255で表された電圧を得て,その電圧に対応した距離を求め,最後にコールバック関数によりDistanceSensor.cの外部へ距離を送ります.
       measure
    3. DistanceSensor_initialize関数

      距離センサの初期化では,ADコンバータの初期化,Timer4の初期化,更新頻度の初期化,コールバック関数の設定,タイマの動作開始があります.
      DistanceSensor initialize

    4. DistanceSensor_setCallbackFunction関数

      距離を伝えるためのコールバック関数を設定します.
      DistanceSensor setCallbackFunction

    5. DistanceSensor_setFrequency関数

      距離センサから距離を得る頻度を設定します.
      DistanceSensor setFrequency

  5. Interrupt.c

    Timer4の割込みが発生したときもInterrupt_interrupt関数が呼び出されます.割り込まれたら,コールバック関数_timer4Callbackを呼び出します.なお,下記の説明にはドットマトリクスディスプレイに関する処理を省略してありますので,お気を付けください.
    1. スタティックな変数

      スタティックな変数として,Timer4のためのコールバック関数を宣言します.
      /* Timer4の割込み発生時に呼び出す関数ポインタ */
      static void (*_timer4Callback)(void) = NULL;

       

    2. Interrupt_interrupt関数

      Timer4による割込みが発生した時の処理を下記のように追記します.
      Interrupt interrupt
    3. Interrupt_setTimer4Callback関数

      Timer4による割込みが発生した時に呼び出す関数を定義します.
      Interrupt setTimer4Callback
  6. Main.c

    ジョイスティックを扱ったときと同じように距離センサを扱うと良いでしょう.
    1. _changeDistanceSensor関数

      この関数は距離センサが変化した時に呼び出され,引数として距離dが参照返しで送られてきます.dは2000[mm]くらいまで取り得るので,これを32で割った(5ビット右シフト)値をドットマトリクスディスプレイに表示します.
       changeDistanceSensor
    2. main関数

      メイン関数では,ドットマトリクスディスプレイの初期化と,距離センサの初期化および更新頻度を設定した後,無限ループでプログラムが終了しないようにしておきます.
      main