Arduino制作时钟君

工作坊 | Arduino制作时钟君

如何使用Arduino制作一个时钟君?

经过初略观察,我们可以发现时钟君其实是由

板子两块!

( Arduino Nano 及 时钟模块DS1307)

舵机*3!

亚克力板及杜邦线及笔等外设!

三大部分组成

工作坊 | Arduino制作时钟君

所 以 呢 ? ?

外 设 篇

所以首先,我们要搭建个能够让时钟君工作的平台。

由于这是一个已有优秀前人开源的小项目,我们可以直接获得亚克力板图纸如下↓ ↓ ↓

当然,相应的处理及拼装过程,在此就不赘述了。

工作坊 | Arduino制作时钟君

于是这一块就可以愉快地略过了呢!

完全没什么不对!!一点也没有偷懒呢!!!

#如需使用激光雕刻请与相应负责人联系学习使用方法及注意事项#

工作坊 | Arduino制作时钟君

编 程 篇

直接进入我们的真正重点 编程篇!

现在,我们想让时钟君能够将当前时间写在亚克力板上,那么问题来了—— 要想时钟君能写字,统共分几步?#条件反射说三步的同学请反省一下好吗#

工作坊 | Arduino制作时钟君

既然想写字,肯定就需要先定位。

观察下图,我们可以发现时钟君是由两支 “机械臂” 操控的,当舵机转动合适的角度,带动两臂在平面上移动,从而写出当前时间。

工作坊 | Arduino制作时钟君

对上图进行简单的抽象,我们的问题突然就进入了数学的领域。#前方提醒!以下将出现一系列图片感人但逻辑缜密的分析过程,受不了的同学请抓紧时间快进,转入代码段落#

工作坊 | Arduino制作时钟君
工作坊 | Arduino制作时钟君

假装大型推导现场

工作坊 | Arduino制作时钟君
工作坊 | Arduino制作时钟君

本图由 路通宇同学 友情提供

工作坊 | Arduino制作时钟君

本图由 路通宇同学 友情提供

工作坊 | Arduino制作时钟君

本图由 路通宇同学 友情提供

<<  滑动查看 配合下文解说更佳  >>

由图1,先确定(Hx,Hy)对应的α角

由于TH和O1次级臂的夹角一定

所以,只要L1,L2,L3已知,L4就已知了

给出Tx和Ty之后

O1T的长度就可以求了

而且,α1=arctan(△y1/△x1)

下面就算α2就好了

很幸运,L4,L1,O1T都已知,那么α2也就算出来了

所以,给定一个T,我们就可以算出一组α(O1的和O2的)

为什么要用两个呢?为了稳!

我们获取了Hx和Hy,就可以轻易解出β了(见图2及图3)

解出β就略了

再见了

理论推导

现在让我们用代码实现吧

从几何关系入手写第一个函数!

工作坊 | Arduino制作时钟君

#先算出左面舵机的角度

工作坊 | Arduino制作时钟君

#再算出右面舵机的角度

工作坊 | Arduino制作时钟君

对了,刚才函数里面用到一个解三角形的函数

工作坊 | Arduino制作时钟君

怎么让舵机转起来呢?调用这个封装好的函数

工作坊 | Arduino制作时钟君

形参是角度单位,但是究竟是几秒,还是要实际调试

此外,此处需要include这个库 ↓

工作坊 | Arduino制作时钟君
工作坊 | Arduino制作时钟君

完成定位操作后,我们就需要考虑具体的数字该怎么写了。将 写数字 的行为,抽象成 画直线画椭圆 两个函数,即所有数字均可由这两种函数体现。

由于坐标和两个角度的关系是非线性的,舵机的角度线性变化时,坐标值是非线性变化的,所以我们直接调用set_XY会画出奇怪的弧线。故我们采用了个你非常熟悉的方法:无限细分

工作坊 | Arduino制作时钟君

当然,步长是几得自己调,直到爽为止

接着下一步…画椭圆!

#小声BB:其实0啦6啦9啦也可以写成数码管的样子嘛#

不过为了展现聪明才智,咱还是画个圈

工作坊 | Arduino制作时钟君

形参多的时候一定要加注释!

以上终于将顺逆时针画圆封装到一起了!

工作坊 | Arduino制作时钟君