基于乐高头脑风暴的布谷鸟钟

两年半前,我购买了Lego Mindstorms EV3套件来迈出机器人技术的第一步。 将ev3dev组件滚动到控制器上,并充分使用SSH引擎和传感器控制功能后,我冷却了两年的购买。 原因是我没有足够的想象力使之成为可能:在从乐高技术公司组装了几款模型后(包括盒装和自制),我已经习惯了像遥控玩具这样的奇迹,而像Lego的模型克拉科夫展览会上展示,而他以前是在一个远程机械系统上工作的人,已经不再激发足够的灵感。 我真的不想重复别人的经历。

最后,它突然浮现在我头上:布谷鸟钟可能成为一种非常复杂,有趣,实用且不太笨拙的模型。 受到这个想法的启发,我开始做生意。

按照我的想法,模型不仅要成为玩具,还要成为功能齐全的设备。 这完全有可能:时钟挂在我的墙上,并以24/7模式显示当前时间。 我并没有设定要在所有细节上重现原稿的机制的任务-例如,箭头是独立的,声音是通过控制器的扬声器重现的,砝码和摆锤专门用于周围环境。 因此,已经将所有主要工作转移到了软件部分,我将机制组装到了最简单的版本中。 我没有记录整个组装过程,因此无法以相同的形式再次组装模型。 但是,配对软件和机制的基本原理是这样的,程序应在根据类似原理组装的其他模型上进行最小的修改。

我在YouTube上发布的视频中展示了各种形式的手表:


视频中介绍了有关该模型的基本信息。 下面,我将更详细地介绍有关机械,软件以及在设计和组装过程中出现的问题的详细信息。

机械师


机械零件的组装耗时6天。 在新年假期期间,将Lego盒子放在桌子上之后,我组装了一种与最终版本不同的机制,只不过是布谷鸟生活在其后的门上(更多内容在下文中)。 我没有任何特殊的设计技能,因此该表是一个带两只手的长方形盒子,并且表盘的正面标有圆点。 手表的上部是一个被两扇门封闭的隔间,杜鹃布满其中,而下部则是一个示意性的摆锤和两个配重。 零件取自几套乐 玩具 :一台Lego Mindstorms EV3(31313) ,两台沃尔沃平地机(42030) ,一台带动臂的梅赛德斯卡车(42043)和一台汽车起重机(42009) 。 尽管有大量的装置,但这种尺寸的模型几乎没有足够的细节-表盖由不同颜色的条带组装而成,但是由于在壁挂式安装中位于眼睛上方,因此并没有引起人们的注意。

分针使用了15个单位的标准Lego Technics酒吧。 将其放置在轴上,将其牢固地连接至发动机。 因此,事实证明,设置分针的精确度足以使它可以用于确定精确到分钟的时间。 时针较短,安装在旋转机构上。 它通过多个齿轮连接到发动机,因此存在相当明显的反冲-但是,该反冲并不大,不会导致确定时间的问题。

指针由两个大型马达(LM)驱动。 此外,与另一只外针配对,另一只手工作,内部一只-分针与第一只指针固定在同一根轴上,而钟表的旋转机构则复制在手表内部。 内部箭头的目的是在使外部箭头穿过上方位置时按下按钮(触摸传感器)。 因此,控制器具有在接通电源后立即确定箭头的位置并根据系统时间设置其正确位置的能力,从而使用户不必手动输入箭头。

配重具有纯粹的装饰功能。 最初,我想到做一个重量,该重量会慢慢降低(如在普通手表中一样),然后迅速向上拉至较高位置(类似于摆钟的手动上弦)。 随后,由于多种原因,我拒绝了此选项。 首先,发动机和重量之间的齿轮比切换机制为模型增加了额外的复杂性(而同一发动机的摆锤驱动只会增加模型的复杂性)。 其次,不管怎么说,快速眼线笔都会带来嘈杂的操作,但是我希望手表尽可能安静地工作。 第三,在传统的布谷鸟钟中,通常有两个配重块(一个为钟表,第二个为布谷鸟形),并且将两个链轮翻转轮放在表的底部立即会导致模型尺寸更大的增加。

