一台会画数学的桌面摆件

一根横梁在转,一个滑块在横梁上进退。两个动作合起来,就能把一条数学公式,慢慢画成一个真实存在的图形。手机上选一条曲线,它就开始画。

2
个电机
0
个磨损件
Ø220
毫米画幅
28
分贝,比耳语轻
~¥255
整机物料
01 —— 最终效果

它能画出什么

下面每一条都是现场算出来的,不是图片。点任意一个图案,看它一笔一笔画出来——这就是机器实际走的路线。

速度

换图形不用换零件

手机上换一条曲线,发过去的只是十几个字节的几个数字。同一台机器、同一段程序,画出完全不同的图案。

慢,是故意的

笔尖每秒只走 8 毫米。一条五叶玫瑰线要画两分半,一只蝴蝶曲线要二十分钟。它不是打印机,是让你看着它长出来。

是真的画在东西上

换个笔头就换一种画法:紫外光在余辉板上留痕、球头针在细沙里犁沟、真笔在纸上画。同时手机里也存着一份

02 —— 结构

整台机器只有两个会动的东西

一根横梁绕中心转,一个滑块在横梁上前后走。就这两个动作,能把笔尖送到圆盘内任何一个位置。

俯视 · 你会看到的样子横梁贯穿中心
笔尖 配重 θ 转 ρ 进退 笔尖位置 = 转到哪个方向 + 离中心多远 这就是「极坐标」,玫瑰线、蝴蝶曲线的公式本来就是这么写的
横梁剖开 · 槽里有什么放大
滑道由型材自带,不用另加导轨 塑料滑块 (没有电机) 皮带(去) 皮带(回) 咬住 ▶ 笔尖 / LED 铝型材 24 × 14 mm 皮带往哪走,滑块就往哪走
纵剖面 · 动力怎么上去的两个电机都在底座,转动部分没有滑环
惰轮(不出力) 张紧轮 铝型材横梁 · 全长 260 mm · 贯穿中心 滑块 + 笔尖 外管套着内轴,同一根轴心 伞齿轮:把竖着的转动 扳成横着的 轴承 外管 → 带横梁转 内轴 → 拉皮带 底座(不动)· 电机、电路板、电池全在这里 电机 1 · 管转 电机 2 · 管滑 无线供电线圈 非接触 · 5V 2W 没有滑环 转动部分靠一对线圈 隔空取电,不靠碳刷 → 没有会磨坏的零件
① 电机 2在底座,自己不动
② 内轴穿在外管里转
③ 伞齿轮把转动扳 90°
④ 皮带轮子转一圈走 62.8 mm
⑤ 滑块被皮带拖着走
03 —— 真实留痕

让它真的在东西上画出来

笔尖做成磁吸快换,换个头就换一种画法。同一条曲线,在三种介质上是三种完全不同的东西。

笔尖怎么抬起来换图案时不能拖出连线

画完一个图案要换下一个,笔必须先抬起来再移动,否则会在纸上拖出一条难看的连线。

滑块上装一个微型推挽电磁铁,行程 2 毫米。通电压下、断电弹起——断电时笔是抬起的,所以哪怕中途没电,笔也不会一直压在纸上洇出一个墨点。

  • 长余辉板:不用抬,关掉紫外灯就行
  • 细沙盘:可以不抬,连线本身也是痕迹的一部分
  • 纸:必须抬,这是唯一强制要抬笔的介质
电怎么送到转动的横梁上这是加了笔之后才出现的问题

笔尖要发光、电磁铁要通电,可横梁一直在转——转动的东西怎么供电?

传统做法是滑环(碳刷蹭着铜环导电),但那是全机唯一会磨损的零件,几年就要换。

改用一对同轴线圈隔空送电:一个固定在底座、一个跟着转盘转,中间不接触,靠电磁感应传 5V / 2W。就是手机无线充电那套东西,成熟、便宜、永远不会磨坏

传输功率5 V / 2 W
线圈间隙2 ~ 4 mm
成本增加¥ 12
磨损件仍然是 0

为什么标配是长余辉板,而不是纸

这是个摆件,会一天到晚一直画。纸会画满,沙会画乱,都需要人来收拾——那它就变成一个需要伺候的东西了。

长余辉板的痕迹会在一两分钟内自己淡掉,永远有新的在长出来、旧的在消失,不需要任何人管。想要一张能拿在手里的作品时,再换上纸笔头画一张。

04 —— 原理

为什么两个动作就够了

