Blog Auto

Danglepoise

发表于 2025 年 4 月 23 日 阅读时长 41 分钟 家庭自动化 项目

动机

在上世纪末,“升降式”灯具曾风靡一时。 你一定见过:一个配重(或弹簧)平衡灯笼的重量,使灯可以上下移动。 我一直觉得这些东西很棒。 您可以把它们留在天花板附近,用于一般的房间照明,稍微降低一点以营造更亲密的氛围,或者直接拉下来进行专注的工作。 将升降式吊灯与 20 世纪 70 年代另一款必备照明设备——调光开关搭配使用,您就拥有了一个真正灵活的照明系统。

最近我发现自己需要一些照明,并且想复刻这种巧妙的设计。事情变得相当复杂。

为什么不直接购买一个升降式吊灯和一个调光开关来解决问题呢? 原因有三。 首先,现代装饰照明似乎在一个对价格非常敏感的市场中运作,这促使制造商尽可能地降低成本。 这通常会导致大量家用灯具出现某种程度的不牢固性。 这对于您可以简单安装并忘记的东西来说效果很好; 在您安装灯具时,令人不安的摇晃会困扰您几分钟,然后直到您要卸下它时才变得无关紧要。 但是,对于需要可靠且安全移动的东西来说,摇晃和不牢固会让我感到不快。

通过寻找古董升降装置可以避免第一个问题:这些通常更坚固。 但是,找到一个状况良好的很困难,而且找到五个状况良好_且匹配的_几乎是不可能的。 你说五个? 啊,是的。 在最近的一些装修之后,我们最终得到了一张相当长的餐桌,非常适合娱乐或大型家庭游戏 Kingdom Death : Monster (注意:不适合家庭)。 我认为充分照亮它需要一排大约五盏灯。 因此,古董方法行不通。

第三,也是最后,可能也是最根本的一点:我真的很喜欢在东西里安装电动机。 并不是我喜欢毫无意义的复杂性(虽然……实际上这可能完全是另一篇文章!)。 只是让东西自动移动比自己移动它本质上更令人满意。 或者至少我是这么认为的。

我已经说服自己市场上没有任何东西可以满足我(无可否认是小众的)需求,所以我做了任何明智的人都会做的事情:我放弃了并试图忽略它。 我失败了。 这篇文章试图记录我_持续_未能忽略让灯用电机上下移动的冲动。

研究

关于滑环

那么,安排灯上下移动的最佳方式是什么? 我的第一个想法是用一些合适的软线悬挂灯,并将软线的另一端缠绕在一个连接到电机的滚筒上。 这似乎很合乎逻辑,但是让灯通电变得有点棘手:当滚筒转动时,我们需要某种方式来保持电气连接。 解决方案是“滑环”,它基本上是一些位于旋转物体一侧的圆形导电环,它们的排列方式使得它们与旋转物体的另一侧的一些……触点接触。 我想说“如果我变得太技术性,请阻止我”,但说实话,现在已经无法阻止我了。

无论如何,滑环绝对是存在的。 它们种类繁多,但我们还有几个额外的限制:没有想清楚我们将要从这个东西上悬挂什么样的灯,使用传统的市电灯座似乎是最好的(毕竟你可以得到很多不同的类型),而不是试图从一开始就找到_完全_合适的低压解决方案。 因此,我们需要通过滑环运行市电,而且,我们真的不希望灯在移动时闪烁。 这意味着我们需要一个_相当好的_滑环。

在搜索滑环时,我发现了三种主要类型:价格适中的低压滑环,用于真空吸尘器的廉价市电额定滑环(大概是那些带有自动卷绕电缆的滑环),以及_非常_昂贵的高质量滑环。 最后这些似乎主要被国防公司使用:坦克炮塔(!),导弹上的寻的头,等等。 我还没有为这个项目设定预算,但是当潜在的供应商面向军事工业联合体的较重端时,是时候重新考虑了。

我重新思考了。

