消费电子- 解魔方的机器人--资料全部开源

接口:串口,3D打印,步进电机
算法:颜色识别,解魔方

当我刚刚进入大学的时候,在实验室里看到了某个学长做了两个机械手,意欲用来解魔方(虽然最后也没做出来),但对于刚刚接触电子没多久的我来说也是极大的震撼,做一台解魔方机器人的想法就一直萌芽心底。

由于各种各样的原因,一直没有空闲来做这样一个没什么商业价值的项目。直到现在2016年,我决定留一些时间出来做一些业余的小制作,算是提高一下个人姿势水平,增加一点生活的乐趣吧,希望通过这个项目,学习下机械画图软件,熟悉下C#写的简单上位机。

看了很多别人做的各种各样的魔方机器人,都不甚满意,自主设计的基本方案如下:

框架:木棍搭一个

动力:步进电机

各种结构件:手工打磨/3D打印

硬件:stm32+步进电机驱动,只用于执行解魔方的步骤

软件:手上的Windows平板,用摄像头识别颜色并计算还原步骤,通过串口跟下位机stm32通信。

预算:2K

嗯,基本方案确定了,应该还是行得通的,但大量细节还是可以预见到各种各样的问题…果不其然,制作过程中方案几经变动,机     械结构三次大改,PCB投了两版,为了提高稳定性又改了各种细节……后面我会一一道来。


点击这里观看实际的解魔方视频 http://v.youku.com/v_show/id_XMTc1MDE5NzQ5Mg==.html


结构部分:

做第一版结构时还是too young,精度考虑极其不到位,框架采用废旧衣柜剩下的木头,做出来效果如下:

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

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

6.jpg

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

可以发现,这个爪子具有夹紧的功能,为了增加摩擦力,与魔方接触的地方增加了两块橡胶皮,可以将单独地将魔方固定住,组装完成的结构如下图,大家视频里面也可以看到工作原理。这样最终版的结构就做好了。各个结构件的solidworks文件也已上传,如果以后还有时间改进,我准备把四个爪子全做成夹紧式的,速度还有进一步提高的空间。

0.jpg

硬件部分:

硬件应该算是这个项目最简单的部分了吧,stm32最小系统+8个步进电机驱动就搞定了。一开始用了步进驱动用了A4988,后来换成额定3A的步进电机,改用DRV8825。这部分直接用了淘宝上买的现成模块(懒得自己画),电源用了以前项目剩下的开关电源,明纬24V-14.5A,实际上大大地浪费了,24V直接驱动步进电机,dcdc降压给单片机用(TPS5430),第二版PCB相对第一版基本上只改动了下大小,增加了控制步进电机细分的IO口(没用上),最终的原理图如下。另外,原理图中的蓝牙和六轴部分暂时都没有用,是想把这个板子留给下一个项目用的。


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

10.jpg


固件+软件部分:

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

13.png


固件部分到此,下面是上位机部分。

本人很喜欢玩魔方,高中巅峰的时候到过平均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度),这里黑色和白色做了额外的判断,有兴趣的朋友可以看代码里面的实现。由于有些相近的颜色,如红色和橙色,环境亮度不一样的时候很容易误识别,我用了简单暴力的方法:


14.png

直接在旁边加了两个1W的LED灯上去,管你是白天还是晚上,统统都亮起来,误识别的问题就这么解决了~

写到这里,整个方案已经讲的差不多了,大家有各种想法和疑问,欢迎加交流。


相关文件

  • Firmware-Keil-stm32f103.rar 大小:2737.35 k 下载
  • Hardware-Cadence16.6.rar 大小:687.63 k 下载
  • Software-VS2013.rar 大小:662.63 k 下载
  • Structure-Solidworks2015.rar 大小:2166.80 k 下载
版权归yangxx所有举报