● 电路部分主要由一块Arduino板和一块Adafruit Motorshield板组成。通常电机和Arduino板不宜使用同一个电源供电,但是在这个DIY中电机的功率很小,只需要很小的电压就能驱动。所以我就插了根跳线,让arduino板的电源同时给Motorshield供电。
● 接下来又做了几根4针脚的延长线,因为我的步进电机恰好有几个那样的接口,只是接口上的线稍细了些。
● 我对步进电机了解也不太深,只能大致给童鞋们说一说基本原理:步进电机中都有两个线圈,对两个线圈输入一定频率和极性的脉冲信号,就能驱动转子向指定方向旋转。在我所用的步进电机上,这两个线圈是相互独立的,所以电机上引出了四根线。关于这种型号步进电机的详细介绍可以查阅 下面 这篇文章。
● 两根线连接到一个线圈上,另外两根连到另一个线圈。借助万用表确定怎样正确连线。然后一个线圈的两根线连到Motorshield板的1、2输出端上,另一线圈连到4 、5输出端。这里要注意线的极性,不要接反。
● 测试程序时无需等待,可以直接把程序中millisPerSecond的值改为200,它的转速就会变成原来的5倍。你也可以改变步长,步长变化会改变每个周期电机移动的步数。
程序中有三个内部时间定义,由三个整型变量组成: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即可。
● 我最开始设想的时钟使用弹簧作驱动,用石英机芯作时钟信号源,再通过电磁铁和齿轮传动链来带动表针移动。
● 线性时钟的原型完工后,我开始考虑如何改进。它想走进千家万户的话就必须要能适应多种环境,所以我就想制作一个更实用的改进版来对部件进行测试。
● 在改进版本中,我将一段两米长的铝制滑轨锯成两段,代替原来的pvc滑轨。我原本以为铝制的滑轨更牢固,因此时钟就能做的更长。可是在测试中,情况并非如此,铝制滑轨带来的改进并不明显。原因是铝制滑轨并非在所有部分都那么光滑,尤其端部十分粗糙,因为硬度高,想打磨光滑也很困难。如果最后还要对时钟进行包装的话,那金属滑轨就更没有什么明显的好处了。
● 从卷帘上找一条珠链----因为时钟长一米,所以要把它连成一米长的圆环---也就是说,所找的珠链至少要有两米才行,这样才可能连成这个链环。
● 可是有个问题,卷帘上只有一个珠链轮,所以我测绘了它,并和两个支架和一些安装在导轨上的滑动块一同进行3D打印。
● 我在http://www.shapeways.com 上把设计图3D打印成实体零件,下面就是这些零件的STL文件,我相信它们会对你有帮助的。
● 刚开始我还用轻木做了两个滑轮。它们虽然可以工作,但是边缘做不圆滑,所以就放弃了。
● 这些设计似乎看上去很棒,样子很漂亮,表面也十分光滑。但正如我猜的那样,它们有个缺陷,那就是太重,那两个小电机根本奈何不了它们。如果电机的转矩能再大一点儿那就是绝配,所以虽然这想法十分简洁,现在我也只能放弃。