カラーセンサーS11059-02DTをArduinoで使用する(固定時間モード編)

概要

この記事について

デジタルカラーセンサS11059-02DTの固定時間モードによる測定について、ライブラリを使用したサンプルスケッチを元に解説します。

下記の記事に沿って、ArduinoでS11059-02DTを制御する環境が準備できていることを前提としています。

固定時間モードについて

固定時間モードでは測定は継続的に繰り返されます。 測定のタイミングなどがイメージしやすいため、マニュアル設定モードよりは比較的扱いやすく感じました。

サンプルスケッチ

#include <Wire.h>
#include <S11059.h>

S11059 colorSensor;

void setup() {
  Serial.begin(9600);
  // colorSensor.begin();   // S11059#begin()はライブラリのバージョン0.1.0で除去されました
  Wire.begin()              // 直接Wire.begin()を呼び出してください (2017/05/01 追記)

  // 積分モードを固定時間モードに設定
  colorSensor.setMode(S11059_MODE_FIXED);

  // ゲイン選択
  // * S11059_GAIN_HIGH: Highゲイン
  // * S11059_GAIN_LOW: Lowゲイン
  colorSensor.setGain(S11059_GAIN_HIGH);

  // 1色あたりの積分時間設定(下記は指定可能な定数ごとの固定時間モードの場合の積分時間)
  // * S11059_TINT0: 87.5 us
  // * S11059_TINT1: 1.4 ms
  // * S11059_TINT2: 22.4 ms
  // * S11059_TINT3: 179.2 ms
  colorSensor.setTint(S11059_TINT1);

  // ADCリセット、スリープ解除
  if (!colorSensor.reset()) {
    Serial.println("reset failed");
  }

  // ADCリセット解除、バスリリース
  if (!colorSensor.start()) {
    Serial.println("start failed");
  }
}

void loop() {
  // 積分時間よりも長く待機
  //
  // 固定時間モード時のS11059.delay()で実行される待機処理の時間は
  // S11059.setTint(tint)で設定した値に応じて異なります
  colorSensor.delay();

  // センサのデータ用レジスタ(赤、緑、青、赤外)をまとめてリード
  if (colorSensor.update()) {
  Serial.print(colorSensor.getRed());
    Serial.print(",");
    Serial.print(colorSensor.getGreen());
    Serial.print(",");
    Serial.print(colorSensor.getBlue());
    Serial.print(",");
    Serial.print(colorSensor.getIR());
    Serial.println("");
  } else {
    Serial.println("update failed");
  }

  delay(500);
}

サンプルスケッチの解説

積分モード設定

colorSensor.setMode(S11059_MODE_FIXED)で固定時間モードに設定しています。

ゲイン選択設定

colorSensor.setGain(S11059_GAIN_HIGH)でHighゲインに設定しています。

下記の定数を引数で指定できます。

  • S11059_GAIN_HIGH: Highゲイン
  • S11059_GAIN_LOW: Lowゲイン

ゲイン選択についてはデータシートに下記のように記載されています。

HighゲインとLowゲインで使うフォトダイオードの面積比は10:1です。 このため、ゲイン比率は10倍になります。

試しにHighゲインをLowゲインに変更してみると、下記のように値が1/10近くまで下がりました(差異を分かりやすくするために積分時間の設定も合わせて長めに設定しています)。

f:id:jakalada:20160328233709p:plain f:id:jakalada:20160328233720p:plain

1色あたりの積分時間設定

colorSensor.setTint(S11059_TINT1)で1色あたりの積分時間設定を1.4 msに設定しています。

下記の定数を引数で指定できます。

  • S11059_TINT0: 87.5 us
  • S11059_TINT1: 1.4 ms
  • S11059_TINT2: 22.4 ms
  • S11059_TINT3: 179.2 ms

S11059-02DTは、赤、緑、青、赤外を順に測定するため、その1色あたりの時間が上記の設定です。 そのため、全体の測定が完了するのは設定の4倍の時間が掛かります。

設定の反映と測定開始

colorSensor.reset()で上述した各種設定をS11059-02DTに反映します。

colorSensor.start()で反映した設定による測定を開始します。

測定結果の読み取り間隔

colorSensor.delay()で1色あたりの積分時間設定を4倍した時間だけ待機します。 積分時間より長く待機することで、常に新しい測定結果が読み取れることを期待する動作です。

S11059-02DTが実際に測定を完了した時間からは誤差が蓄積されていくため、最大でその待機時間の分だけずれると想定しています。 716.8ms(179.2ms x 4)の誤差は、ライントレーサーなんかだと、結構致命的な気がします。

各色の測定値が小さくてもよいのであれば、短めに設定したほうが安全そうです。

測定結果の読み取り

colorSensor.update()で測定結果の各色をすべて読み取ります。

読み取った各色の値を下記で取得してスケッチで扱います。

  • 赤: colorSensor.getRed()
  • 緑: colorSensor.getGreen()
  • 青: colorSensor.getBlue()
  • 赤外: colorSensor.getIR()