カラーセンサーの組み立て

デジタルカラーセンサS9706 (マニュアル)は非常に小さいので、シール基板を通常の基板に張り付け、そこに半田付けして固定します。また、使うときには下向きにするので入射光が少ないので白色LEDで照らします。ここで用いているLEDは非常に小さいですが、結構な光度です。LED用の抵抗は100Ωのチップ抵抗を用いています。
LED及び抵抗は瞬間接着剤で張り付けています。抵抗は小さくて半田付けしにくいので1/6Wの抵抗を用いた方が楽だと思います。
また、この基板に直接接着する理由もないので、適当に目的の場所に光が当たるように取り付けます。
  1. 以下のような大きさの基板とシール基板(サンハヤトICB-060)を用意します。

  2. シール基板はカラーセンサーの大きさにあわないので、半分に切ります。

  3. 半分に切ったシール基板を普通の基板に貼り付けます。

  4. シール基板上にカラーセンサーを半田付けします。

  5. 丸ピンICソケット・両端オスピンを4ピンずつ用意します。

  6. 足の付け根が三角のほうがソケットなどに入るほうなので、平らのほうを基板側に挿入して半田付けします。

  7. つぎにこれをチェックするためのソケットを作り、配線します。

  8. プログラムを作り、動作チェック後にLEDを取り付けます。LEDをセンサーのすぐ近くに配置するとLEDからの反射光ではなく、直接入ってしまいますので少し離しましょう。あるいは衝立でもつけて隔離しましょう。

通信プロトコル(計測の方法)



カラーセンサーのプログラム

メインプログラム
#include "mbed.h"
#include "ColorSensor.h"

//ColorSensor color(p5, p6, p7, p8, 10);
ColorSensor color = ColorSensor();
Serial pc(USBTX, USBRX); // tx, rx

int main()
{
  unsigned R, G, B;
  pc.baud(115200);
  while(1)
  {
    //color.getRGB(R, G, B);
    //pc.printf("%4d %4d %4d\n", R, G, B);
    switch(color.judge()){
      case RED: pc.printf("RED\n"); break;
      case GREEN: pc.printf("GREEN\n"); break;
      case BLUE: pc.printf("BLUE\n"); break;
      default: break;
    }
    wait_ms(500);
  }
}
 1 mbed用のヘッダ
 2 ColorSensor用のヘッダ
 3 
 4 デフォールトの設定
 5 カラーセンサーのオブジェクトを作る
 6 シリアルのオブジェクトを作る
 7 
 8 
 9 
10 
11 
12 
13 
14 RGBのそれぞれの値を読むチェック用
15 
16 色をRGBに判定する
17 
18 
19 
20 
21 
22 
23 
24 

ヘッダーファイル
ColorSensor.h
#include "mbed.h"
#define RED   0
#define GREEN 1
#define BLUE  2
#define OTHER 3
class ColorSensor
{
  private:
    DigitalIn *Dout;
    DigitalOut *Range;
    DigitalOut *CK;
    DigitalOut *Gate;
    int time;
    double R, G, B;
  public:
    ColorSensor(PinName Dout, PinName Range, PinName CK, PinName Gate, int time);
    ColorSensor(void);
    void getRGB(unsigned short RGB[]);
    void getRGB(unsigned& R, unsigned& G, unsigned& B);
    unsigned checkRGB(unsigned& R, unsigned& G, unsigned& B);
    int judge();
    void setWhite();
};
 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 色データを受け取るオブジェクト
10 センサーの感度
11 クロック
12 計測開始、終了
13 計測時間
14 初期白データ
15 
16 コンストラクタ
17 コンストラクタ
18 
19 
20 
21 RGB判定
22 白レベル設定
23 

クラスの定義
ColorSensor.cpp
#include "ColorSensor.h"
// カラーセンサーテストプログラム
// 赤、緑、青を判定する。
#define coef 1.05

ColorSensor::ColorSensor(
    PinName dout, PinName range, 
    PinName ck, PinName gate, int tm)
{
  Dout  = new DigitalIn(dout);
  Range = new DigitalOut(range);
  CK    = new DigitalOut(ck);
  Gate  = new DigitalOut(gate);
  time  = tm;       // 積算時間(ms)

  *CK = 0;
  *Gate = 0;
  *Range= 1;    // 高感度モード
  setWhite();
}

void ColorSensor::setWhite()
{
  unsigned short RGB[3];
  getRGB(RGB);
  R = RGB[0];
  G = RGB[1];
  B = RGB[2];
}

ColorSensor::ColorSensor(void) {
  unsigned short RGB[3];
  double R, G, B, r,g,b;

  Dout  = new DigitalIn(p5);    // Dout
  Range = new DigitalOut(p6);   // Range
  CK    = new DigitalOut(p7);   // CK
  Gate  = new DigitalOut(p8);   // Gate

  *CK   = 0; //ck
  *Gate = 0; //gate
  *Range = 1;  // 高感度モード range
  time = 10;   // 10ms
  setWhite();
}

void ColorSensor::getRGB(unsigned short RGB[])
{
    unsigned short i, j, coldata;

     *Gate = 1; 
     wait_ms(time);      // 積算時間
     *Gate  = 0; 
     for(i=0; i<3; i++) {
       coldata=0;
       for(j=0; j<12; j++) {
         *CK = 1; 
         wait_us(1);
         coldata>>=1;
         if(*Dout) coldata|=0x800;
         *CK = 0;
         wait_us(1);
      }
      RGB[i]=coldata;
    }
}