如果我不能旋转电缆,我就不能真正地卷起它。 如果我不能卷起电缆,我可能需要卷起其他东西,以便将电机的旋转运动转化为线性运动,从而使灯升降。 这并不难,但是然后我该如何处理软线呢?仍然需要它来为灯供电。 我_可以_只是让它松散,当灯在运动的顶部时形成一个大环,但这会 a) 看起来很糟糕,并且 b) 往往会将灯推离轴线(也看起来很糟糕)。 因此,我们需要一种方法来确保软线在没有太多距离可以覆盖时填充更紧凑的空间,但仍然允许在灯下降时进行延伸。 我想出了这些(其中一些比其他的打印得更好):

灯具悬挂在钢缆上。 对于可以缠绕的东西来说,这似乎是一个不错的选择:坚固、灵活且容易获得(在我的情况下,来自萨默塞特的非常乐于助人的 TECNI)。 我选择了直径为 1.5 毫米的电缆,其最小断裂载荷为 130 公斤——对于这些用途来说可能有点过头了,但比任何更薄的东西都更容易获得。 这里的惊天动地的创新是成对的小塑料夹子。 这些夹子穿到电缆(钢缆)上,然后夹到软线上。 你看这个:软线夹相对于电缆环的方向偏移了 +90º 或 -90º! 太棒了。 这样做的结果是,当电缆缩回时,软线会呈现出令人愉悦的之字形配置。

我使用胶合板支架和手动拉动的电缆对它进行了原型设计,并说服自己它可以工作。 我有一张它工作的照片,但我弄丢了,所以这是一个成品进行一些之字形的简短片段:

简陋的机械装置

好的,这样就完成了悬挂部分。 接下来要更深入地思考一下在电子控制下进行上下移动的整个部分。 如上所述,电机很好。 当然,有许多不同类型的电机,具有各种尺寸和功能,因此在进行任何适当的设计工作之前,我可能应该选择一个。 值得注意的是,这些灯可能不需要移动得特别快,并且尽管电缆很坚固,但也不打算特别重。 因此,我不需要一个真正大的电机——这很好,因为我们将在某个时候将整个组件连接到天花板上(稍后会详细介绍),因此我们不希望任何东西太重。

那么小是好事。 除非,不要太小; 我们总是可以使用变速箱来换取速度和扭矩,但这会带来噪音和复杂性,而我真的不想处理这些问题。 因此,最好有一个电机具有足够的扭矩来直接驱动电缆缠绕滚筒。 我还希望能够相当准确地定位灯。 高扭矩、相对低速、精确控制? 听起来我们进入了步进电机的领域。 对于那些很少对电机特别感兴趣的读者(我尽量不评判),步进电机通常用于 3D 打印机中。 它们具有两个(或更多)独立的线圈,它们的排列方式是,以特定的顺序激励它们会导致电机旋转一个“步”。 反转该顺序会使它们向相反的方向迈一步。 步长通常很小,大约为一度或更小,因此需要很多步才能旋转 360º。 这使得它们非常适合精确的定位,不适合真正的高速操作,并且扭矩相当高。

步进电机还具有另一个有趣的特性:它们擅长保持位置。 每个可能的位置都会激励一个线圈,提供一个“保持扭矩”,以抵抗轴的运动。 这对于我们的应用来说听起来非常有用,因为我们希望灯保持在它们放置的位置,但这也意味着它们在静止时消耗的功率几乎与旋转时一样多。 这似乎……不雅。 浪费。 没意思。 因此,我们需要更多的东西。 某种刹车? 是的,那样可以。 确实有这样的东西,但并非一定适用于您想要的步进电机尺寸(并且您可以获得几乎任何尺寸的步进电机)。 我选择了一个看起来合适的电机和制动器组件,但在项目进行到一半时,该组件被制造商迅速停产。

有应用程序吗?

我英勇地无视机械设计的更精细之处,推迟了对所有东西如何组合在一起的进一步思考,直到以后。 要锁定的最后一个关键部分(不是字面意义上的:这仍然是一个机械问题)是电子设备,更具体地说,是使用哪种微控制器。 我长期以来一直是 Electric Imp 平台的粉丝——事实上,它是我的主要商业硬件项目 Fruit 的基础,其中数百个仍然在使用中 7 年后。 然而,它背后的公司已经多次易手,这使得它从寿命的角度来看有点问题,无论如何,当时我的许多技术人员告诉我,我们最好使用 ESP32。 我可以看到表面上的相似之处:它们都是具有 wifi 支持的强大的嵌入式微控制器。 Electric Imp 在其安全模型和易用性方面走得更远,但 ESP32 更受欢迎,也更便宜。 我放弃了,并决定围绕 TinyPICO 构建电子设备,这是 ESP32 主题上设计特别精良的变体。

