Clock of Clocks 288

by Lucas Lu

设计概念图

Design Sketch

最终成品图

Finished Clock

The Inspiration | 灵感起源

当我第一次看到 A Million Times 时钟时,我瞬间变成了它的狂热粉丝。几百个独立的指针同步舞动,幻化出数字和波浪,那种时间的流动感简直像魔法一样。然而,它高昂的售价成功“劝退”了我。于是,我决定自己动手,制作一个 24 x 12 的矩阵版本。

Technical Architecture | 技术架构

这个系统是一个典型的分布式控制网络,由一个主控节点指挥 72 个从机节点:

  • Master (Arduino Mega): 负责“大脑”职能。通过 WiFi 连接 NTP 服务器获取标准时间,并将时间映射为庞大的三维字符数组(如代码中的 digits[10][6][5][2])。它还内置了 9 种预设动画(Wave, Square, Random 等),通过 I2C 总线向从机分发指令。
  • Slaves (72x Arduino Nano): 负责“执行”职能。每块 Nano 独立驱动 4 个双轴步进电机(共 8 个通道)。它们通过高频 I2C 中断接收目标位置,并使用自定义步进算法确保运行平滑。

Core Innovation | 闭环校准系统

传统步进电机是开环控制的。在 288 个电机的高频运行下,丢步是致命的。

为了解决这一问题,我在 PCB 上集成了霍尔效应传感器矩阵。在从机代码中,我实现了一个实时校准逻辑:

代码中的 findZero() 函数利用霍尔传感器的跳变沿确定指针的物理零点。在 loop 运行过程中,程序会通过磁铁划过传感器的平均位置动态计算 position_diff。如果检测到误差超过 24 步(约 2 度),Nano 会在行进中自动进行位置补偿(Silent Calibration),从而实现永不消失的同步感。

Open Source | 源码概览

该项目已在 GitHub 完全开源,包含完整的 I2C 通信协议和运动控制逻辑。

► Master 控制逻辑 (Arduino Mega)
// 核心逻辑:从 NTP 获取时间并映射到 12×24 矩阵 void showDigits() { int h1 = currentTime.getHour() / 10; int m2 = currentTime.getMinutes() % 10; // 将预定义的 digits 数组映射到 base 矩阵 for (int i = 0; i <= 5; i++) { for (int j = 0; j <= 4; j++) { base[i + 3][j + 1][0] = digits[h1][i][j][0]; // ... 更多映射逻辑 } } // 通过总线向 72 个从机下发 8 字节位置数据 for (int i = 1; i <= 72; i++) { Wire.beginTransmission(i); Wire.write(sendData, 8); Wire.endTransmission(); } }
► Slave 反馈逻辑 (Arduino Nano)
// 核心逻辑:霍尔传感器动态校准 void loop() { // 检测霍尔传感器(数字/模拟混合检测) if (digitalRead(hall_sensors[i]) == LOW) tempVal = 1; else tempVal = 0; if (tempVal != hall_flags[i]) { hall_flags[i] = tempVal; hall_positions[i][tempVal] = position_current[i]; if (tempVal == 0) { // 磁铁离开传感器瞬间 // 计算物理位置与逻辑位置的偏差 position_diff[i] = STEPS – (hall_positions[i][0] + hall_positions[i][1]) / 2; // 动态自动校准 if (position_diff[i] > 24 && position_diff[i] < STEPS - 24) { position_current[i] = (position_current[i] + position_diff[i]) % STEPS; } } } }