从此开始,我走了一条简单的路:我实际上在手表上安装了两个配重,但是将它们放在扔在单个驱动轮上的公共电路上。 在此版本中,砝码始终沿反天气方向移动,并依次下降。 此行为与真正的摆钟无关,但看起来很有趣。

链条是由三个单元的普通装饰件组成,并使用轴和活塞组合而成:滑动活塞是非常少见的零件,我用轴将所得链条的长度加倍。 要使这样的链条运动而不会打滑和击穿并不是一件容易的事,但最终还是有可能的。

至于改变配重运动的方向,我的第一个想法是使其纯机械化:举升到表壳的底壁时,安装在配重正上方的宽轴压紧链条穿过的板并导致轮子旋转。 我将使用与起重机42009相同的开关元件:换挡时,驱动轮与右或左邻居进入离合器。 但是,这个想法并没有实现:当压力板不与左右邻居接合时,压板将滑动部件移至中心位置,扭矩停止流向车轮,并且开关冻结在中心位置。

为了纠正这种情况,我决定在此回路中增加一个可移动的三角形,该三角形的两侧将具有固定的长度,而第三侧将由同一卡车起重机的悬架中使用的弹簧加载滑动部件表示。 这种设计的含义是,三角形始终位于压力面板上与起重重量相对应的一侧:当重量到达顶部时,压力面板压在三角形上,弹簧压缩,三角形穿过平衡位置,然后“扔”到另一侧,释放弹簧存储的能量。 按照我的计划,这种能量应该使速度开关移动通过平衡位置,然后立即将其转换为相反位置。

但是,我无法稳定该系统。 通过时钟的大小,您可以了解到微型机制不是我的事,而是随着结的大小增加,其中产生的扭曲会导致摩擦,从而消耗掉大部分开关能量。 在遭受了这种机制的折磨之后,我最终决定通过在按钮面板(触摸传感器)上方安装一个按钮而不是复杂的机制,将所有肮脏的工作转移到微控制器上。

有点简单的算术。 EV3具有四个输入和四个输出。 按钮和箭头引擎已经分别占用了两个输入和两个输出。 在该电路中增加一个使链轮旋转的电机和两个按钮,这意味着,首先,我没有用于连接布谷鸟位置传感器的自由端口(我认为为此目的使用了光学测距仪),其次,其余节点(布谷鸟和摆锤)只有一个引擎。 我考虑了将两个配重块上方的按钮面板都连接到一个通用按钮的选项,但是拒绝了,因为如果在打开时钟时,其中一个配重块处于较高位置并按住按钮,则手表将没有足够的信息来选择链条的运动方向。

由于摆锤比杜鹃更容易与链条运动机构相关联(就其运动性质和位置而言),我在车身下部放置了另一个大型电动机,该电动机首先来回驱动摆锤(1次发动机旋转)转换成一个完整的摆幅),其次-通过减速齿轮旋转车轮,从而驱动链条。 这样的系统具有的缺点是,当使链条的运动方向以及相应的发动机的旋转方向相反时,即使摆锤处于中间位置,摆锤也改变了运动方向,这看起来可能很难看。 但是,切换配重的移动方向是非常少见的操作,因此我忽略了这个问题。 我的装配的另一个缺点是摆锤驱动器中的可更换间隙相当大,这就是为什么当摆锤缓慢移动时,摆锤会停在较低的位置几分之一秒,从而引起明显的注意。 我懒得解决这个问题。

说到摆的速度。 经过试验,我选择了每秒30度的引擎值。 这意味着摆锤会在12秒内完全振荡。 但是,随着速度的提高,引擎开始发出嘶哑的声音,继续听他的歌的前景对我完全微笑。 懒得去研究一下这种机制并引入一个超速档,所以我选择了这种“月球”格式。 发动机和链条驱动轮之间的传动比应使重量在40至50分钟内从下部位置移到上部位置。