设计

我们开始了。 我们有悬挂能力、步进器和制动器小部件以及微控制器。 从哪里开始? 基于我最终能够使固件工作的有点傲慢的假设,我决定从电子设备开始。 当然,除非知道我有多少空间可以玩,否则尝试设计电子设备是很愚蠢的,所以我实际上是从物理设计的粗略轮廓开始的。 关键组件显然是步进电机,因为它相对较大且较重——它需要一个刚性安装点,并且周围需要一些气流以进行冷却。 它还需要连接到某种绞车装置以驱动电缆。 经过一些电子表格工作后,我确定直径略小于电机的绞车滚筒将提供足够的扭矩,并且能够卷起几米长的电缆而不会太宽,这表明了一个不错的简单堆叠:制动器:电机:滚筒,作为要围绕其设计的主要组件。

我花了一段时间犹豫是否需要任何辅助电缆管理; 我考虑添加额外的滚轮,以便电缆可以从绝对中心离开成品单元(纯粹是出于美观原因),但最终认为磨损和复杂性不值得。 相反,电缆出口将在一个轴上居中,在另一个轴上偏移,电缆直接从绞车滚筒下降,而不会经过任何其他承重部件。 这需要电机组件的一侧刚好在机箱中心线之上,这立即意味着一个长方体外壳,留下一个大约 140 x 60 x 80 毫米的空隙,用于放置电子设备(以及稍后要解决的许多机械细节)。

电子设备

在制定了粗略的空间预算后,差不多该启动 KiCad 了,但首先我需要弄清楚到底要尝试将什么东西装入该空间中。 TinyPICO 已经被选中,但这肯定无法直接驱动步进电机,并且在四处搜寻概念时,还出现了一些其他的想法。 我决定,电子设备必须执行以下操作:

其中第二个似乎是最重要的,这意味着选择一个好的市电电源模块并尊重它。 与电源一样,关键因素始终是电压和电流。 步进电机对电压不太挑剔,但螺线管制动器指定为 24 伏,因此我们将提供 24 伏。 其余电子设备在 5V 下会更快乐,因此我们需要某种进一步的稳压器。 电机的功率预算约为 1 安培,制动器的功率预算约为 1 安培(相当高!),其余电子设备的功率预算为半安培(这很慷慨),总计为 2.5 安培,或在 24 伏下的总功率为 60 瓦。 听起来像是一个名为 IRM-60-24 的直接电源的完美任务,这是一个来自 Mean Well 的完全封装的市电电源。

因为我在市电方面是个胆小鬼,而且也因为 IRM-60-24 的尺寸,我决定将所有市电电压的东西都放在一个 PCB 上,并将所有其他东西都放在一个单独的 PCB 上,通过针脚头连接。 因此,要安装到市电板上的唯一其他组件是一个允许切换灯电源的继电器,以及一个保护继电器在灯软线短路时免受损坏的聚熔丝。 在 KiCad 中将它们组合在一起非常简单,然后布局一个合适的两层 PCB。 令人欣慰的是,这部分设计不需要进一步的改进……不像几乎所有其他东西。

控制板稍微复杂一些。 从理论上讲,您可以使用不超过几个 MOSFET 和一个查找表来驱动步进电机,但这需要相当精确的定时控制(我不确定是否能实现,因为 ESP32 将要进行很多其他操作),并且无论如何都相当粗糙。 步进电机控制的最新技术包括斩波算法,该算法可以缩放呈现给电机线圈的电压以降低工作噪音,或者非常快速地对速度和负载做出反应以抑制电机中的谐振。 微步进也很常见,允许超精细的位置控制,这有助于避免低速时的抖动。 所有这些技术听起来都_非常_模拟,因此我开始寻找专用的电机控制芯片来为我处理所有这些。

