読者です 読者をやめる 読者になる 読者になる

カラーセンサーS11059-02DTをArduinoで使用する(マニュアル設定モード編)

概要

この記事について

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

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

固定時間モードのことも説明に交えているため、下記の記事も参考にしてください。

マニュアル設定モードについて

マニュアル設定モードでは一度測定した後、自動的に待機モードに移行します。 固定時間モードと異なり、再度測定する場合は改めて測定を開始する必要があります。

また、積分時間の設定、計算が少し面倒です。

サンプルスケッチ

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

S11059 colorSensor;

void setup() {
  Serial.begin(9600);
  colorSensor.begin();

  // 積分モードをマニュアル設定モードに設定
  colorSensor.setMode(S11059_MODE_MANUAL);

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

  // 1色あたりの積分時間設定(下記は指定する定数とマニュアル設定モードの場合の積分時間)
  // * S11059_TINT0: 175 us
  // * S11059_TINT1: 2.8 ms
  // * S11059_TINT2: 44.8 ms
  // * S11059_TINT3: 358.4 ms
  colorSensor.setTint(S11059_TINT0);

  // マニュアルタイミング(0~65535)
  // setTint()で指定した積分時間を何倍まで長くするかを設定
  colorSensor.setManualTiming(3120);
}

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

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

  // 積分時間よりも長く待機
  //
  // マニュアル設定モード時のS11059.delay()で実行される待機処理の時間は
  // S11059.setTint(tint)、S11059.setManualTiming(manualTiming)で
  // 設定した値に応じて異なります
  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(1000);
}

サンプルスケッチの解説

積分モード設定

colorSensor.setMode(S11059_MODE_MANUAL)でマニュアル設定モードに設定しています。

ゲイン選択設定

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

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

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

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

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

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

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

下記の定数を引数で指定できます(※固定時間モードの場合の2倍の時間になっているのは仕様です)。

  • S11059_TINT0: 175 us
  • S11059_TINT1: 2.8 ms
  • S11059_TINT2: 44.8 ms
  • S11059_TINT3: 358.4 ms

S11059-02DTは、赤、緑、青、赤外を順に測定するため、その1色あたりの時間が上記の設定です。 そのため、全体の測定が完了するのは設定の4倍の時間が掛かります。 また、固定時間モードと異なり、後述するマニュアルタイミングの値を掛けあわせた時間が積分時間になります。

マニュアルタイミング設定

colorSensor.setManualTiming(3120)でマニュアルタイミング設定を3120に設定しています。

0〜65535の整数値を指定できます。

積分時間を何倍まで長くするか、という設定です。

設定の反映と測定開始

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

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

測定結果の読み取り間隔

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

サンプルスケッチの下記の設定で積分時間は2184 ms(175 us x 4 x 3120)になります。

  • 1色当たりの積分時間設定: 175 us
  • マニュアルタイミング: 3120

マニュアル設定モードでは、固定時間モードよりも長い積分時間を設定できることになります。 下記のような設定を行った場合、27分27秒744ミリ秒の測定を行うことになるのですが、まだ試していません。 光量が相当少ない環境でもそれなりの数値が出ることを期待しています。

  • 1色当たりの積分時間設定: 358.4 ms
  • マニュアルタイミング: 65535

測定結果の読み取り

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

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

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