ちょっと Tea Time!? 【備忘録】新春工作。マイコン内蔵LEDをつかってみる。 2026.1.21
秋月にまだ福袋あるかな〜と思っていましたが、さすがにもうないようです。
ということで、いつもの2Fに行ってみましたが、あまりめぼしいものはなさそうです。
まあ、遊びで買ってみようということでマイコン内蔵LEDを買ってみました。

マイコン内蔵LEDです。20個で200円です。OSTW3535C1Aです。
データシート
形状は小さいですが、蛇の目基板に直接実装できそうです。

ある程度のサイズがあるので、蛇の目基板に実装できそうです。
使うには高速なマイコンが必要
データは24Bitのシリアル転送で行います。1,0はH,Lのパルスの幅で決定されますが、
この時間幅が小さいです(最小で300nSくらい)。実はこれに類似したLEDを以前にPICで動かしてみたことがありますが、
さすがにPICだと遅いので、点灯させるのが精一杯でした。
今回はRP2040をつかって見ようかと思います。

シリアル転送で動かします。パルス幅が短いので高速なマイコンが必要です。
とりあえず半田付けしてみましょう

こんな形で一袋分の20個をとりつけてみました。

RP2040マイコンはこれをつかいます。

マイコンをとりつけて完成です。

LEDの配線はこんな感じになっています。
動かしてみましょう! 2026.1.22
24bitデータを送出するプログラムを作成です。
タイミングは仕様の下限を狙います。そうすれば、伝送速度があげられますからね。
下記のcpu_led_dataout()関数が1つのデータを送ります。
| void cpu_led_high() { int i; for(i=0;i<7;i++) output_high(LED); for(i=0;i<2;i++) output_low(LED); } void cpu_led_low() { int i; for(i=0;i<2;i++) output_high(LED); for(i=0;i<7;i++) output_low(LED); } void cpu_led_dataout(int data) { int i; int j=0x800000; for(i=0;i<24;i++){ if(data&j) cpu_led_high(); else cpu_led_low(); j = j >> 1; } } |
上記のプログラムでのタイミングです。

0コード送出時
H=200ns弱(220ns-380ns) ちょと短い
L=580ns(580ns〜1.6us) 下限ぎりぎり

1コード送出時
H=500ns(580ns-1.6us) ちょと短い
L=300ns(220ns-420ns) 大丈夫
このタイミングで1データ(24Bit)を送出する時間は下記のようになりました。
20個のLEDを点灯させるわけですから、これを20個連続で送りますから
最大で19us*20=380us必要ですが、フレーム時間を100fpsに設定すると10ms毎でのデータ送出
になりますから、CPUの占有率は4%程度とかなりすくないです。
さすがにRP2040は速いです。

24bitのコードの送出では、0x000000と0xffffffではそれぞれ17usと19usの時間がかかります。
実際に点灯させると、あれ?
20個のLEDを流れるように点灯させるプログラムを組んでみましたが、
なぜか最後の4個のLEDが点灯しません。半田付けをチェックしてみましたが問題なしです。
LEDの端子の信号をオシロで調べてみましたが、信号はきているようです。
それと、点灯しているLEDも後方部分ではすこし色調がおかしく点灯するものがあります
(白色指定しているが、それ以外の色がみえる)。

20個あるうちの後方の4個のLEDが点灯しません。それにすこし色調がおかしいLEDもあります。
LED交換とクロックタイミング変更
まずクロックタイミングをすこし変更して、仕様内に収まるようにしました。そうすると、点灯しないLEDは
そのままですが、点灯しているLEDはすべて白色になりました。やはりタイミングは仕様内にいれないと
いけないようです。
つぎに点灯しなかった最初のLEDを取り替えました。そうすることで、20個すべてが点灯するようになりました。
やはり1個不良品があったと思われます。でも、長期保管というだけで壊れるかな?ひょっとして、そういった
事例がみつかったからジャンクとして安価に売っているのかな?このあたりは、よくわかりません。

ようやく全点灯しました。ついでに、裏面にパスコンなどを挿入しています。
ちなみに、変更後のプログラムです。
| void cpu_led_high() { int i; for(i=0;i<10;i++) output_high(LED); for(i=0;i<2;i++) output_low(LED); } void cpu_led_low() { int i; for(i=0;i<4;i++) output_high(LED); for(i=0;i<7;i++) output_low(LED); } void cpu_led_dataout(int data) { int i; int j=0x800000; for(i=0;i<24;i++){ if(data&j) cpu_led_high(); else cpu_led_low(); j = j >> 1; } } |
実際のタイミングは下記になりました。

0コード送出時 H=300ns(220ns-380ns) L=600ns(580ns〜1.6us)

1コード送出時 H=680ns(580ns-1.6us) L=260ns(220ns-420ns)
さて、動くようになりましたが、これで何をさせようかな?
不良率高そうだなあ〜
色を変化させて点灯させてみると、1個だけ点灯色が異なるものがあった。
輝度を落として白色発光でみてみると、どうやら緑のLEDが点灯してないようだ。

1個のLEDの緑成分が点灯していません。
交換するのも面倒だなあ〜。それにしても、結構不良率が高そうだなあ〜。
買ってみよう! 2026.1.31
このLEDですが1個10円程度なので、マトリックス状の基板でもつくって点灯させたら
面白いかな〜と思いましたが、調べてみるとすでにそういったものがあるようです。
さらに、LED1個あたりの値段にすると10円以下です。
ということもあり思わず買ってみました。

8x8のマトリックスLEDです。これで500円程度でした。

配線の端子は基板の裏面についています。

ついでにテープ状のものも買ってみました。長さは3mあります。

1mあたり60個のLEDがついています。全部で180個ですが、
セール品で800円ほどでした。LED1個あたり5円程度です。

IP65なので、野外でもそのままつかえそうです。
動かしてみましょう!
ドライバーソフトはまったく同じなので、そのまま繋ぎかえるだけです。
もちろん、LEDの数だけ段数は増やします。

8x8のマトリックスLEDも抜けはありませんでした。

180個のLEDも問題なしでした。
これらをつかって、家で電飾したら面白いだろうなあ〜。
絶対変わり者っていわれるだろうなあ〜(笑。
さてさて、本当に何につかおうか?
(つづく)