PlotClock “小贱钟”彻底研究——角度计算
背景
硬件开源项目PlotClock,是一个很有趣的项目,通过控制两个舵机进行书写当前的时间。书写完成之后自行擦除,然后再书写,如此循环往复。
image.png
项目在github上有相关的资料下载,包含代码和3D打印件的图纸,需要使用arduino作为控制器件。
阅读了源码,并在网上查阅了相关的教程文章,感觉把这个项目说的很透彻。如果要自己修改设计,又不想等比例放大原设计的情况下,各个部件的尺寸应该是多少?舵机的间距如何决定?可书写的范围如何确定?这些问题都没有答案。因此决定,彻底的对PlotClock的原理进行分析,从而回答以上的问题。
分析
小贱中工作时,通过转动舵机改变摆臂的角度,从而达到控制画笔位置的目的。那么,首先要解决的问题是根据目标位置,反向计算出舵机摆动的角度。解决了这个问题之后,我们可以根据要书写的内容,确定画笔的坐标,然后得到舵机的角度。通过控制舵机搬动到指定的角度,从而控制画笔进行书写。
有了以上的分析我们就可以将问题简化为,根据画笔坐标点T(Xt,Yt),计算出两个舵机需要搬动的角度。
几何计算
为了方便后续的描述,首先为各摆臂部件命名,并为相关的数据进行命名。
直接连接舵机的摆臂,称为一级摆臂。连接左右舵机的一级摆臂长度相同,长度为L1。
连接在一级摆臂上的摆臂,称为二级摆臂。左右二级摆臂形状不同。左二级摆臂,由两部分组成,主摆臂以及延长的持笔夹。左二级摆臂的主摆臂与右二级摆臂长度相同,长度而L2。左二级摆臂延长的持笔夹长度为L3。
image.png
左二级摆臂的主摆臂与延长持笔夹的夹角,角度为135度。
image.png
定义好以上名称之后,我们就可以开始进行计算了。
我们以左侧舵机转轴为原点,构建直角坐标系。目标就是根据持笔夹的持笔位置坐标,计算出左右一级摆臂的角度。
假设笔的位置位于点T(Xt,Yt),连接点T与原点O,得到辅助线段TO。TO与X轴的夹角为α1,TO与左一级摆臂的夹角为α2,左一级摆臂与X轴的夹角为α。如下图:
image.png这个α就是我们需要知道的角度。
在开始计算之前,先说明一下需要使用到的个公式,
公式1:勾股定理,在直角三角形中:
image.png公式2,任意三角形边长关系
image.png公式3,任意三角形中一直边长求角度的公式,有公式2推导,如果需要知道角A的角度可使用:
image.png有了以上的准备我们就可以开始进行相关的计算了
可计算α1的值
image.png
可计算α2的值
image.png
其中TO可计算
image.png
最终求出角α的值
image.png
到这里我们得到了左侧舵机的角度α
下边我们开始计算右侧舵机的角度。在计算之前我们需要先求出,左二级摆臂的主摆臂末端K与原点的距离KO。如下图所示:连接KO,连接T与左一级摆臂末端。由于T与一级摆臂末端的距离是固定不变的,在实际项目中可以通过测量得到。所以直接使用这个长度L4。
image.png为了求KO的距离我们,在一直L2、L1的情况下我们需要知道角β。通过分析,角β=β1-β2
可求β1为
image.png
可求β2为
image.png
获得β即可计算KO的值
image.png
获得KO的值之后,我们可以连接K点和右舵机的轴点C,KC作为辅助线。
image.png已知L1、L2以及KO的情况下,可以计算角γ1。
image.png
通过α和γ1可以计算角γ
γ = 180 - α - γ1
通过KO、OC的值以及角γ可以计算KC的长度
image.png通过KC、OC和KO可以获得θ1的角度
image.png通过KC、L1以及L2可以计算θ2的角度
image.png最终获得θ的角度
θ = 180 - θ1 - θ2
有了α和θ就可以确定舵机需要转动的角度。
最后梳理一下
摆臂相关的4个长度L1、L2、L3、L4,其中L1、L2、L3通过摆臂的规格参数可以获得。L4则需要通过测量获得。
两个舵机转动轴之间的距离OC,也需要通过测量获得。
由此,所有计算中所有需要使用到的输入参数都可以获得。
如果细心,可以发现左二级摆臂与持笔夹之间的夹角,并没有直接参与到计算过程中。实际上这个夹角会影响到L4的长度。
那么在实际制作的时候,L1、L2、L3、L4以及OC的数值取多少合适,他们的取值有什么约束以及影响呢?为什么PlotClock写的字都是歪歪扭扭的?这些问题,我们将在下一篇文章中进行讨论。