ブログBlog
2026年02月16日 [アプリ屋さんのIoT]
光の実験キット(1)プロトタイプ
今回から数回にわたって、光の実験を、電子工作を用いて行いたいと思います。色を表現するためには、3色を混ぜる事でほとんどの色を表現することができます。
絵具やプリンタに代表される、青(シアン)、赤(マゼンタ)、黄を混ぜる方法である減法混色。
カラーディスプレイなど、赤、青、緑を混ぜる加法混色。
上記の2つが挙げられます
加法と減法の覚え方としては、色の明るさが明るい方向に向かうかのベクトル方向として覚えるのはいかがでしょうか?
減法混色では、青(Cyan)、赤(Magenta)、黄(Yellow)を使いますが、プリンタなどでは発色を良くするために黒(Keynote)の4色が利用されることが多いです。それぞれの英名の頭文字を使って、「CMYK」と表現することが多いです。
一方の加法混色では、赤(Red)、緑(Green)、青(Blue)が使用されます。各色の英名の頭文字を使って、RGBと表現することが一般的です。
この企画では、LEDを用いて色を表現するため、加法混色を用いた実験装置を作っていきます。
今回は、以下を実践したいと思います。
・LEDを安全に光らせる回路
・半固定抵抗を用いて、LEDの明るさを調整できる機能
・Arduinoの出力で明るさを調整するプログラミング
簡単に発光する電子部品、LEDを紹介します。
LED(発光ダイオード:Light Emitting Diode)は、ダイオードの一種です。
ダイオードは、電流の方向を制御することができ、LEDは電流を流すときに、発光します。
LEDは主に赤、緑、青、黄、白があります。
LED自体に抵抗値は少ないため、過電流を防ぐために抵抗を繋げるのが一般的です。
LEDの詳しい説明に関しては、別の記事で行いたいと思います。
では、これから、実際の回路を見てみましょう。
※記事トップ画像は、Arduinoとトグルスイッチははずしている常置です。回路に使った部品を簡単に解説します。
Vccに近い方から、紹介します。
・電源スイッチ
・LED
・半固定ボリューム(可変抵抗の一種):GF063P 1kΩ
・抵抗
・3ピンのトグルスイッチとなります。
3Pトグルスイッチを扱うことで、Arduino無しでも、独立した回路として機能します。
LEDは、赤・緑・青・黄・白をそれぞれ繋ぎました。
RGBであれば、黄と白は不要ですが、次の実験の下準備として回路を作っています。
よく見かけるArduinoのLED点灯サンプルでは、220Ωの抵抗を用いています。
半固定ボリュームは、製品ごとの微調整を行う用途で使用されます(普段は変更しない)。
スピーカーのボリュームなどは、可変抵抗を用います。
今回の回路図では、100Ωに半固定抵抗を直列でつなぎ、調整できるようにしています。
今回利用した半固定抵抗は、理論上0〜1KΩを調整できます。
よって、今回の回路の抵抗値は、100〜1100Ωの抵抗を挟んだことになります。
半固定ボリュームを調整することで、LEDごとの抵抗値を調整して輝度を調整します。
この時、回し過ぎると、抵抗値が0近くになり、最悪の場合LEDなどが破壊されます。
ArduinoではPWM制御を行えるように設計されています。
PWMは、パルス幅変調(Pulse Width Modulation)を示し、高速で電圧のHigh(Vcc)とLow(GND)を切替え、その長さの比率をもって、電圧を仮想的にアナログ的な出力を行うことができます。
赤色LEDの回路をArduinoのD5ポートに接続しています。
D6ポートから順に、緑、青、黄、白のLEDを使った同様の回路を複製しています。
可読性を上げるために、省略しました。
さて、回路の使い方となります。
まずは3ピントグルスイッチを操作して、GNDに繋げます。
この作業によって、Arduinoが物理的に回路から分離します。
次に、半固定ボリュームを調整してLEDの明るさを調整します。
中心にある黄色いのがボリュームになります。
小型のドライバー(時計ドライバーなど)で時計回りに回すことによって、抵抗値を減らすことができます。
先の繰り返しになりますが、回し過ぎると抵抗値が0に近づき(ショートし)ますので注意が必要です。
仕様書(外部サイト)を確認すると、220±10°が許容範囲で、250±10°まで回るようです。
この半固定ボリュームを120Ωに設定することで、理論上の220Ωに設定しています。
特にRGBを中心にして色を調整しました。
最後に、液晶ディスプレイ等のフルカラーである約1,600万色をじゅんぐり表示するスケッチを記します。
(正確にはフルカラーを表示しようとすると、膨大な時間と差分が分かりにくいので32段階3万色にしてあります)
回路はアクティブロー(0Vや電圧が低いときに高出力)なので、for文などはデクリメントを行っています。
実験用に黄および白LEDを、緑のLEDが2周した時点で、どちらかが点灯するようにしてあります。
あまり見かけない演算子ではありませんが、「>>」はシフト演算子と呼ばれ、データを2進数に変換して、指定されたビット分ずらします。
4ビットシフトしていますので、2の4乗分の1(つまり1/16倍)にしています。
※タブ表示はHTMLの仕様上表示できないので、全角空白で見た目を調整しています。
// PWM制御用の各色LEDの出力電圧(段階)
int r, g, b, y, w;
const int PORT_R = 5;
const int PORT_G = 6;
const int PORT_B = 9;
const int PORT_Y = 10;
const int PORT_W = 11;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(PORT_R, OUTPUT);
pinMode(PORT_G, OUTPUT);
pinMode(PORT_B, OUTPUT);
pinMode(PORT_Y, OUTPUT);
pinMode(PORT_W, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
for(r = 255; r>=0 ; r-=8)
{
for(g = 255; g>=0 ; g-=8)
{
for(b = 255; b>=0 ; b-=8)
{
analogWrite(PORT_R, r);
analogWrite(PORT_G, g);
analogWrite(PORT_B, b);
if ( (r>>4) %2 )
{
digitalWrite(PORT_Y, LOW);
digitalWrite(PORT_W, HIGH);
}
else
{
digitalWrite(PORT_Y, HIGH);
digitalWrite(PORT_W, LOW);
}
delay(10); // wait for a 0.01 second
}
}
}
delay(1000); // wait for a second
}
今回の実験結果です。
LEDの混色を確かめるために、PPC用紙(コピー用紙)をスクリーンにし、後ろから照らしました。
こちらは、すべてのLEDを光らせた写真となります。
LEDの指向性が強いため、また、LEDの間隔が広いために、各色が強く表示されています。
そして、グラデーション。
もう少し顕著に出ると思ったのですが、LEDの光が強く影響していました。
よく観察すると、次の2色が確認できます。
・赤と緑の中間に、黄色。
・緑と青の中間にシアン(水色)。
こちらは、赤と青を光らせたバージョン。
中間部分にマゼンタ(赤紫)を中心にしたグラデーションが確認できます。
今回は、LEDを使った色の実験回路のプロトタイプを作成しました。
次回はLEDに関しての深堀をしていきたいと覆います。
IoT開発を行って、仕事の効率化や豊かな生活を送りませんか?
「Let's extend technology!!」
を合言葉に、
IoTの事例やヒント、開発記を投稿していきます!
ハードウェア業者と、話がうまくできない。
そんなときは、両方に対応している弊社にご相談ください。
お待ちしております!


