【電子工作】ラジオペンチさんの110LEDクリスマスツリーをBluePillに移植 Part1 | トドお父さん通信

トドお父さん通信

北部九州在住 高BMI中高年のオタク趣味の活動記録

  完成したクリスマスツリーです

 

おもちゃ病院で必要な部品をAliExpressで購入しようと思いました。

Choice という仕組みがあって、1500円以上なら送料無料になるんですよ。

そういえばラジオペンチさんのブログで、NEOPIXELというRGB LEDをテープに多段接続

したテープLEDが安く売っていることを思い出しました。
 

これですね。ラジオペンチさんの記事で使っているのはWS2812Bですが、改良型のWS2813を使ったものを
買いました。電源電圧もつかいやすい5Vの物にしました。
 
WS2813 DC5V, White PCB, 2m 60 IP30  で1190円でした。
テープ色が白、1mに60個 LEDで2m、防水なしという意味ですね。

WS2812BとWS2813の違いですが、WS2813はデータ線が2系統になっているので、途中の1個が壊れても次のLEDから先は点灯する冗長性が特徴の様です。信号線が増えるのでテープの幅は若干太くなるようです。
またリフレッシュレートが500Hzから2kHzに上っていることも特徴のようです。

 

ラジオペンチさんのホームページに載っていた元記事はこれです。

 

 

まずは、120個のLEDストリップから6個のLEDを切り出します。
これをSTM32F103 BLUEPILLでテストしましょう。
 

下記はWS2813のテストプログラムです。

 

/*
  WS2813B LED テストプログラム(ビットバン方式)

  MCU        : STM32F103 (BluePill想定)
  IDE        : Arduino IDE (STM32duino)
  書き込み   : ST-LINK
  LED        : WS2813B × 6個
  出力ピン   : PA8
  ライブラリ : Adafruit NeoPixel

  ※ WS2813B は WS2812B 互換のため、
     NEO_KHZ800 を指定する
*/

#include <Adafruit_NeoPixel.h>

// ===== 設定 =====
#define LED_PIN    PA8     // LEDデータ出力ピン
#define LED_COUNT  6       // 接続しているLEDの数

// NeoPixel オブジェクト生成
// NEO_GRB  : 色データ順
// NEO_KHZ800 : 800kHz(WS2812/WS2813共通)
Adafruit_NeoPixel strip(
  LED_COUNT,
  LED_PIN,
  NEO_GRB + NEO_KHZ800
);

void setup() {
  // NeoPixel 初期化
  strip.begin();

  // 念のため全LED消灯
  strip.clear();
  strip.show();
}

void loop() {
  // 赤 → 緑 → 青 を順番に表示
  colorAll(255, 0, 0);   // 赤
  delay(500);

  colorAll(0, 255, 0);   // 緑
  delay(500);

  colorAll(0, 0, 255);   // 青
  delay(500);
}

/*
  全LEDを同じ色で点灯させる関数
  r, g, b : 0~255
*/
void colorAll(uint8_t r, uint8_t g, uint8_t b) {
  for (int i = 0; i < LED_COUNT; i++) {
    strip.setPixelColor(i, strip.Color(r, g, b));
  }
  strip.show();   // ここで実際にLEDへデータ送信
}


これで、6個のLEDにr=g=b=255のデータを流し込みましたから、6個が白に光ったら接続確認はOKです。

接続は下記のデータシートに示すように、先頭のLEDにUSB 5VとGND、それから信号線のDIに330Ωを介してSTM32F103 BLUEPILLのPA8を接続します。

 データシート接続図


 回路図です(実体配線図)

 

 

このとおりにブレッドボードで組んで、STLINKでスケッチをダウンロードすると

あっけなく動作しました。 USB経由の書き込みは何度かトライしましたが地雷があってうまくいきませんでした。

あっさり光りました!

 

次に光がダイナミックに動いて動作するデモプログラムを作りました。
この時はNEOPIXELの動作を理解してなかったので、GROK先生に相談しました。

https://x.com/i/grok/share/raiTG4ZqQ6bDDPPBPhTkunrzJ


ChatGPT先生にも、プログラムの添削とエフェクトの追加をお願いしました。

https://x.com/i/grok/share/raiTG4ZqQ6bDDPPBPhTkunrzJ

*   - WS2813BのDIとBIは両方接続推奨 は間違いで、

実際は、DIを330Ωを介してPA8に接続し、BIはGNDに落とします。
 

