
ちょっと興味はあるのだけれど使ったことの無い部品に「マイコン内蔵RGB-LED」などというものがあります。RGB3色のLEDの中に制御用の小さなマイコンを仕込んだもの。意外とリーズナブルなお値段。そのうち購入して試用してみようと思いつつ、今回は普通のRGB-LEDを外付けのマイコンで制御してみました。
※「部品屋根性」投稿順Indexはこちら
さて手元の部品箱にはマイコン内蔵の3色LEDのような良いものは無いのです。「素の」3色LEDがありました。例のお楽しみの中華部品キット Kuman社K4キットの「3色RGBモジュール」です。ぶっちゃけ3色LEDをそのまま基板に載せてブレッドボードに搭載しやすくしたもの。
とか書きながら間違いに気づいてしまいました。左のモジュールごらんください。1kΩの電流制限抵抗が載っています。実験するときによく見ず外付けで330Ωつけてしまっていました。不要!
回路図などついていないとは言え、モジュール表面みれば分かるのだからよく見ろよ、というところ、トホホ。
さて、中華K4キットにはデータシートが付属しているけれども、会社名が入ってないじゃん、などと何時もディスって?おりましたが、今回は違います。データシートにはLEDのメーカとして
とちゃんと明示されております(難をいえばLEDの透明なパッケージには型番や社名は入れようがないので確かめようが無いのでありますが。)Kingbright社は米国ロサンゼルス近郊にある、LED販売の会社のようです。多分中国製造、米国は販社でないかと想像されます。
マイコン内蔵のLEDの場合、各色の端子をPWM駆動するマイコン(専用ICと言ってよいですが)が入っていて各色の発光を制御しておる、と。そこで今回は、そのマイコンのPWM駆動機能を外付けのマイコンで代行してみようという感じです。外付けのマイコンボードはST Microelectoronics社製 Nucleo-F072RB、32bit Arm Cotex-M0 CPU搭載、48MHz動作であります。まあ、LEDを光らせるには「牛刀割鶏」と申し上げておきます。
LEDへの接続は以下のようです。
Nucleo-F072RBボード自体は、Arduino互換の拡張ピンヘッダも備えているのでそこから信号を引き出しています。搭載のマイコンは3.3VのIO電圧なので、電源は3.3Vとしました。また、R,G,Bの3端子をPWM駆動するのに Arduino互換端子名 D3, D4, D5の3端子を使っています。純正Arduino UnoではD4はPWMできない端子ですが、Nucleo-F072RBではPWM(analogWrite)可能な端子となります。その辺調べた記事はこちら。先ほど述べましたとおり、1kΩの電流制限抵抗が入っているのに気づかずに、外付け330Ωまで入れてますがとりあえず無駄です。外付け抵抗には別な使い道がありそうですが、後で。
PWMの設定は、アナログ A3, A4, A5端子に可変抵抗を入れて電圧を読み取り(analogRead()関数)、よみとった値を0~255までの値に変換(map()関数)してPWM出力をする analogWrite()関数 に与えています。可変抵抗に手で回しやすい良い部品が無かったので、10kΩの半固定抵抗使ってしまいました。別にアナログ入力する必要ないので、別な設定方法にした方が良かったかなと思うのですが、ま、あくまでテスト用ということで。
Nucleo-F072RBボードとブレッドボードの様子はこちら。
制御に使ったプログラムコードは末尾に掲げました。VS Code上のPlatform IOは、Nucleo-F072RBボードをサポートしているので、ボードを指定し、プラットフォームをArduinoとして作成したものです。珍しく、さらから入力してビルドまでノーエラーで1発完動。1色づつPWMのHIGH期間最長(他色はゼロ)に調整し、写真を撮ったものを最初のアイキャッチ画像に掲げました。同じ設定だと青が暗めで赤、緑が明るいです。外付けの330Ωの抵抗のところ、明るさを見ながら色毎に抵抗を変更すると良い感じに調整できるかも。メンドイけれども。。。
部品屋根性(38) ラズパイZeroオフィシャルケース、お買い得? へ戻る
部品屋根性(40) McDonald’sにBluetooth LE テーブルロケータ へ進む
今回使用のソース
Nucleo F072RB向け、VS Code + PlatformIO、Arduinoフレームワーク
#include <Arduino.h>
#define VOL_MIN (100)
#define VOL_MAX (900)
int vR = 0;
int vG = 0;
int vB = 0;
void outputLED() {
analogWrite(D3, vR);
analogWrite(D4, vG);
analogWrite(D5, vB);
}
void setup() {
Serial.begin(9600);
while(!Serial) {};
Serial.println("RGB LED");
pinMode(D3, OUTPUT); //R
pinMode(D4, OUTPUT); //G
pinMode(D5, OUTPUT); //B
outputLED();
}
void loop() {
int aR, aG, aB;
aR = analogRead(A3); //R
aG = analogRead(A4); //G
aB = analogRead(A5); //B
Serial.printf("%4d %4d %4d\n", aR, aG, aB);
aR = (aR < VOL_MIN) ? VOL_MIN : ((aR > VOL_MAX) ? VOL_MAX : aR);
aG = (aG < VOL_MIN) ? VOL_MIN : ((aG > VOL_MAX) ? VOL_MAX : aG);
aB = (aB < VOL_MIN) ? VOL_MIN : ((aB > VOL_MAX) ? VOL_MAX : aB);
vR = map(aR, VOL_MIN, VOL_MAX, 0, 255);
vG = map(aG, VOL_MIN, VOL_MAX, 0, 255);
vB = map(aB, VOL_MIN, VOL_MAX, 0, 255);
Serial.printf("%4d %4d %4d\n", vR, vG, vB);
outputLED();
delay(2000);
}
