基于叶序算法的向日葵LED艺术装置开发

开发者利用叶序算法生成向日葵形态点云,结合沃罗诺伊镶嵌转化为有机网格。通过CadQuery构建带壁厚壳体并预留LED孔位,将数字模型成功转化为物理艺术装置。

自然界的生长模式往往蕴含着简洁而优雅的数学逻辑。其中,叶序(Phyllotaxis)是一种典型的涌现现象,表现为植物中心(如向日葵花盘)中螺旋排列的种子结构。这种结构可以通过极简单的代码生成:在圆的半径线上取一系列线性点,并将每个点按黄金比例(约 1.6180339887)的角度增量进行旋转。

89个LED像素单元集成于STM32控制板
// 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;
}

上述算法生成的点云呈现出类似向日葵的形态。进一步应用沃罗诺伊镶嵌(Voronoi tessellation),可以将这些点转化为具有有机质感的细胞状多边形网格。

绘制点时呈现出的基础形状
沃罗诺伊镶嵌处理后的结果

数字化设计向物理实体的转化

为了将这一数字模型转化为物理装置,开发者利用 CadQuery 库处理从 Processing 草图中导出的细胞边缘数据,构建三维几何模型。核心逻辑在于通过布尔运算创建带有壁厚的壳体结构:首先构建单个细胞的负空间,然后从总体积中减去该部分,并在每个细胞中心预留放置 LED 的孔位。

# 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)))

生成的几何体被分割为四个大致相等的象限,以适应 3D 打印机的构建体积限制。随后,STEP 文件导入 FreeCAD 进行后处理,添加用于固定半透明纤维纸面板的螺丝孔。

CadQuery 生成的各象限模型
经 FreeCAD 转换的面板模型

硬件集成与驱动开发

物理外壳采用 3D 打印制造,表面覆盖半透明的有机纤维纸以柔化光线。LED 矩阵包含 89 个像素单元,连接至一块备用的 STM32 黑药板(Black Pill)。开发者编写了基于 SPI 协议的新像素驱动程序,并构建了简易框架以便快速测试灯光效果。

初始测试代码实现了径向螺旋图案,通过计算每个 LED 相对于中心的距离和角度来动态调整亮度:

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

最终选定的视觉效果为脉动的正弦波,其亮度从中心向外辐射调节。

音频响应功能的实现

为了使装置能够对环境声音做出实时反应,系统集成了 INMP441 数字 I2S 麦克风。由于输出为数字信号,避免了模拟噪声干扰。音频分析依托 ARM CMSIS 库,通过自动增益控制和多频段分割技术提取不同频率的能量数据,从而驱动 LED 产生动态变化。

经过调试,装置能够根据音乐节奏(如 John Hopkins 的作品《Neon Drum》)呈现出充满活力的视觉反馈。

结构优化与 PCB 迭代

初代原型使用竹制切割板作为背板,圆形设计旨在呼应自然的木质纹理。然而,早期的电子组件安装在万能板上,存在布线杂乱、易受震动导致接触不良等问题。为解决稳定性问题,开发者设计了专用 PCB,整合了 MCU、麦克风和电平转换器,以确保稳定的 5V 信号传输。

早期原型内部杂乱的万能板电路
定制设计的空白 PCB

第二版本:模块化与无线化

在 2026 年新年派对展示后,鉴于用户反馈良好且有人提出购买意向,开发者启动了第二版本的迭代。新设计放弃了 3D 打印背板,转而采用五片相同的 PCB 径向拼接成环状结构,既利用了 PCB 批量生产的优势,又增强了整体刚性。

焊接过程采用了加热 PCB 而非传统烙铁的方式,以提高效率。2026 年夏季,开发者在 Recurse Center 编程课程期间完成了组装,新的 3D 打印细胞壁直接粘贴于 PCB 之上。

控制器升级为 ESP32,支持无线网络连接。固件改用 Rust 语言重写,并提供了一个本地 Web 服务接口。Recurse Center 的成员可通过 WebAssembly 后端上传自定义草图或游戏逻辑,使装置成为一个可编程的艺术平台。

未来展望与挑战

尽管项目取得了阶段性成果,但在规模化生产方面仍面临挑战。手工焊接 LED 耗时较长,且半透明纸张面板较为脆弱,修复困难。未来的第三版本计划探索更高效的组装方式,例如使用磁铁固定面板、增加保护层以及简化焊接流程,以实现更广泛的部署或销售可能性。

评论 0

0/500

评论需审核后展示,请文明发言

💬
还没有评论,来说两句

相关阅读