Phyllotaxis: Khi hoa hướng dương trong tự nhiên trở thành màn hình LED phản ứng theo âm thanh

Công nghệ28 tháng 9, 2026·7 phút đọc

Một lập trình viên đã biến cấu trúc xoắn ốc của hoa hướng dương thành màn hình LED 89 ô, phản ứng theo nhạc và âm thanh trong phòng. Dự án trải qua nhiều phiên bản, từ đèn Neopixel hàn tay đến PCB chuyên dụng và firmware viết bằng Rust.

Phyllotaxis: Khi hoa hướng dương trong tự nhiên trở thành màn hình LED phản ứng theo âm thanh

Phyllotaxis: Khi hoa hướng dương trong tự nhiên trở thành màn hình LED phản ứng theo âm thanh

Có những mẫu hình trong tự nhiên mà chỉ cần vài dòng code là có thể tái hiện được. Phyllotaxis — cấu trúc xoắn ốc kép xuất hiện ở trung tâm hoa hướng dương hay các loài sen đá — là một ví dụ như vậy. Một lập trình viên đã lấy cảm hứng từ đó để tạo ra màn hình LED 89 ô, có khả năng phản ứng theo âm thanh và nhạc phát trong phòng.

Từ vài dòng code đến mô hình vật lý

Ý tưởng bắt đầu từ việc tìm hiểu các mẫu hình xuất hiện trong tự nhiên thông qua lập trình. Bí quyết nằm ở việc lấy một loạt điểm trên một bán kính của đường tròn, rồi xoay mỗi điểm theo một bội số tăng dần của tỷ lệ vàng (1,6180339887). Kết quả là một đám mây điểm trông đã rất giống hoa hướng dương.

Mẫu hình phyllotaxis cơ bảnMẫu hình phyllotaxis cơ bản

Khi áp dụng phép phân chia Voronoi lên các điểm này, hình dạng trở nên thú vị hơn hẳn, mang dáng dấp của một quả nang hạt.

Kết quả phân chia VoronoiKết quả phân chia Voronoi

Từ đây nảy ra câu hỏi: nếu biến nó thành vật thể thật và đặt một bóng LED RGB địa chỉ hóa vào mỗi ô thì sao? Tác giả từng làm một ma trận Neopixel hình chữ nhật hồi cấp ba, nhưng vẫn chờ một hình dạng thú vị hơn cho lần tiếp theo.

Dựng mô hình 3D bằng CadQuery

Dữ liệu cạnh của các ô được xuất từ Processing rồi đưa sang một script Python dùng thư viện CadQuery. Đoạn code dưới đây tạo không gian âm cho từng ô, sau đó khoét nó ra khỏi tổng thể để tạo thành các bức vách, đồng thời đục một lỗ vừa cỡ LED ở tâm mỗi ô:

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)
total_shape = total_shape.cut(
    led_hole.rotate((0, 0, 0), (0, 0, 1), math.degrees(angle))
    .translate((centerX, centerY, 0)))

Mô hình CadQuery cho từng phần tưMô hình CadQuery cho từng phần tư

Toàn bộ hình học được chia thành bốn phần tư gần bằng nhau để vừa bàn in 3D. Sau đó tác giả xử lý hậu kỳ trong FreeCAD, thêm lỗ bắt vít và tạo một phiên bản mỏng đóng vai trò "mặt nạ" có lót giấy bên dưới. Loại giấy dâu tằm (mulberry) trong suốt được chọn vì khả năng khuếch tán ánh sáng đẹp và trông rất tự nhiên.

Mô hình mặt nạ sau khi xử lý trong FreeCADMô hình mặt nạ sau khi xử lý trong FreeCAD

Hàn 89 bóng LED và viết firmware

Hàn thủ công 89 bóng LED là công việc khá nhàm chán, nhưng tác giả cho biết mình đã đạt được trạng thái tập trung sâu và thấy thư giãn. Mạch điều khiển ban đầu là một board STM32 Blackpill còn dư, với trình điều khiển Neopixel viết qua giao thức SPI.

Điểm đáng chú ý là một framework cho phép viết code kiểu "shader" cho LED, dùng bảng tra cứu vị trí dấu phẩy động của từng bóng như thể chúng nằm trên đường tròn đơn vị. Nhờ đó có thể viết những hiệu ứng như xoắn ốc tỏa hướng:

void radial_spirals(LEDBuffer leds) {
    for (int i = 0; i < NUM_LEDS; i++) {
        float x = led_positions[i][0];
        float y = led_positions[i][1];
        float r = sqrtf(x*x + y*y);
        float theta = atan2f(y, x);
        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);
    }
}

Phản ứng theo âm thanh