来自 Trinamic 的 TMC2208 似乎符合要求:它具有许多商标功能,例如 MicroPlyer™ 和 StealthChop2™,更不用说可能很有帮助的 SpreadCycle™ 了。 这些勾选了所有“花哨的控制算法”框,并且该部件可以在高达 36V 的电压下驱动每个线圈高达 2A,同时需要很少的外部部件。 它具有方便的 UART 接口。 唯一的缺点是它仅作为 QFN 部件提供:这些部件非常难以手动组装,特别是如果您的热风枪有点问题(就像我的那样),因此这可能意味着让其他人组装该板,并且还出于散热原因使用 4 层 PCB。 这不是世界末日,但为了说服自己这个部件确实可以完成任务,我订购了一个开发套件。

总而言之:是的,TMC2208 绝对可以驱动我想要的步进电机。 太棒了。 这很有趣。 现在来完成控制板的物料清单。 我们需要为 TMC2208 和 TinyPICO 的低压侧提供电源(将我们从市电板获得的 24V 转换为 5V),还需要一个螺线管制动器的驱动器(以及另一个板上的灯电源继电器的驱动器)。 我为此选择了 BTS7090,这几乎可以肯定是大材小用,但作为一个汽车部件,它似乎被设计为可以容忍各种散热和电源滥用。 哦,我们还需要一个限位开关,以确定电缆何时已缠绕到其行程的顶部。

在花费了相当长的时间研究数据表之后,我说服了自己我已经提出了一个可行的原理图。 这导致了令人愉悦的禅宗任务:布线所有走线; 这非常令人满意,但我_确信_早在 20 世纪 90 年代就有人告诉我,这现在将是一项完全自动化的活动……无论如何,在通常的感觉我错过了一些重要的事情,但又无法找出它是什么之后,我将设计发送给几乎不可思议地乐于助人的 JLCPCB 进行制造(以及控制板的部分组装)。 面向制造的设计是一个庞大而复杂的主题,我在此项目中很大程度上忽略了它——我当然可以通过选择更容易获得的部件来简化生活,但对于像这样的概念验证,这可能不是一个好的时间利用。

机械装置

我一直在尝试寻找一个有趣的角度来写关于机械设计的内容,但我所能做的最好的就是 1.5º——这是应用于底盘边缘的拔模角度,以确保可以将其从外壳中移除。 这实际上并不那么有趣。 更有趣的是我最终设计的复杂性; 我已经使用 3D 建模和 3D 打印多年了,但这是我尝试过的最复杂的设计。 我认为,通常情况下,很多复杂性来自对外部简单性的渴望:我真的希望主单元的主体在视觉上简单,并且尽可能紧凑。 这意味着尝试将内部组件紧密地堆叠在一起,并尽量减少在单元底部或侧面可见的功能数量。 我是否成功地实现了这一点将在稍后变得更加明显(剧透:在我看来并非如此),但让我们首先了解初始设计,以了解妖精隐藏在哪里。

从上面的粗略框图可以看出,我们需要将三个主要部件彼此保持关系,并防止被手戳到。 这些是市电 PCB、控制 PCB 和电机。 我们最终对绞车做什么都将连接到电机轴,因此实际上不需要过多考虑。 如果所有部件在使用期间都牢固地连接到天花板上,那也将是一件好事:电机和制动器组件的重量略低于 1 公斤,因此我非常希望避免它掉到任何人的头上。 但是,也需要可以拆卸该单元进行维护(以及不可避免的调试)。

我的想法集中在将电机连接到一个刚性底盘上,该底盘与一个将拧到天花板上的安装板互锁。 将提供一个闩锁,以确保这两个部件不会意外地停止互锁。 底盘还允许我们使用螺钉将外壳连接到底盘上,而这些螺钉在安装该单元后不会可见。 整洁。 我在这里犯了我的第一个大错误:因为外壳会很深,所以我认为让 PCB 从上方简单地插入其中是一个好主意。 然后可以使用底盘固定这些 PCB,该底盘可以保持相当薄——并且也不必在其下表面上有任何突起。 这吸引了我,因为它很容易打印而无需支撑。

