01项目概览
和原版相比,这一版做的改动:主控由 Arduino Uno 换成 WEMOS D1(ESP8266) 或 ESP32-C3 SuperMini(两种方案,本文档顶部可切换);WiFiManager 配网 + 阿里云 NTP 自动联网校时,因此不再需要 DS1307 RTC 模块和电池;时间精度由网络保证,永不漂移。机械结构两版完全相同,只有第 04 节接线和第 05 节固件不同。
工作原理
- 按下按钮(或 D3 引脚接地),触发中断
- 两块 9g 舵机联动,把 UV LED 移动到目标坐标
- 从 NTP 读当前时间,按字形拆解为直线与圆弧
- UV 灯贴着荧光膜"扫"出 时:分,荧光通体发亮
- 写完机械臂回位、舵机断电,荧光约数分钟后渐息
效果演示 (实时时钟)
用与固件相同的字形算法在画布上实时"书写"当前时间
02材料清单(BOM)
总价约 ¥60–120(淘宝/拼多多散件)。注意几个关键坑已用 红字 标出。
| 材料 | 数量 | 备注 |
|---|---|---|
| WEMOS D1 mini(ESP8266) | 1 | 主控,替代原版 Arduino Uno;Micro-USB 供电 |
| ESP32-C3 SuperMini | 1 | 主控(约 ¥10,性价比更高);USB-C 供电,3.3V 逻辑 |
| 9g 微型舵机 | 2 | 一定要是正向舵机(0–180°):最直观的区分是舵盘四角都有螺丝孔;连续旋转舵机会一直转,不能用 |
| 5mm UV LED | 1 | 紫色验钞灯那种(365–395nm)荧光效果最好;白色可见光次之 |
| 12mm 轻触开关(自复位) | 1 | 按下接通、松手断开,常开型 |
| 自粘荧光膜 / 荧光贴 | 1 张 | 荧光绿色效果最好,宽度 4mm 左右合适 |
| M3×8 六角螺丝 | 10 | 外壳 + 机械臂固定 |
| 橡胶脚垫 | 4 | 底部防滑 |
| 杜邦线 / 22AWG 导线 | 若干 | 约 20–30cm |
| Micro-USB 电源线 | 1 | 5V 供电;两舵机同时发力,建议 5V / 1A 以上电源 |
| USB-C 电源线 | 1 | 5V 供电;两舵机同时发力,建议 5V / 1A 以上电源 |
| 100Ω 限流电阻(可选) | 1 | UV LED 限流保护(串在主控引脚与 LED 正极之间,各自版本引脚见第 04 节) |
打印件请见第 03 节;如果你已有原版 Arduino 方案的其他零件(RTC、降压模块等),本版用不到,可以收起来。
033D 打印零件
共 8 个 STL,工程目录 stls/ 下,与原版 Thingiverse 文件一致。用 PLA 打印即可,无需支撑。
| 文件 | 用途 |
|---|---|
Arm1-2.STL | 左机械臂(两段一体) |
Arm3.STL | 右机械臂上段 |
Arm4.STL | 右机械臂下段 |
led_cover.STL | UV LED 聚光锥罩 |
Case.STL | 外壳主体 |
Case_Front.STL | 前面板(荧光贴贴在它上面) |
Case_Top.STL | 顶盖 |
Case_Top_Human.stl | 顶盖变体(预留传感器开口,可选;旧版扩展可选用) |
04接线
这是与原版 Arduino 差异最大的地方,且随主控方案略异:下方默认显示 WEMOS D1,页面顶部切换到 ESP32-C3 SuperMini 后,示意图 / 引脚表 / 固件说明会同步换成对应接法(固件里写死的,别接错)。
接线示意图
| 功能 | WEMOS D1 引脚 | GPIO | 连接说明 |
|---|---|---|---|
| 左舵机信号 | D6 | GPIO12 | 舵机 VCC→5V、GND→GND |
| 右舵机信号 | D7 | GPIO13 | 同上 |
| UV LED 正极 | D5 | GPIO14 | 经 100Ω 电阻;LED 负极→GND;低电平点亮 |
| 按钮一脚 | D3 | GPIO0 | 使用板载上拉,另一端接 GND;按下触发 |
| 舵机电源 | 5V / GND | — | 两舵机 VCC 并到 5V,GND 并到地;建议外接 5V 电源与 D1 共地 |
| 功能 | ESP32-C3 引脚 | GPIO | 连接说明 |
|---|---|---|---|
| 左舵机信号 | GPIO4 | IO4 | 舵机 VCC→5V、GND→GND |
| 右舵机信号 | GPIO5 | IO5 | 同上 |
| UV LED 正极 | GPIO6 | IO6 | 经 100Ω 电阻;LED 负极→GND;低电平点亮 |
| 按钮一脚 | GPIO3 | IO3 | 使用板载上拉,另一端接 GND;按下触发 |
| 舵机电源 | 5V / GND | — | 两舵机 VCC 并到 5V,GND 并到地;建议外接 5V 电源与主控共地 |
- 接线顺序建议:先接 GND 与电源,再接信号线,最后接按钮;每接完一排用万用表/目视检查一遍再上电。
- 启动敏感引脚不要挂负载:ESP8266 为 D3 / D4 / D8,ESP32-C3 为 GPIO2 / 8 / 9(本设计都已避开,按钮均用板载上拉 + 接地触发)。
- 舵机供电强烈建议独立 5V 电源并与主控共地,否则写字瞬间电压跌落会导致主控重启。
- 两个主控都是 3.3V 逻辑,9g 舵机信号端直接接没有问题;舵机本体建议仍用 5V 供电。
05固件烧录与配网
固件在 PlotClock-ESP8266/(ESP8266)或 PlotClock-ESP32C3/(ESP32-C3)目录,已内置配网与校时逻辑,烧完后几乎开箱即用。本节的板卡包 / 库 / 烧录步骤会随顶部主控版本切换。
1装 ESP8266 板卡包
Arduino IDE → 首选项 → 附加开发板管理器网址:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
「开发板管理器」搜索 esp8266,安装 ESP8266 Community 的包。
2装库
库管理器搜索安装:WiFiManager by tzapu。
ESP8266WiFi、Servo、time.h 都随板卡包自带,无需额外安装。旧版 Arduino 的 Time / DS1307RTC 库不再需要。
3烧录
打开 PlotClock-ESP8266.ino,开发板选 LOLIN(WEMOS) D1 R2 & mini,选择端口(Mac 上通常是 /dev/cu.usbserial-xxxx)→ 上传。
4可调宏
代码顶部可开关:OPTION_12_HOUR(12 小时制)、CALIBRATE(校准)、GRID(点阵验证)。默认 24 小时制 + 正常模式,开箱即可。
1装 ESP32 板卡包
Arduino IDE → 首选项 → 附加开发板管理器网址:
https://espressif.github.io/arduino-esp32/package_esp32_index.json
搜索 esp32,安装 Espressif Systems 的包(2.0.9 以上)。
2装库
库管理器搜索安装:WiFiManager by tzapu 和 ESP32Servo(by Kevin Harrington)。
WiFi.h、time.h 随板卡包自带;ESP32 核心不自带 Servo,必须装 ESP32Servo。
3烧录
打开 PlotClock-ESP32C3.ino,开发板选 ESP32C3 Dev Module;Tools → USB CDC On Boot 选 Enabled。
端口选 /dev/cu.usbmodemxxxx 或 /dev/ttyACM0 → 上传。失败时按住板载 BOOT 键再插线(进入下载模式)。
4可调宏
代码顶部可开关:OPTION_12_HOUR(12 小时制)、CALIBRATE(校准)、GRID(点阵验证)。默认 24 小时制 + 正常模式,开箱即可。
配网与校时(无需 RTC)
首次上电
- 上电后 D1 开启热点
PlotClock-Setup - 手机连接该热点,会自动弹出配置页(若未弹出打开
192.168.4.1) - 选择你的 WiFi 并输入密码保存,D1 自动连接
- 若 180 秒内未配网,会自动重启重新进入配网模式
自动校时
- 连上网络后自动以
ntp1.aliyun.com/ntp2.aliyun.com/pool.ntp.org校时 - 时区固定为 UTC+8(北京时间),不用设置
- 之后每次画时间都先读网络时间,永远不会漂移
- 想重新配网:烧录时选「Erase Flash: All Flash Contents」擦除后重拍上电
06机械装配
机械部分与原版一致。核心顺序:先接线上电验证 → 再装机械臂 → 最后合壳,出问题好排查。
6.1 准备电子件
- UV LED 两个脚焊上约 10cm 引线(正极是长脚),套热缩管防短路
- 按钮两个脚也焊上引线
- 两个舵机确认是正向 0–180° 舵机(舵盘四角都有螺丝孔),装入外壳前面板对应舵机位,线从前方开口穿出
- WEMOS D1 用双面胶/热熔胶固定在外壳内部
6.2 接线(对照第 04 节)
- 按接线表和接线图把所有连线接好,统一共地
- 上电先用串口监视器(115200)观察:应打印 WiFi 连接信息与时间读数
- 按一下按钮,如果舵机有动作就说明整链路通了(哪怕画得歪,后面校准)
6.3 组装机械臂
- Arm1-2、Arm3、Arm4 之间用 M3 螺丝连接,转动顺畅不卡顿、无虚位
- LED 装入臂端灯座,把
led_cover聚光锥罩上去 - 舵盘先套在舵机输出轴上(不拧紧),用手把机械臂转到大致中位附近再上紧舵盘螺丝
- 把机械臂组件固定到舵机上(左右对应 D6 左 / D7 右,别装反了)
6.4 合拢外壳与表面处理
- 前、顶、底壳用 M3 螺丝合拢;有走线需要时可用
Case_Top_Human变体开孔 - 荧光贴按前面板书写区剪裁,贴在
Case_Front外侧,荧光面朝外 - 四个橡胶脚垫贴到底部
- 最后通电,进入第 07 节校准
07伺服校准
机械臂默认参数在各部件有公差时会画歪。校准分两步:CALIBRATE(对极限位置)→ GRID(验证点阵)。
| 常量 | 默认值 | 作用 |
|---|---|---|
SERVO_LEFT_ZERO | 1650 | 左舵机零点(状态 1:左臂 0°) |
SERVO_RIGHT_SCALE | 700 | 右舵机转角→脉宽比例(状态 1) |
SERVO_RIGHT_ZERO | 750 | 右舵机零点(状态 2:右臂 0°) |
SERVO_LEFT_SCALE | 650 | 左舵机转角→脉宽比例(状态 2) |
DRAW_DELAY | 3 | 写字速度(ms/点),越大越慢越稳 |
ACALIBRATE 对角校准
- 取消
//#define CALIBRATE注释,上传 - 机械臂每 2 秒在两个极限位置间切换,UV 灯交替亮/灭
- 亮的位置对应状态 2(
SERVO_RIGHT_ZERO+SERVO_LEFT_SCALE);灭的位置对应状态 1(SERVO_LEFT_ZERO+SERVO_RIGHT_SCALE) - 调节这四个常量,让两个落点分别贴近荧光书写区的左下与右上极限,且覆盖面最大
BGRID 点阵验证
- 把
CALIBRATE注释掉,取消//#define GRID,上传 - 会在 0–70mm × 0–40mm 区域、每 10mm 打一个 UV 点(共 5×8 个点)
- 检查点阵是否横平竖直、对称居中,微调常量直到点阵方正
C恢复正常模式
- 两个宏都注释掉,重新上传
- 按按钮验证时间书写居中,荧光效果完整
- 校准参考视频(原版作者):youtu.be/4viW9ADqX2w
08使用与常见问题
一切就绪后:按一下按钮,机械臂用 UV 灯把当前「时:分」写到荧光屏上,发光数分钟后渐息。可以反复按,每次都是崭新的时间。
用了连续旋转舵机。请换成正向 0–180° 舵机(舵盘四角都有螺丝孔)。
先做第 07 节的 CALIBRATE + GRID 两步校准,重点微调四个常量。
检查 D5 接线与 100Ω 电阻方向;LED 负极必须接 GND。注意它是低电平点亮,万用表量 D5 平时为高电平是正常的。
确认已配网成功且网络可达(NTP 阿里云)。断网状态下时间会停留在最后成功校时的值。
把 DRAW_DELAY 调大(如 5–8)放慢笔速;UV 灯落点贴近荧光贴面 5mm 内效果最佳;荧光贴选荧光绿。
取消 //#define OPTION_12_HOUR 的注释后重新烧录。