クリスマスだしMTBを自作イルミネーションでピカピカにしてみた

概要
クリスマスに向けなにかしたいなぁってことで,だれかとイルミネーション行くんじゃなくて,自ら発光させればいいやん!!とのことなので,マウンテンバイク(MTB)を光らせて走行してきました.
仕様
今回の制作における主な要件は以下の通りです.
基本設計:
- 前輪,後輪が停止時も発光を続けること(ダイナモ給電ではなくバッテリ駆動)
- とにかく高い衝撃耐性をもたせる(MTBなので)
- MTB本体に穴をあけたり,傷をつけたりしない設計にすること
- 総コストと,作業リソースをなるべく小さくしたい(なるべく家の在庫を使う)
- XHコネクタを用いて簡単に接続.取り外しができるようにすること
機能要件:
- スマホと有線で光り方を設定できるようにする
- フレーム側をマスターとし,前輪後輪をスレーブとして,光り方を同期させる
ハードについて
構成概要
フレーム(トップチューブバッグ内)にマスター機を設置し,前後のホイールハブ付近にスレーブ機を設置しました.
ホイールは回転するため有線接続ができません.そこで,ESP32のESP-NOW機能を用いて無線同期を行っています.
部品表 (BOM)
今回の制作にかかった費用と部材です.家にあった在庫(XIAO ESP32C3など)を含めると総額約1万円ですが,今回の追加出費は4,000円程度に抑えました.
| カテゴリ | 品目 | 購入先 | 備考 |
|---|---|---|---|
| 制御部 | Seeed Studio XIAO ESP32C3 ×3 | 秋月電子 | 家の在庫.小型で扱いやすい |
| 発光部 | WS2814 RGB LEDテープ | Aliexpress | 5V駆動.今回はRGB制御で使用 |
| 電源 | 単4電池ボックス ×3セット | 秋月電子 | 各マイコンに4本ずつ(6V→レギュレータ) |
| 機構部品 | 3Dプリンタ用フィラメント | - | 自作マウント用 |
| 機構部品 | インサートナット,各種ネジ | 千石電商等 | 固定用 |
| その他 | 結束バンド,ケーブル,基板 | ダイソー等 | 配線・固定用 |
こだわりポイント
- 固定方法: MTBのフレームやスポークを傷つけないよう,3Dプリンタで専用のクランプを作成しました.インサートナットを使用し,振動で緩まないようにガッチリ固定しています.
- 電源: 5VのLEDテープを光らせるため,入手性の良い単4電池4本(約6V)直列を電源とし,降圧して使用しています.
筐体設計と固定
MTBへの取り付けは,本体を傷つけないことと耐衝撃性を両立させるため,3Dプリンタで専用部品を設計しました.
車輪部(電源・制御ユニット)
Fusion360でモデリングします.ノギスで様々な箇所測って作っていきます.
単4電池の幅よりもスポーク間が狭かったので,設計がめんどくさくなりますが,斜めに入れるしかありません.(9V電池とかいう高価なもの使いたくなかった)

3Dプリンタで印刷・インサートナット埋め込みをし,ユニバーサル基板にはんだづけして取り付けました.

LEDテープ固定部
このようなスポークに挟み込む部品をたくさん作り,一つのLEDテープに4つずつ固定器具をつけました.(衝撃テストとかして,OKでした)

これが車輪にとりつけた様子.一切MTBに穴をあけず,さらに,テープも使わず固定しています.

フレーム部(マスターユニット)
フレーム部はもともとボトルホルダー用のネジとネジ穴が二つあったので,そこに取り付ける設計にしました.

ソフトウェアについて
システム構成
Master (フレーム) と Slave (前輪・後輪) の1対2構成です.
-
Master:
- スマホとUSBシリアルで接続.
- シリアルモニタアプリからコマンド(例:
slave1,1,1000)を受け取る. - 自分自身のLEDを制御しつつ,ESP-NOWを使ってSlaveへモード変更命令をブロードキャスト(またはユニキャスト)送信.
-
Slave:
- ESP-NOWでデータを受信.
- 指定されたモード(レインボー,単色点灯など)とパラメータ(速度など)に基づきLEDを制御.
それぞれ書き込みます.

通信プロトコル (ESP-NOW)
Wi-Fi接続ではなく,ESP-NOWを採用しました.
- 低遅延: ペアリング不要でパケットを投げられるため,即応性が高い.
- 接続安定性: ホイールが高速回転して電波状況が変動しても,コネクション維持のオーバーヘッドがないため切れにくい.
データ構造はシンプルに以下の構造体を送信しています.
typedef struct struct_message {
int mode; // 0:Rainbow, 1:Manual, etc.
uint32_t param; // アニメーション速度や待機時間など
uint8_t r; // 赤成分 (Manualモード用)
uint8_t g; // 緑成分
uint8_t b; // 青成分
} struct_message;
コード
こちらにすべてあります.MITライセンスにしているのでご自由にどうぞ
動画
Discussion