Clock of Clocks 288
设计概念图
最终成品图
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;
}
}
}
}