void ColorSensor::getRGB(
  unsigned& R, unsigned& G, unsigned& B)
{
    unsigned i, j, coldata;

     *Gate = 1; 
     wait_ms(time);       //  積算時間
     *Gate = 0;
     for(i=0; i<3; i++) {
       coldata=0;
       for(j=0; j<12; j++) {
         *CK = 1;
         wait_us(1);
         coldata>>=1;
         if(*Dout) coldata|=0x800;
         *CK = 0;
         wait_us(1);
       }
       switch(i) {
        case 0: R=coldata; break;
        case 1: G=coldata; break;
        case 2: B=coldata; break;
      }
    }
  }

  // 比率を%で返す
unsigned ColorSensor::checkRGB(
  unsigned& R, unsigned& G, unsigned& B)
{
     unsigned i, j, coldata, I;

     *Gate = 1; 
     wait_ms(time);      //  積算時間
     *Gate = 0;
     for(i=0; i<3; i++) {
       coldata=0;
       for(j=0; j<12; j++) {
         *CK = 1; 
         wait_us(1);
         coldata>>=1;
         if(*Dout) coldata|=0x800;
         *CK = false;
         wait_us(1);
       }
       switch(i) {
        case 0: R=coldata; break;
        case 1: G=coldata; break;
        case 2: B=coldata; break;
      }
    }
    I = R + G + B;
    R = R*100/I;
    G = G*100/I;
    B = B*100/I;
    return I;
}

int ColorSensor::judge()
{
  unsigned short RGB[3];
  double r,g,b;
  *CK   = 0; //ck
  *Gate = 0; //gate
  *Range = 1;  // 高感度モード range

  getRGB(RGB);
  r = RGB[0]*100/R;
  g = RGB[1]*100/G;
  b = RGB[2]*100/B;
  if(r > g) {
       if(r > b*coef) return RED;
       else if(b > r*coef) return GREEN;
  }
   else {
     if(g > b*coef) return GREEN;
     else if(b > g*coef) return BLUE;
   }
  return OTHER;
}
 1 
 2 
 3 
 4 
 5 色判定時の判定係数。実験による経験値
 6 
 7 
 8 
 9 
10 各ピンのオブジェクトを作り
11 その参照アドレスをインスタンス変数に
12 格納する
13 
14 積算時間を格納する
15 
16 クロックをLowにする
17 GateをLowにする
18 高感度モードにする
19 白レベルを計測する
20 
21 
22 白レベルを計測する
23 
24 RGBの生データ一時保持
25 色計測
26 double型に変換し、保持
27 
28 
29 
30 
31 デフォールトのコンストラクタ
32 
33 
34 
35 Doutはp5に接続する
36 Rangeはp6に接続する
37 CKはp7に接続する
38 Gateはp8に接続する
39 
40 クロックをLowにする
41 GateをLowにする
42 高感度モードにする
43 計測時間を10msにする
44 白レベルを計測する
45 
46 
47 色データを取得する
48 配列に入れて返す
49 
50 
51 計測開始
52 光を積算する
53 計測終了
54 RGBの値をシリアルで取得する
55 
56 各色データは12bit
57 
58 
59 
60 LSBが先頭のデータ
61 
62 
63 
64 色データを格納
65 
66 
67 
68 参照型の変数に値を返す
69 
70 
71 
72 
73 
74 光の積算はGATE信号をHighに行う
75 
76 Red、Green、Blueの順に3回データを取得する
77 
78 1つのデータは12bitである
79 
80 
81 
82 
83 
84 
85 
86 
87 1回目は赤
88 2回目は緑
89 3回目は青
90 
91 
92 
93 
94 
95 RGBの比率を%で参照型で返す
96 光の強度を返す
97 
98 
99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
126 光の構成によって赤緑青に分類する
127 
128 
129 
130 
131 
132 
133 
134 
135 RはsetWhite()で設定した値
136 GはsetWhite()で設定した値
137 BはsetWhite()で設定した値
138 
139 
140 
141 
142 
143 
144 
145 
146 
147 

照明LEDを付ける

上記「カラーセンサーの組み立て」の項目ように、白色LEDの光をセンサーに出来るだけあたらないように配置します。さらにこのLEDをコントロールできるようにします。簡単にはセンサーへのGATE信号をそのまま利用すると、測定する時のみLEDを光らせるようにできるので、電池の減り方を抑えることが出来ます。ここで簡単に使える素子はデジタルトランジスタや、Nチャネルのエンハンスメント型のMOSFETです。
 まず、デジタルトランジスタDTC144を利用する方法です。抵抗は内蔵されているので、外部抵抗は何も要りません。
R1、R2は47kΩです。

INをGATEに繋ぎ、OUTを「カラーセンサーの組み立て」のLEDから黒の線で来ているところに繋ぎます。デジタルトランジスタはインバータとして動作します。GATE信号がHighの時にデータを取るので、LEDは黒の線をこの時にLowにすれば良いのでインバータ一つで電流増幅できることになります。このデジタルトランジスタは一つで100mAまで流すことが出来ます。

 次に、Nチャネルのエンハンスメント型のMOSFETである2N7000です。これは日本製ではないので、番号ではどのような性質なのかは分かりません。日本の型名では「2SK何とか」となります。
 MOSFETは基本的にGate(G)には電流が流れず、電圧駆動型なのでGate側には抵抗が無くても問題ありません。
Gate(G)はセンサーへのGATEを直接繋ぎ、Source(S)はグラウンドに繋ぎます。Drain(D)は上記デジタルトランジスタのOUTと同じようにLEDのカソード側に繋ぎます。

足の接続



カラーLEDと連動させる

カラーコピー