当我刚刚进入大学的时候,在实验室里看到了某个学长做了两个机械手,意欲用来解魔方(虽然最后也没做出来),但对于刚刚接触电子没多久的我来说也是极大的震撼,做一台解魔方机器人的想法就一直萌芽心底。
由于各种各样的原因,一直没有空闲来做这样一个没什么商业价值的项目。直到现在2016年,我决定留一些时间出来做一些业余的小制作,算是提高一下个人姿势水平,增加一点生活的乐趣吧,希望通过这个项目,学习下机械画图软件,熟悉下C#写的简单上位机。看了很多别人做的各种各样的魔方机器人,都不甚满意,自主设计的基本方案如下:
点击这里观看实际的解魔方视频
结构部分:
做第一版结构时还是too young,精度考虑极其不到位,框架采用废旧衣柜剩下的木头,做出来效果如下:



由于手上没有3D打印机,只有借别人的用,只有用来固定魔方的夹子是打印的,剩下的都是手工制作,什么钻孔啊打胶啊等等。传动部分,每个手臂用了两个步进电机,后面的电机加丝杆用于进给,前面的电机用于转动魔方,两个小轮子用于导向该轮子的前进后退。对于这一版,只能说是彻底失败……因为精度根本达不到,四个手臂对准魔方中心都困难。于是我放弃了手工加工的方法,一气之下购入一台3D打印机,所有结构件都用3D打印,整体框架使用2020的铝型材,购于淘宝,价格¥12.8/m,然后让厂家按我给的长度切割,最后花了两百块钱左右,然后购买切割了8mm光轴作为机械手的导轨,做出来的框架如下:


相比之前还是规整了很多,精度也达到了要求。组装完成后:

结构的进一步改进是因为发现一个问题,如果想单独移动魔方朝下的那一面,需要把魔方旋转180度,将下面翻转成上面才能完成,因为魔方只能靠下面的夹子托在正确位置,如果想要把魔方的下面旋转90度是无法做到的(不知道我的描述大家懂没有)。经过观察这个步骤是最浪费时间的一步,整个系统跑通之后,开始提高解魔方的速度,换了更强劲的电机,重新设计结构增加了上面塑料爪子的固定功能,结构如下图:

可以发现,这个爪子具有夹紧的功能,为了增加摩擦力,与魔方接触的地方增加了两块橡胶皮,可以将单独地将魔方固定住,组装完成的结构如下图,大家视频里面也可以看到工作原理。这样最终版的结构就做好了。各个结构件的solidworks文件也已上传,如果以后还有时间改进,我准备把四个爪子全做成夹紧式的,速度还有进一步提高的空间。
硬件应该算是这个项目最简单的部分了吧,stm32最小系统+8个步进电机驱动就搞定了。一开始用了步进驱动用了A4988,后来换成额定3A的步进电机,改用DRV8825。这部分直接用了淘宝上买的现成模块(懒得自己画),电源用了以前项目剩下的开关电源,明纬24V-14.5A,实际上大大地浪费了,24V直接驱动步进电机,dcdc降压给单片机用(TPS5430),第二版PCB相对第一版基本上只改动了下大小,增加了控制步进电机细分的IO口(没用上),最终的原理图如下。另外,原理图中的蓝牙和六轴部分暂时都没有用,是想把这个板子留给下一个项目用的。

Gerber投出去四天板子就回来了(嘉立创),焊接完成后一调就通了,没出现什么问题,不过长时间运行时发现发热量太大,热熔胶都被烫化了,于是增加了一组散热片,又加了一个小米风扇从后面对着吹,这个问题得以解决。线材部分,所有的线材都是自己做了防呆接头,用热缩管裹起来,为了保持美观,线材都加了黑色束线管包起来。

固件+软件部分:
固件部分写的也比较无脑,stm32只是执行上位机传来的指令做动作,步进电机控制需要两个IO,一个用于控制方向,一个用于控制转动。转动的控制直接用了IO口翻转+软件延时的方法,没有使用PWM。单片机与上位机通信协议如下:

固件部分到此,下面是上位机部分。
本人很喜欢玩魔方,高中巅峰的时候到过平均18s,那会用的还是国甲5,现在常年荒废以致手法不行了要三十多秒。。,一开始自然想到用CFOP去解(常用的快速解魔方手法),但是这个方法有一个问题,摄像头需要像人眼一样时刻观察魔方,解魔方过程中的实时识别颜色会给软件设计造成很多麻烦,我追求的方法是一次识别完成,解的过程中就不用开摄像头了。自然的,要达到这个目标,想到最简单的方法—盲拧法。盲拧的原理是,将整个魔方的状态编码,编出来后大概有三个手机号码的长度的一串数字,然后根据这一串数字按部就班地把魔方还原出来,所以,盲拧熟练之后,本质上就是记一串数字。对于这个系统来说,这个方法是最简单的,因为不存在记忆的问题,直接颜色识别完成后一步一步还原就好了。实践之后发现,用盲拧法解实在是太慢了。。。可能多达几百个步骤,要几分钟才解的完,于是我找到了现在的解法——最小步数法。
关于这个方法,有大量的数学家和魔友们探索了很久,已有科学家证明三阶魔方最小还原步数为20步,即为上帝之数,意思是任意一个打乱的魔方20步以内都可以还原。我查阅了一些帖子、论坛,看到了很多方法,什么块构筑、niss等等,然而如果不花大量的时间学习还是不知所云。好吧,由于缺乏很多数学基础,例如群论一类的,自己搞一个算法出来还是比较困难,然而作为一个工程师而非科学家,实现业务需求才是最重要的,几经搜索,我找到了一个开源的最小步数解法,给出了C代码实现,而且我幸运的发现有国内的朋友已经把这个算法应用到了自己的DIY上,在此感谢动力老男孩 — http://www.diy-robots.com/?p=282。关于该算法的详细解释也有很多资料,通过逐步降群的思想还原,在此不赘述,详见http://www.jaapsch.net/puzzles/thistle.htm。把这个算法移植到自己的软件里面后,整个上位机就基本完成了,还存在一个小问题——颜色误识别。
关于识别魔方颜色方法,我找到了现成的库——AForge.net,这个库可以调用摄像头的数据,我的方法是对于每个面,识别3×3每个小方块中心点,可以把RGB的数据读出来,RGB的数据每个都是一字节,将该数据转换到HSV色系里面,很容易就根据hue判断出颜色(0~360度),这里黑色和白色做了额外的判断,有兴趣的朋友可以看代码里面的实现。由于有些相近的颜色,如红色和橙色,环境亮度不一样的时候很容易误识别,我用了简单暴力的方法:
写到这里,整个方案已经讲的差不多了,大家有各种想法和疑问,欢迎加交流。源码、PCB、结构工程、上位机都可通过下方阅读原文下载!
点击“阅读原文”

