オルタナティブ・ブログ > 秋山大志のそれとりあえず作ってみようか。 >

あれこれ考えるよりも作ってしまった方が早いんじゃね?と思う、ギークなサラリーマンのアジャイルな日々。

ハロウィンの自宅を生成AIで魔改造した:中華ホログラムLEDファンの通信を解析、メーカー違いのLEDカーテン6本を自作アプリで一元管理、玄関ドアにプロジェクションマッピング(Claude Code×Gemini×Raspberry Pi)

»

ハッピーハロウィン!

HAPPY HALLOWEEN!

今年のハロウィン、自宅の飾り付けを生成AIで作りました。

LEDカーテン、3Dホログラムファン、プロジェクター。家にあったガジェットと、買い足した中華ガジェットを、全部Raspberry Piでまとめて動かしています。小物は3Dプリンターで出力。コードはClaude Codeが書いて、プロジェクターで映す絵と動画も、ClaudeがGeminiを使って全自動で作りました。私がやったのは、やりたいことを言う、脚立に登る、写真を撮る、ダメ出しする、の4つくらいです。

ハロウィンの玄関。ドアの窓とその上の壁にプロジェクションマッピング、左の窓と右に3DホログラムLEDファン、壁にHAPPY HALLOWEENの文字

10月30日の玄関。ドアの窓には幽霊、壁の上には巨大な目、左の窓の丸い映像と右の丸いのがホログラムファンです。

動いているところは、動画でどうぞ。

ハロウィンの自宅の動画(Threads)

9月24日に始めて、ハロウィン当日まで5週間。Gitのコミットは2つのリポジトリで合わせて約170回。どこまで行けたのか、記録しておきます。

日本のハロウィンといえば渋谷。でも、家は飾らない

日本でハロウィンといえば、まず渋谷です。センター街とスクランブル交差点に仮装した人が押し寄せて、毎年ニュースになる。

ピークは2018年。軽トラックが集団に取り囲まれて横転させられ、逮捕者まで出ました。これをきっかけに渋谷区は、2019年6月にハロウィンと年末年始の路上飲酒を禁止する条例を作っています。

それでも収まらない。2023年には長谷部健区長が「ハロウィーン、渋谷に来ないで」と呼びかけて、ハチ公像は囲いで封鎖。2024年10月からは、渋谷駅周辺の路上飲酒の禁止が通年になりました。

今年2026年のテーマは「GOODBYE BAD HALLOWEEN」。10月30日から11月1日まで延べ約185人の警備員を置いて、路上飲酒禁止エリアなどの酒屋62店に販売の自粛を求め、ハチ公像はまた囲いの中です。区長いわく、「31日の渋谷は夜通しハロウィーンで仮装して楽しむ街ではない」。ブームは下火になってきた、とも言っています(TOKYO MX、テレ東BIZ)。行政が「来るな」と言い続けて、やっと落ち着いてきた。それがここ数年の渋谷です。

パレードなら、川崎と六本木。川崎の「カワサキ ハロウィン」は日本最大級のパレードでしたが、2019年を最後に開かれなくなり、2021年に終了が発表されて、24年の歴史に幕を下ろしました。六本木のパレードには、私も参加したことがあります。10年前は、仮装してデジタル広告業界の仲間とハロウィンパーティーをやっていました。

で、本場アメリカのハロウィンは、家が主役です。家と庭をカボチャやガイコツやクモの巣で飾り立てて、子どもたちが仮装して近所の家を回り、「トリック・オア・トリート!」と言ってお菓子をもらう。

日本は、街で馬鹿騒ぎはするけど、家はほとんど飾らない。うちは、アメリカ式に家を飾る派です。

全体像:ガジェットとRaspberry Pi 3台

  • LEDカーテン 6本:窓に吊るすタイプのLEDカーテン。Bluetoothで操作する中華製(Hello Fairy 2本、Surplife 4本)
  • 3DホログラムLEDファン 4台:羽根にLEDが付いていて、回転すると空中に絵が浮いて見えるアレ。42cmが3台、45cmが1台
  • プロジェクター:EPSON、BenQ、小型のS100など、合わせて数台
  • Raspberry Pi 3台:Pi 4(8GB)がカーテン、ファン、EPSONとBenQの担当。Pi 4(1GB)がS100の2台。Pi 2Bがホロウマスクと効果音
  • 3Dプリンター(Bambu Lab A1 mini):Piとは別に、部品を作るのに使用。ホロウマスク、壁に貼る「HAPPY HALLOWEEN」の文字14個、血の手形

