色の読み取りとフルカラーLEDへの色転写
こんにちは。くろべこでございます。
昨日の記事でデジタルカラーセンサ(S11059-02DT)とフルカラーLEDの紹介をしました。
今回はせっかくなのでこの二つを使用して電子工作をしていきます。
何をしたいかというと、、、
【色転写装置】を作りたいと思います。
どのような機能かというと、“カラーセンサで読み取ったRGBデータでフルカラーLED制御用のPWM入力に反映させて色を転写させる”といったものになります!
構想の中では食品工場とかにあるようなワークから色を検出して選別するような一画素タイプの色検出センサ的な使い方がしたかったのですが、駆動系も準備する必要があり時間がかかりそうだったので後日に回したいと思います、、、
という事で、主要部品はカラーセンサ, フルカラーLED, マイコンのみで構築できる本装置を作っていきます。
材料
- デジタルカラーセンサ(S11059-02DT)
- フルカラーLED
- 白色LED(照明用)
- レベル変換器(カラーセンサのVccが2.25V~3.36V推奨の為)
- 1kΩ抵抗×5(I2Cプルアップ&フルカラーLED用)
- 100Ω抵抗×1(白色LED用)
- 白色光拡散キャップ
※白色光拡散キャップがない場合は、白い何かを被せるを三色が混ざりやすくなります。参考例として、発泡材と紙を使った写真を載せますね。
電気回路
気を付けたいところは2か所です。
- I2CのSDA, SCKは1kΩ抵抗でプルアップすること。
- デジタルカラーセンサのVccの関係上ロジック電圧のレベル変換を行うこと。
カラーセンサとLED照明(白)はモジュールかするために紙コップに組み込みました(色の検出は物体の反射光をカラーセンサが受光して検出するためです)。
コード
今回はカラーセンサのコードについてはライブラリを使用します(以下のリンクの参照)。Zipファイルをダウンロードの上ライブラリをインクルードしてください。
コード中のカラーセンサの設定値については以下の通りです。
- カラーセンサゲイン:HIGH
- 測定モード:マニュアル
- 積分時間:175us
- 積分倍数:1500
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
//ライブラリインクルード #include "Wire.h" #include "S11059.h" S11059 colorSensor; uint16_t datar,datag, datab;//色データ格納 byte gammatable[256];//フルカラーLED照度曲線調整 void setup() { Serial.begin(9600); Wire.begin(); pinMode(3, OUTPUT);//照明用白 pinMode(9, OUTPUT);//赤 pinMode(10, OUTPUT);//緑 pinMode(11, OUTPUT);//青 // 積分モードをマニュアル設定モードに設定 colorSensor.setMode(S11059_MODE_MANUAL); // ゲイン選択 // * S11059_GAIN_HIGH: Highゲイン // * S11059_GAIN_LOW: Lowゲイン colorSensor.setGain(S11059_GAIN_HIGH); // 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(1500); //光の強さの補正をする for (int i=0; i<256; i++) { float x = i; x /= 255; x = pow(x, 1.2); x *= 255; gammatable[i] = x; } } void LED(uint16_t a,uint16_t b,uint16_t c ){ uint16_t R, G, B;//RGB R=map(a,0,65535,0,255)*1; G=map(b,0,65535,0,255)*1; B=map(c,0,65535,0,255)*1; Serial.print("RED_PWM:");Serial.println(R); Serial.print("GREEN_PWM:");Serial.println(G); Serial.print("BLUE_PWM:");Serial.println(B); Serial.println(""); Serial.print("RED_PWM_ganma:");Serial.println(gammatable[R]); Serial.print("GREEN_PWM_ganma:");Serial.println(gammatable[G]); Serial.print("BLUE_PWM_ganma:");Serial.println(gammatable[B]); Serial.println(""); analogWrite(9,gammatable[R]); analogWrite(10,gammatable[G]); analogWrite(11,gammatable[B]); } void loop() { analogWrite(3, 255); // 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()) { datar=colorSensor.getRed(); Serial.print(datar); Serial.print(","); datag=colorSensor.getGreen(); Serial.print(datag); Serial.print(","); datab=colorSensor.getBlue(); Serial.print(datab); Serial.print(","); Serial.print(colorSensor.getIR()); Serial.println(""); } else { Serial.println("update failed"); } LED(datar,datag, datab); delay(1000); } |
このコードではフルカラーLEDの照度について調整をしています。
具体的には8bit分解能0~255を比例系から指数関数系に変更しています。
というのも、色取得をフルカラーLEDに反映するにあたって結構調整が難しくてですね、、、
試行錯誤のひとつとして入れているので効果的かは???です。
調整が難しかったところをまとめると。
- 積分倍数:積分時間は175us固定ですが倍数調整で飽和してしまう色が出てきてしまう。
- ゲイン:LOWの方が安定しそうだったが、値が小さくLEDがどうしても暗くなる
- フルカラーLEDのPWMテーブル:8bit指数関数テーブルの乗数調整
上記以外にも各色の電流制限抵抗により発光具合も変わるので色の再現のポイントの一つですね。また、フルカラーLEDでもVfのばらつきもあるので調整にはかなり苦労しました。
世の中にはマイコン内蔵のフルカラーLEDなるものがあるので、そちらの方が調整が簡単にできるかもしれません。
動作確認
動作確認にはカラーシートとマジックのキャップを使用しました。
【カラーシート緑】
【カラーシート青】
【カラーシート赤】
【キャップ水色】
【キャップピンク】
青系の再現は良い感じになっていますが、緑系は青色に負けているような感じですね。
そして、全体的に実物よりも淡い色になっています。
前述しましたが、このカラーセンサは物体に光を当てた時の反射光を検出しています。なので、どうしても実物よりも淡くなってしまうんでしょうね。
反射光と思われるカップから漏れている光とはほぼ同じような色は出せていると思うのでまあ、成功としときましょう。
おわりに
今回はカラーセンサから取得した色データをフルカラーLEDに反映する電子工作を紹介しました。
これを一言で言うと、、、調整が難しい!!!
工場でこんなセンサがあったら発狂するレベルで調整が難しいです。実際のかかった時間を言うと、組み立て1時間、調整5時間くらいです。
とはいえ、実物の色の再現はできないものの反射光は表現できるレベルにはなったのかと思います。
次のステップとしては、色の選別機とか作るのも面白いかもしれませんね。現在構想している対象としてはm&m’s(カラフルなチョコレート)を考えています。
では、今回はこれで失礼します!
コメント