Arduinoでカラーセンサーを扱う

標準

今回はArduinoでカラーセンサーの値を読み取ってみようと思います。
使ったカラーセンサーは「S11059」です。

回路

今回使うS11059は動作電圧(Vdd)が2.25~3.63[V]といったように、Arduinoの5[V]を直接引っ張ることが出来ません。これをするには、レベル変換回路が必要になるのですが、これは面倒なので今回はArduinoの3.3[V]を引っ張ることにします。
他の端子はSCLはSCL、SDAはSDAに接続するのみです。単純ですね。
この時、SCLとSDAにはプルアップ抵抗を挟むことが推奨されています。 (CbusとVddの値によって変化するが2.2[kΩ]程度)

ライブラリの導入

今回のプログラムを作成するにあたって、カラーセンサーの値をより簡単に読み取るための専用ライブラリを使います。
下記GitHubのプロジェクトページの下の方から、ライブラリを.zip形式でダウンロードしてください。

jakalada/Arduino-S11059

その後、ソフト側からライブラリをロードします。

ライブラリのロード

以上でライブラリの導入は完了です。あとはコード側で指定することでライブラリを実際に使用することが出来ます。

スケッチ

上記ライブラリを導入した上で、同プロジェクト内にあるサンプルソースをコピペします。
また、以下のソースはそのサンプルソースをSketchのシリアルプロッタのグラフの色に概ね合致するように若干カスタムしてあります。どっちを使っても構いません。

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

S11059 colorSensor;

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

  // 積分モードを固定時間モードに設定
  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.getBlue());
    Serial.print(",");
    Serial.print(colorSensor.getGreen());
    Serial.print(",");
    Serial.print(colorSensor.getRed());
    Serial.print(",");
    Serial.print(colorSensor.getIR());
    Serial.println("");
  } else {
    Serial.println("update failed");
  }

  delay(100);
}

考察

上記ソースコードで動作させて、シリアルプロッタで見てみたところ以下のようになりました。
カラーセンサー

上記プロットで赤は赤色要素、オレンジは緑色要素、青は青色要素、アクアは赤外線要素の値を表しています。
感度の差があるのか、デフォルトとしての値が違いますね。

この検証でArduinoの尊さを実感しましたね。I2CはRaspiでも読み取れますが、電圧を下げれるのはArduinoの利点ですね。この調子で地磁気センサーも扱っていきます。

投稿者プロフィール

yoshipc
コンピューター関連を得意としています。PHPが専門です(尚、技量はお察し)。このブログとMastodonのインスタンスを運営・管理しています。よろしくお願いいたします。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です