Điều khiến dự án trở nên "sống động" hơn là khả năng phản ứng theo âm thanh thay vì chỉ chạy các hiệu ứng cố định. Board STM32 có hỗ trợ dấu phẩy động và các lệnh DSP của ARM, nên có thể chạy phép biến đổi Fourier để phân tích âm thanh.

Tác giả thêm một micro kỹ thuật số I2S loại INMP441 vào mạch. Vì đầu ra là tín hiệu số nên việc đấu dây đơn giản và không lo nhiễu analog. Thư viện ARM CMSIS giúp xử lý tín hiệu, kèm theo điều khiển tăng ích tự động và tách nhiều dải tần để phân tích năng lượng ở các tần số khác nhau. Kết quả là một chương trình phản ứng theo âm thanh khá hỗn độn nhưng vẫn là nền tảng chạy trên board cho đến tận bây giờ.

Dọn dẹp và phiên bản hai

Sau khi hoàn thiện, tác giả cần một bề mặt chắc chắn hơn để gắn thiết bị. Một tấm thớt tre được phay thành hình tròn, với vân gỗ tự nhiên hài hòa với loại giấy hữu cơ. Cụm MCU và micro ban đầu được gắn trên board đục lỗ (perfboard) và nhét vào một hộp in 3D có công tắc kiểu pedal guitar — nhưng phần điện tử khá lởm khởm, dễ nhiễu khiến LED nhấp nháy mỗi khi hộp bị xê dịch.

Tác giả quyết định học thiết kế PCB và chuyển sang một board mạch chuyên dụng, gắn board Blackpill, micro, nút bấm và cả một mạch chuyển mức logic để có tín hiệu 5V ổn định. Kết quả tốt hơn mong đợi, và việc làm PCB hóa ra dễ hơn tưởng tượng ở mức độ phức tạp này.

Sau khi khoe thiết bị tại một bữa tiệc đón năm mới 2026 và nhận được nhiều lời khen, tác giả quyết định làm phiên bản thứ hai. Thay vì dùng đế in 3D để gắn LED, phiên bản mới dùng chính PCB làm mặt lưng. Hình dạng được tinh chỉnh và thêm đối xứng bậc 5, vì PCB thường được đặt theo lô 5 chiếc — thay vì bốn miếng in 3D riêng biệt, chỉ cần đặt 5 tấm PCB giống hệt nhau rồi ghép thành vòng.

Tuy nhiên, hàn thủ công đèn Neopixel bằng mỏ hàn hóa ra còn khổ sở hơn, do các pad hàn nằm ở mặt dưới của bóng — chúng vốn được thiết kế để hàn bằng phương pháp gia nhiệt cả PCB. Dự án tạm dừng một thời gian, cho đến khi tác giả mang linh kiện đến một chương trình lập trình tại Recurse Center vào mùa hè 2026. Một người bạn ở đó khéo tay với trạm hàn khí nóng đã giúp hoàn thiện công đoạn hàn. Các bức vách ô mới được thiết kế và in 3D để kẹp vào PCB và bắt vít lại với nhau.

Phiên bản mới sau đó được chuyển sang dùng ESP32 để kết nối Wi-Fi, firmware viết lại bằng Rust. Bộ điều khiển chạy một website nội bộ, cho phép thành viên Recurse Center tải lên các sketch và trò chơi thông qua backend WebAssembly nhỏ gọn cùng một API tối giản. Thiết bị được để lại Recurse Center như một tác phẩm sắp đặt.

Còn gì phía trước?

Tác giả vẫn chưa thực sự hài lòng với dự án. Nhiều người bày tỏ mong muốn sở hữu một chiếc, nên anh muốn có thể sản xuất nhiều hơn — ít nhất là để tặng bạn bè, nếu chưa tính đến bán rộng rãi. Nhưng quy trình chưa lý tưởng: hàn mạch vất vả cả hai lần vì những lý do khác nhau, việc gắn giấy khó khăn, và giấy thì dễ rách, khó sửa chữa.

Một số hướng cải tiến đang được cân nhắc gồm: dùng loại LED khác dễ hàn tay hơn, chuyển sang dịch vụ lắp ráp PCB, thử một lớp mica trong suốt để bảo vệ giấy, hay gắn mặt nạ giấy bằng nam châm.

Dự án xứng đáng được tạm nghỉ một thời gian, nhưng khi thời điểm đến, phiên bản 3 sẽ ra đời.

Với những người yêu thích giao thoa giữa toán học, lập trình nhúng và chế tác vật lý, đây là một ví dụ đẹp về cách các quy luật tự nhiên có thể trở thành sản phẩm tương tác — và cũng là lời nhắc rằng đôi khi phần khó nhất của một dự án phần cứng không nằm ở code, mà ở mỏ hàn.

Chia sẻ:FacebookX
Nội dung tổng hợp bằng AI, mang tính tham khảo. Xem bài gốc ↗