回想起来,我应该将 PCB 连接到底盘上,而不是外壳上。 这将大大简化组装过程,并使调试工作更容易。 这比通过使用薄底盘节省塑料更有用。 下次要吸取的教训。

无论如何,通过图片更容易理解此讨论,所以让我们看一些:

这些是主要部件。 哦,我可能应该指出,我使用了_出色的_ OnShape 来完成所有这些:与我尝试过的所有其他 CAD 系统相比,使用它绝对是一种乐趣。 我知道我只是触及了其功能的表面,但仅仅是将基础知识绝对正确就使其比例如说 Fusion 360 更少令人沮丧。 如果没有它,这个过程会感觉更像_工作_,而不是我为了好玩而做的事情。 无论如何,这些部件看起来有点迷失了,只是漂浮在太空中,所以这是早期版本的底盘:

早期底盘

中间的手指类型排列旨在与安装板互锁,该安装板如下所示:

早期安装板

安装板通过螺钉孔连接到天花板(我提供了几个,因为你永远不知道你会碰到什么),并且可以使用对齐槽整齐地对齐。 底盘上的 λ 形夹子与安装板啮合,确保除非你用合适的工具按下夹子,否则这两个部件无法分离。 其余的功能主要是电缆管理方面的尝试,稍后会进行大幅修改,因此我不会浪费时间在它们上面。

关于绞车

互联网上关于绞车设计的主题可用的材料很少,因此我不得不主要从第一原理入手来解决问题。 因此,我犯了一系列有趣的错误,如果我再次处理此设计,我会采取一种根本不同的方法。 第一个挑战是将电缆牢固地连接到滚筒。 紧弯对编织电缆不利,因此我首先形成一个圆柱体,然后在其中提供一个孔,通过该孔将电缆引导到圆柱体内部的连接点。 电缆的末端将使用卷曲套圈形成一个环,然后滑过一个巧妙成形的安装柱,该安装柱将保持其位置。 该柱不需要非常坚固,因为在使用中滚筒上始终会有几圈电缆,并且这些圈与滚筒本身之间的摩擦会提供保持力,而不是柱本身——但即使如此,我还是试图使其尽可能坚固。

另一个关注点是尝试使电缆整齐地缠绕在滚筒上,特别是为了避免它全部堆积在自身顶部。 接受的智慧似乎是,通过在滚筒中刻出凹槽以使电缆螺旋进入,最好在第一层解决此问题。 我不确定这会有多有效,但无论如何我花了一个有趣的下午在上面,提出了一个通过从圆柱体表面减去扫掠螺旋管来形成一个漂亮的螺旋槽(具有适当的引入和引出)的设计。 在滚筒的任一端添加一些法兰以防止电缆滑落,我们就几乎完成了:

其他机械部件

如前所述,我们需要知道何时已将灯具绞到其行程的顶部,以提供一个参考点,从中计算距离,并防止电机将灯撞到主单元中并造成灾难性后果。 这是实际上在机械设计和电子设计之间快速迭代的部分之一,但我将在此处讨论它以避免混淆叙述过多。 基本上,这个想法是,电缆将通过一个狭窄的槽离开外壳,该槽对齐以与滚筒的边缘相切。 槽周围的区域将是铰接的,这样,如果任何大于电缆的东西撞击该区域,它将以一种可以按下 PCB 上的微动开关的方式枢转。 由于电缆槽位于外壳的中心线上,并且控制 PCB 一直位于边缘上,因此需要一个杠杆、推杆和开关排列,最终使我想起了人耳的锤骨、镫骨和砧骨:

将此部件安装到外壳中涉及对内部隔板(在那里是为了确保钢缆不会与任何市电电压部件接触,并提供刚性)进行一些调整,但除此之外,外壳设计作为第一次尝试来说是相当简单的。 说真的。

早期外壳

软线从底面的中心离开,内部由一个应力释放夹固定,并且整个外壳(包括 PCB)使用黄铜螺纹嵌件连接到底盘。 这些非常易于使用(只需用烙铁加热它们并将它们推入),并提供牢固的机械连接; 我将来会再次使用它们。

这样,理论上,机械设计就完成了。 在实践中……请继续阅读。 但首先,让我们转向固件。

固件

