Arduino-デジタルカラーセンサ「S11059-02DT」の使い方
当記事では、Arduinoでデジタルカラーセンサ「S11059-02DT」を使う方法を詳しく解説します。
温度・湿度センサ「S11059-02DT」はI2Cで制御するため、ArduinoのWireライブラリを使ったプログラムで動作させます。
なお、その他のArduino関数・ライブラリについては、以下の記事をご覧ください。
デジタルカラーセンサ「S11059-02DT」の基本スペック
「S11059-02DT」はI2C制御で、フォトダイオードを自動で順番に切り替えて、赤(Red)/緑(Green)/青(Blue)/赤外(IR)の色を測定できるセンサです。
当記事では、基板にモジュール化された秋月電子通商の「I2C対応デジタルカラーセンサモジュール S11059-02DT」を使用して、サンプルプログラムを解説していきます。
基本スペック | S11059-02DT |
---|---|
電源電圧 | DC2.25~3.63V |
通信方式 | I2C (1kHz~400kHz) |
測定光 | 赤/緑/青/赤外 |
データビット数 | 16bit |
消費電流 | 動作モード:75uA(Typ.) 待機モード:1.0uA(Typ.) |
S11059-02DTのより詳細なスペックを確認したい場合は、以下のリンク先にある説明書とデータシートをご覧ください。
デジタルカラーセンサ「S11059-02DT」のコマンド
機能 | アドレス | Bit |
---|---|---|
コントロール | 00 | Bit7:ADCリセット 1:リセット 0:動作開始 Bit6:スリープ機能 1:待機モード 0:動作モード Bit5:スリープ機能 モニタ Bit4:- Bit3:ゲイン選択 1:Highゲイン 0:Lowゲイン Bit2:積分モード 1:マニュアル設定モード 0:固定時間モード Bit1/0:積分時間設定 00:87.5uS 01:1.4mS 10:22.4mS 11:179.2mS |
マニュアルタイミング レジスタ | 01/02 | 上位バイト/下位バイト |
Red センサデータレジスタ | 03/04 | 上位バイト/下位バイト |
Green センサデータレジスタ | 05/06 | 上位バイト/下位バイト |
Blue センサデータレジスタ | 07/08 | 上位バイト/下位バイト |
赤外 センサデータレジスタ | 09/0A | 上位バイト/下位バイト |
S11059-02DTのより詳細なコマンド内容を確認したい場合は、以下のリンク先にある説明書とデータシートをご覧ください。
サンプルプログラム(サンプルスケッチ)
- I2C対応デジタルカラーセンサモジュール S11059-02DT
- I2Cバス用双方向電圧レベル変換モジュール(PCA9306)
- Arduino Uno
- USBケーブル
- ブレッドボード
- ジャンパ線
- PC(プログラム書き込み・シリアルモニタ表示)
サンプルプログラム(サンプルスケッチ)で、ブレッドボードを使います。ブレッドボードの詳しい使い方は、以下の記事をご覧ください。
初期設定[マニュアル設定モード,Lowゲイン,Tint=00(175us),積分時間546ms/ch(マニュアルタイミングレジスタに0x0C30がセット)]
#include <Wire.h>
//アドレス指定
#define S11059_ADDR 0x2A
#define CONTROL_MSB 0x00
#define CONTROL_1_LSB 0x84
#define CONTROL_2_LSB 0x04
#define SENSOR_REGISTER 0x03
void setup()
{
Serial.begin(9600);//シリアル通信を9600bpsで初期化
Wire.begin();//I2Cを初期化
Wire.beginTransmission(S11059_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
Wire.write(CONTROL_MSB);//コントロールバイトを指定
Wire.write(CONTROL_1_LSB);//ADCリセット、スリープ解除
Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
Wire.beginTransmission(S11059_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
Wire.write(CONTROL_MSB);//コントロールバイトを指定
Wire.write(CONTROL_2_LSB);//ADCリセット解除、バスリリース
Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
}
void loop() {
//変数宣言
int high_byte, low_byte, red, green, blue, IR;
delay(2500);//2500msec待機(2.5秒待機)
Wire.beginTransmission(S11059_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
Wire.write(SENSOR_REGISTER);//出力データバイトを指定
Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
Wire.requestFrom(S11059_ADDR, 8);//I2Cデバイス「S11059_ADDR」に8Byteのデータ要求
if(Wire.available()){
high_byte = Wire.read();//high_byteに「赤(上位バイト)」のデータ読み込み
low_byte = Wire.read();//high_byteに「赤(下位バイト)」のデータ読み込み
red = high_byte << 8|low_byte;//1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、redに代入
high_byte = Wire.read();//high_byteに「緑(上位バイト)」のデータ読み込み
low_byte = Wire.read();//high_byteに「緑(下位バイト)」のデータ読み込み
green = high_byte << 8|low_byte;//1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、greenに代入
high_byte = Wire.read();//high_byteに「青(上位バイト)」のデータ読み込み
low_byte = Wire.read();//high_byteに「青(下位バイト)」のデータ読み込み
blue = high_byte << 8|low_byte;//1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、blueに代入
high_byte = Wire.read();//high_byteに「赤外(上位バイト)」のデータ読み込み
low_byte = Wire.read();//high_byteに「赤外(下位バイト)」のデータ読み込み
IR = high_byte << 8|low_byte;//1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、IRに代入
}
Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
Serial.print(blue);//「blue」をシリアルモニタに送信
Serial.print(",");//文字列「,」をシリアルモニタに送信
Serial.print(red);//「red」をシリアルモニタに送信
Serial.print(",");//文字列「,」をシリアルモニタに送信
Serial.print(green);//「green」をシリアルモニタに送信
Serial.print(",");//文字列「,」をシリアルモニタに送信
Serial.print(IR);//「IR」をシリアルモニタに送信
Serial.println("");//改行
}
167,693,511,72
167,693,511,72
167,693,511,72
167,693,511,72
167,693,511,72
167,693,511,72
167,693,511,72
167,693,511,72
167,693,511,72
167,693,511,72
サンプルプログラムでは、[マニュアル設定モード,Lowゲイン,Tint=00(175us),積分時間546ms/ch(マニュアルタイミングレジスタに0x0C30がセット)]の初期設定を行い、赤(Red)/緑(Green)/青(Blue)/赤外(IR)の色を測定してシリアルモニタまたはシリアルプロッタに表示させます。
シリアルプロッタのデフォルトの色の順番は、「青、赤、緑、オレンジ」になるので、「Serial.print()」で送信する順番を「青(Blue)、赤(Red)、緑(Green)、赤外(IR)」にしています。
[固定時間モード,Highゲイン,Tint=01(1.4ms),積分時間1.4ms/ch]
#include <Wire.h>
//アドレス指定
#define S11059_ADDR 0x2A
#define CONTROL_MSB 0x00
#define CONTROL_1_LSB 0x89
#define CONTROL_2_LSB 0x09
#define SENSOR_REGISTER 0x03
void setup()
{
Serial.begin(9600);//シリアル通信を9600bpsで初期化
Wire.begin();//I2Cを初期化
Wire.beginTransmission(S11059_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
Wire.write(CONTROL_MSB);//コントロールバイトを指定
Wire.write(CONTROL_1_LSB);//ADCリセット、スリープ解除
Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
Wire.beginTransmission(S11059_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
Wire.write(CONTROL_MSB);//コントロールバイトを指定
Wire.write(CONTROL_2_LSB);//ADCリセット解除、バスリリース
Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
}
void loop() {
//変数宣言
int high_byte, low_byte, red, green, blue, IR;
delay(50);//50msec待機(0.05秒待機)
Wire.beginTransmission(S11059_ADDR);//I2Cスレーブ「Arduino Uno」のデータ送信開始
Wire.write(SENSOR_REGISTER);//出力データバイトを指定
Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
Wire.requestFrom(S11059_ADDR, 8);//I2Cデバイス「S11059_ADDR」に8Byteのデータ要求
if(Wire.available()){
high_byte = Wire.read();//high_byteに「赤(上位バイト)」のデータ読み込み
low_byte = Wire.read();//high_byteに「赤(下位バイト)」のデータ読み込み
red = high_byte << 8|low_byte;//1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、redに代入
high_byte = Wire.read();//high_byteに「緑(上位バイト)」のデータ読み込み
low_byte = Wire.read();//high_byteに「緑(下位バイト)」のデータ読み込み
green = high_byte << 8|low_byte;//1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、greenに代入
high_byte = Wire.read();//high_byteに「青(上位バイト)」のデータ読み込み
low_byte = Wire.read();//high_byteに「青(下位バイト)」のデータ読み込み
blue = high_byte << 8|low_byte;//1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、blueに代入
high_byte = Wire.read();//high_byteに「赤外(上位バイト)」のデータ読み込み
low_byte = Wire.read();//high_byteに「赤外(下位バイト)」のデータ読み込み
IR = high_byte << 8|low_byte;//1Byte目のデータを8bit左にシフト、OR演算子で2Byte目のデータを結合して、IRに代入
}
Wire.endTransmission();//I2Cスレーブ「Arduino Uno」のデータ送信終了
Serial.print(blue);//「blue」をシリアルモニタに送信
Serial.print(",");//文字列「,」をシリアルモニタに送信
Serial.print(red);//「red」をシリアルモニタに送信
Serial.print(",");//文字列「,」をシリアルモニタに送信
Serial.print(green);//「green」をシリアルモニタに送信
Serial.print(",");//文字列「,」をシリアルモニタに送信
Serial.print(IR);//「IR」をシリアルモニタに送信
Serial.println("");//改行
}
5,19,13,2
4,18,14,2
5,18,13,3
5,17,13,2
5,17,14,2
5,18,14,3
5,18,14,2
5,17,13,3
5,17,14,3
5,18,14,2
サンプルプログラムでは、[固定時間モード,Highゲイン,Tint=01(1.4ms),積分時間1.4ms/ch]の初期設定を行い、赤(Red)/緑(Green)/青(Blue)/赤外(IR)の色を測定してシリアルモニタまたはシリアルプロッタに表示させます。
シリアルプロッタのデフォルトの色の順番は、「青、赤、緑、オレンジ」になるので、「Serial.print()」で送信する順番を「青(Blue)、赤(Red)、緑(Green)、赤外(IR)」にしています。
おすすめのArduinoボードはどれ?
当記事『Arduino-デジタルカラーセンサ「S11059-02DT」の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。
やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。
電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。
また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。
このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。