Πίσω στα RoboNews
▲ 168 πόντοιjagi.studio7 λεπτά ανάγνωσης•

Φyllotaxis: Η δημιουργία ενός ηχητικού αντακτιστού LED διασπάματος

Πρωτότυπος τίτλος: "Phyllotaxis: An audio-reactive LED display" (από evakhoury)

Αρχικό ΆρθροΣυζήτηση HN (21 σχόλια)
TL;DR (Εν Συντομία)

Το άρθρο περιγράφει τη δημιουργία ενός φυσικοειδούς LED διασπάματος βασισμένου στον μαθηματικό φύλλωτικό pattern. Εξηγεί τη γενέτευση του σημειακού nebulous με τη χρήση του χρυσού λόγου, τη μετατροπή σε Voronoi τesserelation, τη μοντελοποίηση με CadQuery, την 3D τύπωση, την ενσωμάτωση WS2812B LEDs και την υλοποίηση ηχητικής αντακτισιότητας με STM32 και I2S microphone, culminating in an ESP32‑based Rust firmware that hosts a WebAssembly sketch playground.

📌 Κύρια Σημεία & Συμπεράσματα

  • Ο φύλλωτικός pattern προκύπτει από την γωνία πολλαπλασιασμού με τον χρυσό λόγο (φ ≈ 1.618) και την ακτinomial διάσταση, παράγοντας φυσικά εμφανιζόμενα double‑spiral σημεία.
  • Η Voronoi tessellation των σημείων δίνει κελιά που μετατρέπονται σε φυσική μορφή μέσω CadQuery, όπου κάθε κελί γίνεται κέλυφος με τρυπή για LED, επιτρέποντας μοντυλοποίηση και 3D τύπωση σε τετράγωνα τετράγωνα.
  • Η αρχική υλοποίηση χρησιμοποιεί STM32 Blackpill με SPI‑based WS2812B driver και I2S INMP441 microphone, εφαρμόζοντας FFT via ARM CMSIS DSP για multiband energy detection και ηχητική αντακτισιότητα.
  • Η δεύτερη έκδοση μεταplace το hardware σε ESP32, γράφει το firmware σε Rust, εξυπηρετεί ένα τοπικό website και επιτρέπει το upload‑and‑run of WebAssembly sketches μέσω ενός minimal API, καθιστώντας το διασπάσμα προσαρμόσιμο και extensible.

Ορισμός και γενέτευση του φύλλωτικού patterns

Ο φύλλωτικός (phyllotaxis) είναι ο μαθηματικός μηχανισμός που εξηγεί την disposición των φύλλων, των σπόρων και των κυττάρων σε φύτα όπως ο ηλιάνθος. Ο κώδικας που παρουσιάζεται στο άρθρο δημιουργεί ένα σύνολο σημεία σε επίπεδο:

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;
}

Κάθε βρόucho προσεγγίζει την επόμενη γωνία πολλαπλασιάζοντας τον δείκτη i με τον χρυσό λόγο, ενώ η ακτinomial απόσταση distance κλιμακώνει από το κέντρο προς την άκρη. Το αποτέλεσμα είναι ένα nebulous σημειακού που, όταν τesserελάται με Voronoi, μοιάζει με τον κεντρικό δίσκο του ηλιάνθους.

Από το numérique στο φύσιμο: CadQuery, 3D τύπωση και ηλεκτρολογική ενσωμάτωση

Μετά την παραγωγή του σημειακού nebulous, τα σημεία χρησιμοποιούνται για τον υπολογισμό των κορυφών του Voronoi διαγράμματος. Η εξαγωγή αυτών των δεδομένων σε CadQuery επιτρέπει τη δημιουργία τρισδιάστατης φύσης:

cell_shape = (cq.Workplane("XY")
    .polyline(vertices)
    .close()
    .offset2D(-wall_thickness/2, kind='intersection')
    .extrude(total_height)
    .translate((0, 0, base_height)))