操作はスマホのページから。演出の切り替え、文字の表示、スケジュール(日没の1時間前から深夜0時まで)を、家の外からでも変えられるようにしました。

中華ホログラムLEDファンの通信を解析した

いちばん面白かったのがここ。

3Dホログラムファンは、メーカーの専用アプリで動画を送って映す仕組みです。でも、4台をカーテンやプロジェクターと連動させて、スケジュールで自動で動かしたい。それなら、アプリを通さずに自分で操作するしかない。

Claude Codeに、メーカーのWindows版アプリ(V13)の中身を読ませました。ボタンとメッセージの対応表から、ファンに送っているコマンドを復元する。分かったのはこんな作りです。

  • ファンは、自分でWi-Fiのアクセスポイントになる。つないで、決まったアドレスにTCPで話しかける
  • コマンドは、決まった前後の目印で挟んだ1文字。電源は「a」、次の動画は「c」、明るさは「m」と「l」、という具合
  • 動画は、ファン独自のBIN形式。円形に並んだLEDに合わせて、1フレームずつ極座標に変換して送る

1日目で、Macから一覧取得、再生、アップロード、動画の変換までできるようになりました。47cmの別モデルや、12cmの小型モデルの形式まで、ついでに対応しています。

ハマったのは、ファンがそれぞれ自分のWi-Fiを飛ばしていること。4台を同時に動かすには、4つのWi-Fiに同時につながないといけない。結局、Raspberry PiにUSBのWi-Fiアダプターを挿して、家のWi-Fiとは別の口からファンにつないでいます。

メーカー違いのLEDカーテンを、1つの自作アプリで動かす

個人的にいちばん面白かったのは、ここです。

窓のLEDカーテンは6本。ところが、メーカーが2つに分かれています。Hello Fairyが2本、Surplifeが4本。どちらもBluetoothで、スマホの専用アプリから絵や文字を送るタイプです。

で、メーカーが違うと、アプリも違う。スマホにアプリを2つ入れて、1本ずつ選んで、同じ絵を別々に送る。6本で1つの絵を出すとか、時間で自動で切り替えるとか、そんなことはできません。メーカーにそんな気はないので。

なら、6本まとめて動かすアプリを自分で作ればいい。

手順:通信を録って、Claudeに渡すだけ

やったことは単純です。メーカーのアプリでカーテンを操作しているときのBluetooth通信を、Apple純正の記録ツール(PacketLogger)で録る。そのログをClaudeに読ませる。Claudeが、どのバイトが何を意味するかを推測して、試すコードを書いて、カーテンに送って、合っていたら次へ。

読み解いてみると、2社の中身はまるで別物でした。

  • Hello Fairy:1回の送信が「AA+命令+長さ+中身+合計値」の素直な作り。20×20の点を「何番のLEDを何色に」と1つずつ指定する。色は色相を2で割った1バイト。ちなみに、メーカーのアプリは最後の合計値をちゃんと計算せずに、適当な値(0xBB)を送っていることが多い。それでも通る。ゆるい
  • Surplife:中身は別の会社のコントローラ。長いメッセージを細切れにして送る方式で、絵を描くモードに入るたびに、アプリが16バイトの乱数を合言葉として送る。色は1つの点を2バイトに詰めた独自の形式(色相7ビット、彩度4ビット、明るさ5ビット)

違いすぎて笑う。ただ、どちらも20×20で、点の並び順(左の列から、上から下へ)だけは同じでした。

速さも違います。Hello Fairyは、変わった点だけを送れば1秒に12コマ動く。Surplifeは1コマ送るのに0.23秒かかるので、1秒に4コマが限界。この差も、全部コードの側で吸収しています。

自作アプリの中身:6本を1枚の画面にする

