フルカラーLEDとは
Red/Green/Blueの3色の色を1つのLEDで表現できるLEDです。
普通のLEDが2本の線に対し、フルカラーLEDは4本の線を制御して、表示します。
フルカラーLEDの各線について
規格化されているのかは分かりませんが、一番長い線がカソード(GNDに繋がる線)で、左から順番に青のアノード、緑のアノード、赤のアノードとなります。3本を別々に制御するためには3本のピンが必要です。
回路イメージ
3つのタクトスイッチをそれぞれ、R・G・Bの制御用に割り当てます。ボタンは14~16番ピンを使用します。
また、出力用に6, 7, 9番のピンを使用します。単純にLチカをしたときはdigitalWriteを使いましたが、今回は明るさを制御したいためanalogWriteを使います。
analogWriteを使う場合は、対応したピンを使う必要があり、https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide によると、4, 6, 8, 9, 10, 18, 19, 20, 21が対応しているピンになります。
抵抗は230Ωのものを3つ、各アノードに接続しています。
一点問題があり、RとBのつもりでボタンを押しているのですが、お互いが反転しています。
回路的にはあっているはずなので、まだ原因は謎です。
ソースコード
# include <Arduino.h>
# define BUTTON_1 14
# define BUTTON_2 15
# define BUTTON_3 16
# define LED_R 6
# define LED_G 8
# define LED_B 9
int r_value = 0;
int g_value = 0;
int b_value = 0;
char buffer[256];
void setup()
{
pinMode(BUTTON_1, INPUT_PULLUP);
pinMode(BUTTON_2, INPUT_PULLUP);
pinMode(BUTTON_3, INPUT_PULLUP);
pinMode(LED_R, OUTPUT);
pinMode(LED_G, OUTPUT);
pinMode(LED_B, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if (digitalRead(BUTTON_1) == LOW)
{
r_value = (r_value + 16) % 256;
delay(300);
}
if (digitalRead(BUTTON_2) == LOW)
{
g_value = (g_value + 16) % 256;
delay(300);
}
if (digitalRead(BUTTON_3) == LOW)
{
b_value = (b_value + 16) % 256;
delay(300);
}
sprintf(buffer, "R = %d, G = %d, B = %d", r_value, g_value, b_value);
Serial.println(buffer);
analogWrite(LED_R, r_value);
analogWrite(LED_G, g_value);
analogWrite(LED_B, b_value);
}
動作イメージ
フルカラーLED繋いで、各ボタンでR/G/Bの出力値変更するプログラムを書いてみた。RとBは128を超えないと明るさに反映されないし、Rのボタン押したら青くなるし(左のボタンが赤のつもり)Bのボタンを押したら赤くなるしで、色々おかしい。 pic.twitter.com/r83TYrby1S
— Toshio Maki (@Kirika_K2) 2018年7月8日