ちょっと 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) 下限ぎりぎり


コード送出時
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も問題なしでした。

これらをつかって、家で電飾したら面白いだろうなあ〜。
絶対変わり者っていわれるだろうなあ〜(笑。

さてさて、本当に何につかおうか?

(つづく)