经过所有先前的操作后,EV3端口仍保持空闲状态,它占据了驱动杜鹃的中间电动机(中电动机)。 杜鹃本身是由相同乐高技术的零件组装而成的。 禽鸟的高度达到11个单位,并放在可伸缩的杆上(在上述卡车起重机的这些杆上,放置了远程限位器)。 微型机械装置在鸟的翅膀和尾巴之间引入了一个传动装置,通过该传动装置,我将一根电缆固定在了手表内部。 选择电缆的长度,以使布谷鸟完全离开,其翅膀朝下,并且仅在运动的最后将它们稍微散开。 事实证明,这是大气的-只是在简单表款的机械化水平上。 布谷鸟的驱动是通过打滑装置接通的,这可以弥补无位置传感器的不足-即使布谷鸟试图将布谷鸟移动到边界点之外,它也不会损坏发动机。 门与固定有鸟的木板紧密连接,并在布谷鸟本身离开时同时打开。

最初,我将11 x 5用于1个单元的面板作为门,但这真是个坏主意:它们的边缘没有倒圆,并且紧贴相邻部件的门经常被阻塞,使布谷鸟居于内部。 视频显示了门组件的第二种版本-带有圆角边缘的普通装饰不会引起此类问题。 此外,门的“木板”版本可以更安静地打开和关闭。

手表安装在用螺栓固定在墙上的表带上。 整个结构重于一公斤。

至此,机械部分的描述原则上结束了。 值得一提的是,该模型是100%由Lego Mindstorms和Lego Technics组装而成的,唯一不适用于这些套件的部件是电源线,该电源线是我焊接到EV3上的,因此我不必一直更换电池。 该电线连接到插入插座的电源。

程序


ev3dev程序集为许多编程语言提供了活页夹。 为了使组装没有困难,我决定限制自己使用Python脚本。 该脚本在GitLab存储库中可用。 下面我将简要介绍其功能。

移动箭头的代码相对简单-它使用关于箭头每转一圈的发动机度数和箭头从垂直位置的初始偏移的数据,将分钟和小时重新计算为发动机的旋转度。 当程序尝试获取此数据时,所有的乐趣就开始了。

正如我已经说过的,决定放弃射手的手动连接。 而是在启动时,手表通过确定几何参数进行校准。 两只手彼此独立进行校准。

校准算法如下。 首先,引擎开始以相对较高的速度旋转(我使用每秒180度的经验值),直到来自确定箭头上方位置的按钮的确认信号发出为止。 此后,引擎将速度重置为每秒30度,并继续顺时针旋转箭头(在程序中缝制了引擎的旋转方向),直到箭头与按钮的最后打开点分开70度为止。 之后,箭头沿相反的方向穿过上方位置,从而固定了触点的第一个闭合件和最后一个开口(按钮可能在边缘位置发出喀嗒声)。 从最后一个开口移开相同的70度,箭头再次将运动方向更改为直线,并重复了注册第一个回路和最后一个回路的过程。

可以认为,箭头的上部位置对应于如此获得的四个值之间的算术平均值。 实践表明,这种近似值非常好-分针的目标位置与实际极少的偏差超过了1步,几乎从未超过2步。 (由于拍摄的目的,我翻译了系统时间,并且指针的移动速度比正常操作时快,因此每转一圈的校正误差都会增加,因此视频显示了更大的偏差,请参见下文。)对于顺时针方向,齿隙会吃掉精度,但是该算法当然使用相同的算法。

在计算出箭头的上方位置以及传感器首次打开与箭头的上方位置之间的差(此值需要校正后,请参见下文)之后,校准算法再次将发动机转速提高到每秒180度并重复搜索上方位置。 两个连续的较高位置之间的差确定了以发动机的旋转单位为单位的箭头的完整旋转的长度。 最高位置搜索过程重复五次,这使我们可以平均获得的值并稍微提高精度。

