这是一个时钟DIY的全部过程:从开始的构想到制作流程的每一步,都将原汁原味的呈现出来。
我们要制作的东西,叫做线性时钟。什么是线性时钟呢?顾名思义,所谓线性时钟就是把圆形钟面上的数字拉直,然后按直线排列起来。想象一下,要是在家里或是办公室放着一个这么Geek的时钟,一定会有种很潮的感觉。
我雄心勃勃,希望将来能把线性时钟推向市场,让它走进千家万户。如果你看了之后,准备亲自操刀DIY一个,或是灵光闪现想对它进行改进的话,本文提供全套制作方案和使用的零件列表。
这个线性时钟是一个简化版本,用了很多常见的零件。它只是个检验可行性的愿型。制作过程并不复杂,如果零件、工具齐全,一晚上足以搞定。我选择的元件大都比较容易找到,制作时也无需对它们开膛破肚,更用不着太特殊的东西,而且制作精度的要求也不太高。
之后介绍了我试图改进线性时钟所做的几种尝试以及最终定型方案。我很享受整个DIY过程,我相信你看过之后肯定也按捺不住、蠢蠢欲动了吧。下面就让我们开始吧!
这个过程确实很辛苦。我甚至因为可实现的方法太多,不知如何选择而陷入僵局。
2、造价低,适应普通零售商店的价格范围
3、水平、垂直放置皆可使用
4、指针不走动时不能有噪音
5、重量轻,无需特殊的架子或钩子就能固定到墙上
6、满足多数人审美观点需求,要有多种样式、颜色和材料可供选择
我犹豫了很长时间之后,终于选定了一个比较简单的机械设计方案,即用一个绕线轮来控制装有弹簧的蜗牛凸轮的转向,并通过他们来带动齿轮组,控制指针移动。
时钟信号来源于一个石英钟机芯,机芯每秒钟发出一个脉冲信号,该信号可作为时钟的计时装置。其实有很多电子设备都能实现计时功能,比如时钟芯片和无线电时钟等,但是为了简单起见,我还是选择了石英芯片,因为我对它比较熟悉,并且有利于控制成本。
为了避免往时钟上安装讨厌的电源线,我决定用电池作为时钟的能源。因此我主要考虑使用弹簧驱动装置,这样电机之类的就不必使用了,只需每分钟给个脉冲信号就行。但如果按照这个思路制作,难度会很大,所以在本文中我将设计简化为使用微控制器来驱动步进电机。
看到这里,童鞋们可以直接跳到最后去看看制作完的线性时钟是个神马模样。
● 把两个缝纫机绕线轮粘到一起。
● 粘贴面要打磨平整,然后用强力胶水粘住。
● 在时钟运行中,一个轮绕线,另一个轮放线。你可能会想:两个绕线轮粘在一起,不就相当于一个吗,那只用一个长一些的线筒可不可以呢?嗯,这种想法应该是对的,但是如果这样的话两根线可能会搅在一起,所以为了让它们运行更流畅我使用了两个绕线轮。
● 这里还需要设法把绕线轮和步进电机的轴连在一起。恰好,我的电机轴上带有一个铜环,刚好能塞到绕线轮的孔里,大小还蛮合适。我用热熔胶把轴和绕线轮牢牢地固定在一起,要是不放心,你还可以用环氧树脂来粘,强度保证给力。
● 这里注意要在绕线轮和电机外壳之间留点缝隙,确保电机旋转时没有障碍。缝隙有两张纸那么厚就可以,在固定的时候可以预先拿两张纸垫到缝隙里,这样就不用担心绕线轮和电机外壳接触了。
● 在每个绕线轮上缠一根比时钟稍长的线,两根线的方向相反,为确保线头不松散,把线头用蓝丁胶(BLU - TACK)粘一下,再裁剪它们到一定长度。
时钟的绕线轮直径和上面绕线的多少密切相关,绕线越多它体型就越胖,步长就变得越长---也就是说,因为线是逐渐绕上去的,电机每前进一步绕线轮上就多绕一些线。这在实际中会引起一个小问题,当其中一个绕线轮绕满线之后那么传动中的线会略微变形。
为了补偿这个变化(虽然不严重,但也足以引起一些问题),两边的绕线回路可以用一条松紧带捆在一起。这样绕线就有了足够的伸缩性,松的时候能保持运行的流畅,在被拉紧得时候又能提供足够的张力保持不变形。
这有一定的难度,我的制作过程都已经用图片展示出来:
● 保证每一对绕线轮上的线都足够在时钟上绕一圈。也就是说,要把这一对绕线轮上引出的线从时钟另一端的惰轮上绕过再引回来。把两个绕线轮上的线截成同样长度。
● 每个绕线轮只绕一半的线,把两个绕线轮的线头沿滑块槽引到惰轮。
● 用手指捏住两个线头,沿着滑块槽的方向来回扯动,试着让线在绕线轮来回缠绕几圈,感觉一下张力的变化程度。这样松紧带会拉到多紧你就心里有数了。如果变化很小(绕线较细时),那么松紧带就不必放的太松。如果变化很大(绕线较粗时),这时就有必要让松紧带富余一些了。
● 在两根线的末端都打上大约一英寸的结,两根线不直接连接,而是用一段适当长度的松紧带连起来,先在松紧带的一端打一个结。
● 把松紧带打结的一端捆到从惰轮引来的线上(来自于另一端的收线轮)
● 然后再来回扯一扯线,试试看把松紧带的节套到绕线的哪个位置比较合适,然后再打上结固定住。我在绕线的线头上多打了几个结,这样方便调整松紧带的长短。
● 松紧带上的结要能卡到你开的滑动块凹槽上。如果怕不结实可以再用胶水粘一下,但是我发现只要把结塞进槽里,它就不容易跑出来了。
● 电路部分主要由一块Arduino板和一块Adafruit Motorshield板组成。通常电机和Arduino板不宜使用同一个电源供电,但是在这个DIY中电机的功率很小,只需要很小的电压就能驱动。所以我就插了根跳线,让arduino板的电源同时给Motorshield供电。
● 接下来又做了几根4针脚的延长线,因为我的步进电机恰好有几个那样的接口,只是接口上的线稍细了些。
● 我对步进电机了解也不太深,只能大致给童鞋们说一说基本原理:步进电机中都有两个线圈,对两个线圈输入一定频率和极性的脉冲信号,就能驱动转子向指定方向旋转。在我所用的步进电机上,这两个线圈是相互独立的,所以电机上引出了四根线。关于这种型号步进电机的详细介绍可以查阅
下面 这篇文章。
● 两根线连接到一个线圈上,另外两根连到另一个线圈。借助万用表确定怎样正确连线。然后一个线圈的两根线连到Motorshield板的1、2输出端上,另一线圈连到4 、5输出端。这里要注意线的极性,不要接反。
● 测试程序时无需等待,可以直接把程序中millisPerSecond的值改为200,它的转速就会变成原来的5倍。你也可以改变步长,步长变化会改变每个周期电机移动的步数。
程序其实并不复杂,但是你必须要有最新版的Adafruit Motorshield驱动。因为其中的一个更新在这个程序代码里有重要作用。
程序代码:
程序中有三个内部时间定义,由三个整型变量组成:currentSeconds, currentMinutes 和 currentHours。这三个时间在程序开始前预置,并随着程序运行自动累加。
程序的主循环语句记录开始时间,然后连续检测时间是否超过1000毫秒。如果超过的话,内部时钟时间加1(doTick()),然后触发子程序使时钟上的指针移动(renderTime())。
doTick()子程序负责累加时间,由秒到分钟,由分钟到小时,并且在必要时重置时间。
renderTime()子程序的作用是把累加的时间转换成时钟面板上的时分秒的位置,更准确的说就是步进电机转动的步数。这个程序能判断指针当前位置,(启动时设定在00:00的位置,也就是时钟最左边的位置),通过指针当前位置和初始位置的比较来决定步进电机的运动方向。
使用Arduino的内部计时器有时会不太可靠。这个问题有很多解决方法,
Arduino主页 中也介绍了一些让计时更准确的方法,也可以使用时间函数库。考虑到这仅仅是一台测试机,我采用了一种比较简略的解决方案(这貌似是我想偷懒时的一贯借口哦)。
因为我使用的是Adafruit公司的Motorshield板,所以便用AFMotor函数库来驱动电机。如果你通过其他电路驱动步进电机,也可以选用Arduino步进电机函数库中的其他一些子程序来加快编程。如果你下载了我的程序,记得文件必须保存为.pde后缀,文件名可以自己修改。
** 程序 **
你所选的步进电机不一定和我用的相同,为了使程序适用于不同的电机要进行修改,主要有以下几处:
1、改变电机声明变量的参数
AF_Stepper hourHand(20, 1); // hours
AF_Stepper minuteHand(20, 2); // minutes
第一行,改变数值20可以设定电机旋转一圈移动的步数。一般可设置为200(就是每步1.8度)。如果你没有所用电机的参数资料,那就只能通过实验来检测了,我相信你肯定能够设法得到这个数据。
2、改变stepsPerClock的参数
int stepsPerClock = 592;
这一步可能比较复杂,因为这个数据取决于线性时钟的长度,电机每转一圈的步数以及绕线轮的直径,需要利用公式计算出来。我只计算了电机移动100步时滑动块的移动距离,通过它就能方便的算出滑动块移动整个时钟长度时,电机需要移动多少步。这里注意应在时钟两端留出余量,防止滑动块从时钟两端滑落。
3、调整当前时间:
这个版本的程序中设置初始时间不太方便,下一版本中会进行修改,使我们能用Arduino板上的按钮来改变时间。
int currentSeconds = 0;
int currentMinutes = 55;
int currentHours = 11;
如果按照上面的值设定,时钟启动时指针会指向11点55分。有不少改进方法使设置初始时间更加智能,但是在原型中这个程序已经够用了。
我通常设置的初始时间比当前时刻晚一分钟,这样就留出了往arduino板上烧写程序的时间,刷新完程序等到恰好一分钟时再按下复位按钮。时钟刚启动时,分针可能会有些错位,偏离整分钟的位置,不用担心,用手调整到准确位置就可以了。
4、调整时间速度
通过下面这一行代码可以改变计时的速度。在测试时我把计时速度调整为实际的5倍。
int const millisPerSecond = 200;
上面这段代码设定每秒钟为200毫秒,而实际应该是1000毫秒,因此若想调回实际时间时,只要把200再改为1000即可。
● 从卷帘上找一条珠链----因为时钟长一米,所以要把它连成一米长的圆环---也就是说,所找的珠链至少要有两米才行,这样才可能连成这个链环。
● 可是有个问题,卷帘上只有一个珠链轮,所以我测绘了它,并和两个支架和一些安装在导轨上的滑动块一同进行3D打印。
● 我在//www.shapeways.com 上把设计图3D打印成实体零件,下面就是这些零件的STL文件,我相信它们会对你有帮助的。
** 图样一 **
** 图样二 **
** 图样三 **
● 刚开始我还用轻木做了两个滑轮。它们虽然可以工作,但是边缘做不圆滑,所以就放弃了。
● 这些设计似乎看上去很棒,样子很漂亮,表面也十分光滑。但正如我猜的那样,它们有个缺陷,那就是太重,那两个小电机根本奈何不了它们。如果电机的转矩能再大一点儿那就是绝配,所以虽然这想法十分简洁,现在我也只能放弃。
● 我又改回用一段绕线来作为传动带,用我的小电机来驱动。不过这次我尝试用两个啮合齿轮来代替缝纫机绕线轮。这就能很好的解决绕线轮直径随绕线增多而变大的问题。
● 和滑轮一样,啮合齿轮也是从Rapid网站订购的。
● 固定在电机转轴上的黄铜管由K&S Metals公司生产,是我从附近的器材商店淘到的。
● 我又多加了两个用塑料薄片裁剪成的引线装置,它们可以使绕线和齿轮保持对齐。
● 看似一切都很美妙,也的确能工作,但它们也有很大的局限性,那就是对工作条件太敏感了。因为是这套系统是靠摩擦力驱动,所以发生打滑的概率很大。即便刚开始运行很好也不能保证永远不出类似问题。我绞尽脑汁也对它无可奈何,我想所有靠摩擦力驱动的装置都会遇到这样的问题吧。
最后一步是安装电路板。可以先把它们粘在一块小泡沫板上,再将小泡沫板固定到时钟背后。为了方便固定,可以在时钟背后适当的挖一些槽。
需要用到下面这些材料:
● 几英寸长的万能电路板
● 连接用的导线
● 与Motorshield引脚相匹配的导线插头
● 3个按钮开关和1个LED灯(我用的是弯脚型开关和散光LED,这样更便于操作。)
● 程序也进行了修改,现在时钟可以在按钮的控制下开启或关闭,当它停止时,表盘时间可以由另外两个按钮手动调整。
● 实现此功能靠的是Alexander Brevig按钮函数库。有了这些调节按钮,设置时间时就不用再连接电脑,时钟也就更实用了。但是如果万一时钟掉电,还是需要进行复位。
● 对时钟的外观进行修整,使它看上去更像是一件产品。
● 3个开关分别连接2脚,9脚和10脚,LED灯连接在13脚。每个开关的另一脚都和地线相连,并且每个引脚都有上拉电阻(内置于Arduino板上),所以只要不短路,各引脚默认电压就是+5V。
● 程序会检测开关上的高(松开按钮)低(按下按钮)电平,当程序检测到按钮松开时便开始工作。
** 程序2 **
● 表针、绕线都固定在滑动块上,表针不应变形,要始终保持在与表盘距离适当的特定角度上。
● 一开始我只是用万能胶把绕线和纸板做成的指针粘到滑动块上。
● 纸板做成的指针制作简单,但是却不易保持形状----它会逐渐自动展开,这样就容易和另一个指针在重合位置时“撞车”。
● 因此我又制作了一些新的指针,粘上了一些细铁丝,这样指针的形状就能固定住了,然后再用从衣服上拆下的塑料粘扣把它们粘到滑动块上。
● 用塑料粘扣固定绕线和铁丝非常牢固,固定好之后,再轻轻地把铁丝掰到合适的角度上就OK了。
低功耗---最好不用电源,仅靠电池就能使用:没有达到这个目标。现在的这个方案使用了一个arduino板和两个步进电机。如果只用电池的话,arduino板上的微处理器尚可坚持些时日,但是再加上两个电机的话,我估计能坚持一周就不错了。虽然现在这个版本没达到设想要求,但是也能够接受,因为我突然意识到即便是用电源供电也不一定非要从墙上引出根难看的黑线来。线性时钟的电源线完全可以选用漂亮的纤维编织套管包装,或是用像音箱线一类的扁平电源线。目前的情况看用电池供电还是个梦想,但是我相信这个设想可以在一个不是微处理器和电机组合的版本中实现。
造价低——要在普通零售商店的价格范围内实现!至少我这么认为。为了回复一个读者的问题,我计算了一下使用简化电路时(非集成的分立元件电路)的成本,共计是40美元。如果批量购进配件的话,这个成本还可以更低。而且时钟的制作并不复杂,所以人工成本也不高。40美元的成本中不包括外壳,因为不同材质和外观的外壳价格也不尽相同,将外壳考虑进去时成本可能更高一些。如果成本按60美元计算,那批发价格可以到 120美元,零售价格更可高达200美元以上。听起来很诱人呦。如果我们取消中间环节,进行直销,又能降低部分成本。
水平、垂直皆可使用——实现!该时钟在任何状态下都没有靠重力工作的部件,滑动块和指针都很轻,所以时钟在水平和垂直方向都能使用。
指针不走时不能有噪音----实现!如果电机持续发出嗡嗡嗡的声音,那么这个声音如果被时钟外壳或墙壁放大会形成恼人的噪音。但是线性时钟指针运动的空闲中电机不通电,因此也就不会有持续的噪音了。但是当指针跳动时滑动块还是会发出咔咔的声音,不过我想用些毛毡应该能减小噪音。
重量轻——无需特殊的架子或钩子就能固定到墙上:实现!试验证明,把塑料的窗帘导轨升级到铝制的做法似乎是做了个无用功,导轨变得更重但是却没起到什么作用。但即便是换成铝制的导轨,墙上的挂钩也能承担起它的重量。加上个木质外壳也不用过分担心超重,因为相对于悬挂,我更倾向于将线性时钟摆放在某个地方(比如壁炉或书架上)。
满足多数人审美观点——要有多种样式、颜色和材料供选择:实现。之所以提这样的要求是因为我不想制作出来的时钟看起来怪里怪气,或是和普通家庭的格调迥异。我始终认为我做的时钟必须要有方便制作外壳的轮廓,而不能有突出的轴或是钟摆,否则为了给这些突出物留空间,我就不得不破坏时钟的外表了。 看着这制作成功的时钟,我很高兴,在我给大家讲它的制作过程时,它已经在我的桌子上滴滴答答的走了一周了。
不过要想制作成产品,还需要进行一些改进:
● 用带齿的链环或是珠状链环来代替两根绕线。这样驱动轮的直径就不会变化(因为它们不会层层堆积)。另外绕线在长期的运行中可能会变长,变松,这个问题可以尝试用短点的弹簧或是松紧带来解决。
● 使用独立元件组成的电机驱动电路来代替Adafruit的motorshield板。motorshield功能非常强大,但是用在这里显得大材小用。 可以使用几片L293芯片和一些三极管组成一个更加简单的电路,再搭配一个功能相对简单的arduino板,这样成本能降低不少。
● 在时钟的起点位置安装一个指针位置检测器,在指针每次到达起点时用来自动调整指针的位置。
● 选择更好的时钟内部计时方法。其实有很多方法都能实现这个目的,我感觉可以用石英钟上的计时芯片来进行改进。
这些都是今后要改进的方向。有些是为了提高产品的质量,有些是为了控制成本。毫无疑问,一个成本过高的产品即使十分完美也是没有商业价值的。
感谢童鞋们能耐着性子读完我这篇冗长的制作介绍。我很乐意听到有人想试着自行DIY,希望上面这些介绍能对你有一些帮助。即使你没有按照我所设计的过程制作,也可以从这篇文章里找到已经被我尝试过的方法,我希望你也能享受DIY本身带来的无穷乐趣。