エフェクトを追加した、最終のテストプログラムは下記です。
NeoPixel_xmas_demo2_25dec21c.ino

容量が大きいので、頭の部分だけ貼り付けますね。

/*********************************************
******
 *  NeoPixel クリスマスエフェクト サンプルプログラム (WS2813B 6個用)
 *  
 *  対象ボード   : STM32F103 (Blue Pill) + Arduino IDE
 *  使用ライブラリ: Adafruit NeoPixel (STM32対応版 ANDnXORフォーク)
 *  LED種類      : WS2813B (6個直列接続)
 *  データピン    : PA8 (動作確認済み!)
 *  
 *  主な機能:
 *   - colorWipe     : 順番に単色で塗りつぶし(赤→緑→青)
 *   - theaterChase : シアター風追いかけ点灯
 *   - rainbow      : 全体でゆっくり虹色サイクル
 *   - candyCane    : 赤白キャンディケイン風ストライプ(回転)
 *   - christmasTwinkle : ランダムきらきら点滅(白/金)
 *   - christmasAlternate : 赤緑交互点灯(クラシッククリスマス)
 *  
 *  注意事項:
 *   - WS2813BのDIとBIは両方接続推奨
 *   - データ線に330-470Ω抵抗 + レベルシフタ推奨
 *   - 明るさ50でUSB電源でも安全
 *  
 *  作成日: 2025/12/21
 *  動作確認環境: Blue Pill + WS2813B 6個 (PA8)
 ***************************************************/

#include <Adafruit_NeoPixel.h>

#define NUM_LEDS 6
#define DATA_PIN PA8
#define LED_TYPE NEO_GRB + NEO_KHZ800

Adafruit_NeoPixel pixels(NUM_LEDS, DATA_PIN, LED_TYPE);

void setup() {
  pixels.begin();
  pixels.setBrightness(50);  // 明るさ調整(クリスマスは少し明るめにしてもOK)
  pixels.clear();
  pixels.show();
}

void loop() {
  // 既存のエフェクト
  colorWipe(pixels.Color(255, 0, 0), 200);   // 赤
  colorWipe(pixels.Color(0, 255, 0), 200);   // 緑
  colorWipe(pixels.Color(0, 0, 255), 200);   // 青
  theaterChase(pixels.Color(127, 127, 127), 100);  // 白追跡
  rainbow(10);
}

 

X(旧Twitter)の投稿も参考まで

 

6個のNEOPIXELデモ動作中の画像はこれです。
 

 

それでは、次は前にも紹介したSTM32F103C8T6を搭載したBluePill基板の紹介です。

 

AliExpressで200円前後で買えるので、やすいですね。

自分はおもちゃ修理にSTM32を使うアイデアがあるので、勉強用に3枚買いました。

 

その場合は、開発環境はSTM32CubeIDEかKEILというものを使う必要があるのですが、

今回はArduinoベースなので、Arduino STM32Coreというものを使います。

これだと、STM32でArduinoのライブラリが使えるので、非常にラクですね。

 

ArduinoのボードマネージャでSTM32Coreというものを組み込むのですが、この辺の情報は

巷にあふれていますので、割愛します。ただし、Arduinoは最新のVerを使ってくださいね。

 

もうひとつ、BluePillを使うためには、Amazonで中華製のST-LINK/V2というプログラマを

買うことをお勧めします。 自分の場合は、500円くらいで十分使えました。

 

 

ST-LINKが必要なのは、中華製の廉価BluePillはプログラムが書き込まれてないまっさらの状態のためです。 例えばArduinoに接続する場合、BootLoader(USBのCDC)が書き込まれていれば、BOOT1のJumperを”1”に切り替えてUSB経由で書き込みができますが、まっさらではお手上げです。

 

そこでSTLINKで接続すれば、BootLoaderの書き込みをを行うことができるので、Arduinoから書き込み

ができるようになります。

 

ここでも、細かい話はネットの情報で確認下さい。

ST-LINKで接続すると細かい話はおいといて、プログラムの書き込みができるようになりました。

 

さて、ラジオペンチさんのシリアルテープLEDを使った110LEDクリスマスツリーのプログラムをArduino Nanoから、STM32F103C8T6 BluePillに移植したプログラムですが、こちらにおいています。

 

説明が長くなってきたので、移植したプログラムでNEOPIXELを6個→ 114個に拡張し、クリスマスツリーに巻き付けてNEOPIXELのデモをした話は次回にしますね~。

こうご期待 !


それでは、皆さんおやすみなさい