KOSEN{BLOG}について

色の三原色を光の三原色(RGB)に変換するデバイスの開発

ことの発端

久留米高専専攻科1年の授業には「創造工学実験」と言うものがあります。この授業は端的に言うと「予算は~円まで学校が出すからその予算内で、誰も考えたことのない面白そうなデバイスを発案・設計・開発しましょう」と言うものです。今回はこの授業で制作したものを紹介します。

作成したもの

この記事の見出しにも書いてある通り、私は「色の三原色を光の三原色(RGB)に変換するデバイス」を作成しました。単純に言うと、「なんでもいいので現実世界にある物体の上に私のデバイスを載せると、その物体の表面の色を読み取り、RGB(16進数)を表示してくれる」です。

ではこのデバイスについて詳しく書いていきます。

発案

元々私は、プログラミングが好きなので、5年生(1年前)の夏休みにpythonとweb系フレームワークライブラリであるdjangoを使ったwebページの開発をしていました(あわよくば自分のホームページとして使いたかったです)。その開発の際にちょっと迷ったことが、[フロントエンドのデザイン]です。どのようなデザインでwebページを作ったら見やすくて印象に残るのだろうかとUdemyでデザイン講座を買って見たり…

結果的には、そこそこ普通な見た目のウェブページができました。しかし、この時「現実にある色をwebページなどのデジタルデザインでも使えたらいいのになぁ」とふと思いつきました。秋月電子でカラーセンサーをパッと調べたところ、そこそこ手ごろな価格で売っていたのでいつかは作りたいと胸に潜めていました。

創造工学実験開始時に、「ちょうどよかった。お金も学校持ちやし」といった感じでこれを作りました。

 

完成品

かなり雑です。筐体に至っては、プラ板をくっつけただけになっています。

 

カラーコードについて

WEBページやword、エクセル、パワポなどデジタル世界でよく使われている色の表現方法としてカラーコード(RGB 各8bit計24bit)があります。
これは、「Red Green Blueの光の三原色のそれぞれの成分がどのくらいの強さか」というもので、各色0~255(255が一番強い原色)で表します。

なぜ「光の三原色」なのかは、「これらの色を表現しているのは、発光している(光源である)液晶のため」ためです。

デジタル世界における色の表現方法はわかりましたが、現実にある色をカラーコードに変換するにはどうすれば良いでしょうか?

色の読み取り方

現実の世界における物体の色というものは大抵、太陽や蛍光灯などの白色の光が反射しているものです。これがいわゆる「色の三原色」ですね。現実世界における物体の色をカラーコードに表すためにはこの「物体が白色の光を反射している」特徴を利用したカラーセンサーを使います。

使用したカラーセンサ ー

カラーセンサーとして使用したものはこちらです。これは秋月に500円で売っているS11059-02DTというものです。このセンサーなんとそれぞれの色の精度が16bitもあります(RGBはそれぞれ8bitなのに)。16bitということは (2^16) = 65536パターンまで分割することができます。すごい精度ですよね。

また、秋月で売っている他のカラーセンサ ーと違いこのセンサーはpinだけをはんだ付けすればいいので、はんだ付けをあまり行ったことのない人も比較的安心してできます。

I2Cが使えるので、ピン数も4つで済むため結構使いやすいです。

カラーセンサ ーの仕組み

ハードウェアを行う際に、楽しいというか面白い(人によってはめんどくさい)ポイントとして、センサーの仕組みです。
ここではこのカラーセンサ ーの仕組みを説明します。

皆さんは、高校や大学受験時「赤シート」を使いましたか?
赤シートは、「赤文字の上に赤シートをかぶせることで文字が消える」という性質を利用して勉強に用いられてますよね。これがカラーセンサ ーにも関連しています。

ここで赤文字について考えてみましょう。赤文字は、赤文字自体が発光していないため、「色の三原色」となりますよね。赤文字に白色光を当てた際、赤文字は白から赤色以外の成分を吸収します。そのため我々の目には「赤色」として見えるのです。

赤シートを赤文字の上に被せて上から見ると、赤文字が消えたように見える理由を説明しましょう。
赤シートを赤文字の上に被せた時、赤文字とその背景色である白は赤シートを通って我々の目に飛び込んできます。この「赤文字の赤」と「白背景の白色」が赤シートを通る際に、赤シートが赤以外の色の成分を吸収します。この際、赤文字の赤は(赤 – 赤以外 = 赤) 白背景の白は(白 – 赤以外 = 赤)と両方同じ赤のみが残ってしまうため、人間の目が識別できなくなる。ということです。

これらの何がカラーセンサーと関連があるのでしょうか?
実はカラーセンサーの表面には、「赤シート」と「青シート」、「緑シート」が貼ってあります。
測りたいものの物体の色をA色とすると、赤シートを通った時の色は A – 赤以外 = Aの赤色成分
青シートの場合 A – 青以外 = Aの青成分、 緑シートを通った場合 A – 緑以外 = Aの緑色成分
このようになるため、色シートの下に入ってくる光は物体の色の各RGB成分となります
ちなみにこの色シートの下には、通常の照度センサーが含まれているため、それぞれの色の明るさつまり強さがわかるというものです。

これにより、それぞれの色の明るさ(強さを出すことができます)

使用した部品

カラーコードの表示

7セグメント * 6桁

マイコン

Atmega328p-pu (arduino unoと同じやつ)

ディスプレイ

ADA-3533(スイッチサイエンス)
このディスプレイは小型で、使いやすいっちゃ使いやすいのですが、RGBが計24bitではなく計16bitとなっているので、表現できる色の数は少ないです… (僕はここを見落としてました)

カラーセンサー

こちら
これは、少し高いことを除けば、めっちゃおすすめです。(精度が高くてI2Cだし、はんだ付けも楽)

RGBW LED

こちら
この部品は、カラーセンサーで色を読み取る際に使いました。
カラーセンサーの真横に設置して、物体に白色を当てると、その反射光がカラーセンサーに入るためですね。

ソフトウェア

Arduino unoの上に載っているAtmega328p-puを購入し、arduino unoでプログラムを書き込めるようブートローダーを入れた後、arduino unoで設計しました。今回は、速さとかの制約がなかったのでPICを使ってません。

使用したライブラリ

液晶操作

Adafruit_ST7735.h

Adafruit_GFX.h

SPI.h

フルカラーLED

Adafruit_NeoPixel.h

カラーセンサー

S11059.h

Wire.h

以上となります。

 

プログラム本文については、C++でのクラスの書き方を知らなかった&調べる時間がなかったため、とても汚いコードとなりました。そのため、公開をしません。何か質問等ございましたら、コメント欄にてお願いします。

 

 

 

 

 

 

 

 

コメントを残す

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