total_shape = total_shape.cut(cell_shape)
# τρύπα για το LED στο κέντρο του κελιού
total_shape = total_shape.cut(
    led_hole.rotate((0, 0, 0), (0, 0, 1), math.degrees(angle))
            .translate((centerX, centerY, 0)))

Κάθε κελί γίνεται ένα κοίλο με τοίχους (wall_thickness) και μια τρύπα που δέχεται το WS2812B LED. Το μοντέλο διαιρείται σε τέτταρα kvadranta ώστε να χωρέσει στην τυπική επιφάνεια του 3D τυπωτή. Μετά την εκτύπωση, το κομμάτι που θα λειτουργεί ως "faceplate" είναι με mulberry paper για difusion του φωτός.

Η ηλεκτρολογική σύνδεση βασίζεται σε μια SPI‑based neopixel driver που τρέχει σε STM32 Blackpill. Τα δεδομένα LED στέλνονται μέσω DMA, ενώ η ήχος καταλαμβάνεται από έναν I2S microphone (INMP441). Η ροή του ήχου επεξεργάζεται με τη βιβλιοθήκη ARM CMSIS DSP: εφαρμόζεται FFT, splitting σε πολλαπλά frequency bands και εφαρμόζεται auto‑gain control για να παράγει ένα ενεργο‑σ που modulates την φωτεινότητα των LEDs.

Ηχητική αντακτισιότητα και firmware εξέλιξη (STM32 → ESP32/Rust, WebAssembly)

Η πρώτη έκδοση του firmware ήταν γραμμένη σε C για το STM32, με έναν κύκλο που:

  1. Λαμβάνει δειγματοληψία ήχου vía I2S.
  2. Υπολογίζει το magnitude spectrum via CMSIS‑FFT.
  3. Συναγέρει την ενέργεια σε‑, mid‑ και high‑band.
  4. Χρησιμοποιεί τις τιμές ενέργειας ως όγκους για χρωματικές ή φωτεινές μεταβολές (π.χ. red‑only pulsating spiral).

Μετά τη συμμετοχή στο Recurse Center, το hardware αναβαθμίστηκε σε ESP32, προσφέροντας Wi‑Fi και περισσότερους πόρους RAM. Το firmware ξαναγράφηκε σε Rust, aprovechόμενος τις ασφαλείς αφαιρέσεις και το embedded‑HAL. Ο ESP32 εξυπηρετεί ένα στατικό HTML/JavaScript UI που επιτρέπει στους χρήστες να ανεβάζουν WebAssembly modules. Τα modules εκτελούνται σε ένα sandboxed runtime που έχει πρόσβαση σε ένα απλό API:

fn set_led(index: usize, color: Rgb8) { /* … */ }
fn audio_energy() -> f32 { /* … */ }

Αυτό το SDK επιτρέπει την γρήγορη δοκιμή νέων οπτικών εφέ (shaders) χωρίς reflashing του firmware· ο χρήστης γράφει ένα WAST module, το ανεβαζει μέσω του UI και το βλέπει αμέσως στο φυτό. Η αρχιτεκτονική είναι thus:

  • Hardware layer: ESP32 + WS2812B + I2S mic.
  • Runtime layer: Rust‑based HAL + WASM interpreter (wasmi).
  • API layer: Minimal set of functions for LED control and audio feedback.
  • Presentation layer: HTML UI + editor (Monaco) για γρήγορο iteration.

Η συλλογική αυτή προσέγγιση μετατρέπει το φυτό από στατικό σε μια πλατφόρμα δημιουργικής κωδικοποίησης, όπου το φύλλο‑pattern είναι μόνο το canvas.

Ετικέτες:#Phyllotaxis#LED#Audio Reactive#CadQuery#Rust#WebAssembly#ESP32#STM32
GitHub Gems & Trends

Ανακαλύψτε καινοτόμα open-source εργαλεία και κρυμμένα διαμάντια ανοιχτού κώδικα.

Εξερεύνηση Gems

Διαβάστε επίσης