事实证明,那些向我保证 ESP32 与 Electric Imp 一样是嵌入式开发的强大平台的人……简直。 plain。 错了。 相比之下,它是一条狗。 不要误会我的意思,它是一个非常强大的设备,而且所有关于其潜在安全漏洞的耸人听闻_可能_都是虚假的,而且当然它非常便宜,但是……开发人员的体验就像尝试仅使用指甲锉修剪玫瑰灌木一样愉快:可行,但会很痛苦。

使用 ESP32 进行开发的根本困难是传说中的执行鸿沟。 简单来说,在进行更改后获得反馈需要太长的时间,因为部署新代码是您真正必须考虑的事情(而不是应该是附带和透明的)。 我必须承认,我没有对在这个平台上构建和部署代码的细节进行太多阅读,这是一个错误。 我天真地认为自 Electric Imp 上市以来的十年左右事情已经有所改善,人们不会忍受将串口电缆插入已经具有板载 WiFi 的设备来对其进行编程。 我是多么错误。

我将回到这个话题(因为它很烦人,而且我不喜欢对明显应该更好的事情保持理性),但首先简要地绕道谈谈语言。 有很多语言可以针对 ESP32 使用的 Xtensa CPU 内核,包括有趣的是 Rust。 我喜欢 Rust。 有时它有点令人费解,但是一旦你绕过了借用检查器,它就会给你很多可爱的编译时保证; 你可以非常自信地认为,如果你的代码编译成功,它不仅会运行,而且可能会做你期望的事情,这是一种真正令人鼓舞的属性。 因此,我为 Danglepoise 开发固件的起点是设置工具链,以便从 Mac 到 ESP32 进行 Rust 的交叉编译。 这非常简单。

不太明显的是对各种 ESP32 外设(包括关键的 WiFi)的支持级别。 在我开始查看它时,这方面的文档非常不均衡(我知道自那以后有所改进)。 进一步的困惑来自不知道最好是进行裸机实现(Rust 术语中的 #![no_std]),还是承担使用 Rust 运行时的资源损失。 这是一个相当细致的决定,不幸的是,有抱负的 Rust 嵌入式开发人员必须在他们有机会熟悉权衡之前就开始处理它。

无论如何,在尝试了几种不同的方法之后,我最终能够在裸机 ESP32 上启动并运行 WiFi。 然而,找到没有标准库也能工作的高级库(例如 HTTP 服务器!)是令人非常沮丧的。 同样,在过去的几年里,这可能已经有了很大的改进,但在任何情况下,似乎没有一种工具真正设置为通过无线方式部署新代码,我认为这是一个阻碍。

在阅读了相当多的关于 ESP32 的页面之后,我发现使用 MicroPython 的人比使用 Rust 的人要多得多。 大量业余爱好者通常会带来开发人员体验的改进,而且我读到有些人成功地使用一种名为 WebREPL 的工具通过 wifi 将代码部署到 ESP32。 外设支持似乎也非常好。 现在,我过去使用过一些 Python(例如,它运行着我的衣柜照明,以及食品储藏室的门),而且它……还可以。 我真的不明白为什么这么多人认为它对机器学习工作至关重要,而且我个人的观点是,显着的空格缩进是纯粹的邪恶,但是很多人都与它相处得很好,所以它不会太糟糕。

经过更多的研究后,我发现一个名为 Thonny(链接)的 IDE 是 MicroPython 开发的首选工具,主要是因为它支持通过 WebREPL 进行部署。 我花了一些时间尝试使用 IntelliJ IDEA(我首选的工具)复制此功能,但事实证明这对于我当时的动机来说是太多的努力了——当时的动机相当低,因为我希望到此时编写一些实际的固件。

在确信我最终可以从 Thonny 将代码通过无线方式发送到 TinyPICO 之后,我编写了一些代码来打开和关闭板载 LED,然后开始考虑如何与 TMC2208 通信。 此时,PCB 送到了邮局。

开发

有了 PCB、组件、第一稿打印部件和对如何处理固件的模糊想法,现在开始了许多个月的迭代冲突。 其中一些具有很高的教育意义。 这比预期的要花更长的时间。 为了读者的理智,我将尝试将这段时间归结为关键发现。