这个作品始于2016年上半年,应该是高一下学期开学没多久,我奶奶转了一个德国的魔方机器人的视频给我,视频里的机器在一秒钟之内就复原了一个三阶魔方。我当时觉得特别有意思,因为我比较喜欢玩魔方,当时又选修了有关Arduino的校本课程,就抱着试试看的心态准备自己做一个魔方机器人。
中间遇到了特别多的困难,我也不是一直时间充裕,因此这个魔方机器人断断续续到2017年11月才最终完成,复原了一个打乱的魔方。制作过程就不赘述了,简单介绍一下它本身吧。
先介绍一下工作流程。首先需要把打乱的魔方以展开图的形式把各个面各个色块的颜色输入计算机,执行一个C++(其实只是C with STL哈哈哈)程序输出魔方解法步骤。然后把解法复制到Arduino的代码里,烧录进单片机。单片机随即控制步进电机执行解法,复原魔方。复原过程平均来说在五秒钟之内可以完成。
解魔方的算法叫Thistlethwaite's Algorithm,以群论为理论基础求解魔方。对于这个算法来说,魔方不再是由颜色,而是每个棱块角块的相对位置和朝向表达。因此,有别于人类使用的层先法,CFOP之类的方法,这个算法极其抽象,但是优点是稳定高效,解法较短。感兴趣的话可以戳这两个链接深入了解一下:
https://www.jaapsch.net/puzzles/compcube.htm
http://tieba.baidu.com/p/1738194036?see_lz=1
总之,我是历尽千辛万苦才从互联网的一个不知名的角落找到了一个仍能编译运行的C++实现。我再自己写了一段代码,把魔方的颜色表达转换为棱块角块相对位置的表达。拼起来以后就是求解魔方的部分。
硬件部分主要用到了Arduino MEGA2560,6组42步进电机+L298N,和一个直流稳压电源。我查了很多技术文档才终于把接线和控制代码对应起来,又历经一番胡乱的调参,才终于实现了单片机对步进电机的控制。
我使用的魔方是GAN356,一款容错性能极佳的魔方。但是还有一个至关重要的优点是它的中心块可以打开,并且是中空的,这就给连接步进电机提供了方便。
如图,我测量了尺寸,设计出了连接件(联想到了可以换多种头的那种螺丝刀的接口设计),3D打印出了成品。7对小东西花了九十几块还不包邮,我买单片机都只花了40不到啊,肉疼。
当我终于看到我的魔方机器人复原了一个魔方,而不是把它拧的更乱的时候我内心的成就感是爆棚的。这么久的尝试终于(居然??)有了结果。
现阶段还有两个遗憾。其一,我没有想到一个好办法做出一个稳定而又灵活能脱开的支架固定步进电机,每次都要靠手拼命按着步进电机才不会跑掉…… 另外,我需要人眼识别颜色再输入计算机,我想使用OpenCV或者Mathematica之类的做颜色识别,苦于水平有限,没有什么好的想法。知乎上大神云集,回答这个问题的最大原因就是希望有人提供点帮助。
更多有关代码和魔方机器人本身的内容我在Arduino中文社区发帖写过。
Cubot 魔方机器人-Arduino中文社区 - Powered by Discuz!
最后放一下GitHub链接。Arduino的代码都是原创的,SOLVECUBE.cpp里面中文注释部分是原创的。
https://github.com/g20150120/cubot
来源:知乎 www.zhihu.com
作者:g20150120
【知乎日报】千万用户的选择,做朋友圈里的新鲜事分享大牛。 点击下载
此问题还有 43 个回答,查看全部。
延伸阅读:
代码是如何控制硬件的?
买电子模块都能下载到原理图,不怕自己的设计被盗用吗?
没有评论:
发表评论