🐙

クリスマスだし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構成です.

  1. Master:
    • スマホとUSBシリアルで接続.
    • シリアルモニタアプリからコマンド(例: slave1,1,1000)を受け取る.
    • 自分自身のLEDを制御しつつ,ESP-NOWを使ってSlaveへモード変更命令をブロードキャスト(またはユニキャスト)送信.
  2. 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ライセンスにしているのでご自由にどうぞ
https://github.com/nihinihikun/MTB_Illumination

動画

https://x.com/nihinihikun_tec/status/2003685636059070570?s=20

Discussion