Raspberry Piの上に、カーテン用の常駐プログラムを置きました。

  • 描く係は1つ:家の形どおりに並べた1枚の画面(上の段が80×20、下の段が40×40)に、演出を描く
  • 送る係はカーテン1本ずつ:自分の担当の20×20を切り出して、そのメーカーの言葉に翻訳して送る。接続が切れたら、つなぎ直す
  • 無線も分けた:Hello FairyはUSBのBluetoothドングル、SurplifeはPi内蔵のBluetooth。1つに全部つなぐと詰まるので
  • 裏向きの1本は左右反転:吊り方の都合で裏返しになったカーテンは、スマホから1本ずつ反転できる

操作は、スマホのページから。

  • 演出を選ぶ。上の段と下の段で別々にするか、全体で1つにするか
  • 時間で自動。「日没の30分前から」のような指定ができる
  • カーテン1本ずつの接続状態が見える
  • 1本だけ、メーカーのアプリに一時的に返すボタン(メーカーのアプリで試したいとき用)

メーカーが2社に分かれていても、使う側から見れば「LEDカーテン6本」。メーカーが出してくれないなら、出せばいい。それが、通信のログを渡すだけでできてしまった。

1枚の画面になると、遊べる

  • パックマン:カーテンからカーテンへ走り抜けて、端でワープする
  • ハロウィンの演出:カボチャ、コウモリ、オバケ、炎、花火、魔女
  • 文字:スマホから入れた文字が流れる。グラデーションや虹色も
  • 「ネコがいます」:3枚にまたがって「ネコがいます」、下に矢印、4枚目にハチワレの猫。「神がいます」と1秒ごとに入れ替わる版もあります

しかも、この画面はLEDカーテンの外まで続いています。下の段のカーテンの右隣には、プロジェクターの映像。これも同じ1枚の画面の続きとしてつないであるので、カーテンを走ってきたパックマンが、そのままプロジェクターの映像の方に飛び出してくる。雪やマトリックスの演出も、カーテンから映像へ流れ込みます。

カーテンも、ファンも、プロジェクターも、1つの仕組みでまとめて動く。我が家のイルミネーションを、まるごとトータルマネジメントできる仕組みが、今回作れちゃいました。

窓のLEDカーテンに表示した文字とハート。窓辺に猫のシルエット

LEDカーテンに「ネコがいます」を出した日。窓辺に、本物のネコがいます。

ハマりどころは、Bluetooth。中華のLEDカーテンは、つながっていると言いながら何も受け付けなくなる、が平気で起きる。書き込みの間隔を空けて、10秒ごとに全部描き直して、落ちたらつなぎ直す。......という対策を、全部生成AIが考えて入れてくれたので、正直楽でした。私は「また消えた」と言っていただけ。

玄関ドアにプロジェクションマッピング

玄関のドアと、その周りの壁にプロジェクターで映しています。

位置合わせは、方眼をドアに映して写真を撮り、その写真からAIに座標を読ませる方式。窓ガラスの位置、ドア枠、雨どい、給湯器の位置まで拾って、そこに合わせて絵を置きます。

玄関ドアに方眼を映して、位置合わせの写真を撮っているところ

位置合わせ用の方眼。これを写真に撮って、ドアの窓の座標を読ませます。

  • ドアの窓枠が色を変えながら光る
  • ドアの窓の向こうに、巨大な目玉がのぞく
  • 壁に血の手形がバンバン叩きつけられる(手形は3Dプリントした実物から作った)
  • ドアの左の壁がひび割れて、3回破れる。穴からオバケ
  • 雨どいをタランチュラが走る。給湯器にはピエロの顔
  • 魔女が飛んでいく

ドアの窓枠が色付きで光り、壁に血の手形が映っている

窓枠が光って、壁には手形。右下の窓から目がのぞいています。

ドアの4枚の窓ガラスにまたがって、巨大な目玉が映っている

4枚の窓にまたがる巨大な目玉。

オバケ、魔女、ゾンビの顔などの素材は、Geminiの画像と動画。ただ、プロンプトを書いてGeminiに作らせるところから、ドアの窓1枚ずつに合わせて切り分けて、映像につなぐところまで、Claudeが全部全自動でやりました。最終的に6分のループです。

ドアの上の壁には、別のS100を2台並べて、目玉、クモ、手、コウモリと月を順番に。ランプのカバーの中では、ずっと炎が燃えています。

3Dプリントのホロウマスクに顔を映す

