目標
カラーセンサーを使用して、環境の色をRGB値として取得したい
知識材料
利用環境
- Arduino IDE 1.8.7
- ESP8266 core for Arduino 2.4.2
- [ESP-WROOM-02]
今後、取得した色をサーバに送信したかったので、WROOM-02 を使いました。
Arduino Uno などでも動きます。
今回のゴール
カラーセンサーの 「赤」「青」「緑」を、なんとなくRGB値として出力
実践
接続
マイコンとセンサーを接続する。
Arduino PIN | DST |
---|---|
3V3 | 3.3V |
GND | GND |
IO14 | [S11059] SDA |
IO13 | [S11059] SCL |
Arduino 側ソースコード
あらかじめ、センサーに「赤いライト」「青いライト」「緑色のライト」を近づけて、
一番大きかった「赤の値」、「青の値」、「緑の値」を
RGBの 0xFF として得られるように map()関数を設定。
s11059.ino
#include <Wire.h>
#define I2C_SDA 14
#define I2C_SCL 13
#define S11059_ADDR 0x2A
void setup() {
Serial.begin(74880);
Serial.println("start");
// Init I2C
Wire.begin(I2C_SDA, I2C_SCL);
// 0x00 = Control
// 0x8B = ADC-Reset + High Gain + 179.2ms
Wire.beginTransmission(S11059_ADDR);
Wire.write(0x00);
Wire.write(0x8B);
Wire.endTransmission();
// 0x00 = Control
// 0x0B = ADC-Run + High Gain + 179.2ms
Wire.beginTransmission(S11059_ADDR);
Wire.write(0x00);
Wire.write(0x0B);
Wire.endTransmission();
}
void loop() {
delay(720);
int h,l ,r,g,b,a;
// 0x03 Read Data
Wire.beginTransmission(S11059_ADDR);
Wire.write(0x03);
Wire.endTransmission();
Wire.requestFrom(S11059_ADDR,8);
if(Wire.available()){
// Red
h = Wire.read();
l = Wire.read();
r = h << 8|l;
Serial.print(" r:");
Serial.print(r);
// Green
h = Wire.read();
l = Wire.read();
g = h << 8|l;
Serial.print(" g:");
Serial.print(g);
// Blue
h = Wire.read();
l = Wire.read();
b = h << 8|l;
Serial.print(" b:");
Serial.print(b);
// Infra red
h = Wire.read();
l = Wire.read();
a = h << 8|l;
Serial.print(" a:");
Serial.print(a);
// It converted to RGB?
int rr, gg, bb;
Serial.println(" ");
rr = map(r, 30, 56000, 0, 255);
gg = map(g, 30, 41000, 0, 255);
bb = map(b, 30, 56000, 0, 255);
Serial.print(rr, HEX);
Serial.print(" ");
Serial.print(gg, HEX);
Serial.print(" ");
Serial.print(bb, HEX);
Serial.println("");
}
Wire.endTransmission();
}
実行と結果
動画内に表示される
r:xxxxx g:xxxxx b:xxxxx a:xxxx の行は、センサーの値をそのまま出力。
その次の HEX 行は、それぞれ R
/G
/B
に変換した結果。
まとめ
何に使うかはさておき、
適当なRGB変換処理にしては、それっぽい色味を得られていたと思う。