校准完成后,指针进入当前时间显示模式。 此外,在箭头的每个圆圈上,算法都会确定断路器首次闭合的位置。 此时,发动机的实际旋转角度与预期旋转角度之差就是校正量。 因此,即使在校准阶段未正确计算完整的圆弧长度(调试输出显示偏差很少超过1度),由于误差的累积,每个圆弧的校正也不允许箭头移动。

请注意,唯一明确地缝在程序中的有关发动机和箭头比例的信息是与箭头的向前运动相对应的发动机旋转方向(前进或后退)。 由于有了位置传感器,对齿轮比和箭头初始位置的数据的需求消失了。 因此,如果您收集一只手表,除了时针和分针之外,还将显示秒针,该算法将允许您通过添加几条线来使用它,而不会浪费时间在数牙齿上。

箭头运动程序中缺少的是防止溢出或精度下降的保护措施。 我没有调查早期会发生什么的问题:引擎旋转角度的位深度将溢出,或者由于精度的浮点数的较高位数的偏离,箭头将开始变得抖动。 但是,实践表明,在几周左右的时间内,不会发生这种情况。 如果遇到这个问题,我很可能会在每圈添加一个引擎重置命令,并在程序中进行相应的角度校正。

如果程序中的Hand类负责箭头的移动,则LedIndication类将点亮,然后关闭EV3前面板上的LED。 我知道一个团队可以达到相同的效果,但是最初该功能旨在跟踪程序崩溃,然后仍然存在。 这个课没有什么比这更有趣了。

摆类负责重量和摆的运动。该算法只是简单地沿一个方向启动引擎,然后以恒定速度旋转引擎,直到夹紧了与完全举起重物对应的按钮为止;之后,电动机的运动方向反转。

顺便说一句,在此类中,提供了防止程序崩溃的保护措施,其中包括以下事实:引擎仅以1秒的命令更新时间打开2秒。如果我以恒定旋转模式打开引擎,则当程序崩溃时,靠在按钮上的按钮会继续向上移动,这可能导致电机过载,齿轮打滑甚至损坏机构。保护可以防止出现此问题。

最后,每次将59分钟的值替换为0分钟的值时,Cuckoo类都会运行杜鹃。首先,杜鹃被完全推开,然后杜鹃一次,通过EV3扬声器再现声音,然后再次藏在表壳中。按照当前小时重复运动-从1到12次。声音来自免费的FreeSound库,经过编辑后在EV3上听起来更好。 (我不能说我对结果感到满意,因为在春天敲击锤子时低音几乎听不到。)

杜鹃去除命令和声音再现命令之间的延迟是通过实验选择的,以便在杜鹃到达其极端位置的那一刻听到声音。但是,ev3dev对此有一个小问题:由于系统负载,声音会周期性地滞后,尤其是当此时存在与时钟的SSH连接时。延迟可能长达几秒钟。我不确定这是否是我的控制器,内部版本本身或从网络接收到的更新问题(安装ev3dev后,我出于习惯使用了apt get upgrade命令,尽管我可能不应该这样做),但是平均而言,布谷鸟听起来很正常,所以我不会调试这个问题。

顺便说一句,一个错误与程序的早期版本之一的声音延迟有关,当时我还没有添加对播放结束的期望:如果杜鹃设法在延迟时间内隐藏并重新出现,则下一个声音被“吞噬”,而“杜鹃”的数量不匹配小时数。后来,我修改了程序,使布谷鸟希望声音在极端位置结束,然后才进入下一个循环。

半小时间隔由从相同原始声音获得的单个信号表示。布谷鸟没有出现。

, , . — , , .

, . , , , . , Skype, .

该程序作为服务安装,并在Debian启动时启动。因此,打开时钟就足够了,他们可以自己做进一步的事情。时间花费在互联网上-在我的EV3中,有一个WiFi加密狗。时钟开始后,我通常会断开网络连接,以免给处理器造成额外的负担。

该程序在BSD许可下可用。如果您希望建立类似的模型并使用我的软件,我将非常高兴。

Source: https://habr.com/ru/post/zh-CN417255/


All Articles