想象一根钟表指针,但它是贯穿中心的一整根,上面串着一颗能前后滑的珠子。指针转到哪、珠子滑多远,就决定了珠子在桌面上的位置。

拆开看:两个动作各自能画什么合起来
关键一步:横梁为什么要贯穿中心

玫瑰线的公式 r = cos(kθ) 里那个 r,会变成负数。负数的意思是「往反方向走」。

  • 横梁只有半根 → 一遇到负数,整根横梁得瞬间甩 180°,又快又难看,电机也吃不消
  • 横梁贯穿中心 → 滑块直接滑过中心到另外半边,动作是连续的

一条五叶玫瑰线画完要过中心 5 次,一条蝴蝶曲线要 74 次。所以「贯穿」不是为了好看,是必须。

动力怎么隔着旋转传上去拖滑杆试试

难点在这:横梁一直在转,怎么给转动的东西供电?答案是不供电——让内轴和外管转得不一样快,这个「差」就是滑块走的距离。

05 —— 怎么做出来

工程上怎么落地

从传动选型到控制程序,几个关键决定和它们背后的算账。

决定一:用皮带,不用丝杆算过账的

丝杆看起来更「精密」,但一算转速就出局了:滑块最快要跑 36.7 mm/s,换成常见的丝杆意味着电机得转到 1100 转,那个转速下步进电机的力气基本掉光了。

滑块全行程±110 mm
最快要多快36.7 mm/s
丝杆 T4×2 → 电机转速1 100 转/分 ✗ 带不动
Ø20 皮带轮 → 电机转速35 转/分 ✓ 很轻松
这样能做到的精度0.02 mm
要不要防止滑块自己滑走不用(横梁是平放的)
决定二:存公式,不存坐标差三个数量级

很自然会想「把每个图案的坐标点都存进去」。但一只蝴蝶画下来有 9 万多个点,存成数据是 37 KB;存成公式只要 16 个字节

存坐标点存公式
一只蝴蝶37 KB16 字节
20 个图案740 KB
要外挂存储芯片
< 1 KB
芯片自带的就够
手机换图案传几十 KB传 16 字节
手机走开后要传完才能画照画不误
控制程序:核心其实就这么几行每秒重复 200 次

机器每秒问自己 200 次同样的三个问题:横梁现在转到哪了?按公式滑块该在哪?那电机该转到哪?

// 每 5 毫秒执行一次
void on_tick(void) {
    theta += THETA_STEP;                        // ① 横梁匀速转,自己记着转了多少
    float rho = curve_eval(&cur, theta);      // ② 代公式,算出滑块该在哪
    float target = theta + rho / 62.8f * 360.f; // ③ 换算成电机2该转到的角度
    stepper_goto(MOTOR_INNER, target);
    stepper_step(MOTOR_OUTER);
}

第 ③ 行里那个 theta 千万不能漏。滑块的位置是靠「内轴比外管多转了多少」决定的,横梁自己转的那部分必须先加回去,否则横梁一转滑块就乱跑。这是整个程序唯一容易写错的地方

图案是怎么存的
typedef struct {
    uint8_t type;        // 哪一类:玫瑰线/蝴蝶/心形…
    float   a, k, phase; // 三个参数
    float   turns;       // 转几圈才画完
} curve_t;               // 一共 16 字节

手机上选「玫瑰线 k=5」,蓝牙发过去的就是 {0, 110, 5, 0, 0.5} 这么几个数。想要七叶?把那个 5 改成 7 就行——同一台机器,同一段程序

电子件清单不用编码器、不用存储芯片
主控 ESP32-C3(自带蓝牙)¥ 8
步进电机 × 2¥ 40
静音驱动 TMC2208 × 2¥ 12
霍尔开关 × 2(找零位用)¥ 2
无线供电线圈对¥ 12
抬笔电磁铁 + 紫外笔头¥ 16
电子件小计¥ 90
结构件 / 型材 / 皮带 / 轴承¥ 103
长余辉板 Ø220¥ 22
电池 / 外罩 / 包装¥ 40
整机物料(1000 台)≈ ¥ 255

为什么连编码器都省了

横梁的角度不需要去「读」——它是步进电机一步一步走出来的,走了多少步芯片自己一清二楚。全机只要两个一块钱的霍尔开关:一个装在转盘上,每转一圈校对一次;一个装在横梁一端,开机时让滑块回零。低速轻载下电机几乎不会走丢,这两个开关纯粹是买个保险。