3Dプリンターで作ったホロウマスクに、マントの下に隠した小さいプロジェクターから、鏡で反射させて顔の映像を映しています。目と口が動いて、しゃべっているように見える。

マスクの3Dデータ(STL)の修正も、Claudeがやりました。目の穴をふさいで内側にくぼませる、厚さ1mmの殻にする、A1 miniの台に収まるように真ん中で2つに割る、1.34倍に拡大する、縁のギザギザをなめらかにする、印刷が倒れないように台座を付ける。STLをいじるPythonのスクリプトを書いて、「もうちょっと薄く」「ここが割れた」と言えば直してくる。

顔は、王様、狼男、能面、猫、魔女、ミイラ、ドラキュラ、ゾンビ、クレオパトラなど。これもClaudeがGeminiで作った画像と動画から起こしています。ただ、マスクの形に合わない顔は、映すと崩れます。パンダやアイドルは没。

3Dプリントのホロウマスクに映した顔。左から位置合わせ用の目印、メキシコのドクロ風の顔、狼男

左が位置合わせ用の目印、真ん中と右が本番の顔。

位置合わせは、1回やって終わりじゃない。目を10%寄せて、唇を5px上げて、1.5度回して......を延々。調整した版は37まで行きました。ここはAIがいくら賢くても、マスクの前に立って見て「もうちょい上」と言う人間がいないと終わらない。

通りがかった人を目で追う

EPSONの映像は、普段はYouTubeのハロウィン動画。でも、家の前の道を人が通ると、巨大な目に切り替わって、その人を目で追います。

魚眼カメラで道を見て、動くものだけを拾っています。映像は保存しない。動くのは夕方5時から夜11時まで。

音もあります。狼の遠吠え、悲鳴、笑い声、雷を、間を空けてランダムに。夜9時から朝7時までは音量を20%に落としています。ご近所あってのハロウィンなので。

前日にSDカードが死んだ

ハロウィン前日の10月30日、メインのRaspberry Pi 4のSDカードが死にました。起動しない。Macにつなぐと、中身が32MBの「abcd.iso」になっていた。何それ。ウイルスなのか、そもそもバッタもんのマイクロSDだったのか。これは別途解析中です。

マイクロSDには、今年はとことん縁があります。7月にはAmazonで買った256GBのマイクロSDが実容量8GBだった話を書いたし、ダイソーからマイクロSDカードが消えた話も書いた。今回のも、解析が終わったら記事にします。

コードはGitにあるので、新しいSDカードにOSを入れ直して、Claude Codeに復旧させました。カーテン6本とは、その日のうちに通信が戻った。ただ、スマホのページのパスワードや、スケジュールの設定みたいに、Gitに入れていなかったものは飛びました。

それも含めて、ハロウィン当日には全部元通り。カーテンも、ファンも、プロジェクターも、ホロウマスクも、完璧に動いています。

生成AIで作ってみて

  • 中華ガジェットの解析は、AIの得意分野:アプリの中身を読んで、通信の形を推測して、試して、直す。この繰り返しが速い。人間がやると何週間かかるか分からない部分が、1日で動いた
  • 現物合わせは、人間の仕事:プロジェクションの位置、マスクの顔のズレ、LEDの向き。脚立に登って、写真を撮って、「もうちょい右」と言うのは結局こっち
  • 絵と動画も、AI任せ:マスクやドアの窓に合わせるテンプレートを作って、Geminiへの指示を書いて、出てきたものを切り貼りするまで、Claudeが全自動。私は出来上がりを見て、没にするか決めるだけ

このブログのキャッチは「あれこれ考えるよりも作ってしまった方が早いんじゃね?」。生成AIのおかげで、作ってしまうまでの距離が、また縮みました。来年は何をやろうか。

警備員と囲いだらけの渋谷に行くよりも、我が家のハロウィンデコレーションの方が楽しめる自信があります。ハッピーハロウィン!

ちなみに、家のネットワークにIoT機器がこれだけ増えると、こいつらが外に何を送っているかも気になってきます。そのあたりは、PHPの脆弱性の記事で予告した、家庭内ネットワークの監視の記事で書く予定です。


※本記事は、筆者が骨子・内容・エビデンスチェックなどをClaudeに指示して本文を作成・投稿しています。

Comment(0)