科学・技術
フィボナッチ数列パターンに基づく音声反応型LEDディスプレイ
Phyllotaxis: An audio-reactive LED display (jagi.studio)
要約
この記事では、自然界に見られるフィボナッチ数列(葉序)パターンをコードで再現し、それを音声に反応するLEDディスプレイとして物理的に実装するプロセスを詳述しています。作者は、このパターンを3Dプリント可能な形状に落とし込み、多数のLEDを配置して、音に反応して光るインタラクティブなアート作品を制作しました。
全文翻訳
自然界に現れるパターンをコードで理解することに魅了されてきました。宇宙に存在する固有の創発パターンと交感することです。フィボナッチ数列(葉序)は、そのようなパターンの1つであり、ひまわり、多肉植物、その他の植物の中心に現れる、拡大する二重らせんの形状です。驚くほどシンプルなコードです: // Inner and outer are throw-away, // just for spacing the cells that are used float[][] points = new float[numCells + numOuter + numInner][2]; float outerRadius = width / 2; final int total = numCells + numInner + numOuter; for (int i = 0; i < total; i++) { float f = i / float(total); float a = i * 1.6180339887; float distance = f * outerRadius; float x = -cos(a * TWO_PI) * distance; float y = sin(a * TWO_PI) * distance; points[i][0] = x; points[i][1] = y; } 円の半径線上に数個の線形点を配置し、それぞれを黄金比の増加する倍数で回転させます。これにより、ひまわりに非常によく似たきれいな点群が得られます。これをボロノイ分割すると、非常に興味深く、種子の鞘のような形状になります。ボロノイ分割結果の形状 点をプロットしたときの形状の出現 ボロノイ分割結果 数週間このパターンを実験した後、アイデアが浮かびました。これを物理的なオブジェクトにして、各セルにRGBアドレス指定可能なLEDを配置したらどうだろうか?一種のセル状LEDマトリックスです。高校時代に長方形のネオピクセルマトリックスを製作したことがありますが、次のものにはもっと面白い形状を探していました。デジタルから物理へ Processingスケッチからセルのエッジデータをエクスポートし、CadQueryライブラリを使用したPythonスケッチにインポートしました。データから物理的なジオメトリを構築するためのコードを作成しました: # Create the negative space of a single cell # shrunk with a negative offset-2d cell_shape = (cq.Workplane("XY") .polyline(vertices) .close() .offset2D(-wall_thickness/2, kind='intersection') .extrude(total_height) .translate((0, 0, base_height))) # Cut it out of the total to create a shell with walls total_shape = total_shape.cut(cell_shape) # Cut the shape of the hole to fit the LED in the center of the cell total_shape = total_shape.cut( led_hole.rotate((0, 0, 0), (0, 0, 1), math.degrees(angle)) .translate((centerX, centerY, 0))) このスニペットは、すべてのボロノイセルの結合された総体積を構築した後、個々のセルの縮小された体積を総体積からカットし、次に各セルの中央にLEDサイズの穴を彫り込みます。すべてのセルに対してこれを行うと、下の黄色の形状が得られます。この時点で、ジオメトリをほぼ均等な4つの象限に分割し、それぞれが私の3Dプリンターベッドに収まるようにしました。STEPファイルをエクスポートし、FreeCADでいくつかの後処理を行い、ネジ穴を追加し、薄いバージョンを作成して「フェイスプレート」として機能させ、その下に紙を貼りました。CadQueryの出力からFreeCADで変換されたフェイスプレートモデル 各象限のCadQueryモデル 形状を3Dプリントし、光をよく拡散し、光を当てると有機的で遊び心のある見た目になる半透明の紙を見つけました。この桑の紙の、美しい有機的な繊維の見た目が大好きです。89個のLEDをはんだ付けするのはかなり面倒です。しかし、フロー状態に入り、リラックスできるようになりました。手元にあった予備のSTM32 blackpillボードに接続し、SPIを使用して小さなネオピクセルドライバーを記述しました。基本的なテストパターンですでにクールでした。簡単なスケッチフレームワークを構築し、LED用のProcessingスタイルの「シェーダー」コードを書けるようにしました。各LEDの浮動小数点位置を単位円上にあるかのようにルックアップテーブルで使用することで、フラグメントシェーダーのようなコードを簡単に書くことができました: void radial_spirals(LEDBuffer leds) { for (int i = 0; i < NUM_LEDS; i++) { // iterate every cell // Get LED position from LUT float x = led_positions[i][0]; float y = led_positions[i][1]; // Polar coordinates float r = sqrtf(x*x + y*y); float theta = atan2f(y, x); // Angle in radians [-π, π] // Spiral pattern: combine angle and radius float spiral = sinf(theta * 2.0f + r * 5.0f - seconds * 2.0f); float brightness = (spiral + 1.0f) * 0.5f; uint8_t level = (uint8_t)(brightness * 255.0f); leds[i] = rgb(level, 0, 0); } } かなり巧妙です。中心から外側に向かって明るさが変化するパルス状のサイン波パターンが、最も気に入ったものでした。これは、後に作成した音声反応型スケッチの主要機能として使用することになりました。音声の追加 事前に定義されたパターンを表示するだけでなく、部屋の音に動的に反応したらクールではないでしょうか?生きていてダイナミックな感じにしたかったのです。それを駆動するSTM32ボードは浮動小数点サポートとARM DSP命令を備えていたため、フーリエ変換を実行して音声分析を行うことができました。INMP441というデジタルI2Sマイクを、これを駆動するブレッドボード回路に追加しました。デジタル信号を出力するため、アナログノイズのリスクなしに簡単に配線できます。ARM CMSISライブラリは、オーディオ信号を処理し、分析を行うのに役立ちました。オートゲインコントロールとマルチバンド分割を使用してさまざまな周波数のエネルギーを分析することで、動的な方法でオーディオに反応するコードを書くための良い基盤ができました。多くの調整と、多くのグローバルタイマーと乱雑な状態を持つ非常に混沌としたスケッチにより、この音声反応プログラムが作成されました。これは現在でもボード上で実行されているものの基盤となっています。Jon HopkinsのNeon Pattern Drumを聴いて生き生きとしました。整理整頓 残りはわずかな詳細です。より頑丈な取り付け面が必要です。竹製のまな板を見つけて円形に削り出し、自然な竹の木目が有機的な紙と非常によく合います。コントローラーMCUとマイクをユニバーサル基板に組み立て、ギターペダルのスイッチが付いた3Dプリント製ボックスに詰め込みました。しかし、電子機器は不安定でノイズが発生しやすく、ボックスを動かすとLEDがちらつく原因となっていました。PCBの製造方法を学び、blackpillボード、マイク、ボタン、そしてマイクロコントローラーから良好な5V信号を得るためのロジックレベルシフター用の適切な場所を備えた、適切なPCBに切り替えました。これはうまく機能し、少なくともこのレベルの複雑さでは、PCBの製造は予想よりも少し簡単でした。非常に乱雑なユニバーサル基板が隠された最初のエンクロージャー コンポーネントをすべてはんだ付けする前の、設計したブランクPCB 2番目のバージョンの構築 2026年の新年パーティーで披露したところ、人々はそれを気に入ったようでした。友人の中には、自分も欲しいと言った人もいました。組み立てが簡単で、より頑丈になるであろう2番目のバージョンを構築することに触発されました。PCB設計を学んだばかりだったので、LEDを取り付けるための3Dプリントプレートから、PCBをバックプレートとして使用することに切り替えてみました。PCBは5枚単位で注文されるため、形状を少し調整し、5倍の対称性を追加しました。3Dプリントする4つのユニークなピースの代わりに、同じPCBを5枚注文し、それらをリング状に組み立てることになります。はんだごてでネオピクセルLEDを手はんだ付けするのは、パッドがLEDの下にあるため、さらに悪夢であることが判明しました。これらは、はんだごてではなくPCBを加熱する方法を使用してはんだ付けされることを意図しています。プロジェクトは一時中断しました。2026年の夏にRecurse Centerでのプログラミング合宿に参加した際にプロジェクトの部品を持参したところ、そこで出会った友人は私よりもホットエアはんだ付けステーションにずっと精通していました。すべてのんだ付けを完了することができ、PCBにクリップしてネジで固定するための新しいセル壁を設計・3Dプリントしました。Recurseバッチ中に新しいバージョンを完成させた後、それをRecurse Centerに設置することにしました。ESP32に切り替えたため、そこにあるWi-Fiネットワークに接続でき、ファームウェアをRustで書き直しました。コントローラーは、RCの参加者がWebAssemblyバックエンドと最小限のAPIを使用してスケッチやゲームをアップロードできるローカルWebサイトを提供します。次は何でしょうか?まだ完全には…