自主机器人:你的私人WALL·E

  DIY
/gkimage/tn/9j/9u/tn9j9u.png

DIYer: Kris Magri
制作时间: 2-3周
制作难度: ★★★★☆
GEEK指数: ★★★★★

看最终效果视频,请 猛击此处

Makey是我编程实现的一个自主机器人(自主者,非遥控也),能够识别并规避障碍。她拥有全封闭的底盘并使用差速转向(原文为“tank steering”,坦克的驾驶方式),这种转向方式使用两台分开控制的电动机分别驱动两个主动轮(一机一轮)

控制信号来自其自身携带的Arduino微型控制器(在国内用单片机如PIC、AVR,或者Arm处理器都可以很好地替代),另外有一个舵机用于Makey头部的转动。Makey的头部装有一个超声波探头,她会持续的左右摇头,以得到不同方向上的距离信息,并进行存储和处理

通过对Arduino的编程,Makey可是实现诸如寻路的功能,仅需要少量硬件上的修改,Makey即可参加机器人界热门的Mini-Sumo(迷你相扑)比赛

1   工具和材料

● (使用的工具与零部件列表这里没翻,毕竟相当一部分东西买原版都不太现实也没有必要–国内的家伙事儿差不多的也能土法上马,有兴趣的童鞋请参考原文)
● 想得到关于这个项目的图示、图纸、代码,请移步 资料下载

2   制作机身

● 机身由两片铝合金薄板制成,涉及的加工方法有切割、钻孔和折弯。你可以一次一片的加工,或者两片一起做以减少占用加工设备的机时。成品见2.5
● 猛击 资料下载 下载图纸并全尺寸打印。剪下底板(base)切割图,用双面胶将切割图均匀平整的贴在铝合金薄板上
● 注意:切割金属时务必佩戴防护眼镜
 

2.1   切割

/gkimage/gp/5y/zn/gp5yzn.png

● 用带锯机把铝合金片切成图纸的形状,切割的边缘一定要在线外
● 提示:切割内角时,先切出一个大概的弧形曲线,然后从两个方向直线进刀以得到直角
 

2.2   打孔

/gkimage/v6/ys/2c/v6ys2c.png

● 用冲子和小锤子在图上有十字线的17处冲出定位孔,为下一步的钻孔做准备。另外要在图上长方形的孔的四个角上冲透
 

/gkimage/3q/sb/j5/3qsbj5.png

● 按照图上标十字线处的尺寸钻孔,要首先取下贴上去的图纸(不过别扔了),用钻头对准前面留下的冲痕开钻可以使钻孔更精确
● 把金属牢固的夹在废木头板上或者随便什么垫子上,这样可以得到更平滑的孔而不会导致薄金属板在钻孔处扭曲变形
● 为了掏成方形孔而钻圆形孔时,你可能需要调整钻孔的直径以使圆孔边缘与长方形的边相切
 

2.3   挖槽

/gkimage/9w/ek/zo/9wekzo.png

● 用冲剪完成对长方形孔的加工,如果你愿意的话可以把前面揭下来的图再贴回去,以便容易知道长方形的边界在哪。最后把边缘磨平
 

/gkimage/6v/2n/5h/6v2n5h.png

● 用手工打磨工具去掉金属边缘的毛刺。给小孔磨边的方法为:把大钻头的尖端插进小孔,然后手工转几下

冲剪是长成这样滴:

/gkimage/1q/1y/3j/1q1y3j.png

 

2.1-2.3都是跟合金板过不去的活儿,原作者的办法基本是土法上马,与美帝的高科技风格严重不符。柚子在大学折腾机器人那会儿去交大观摩,他们有加工中心,只要把CAD图画出来发过去,那边用等离子切割机就给“打印”出来了,钻啊、掏异形啊这种活儿根本不存在。更神奇的是切完的边不用磨,基本不扎手。另外我们用土法掏方形孔的时候是先钻大孔,把带锯拆开一头套进去然后慢慢锯,得到的孔要多丑有多丑,然后还得上铁砧拿小锤砸平

 

2.4   弯板

/gkimage/1o/x2/35/1ox235.png

● 把底板的折弯图用双面胶贴到铝板的另一面,对准圆洞方洞的位置,别贴歪了
● 把铝片贴折弯图的一面向上塞进弯板机里,在所有标示折弯的部位折90度
 

/gkimage/6t/z1/ci/6tz1ci.png

● 每个长边上的两个突出部要先折,然后再折机身的边。(顺序反了就塞不进去了)
● 折弯后要缓慢释放,测量,确认每一处折弯都要是直角
 

2.5   制作顶板

/gkimage/55/kn/ez/55knez.png

● 重复2.1-2.4步骤,加工顶板(top),然后你就搞定了每个机器人都会喜欢的底盘
 

3   运动系统

3.1   安装电机

/gkimage/yp/ov/n0/ypovn0.png

● 用4-40 x 1螺丝穿过小孔,将驱动电机定位在底板上,电机的传动轴应该穿过大孔
● 使用螺母和垫片在电机的一端上紧,因为可以施展的空间尺寸很小,可能需要尖嘴钳子(夹住螺母)才能上紧
 

3.2   制作轮毂

/gkimage/21/hy/3d/21hy3d.png

● 用2英寸(外径,合50.8mm)的空心钻头(见过装空调的师傅在墙上钻大洞用的那种钻吧,很类似)在废木头板上钻出轮子(钻透木板之后木板上有个圆洞,钻头中间的洞里会剩下个圆片,这个圆片就是轮子),我用了18号板(貌似是一种规格),最终得到的轮子有3/4英寸(19.05mm)厚,直径1.8英寸(45.72mm)。钻轮子的时候要牢固的固定木板,并且缓慢进刀,防止卡住钻头
● 给2个木头轮子分别对心定位一个轮心(图中白色塑料的小轮子),并用小螺丝标记两个孔的位置,在此位置上用1英寸(原文如此,合25.4mm,不过疑为有误,从图上看孔绝对没那么大)的钻头钻透
● 给木头轮子喷漆,我喜欢红色光面防锈漆,这种东西非常薄,颜色很亮,覆盖性好并且容易清洁。注意,不要在安装孔里喷太多
 

3.3   制作轮胎

/gkimage/xm/d4/bc/xmd4bc.png

● 用43号钻头在轮心上钻两个相对的孔,然后用4-40丝锥在每个孔里攻出螺纹
 

/gkimage/rj/qk/e7/rjqke7.png

● 用两个4-40 x 1螺丝从木轮外侧把轮子和轮心固定在一起,不要太紧
 

/gkimage/ct/9b/su/ct9bsu.png

● 给每个轮子装轮胎,轮胎外径比较大的一面朝外。最后把轮子装在驱动电机的传动轴上
 

3.1-3.3就是折腾那俩轮子,原作者极其不厚道,没说怎么对心,这个很重要,谁也不希望做完的机器人跑起来一跳一跳的。您还别问我咋对心,我也没经验,新手还是找现成的轮子对付一套比较安全。另外3.2-3.3中原作者留下一个逻辑错误,看出来的童鞋请举手

3.4   安装万向轮

/gkimage/1k/e5/hc/1ke5hc.png

● 使用螺丝、螺母以及垫片将万向滚珠安装在底板底部
 

4   电控系统

4.1   安装电源

/gkimage/qi/a7/du/qia7du.png

● 按照第一步打印出来的隔板图样,从一块硬塑料上切出隔板(隔板是用来装线路板的,用塑料是为了绝缘),按说明打孔,尝试着塞进机器人的外壳并使之架在驱动电机之上,作必要的修整,令其充分贴合匹配
● 用两个4-40 x 2螺丝将Arduino控制线路板与硬塑料隔板固定在一起,螺丝应从隔板下方穿入,并在线路板上方拧螺母。线路板上的USB接口需要和机器人面板上预先留好的开口充分对齐
 

/gkimage/7y/wm/ff/7ywmff.png

● 将电池夹具铆接在机器人外壳的左侧面板上,预制的铆钉头朝外,这样的话丑的一头就朝里啦
 

关于铆接,这里指的不是造泰坦尼克的那种把烧红了的钢制铆钉插进去挤兑一下的工艺,而是一种将铝合金预制铆钉的开放端在常温下挤压成型从而将两个或更多构件固定在一起的方法,最常见到的是各地马路边的刮大风能掉下来砸死人的铁皮广告牌子,它们就是用这种工艺把镀锌薄钢板固定在L字钢框架支撑结构上滴

4.2   控制板

● 按照制造商的教程,把原型板(ProtoShield)焊好教程在 这里
● 用带锯机把板子上的BlueSMiRF接头切下来,这个接头是用来连接蓝牙模块的,我们的机器人用不到那东西。是不是锯得很爽?
● 把面包板接在原型板上,原型板插在Arduino上,如果用的是Diecimila(Arduino主板的一个版本),那么将电源跳线设置在EXT位上
 

焊接原型板绝对不是个轻松的活儿,没基础的童鞋搞不定也不用纠结。面包板(breadboard)是这么个东西,其意义在于省了烧电烙铁的麻烦,不过问题是有时候元件捅进去会接触不良…

/gkimage/y4/ey/n3/y4eyn3.png

 

5   给WALL·E安上一双明亮的眼睛

5.1   WALL·E的脖子

/gkimage/os/co/zs/oscozs.png

● 咱这个项目用的是HS-55型舵机及与之配套的较短的一字舵角,用5”钻头对舵角最靠外的两个孔进行扩孔

/gkimage/ea/h6/nl/eah6nl.png

Du-Bro Mini E/Z 连接头, #DUB845

/gkimage/53/4f/id/534fid.png

微副翼系统 Du-Bro Micro Aileron System, #DUB850

● 将两个Du-Bro Mini E/Z连接头从正面穿过摇臂两端的孔,并在反面用黑色橡胶的部件固定
● 将控制杆(图中所示的细铁丝样东西)穿过Du-Bro Mini E/Z连接头,并用连接头附带的螺丝拧紧
 

5.2   WALL·E之眼

/gkimage/io/g8/vu/iog8vu.png

● 有挑战性的工作来咯!咱们需要把舵机和超声波探头接在一起。把从舵机上伸出来的控制杆分别穿过位于传感器电路板对角的定位孔(这个定位孔来自Du-Bro Mini E/Z连接头,连接头又插在板子上的螺丝眼里,然后另一端用那个黑橡胶部件固定)并向外折成90度角
● 控制杆应该从舵角开始竖直向上,并且给超声波探头留下足够插信号线的空间,传感器正面(有收发端,也就是像俩小眼睛的那一面)朝前,控制杆上还应该套上绝缘套(就是那个塑料管)以防止短路,绝缘套在Du-Bro套件里可以找到。确认安装无误后,将控制杆与传感器上的连接头拧紧。
 

Du-Bro是美国的一家生产模型配件的公司,很遗憾我没找到这些产品的国内版本。欢迎在国内见过这些配件的同学提供信息

5.3   给WALL·E安上一双明亮的眼睛

/gkimage/26/tb/ft/26tbft.png

● 将舵机和超声波探头出来的线穿过机器人外壳顶部预先留下的长方形开孔
● 舵机也要插进那个顶部开孔,调整好位置后两边用螺丝与螺母将舵机与外壳固定好,剪去多余的控制杆(还是那个细铁丝)
● 把舵机摇臂与舵机上到一起,用小螺丝刀调整一下保证Makey的眼睛(传感器)朝前
 

6   连接并测试驱动电机

6.1   电机预处理

/gkimage/sm/tj/it/smtjit.png

● 咱的地摊货电机上的连接头部件是很脆弱滴,所以连接部分一定要用心
● 从外壳里拆出电机和Arduino线路板
● 切2红2黑各12英寸(304.8mm,12寸炮是305mm的,比如筑波级的2*2主炮)电线,每条线的两端1英寸(25.4mm)剥去绝缘皮。先别焊接,用一个红黑线对在电机的末端(有电源接点的那一端)缠几圈,以防止拉断,然后让线对从电机顶端通过,用双面泡沫胶带将其固定在电机上。注意不要覆盖电机上的任何孔洞,同时要为电机的固定留足空间
 

/gkimage/6z/qq/fb/6zqqfb.png

● 将电容的两个引脚分别穿过电机接线头上的小孔,焊接(这里应该是把引脚穿过去的部分和同一根引脚的根部焊在一起,这样的话引脚和电机接线头就充分连通了。注意,千万别把俩引脚焊在一起!)这需要使用尖嘴钳的巧妙掰弯手法。然后把给电机供电的电线头与电容引脚,注意,不是电机接线头,焊在一起,焊牢稳一些。再然后剪掉多余的电容引脚。把电容和缠在电机末端的电线一起用黑胶布(也就是绝缘胶带)紧密的缠在电机上,并且用更多的泡沫胶带把这个鼓鼓囊囊的位置包起来(还是为了固定)
● 把漏在外面的电机供电线拧成双绞线,这样可以减低电路中的噪声(一个供电的低压直流线路里有点噪声怕什么?原作者的想法好奇怪)。给电机标出左和右
 

在电机上并联了一个电容,这样做有两个好处。

其一,在稳定的直流电路里,电容是开路,不会影响电机工作,但是给电机通电的那一瞬间,电容因为要充电,可以分担一部分电流,所以电容作为一个保护器件可以保护电机。

其二也是更重要的,这种直流电机的接线头是一个铜合金片,从电机的塑料外壳里伸出来(通常被和塑料铸在一起),鬼知道奸商们用了什么材料,反正这个东西非常脆,尖嘴钳上去经常能掰断,然后这个电机就没啥抢救的价值鸟,另外这个铜片不怎么粘焊锡,焊接不易。但是电容的引脚一般都是类似铝、锡一样的柔韧金属,想怎么扳都能成形,焊起来也容易得多,所以作者把电气连接的活儿都转到这个引脚上来做。

【连电机的小经验】铜接线片作连接之前最好用细砂纸小心的蹭几下,去掉氧化物。电容线脚穿过去之后轻轻拉紧,在穿孔附近用尖嘴钳用力捏一下,使线脚与铜片充分接触。另外电线最好挑独轴的,也就是绝缘皮里面只有一根金属的,那种绝缘皮里有一束极细铜丝的线焊起来会有想死的冲动

 

6.2   电机测试

/gkimage/gl/1p/e7/gl1pe7.png

● 将短实心跳线分别焊接到电机供电线和电池接头线上,这些跳线可以让你把它们(电机和电池)插到面包板上,焊接之后用热缩胶带作焊点的绝缘(用绝缘胶布缠是一样的,除了丑一点和大一点)。将电机供电线穿过塑料隔板(4.1提到的那个)上的大窟窿(因为面包板和电机分别在隔板上下两侧)
● 按图示把电机驱动器插进面包板中间的一行孔里,使之和电机以及一个电池连通(注意,在面包板上,每一行的孔之间是连通的)。使用短跳线并保证这些线紧贴面包板,傻大黑粗的大电线是不配塞进机器人里的
● 从 Arduino官网 下载Arduino的软件并且安装之,再从 资料下载 处得到这个项目的5个测试程序。通过USB接口把你的Arduino和电脑连起来,如果你用的是Diecimila版本的话,把它的电源跳线接换到USB档上。
● 为了测试电机,运行名为01_Test_Motor_Rotation的程序,此时左边的电机应该先往前转再往后转,然后是右边的,先往前再往后。如果不是这样,检查一下你的接线。接下来运行02_Test_Motor_Speed,此时电机应该以低速启动,然后加速,最后反方向转,如果不是这样的话检查线脚D11和D3
 

7   连接并测试舵机和传感器

7.1   连接舵机

/gkimage/1c/n4/qq/1cn4qq.png

● 将电机和Arduino再装回机器人里面,找两个3针的单排直角插针(通常是将一个20针的单排插针折断得到)插在面包板上,把舵机线接在上面,具体接线规则为:黑线-GND(地线,电池负极),红线-+5V(电池正极),黄线-Arduino跳线D10
● 再来一个3针右转接头,这个是接超声波探头的,接线规则为黑线-GND(地线,电池负极),红线-+5V(电池正极),黄线-Arduino跳线D9
 

7.2   测试舵机和超声波探头

● 运行舵机对中程序03_Test_Servo_Center,松开舵机摇臂的螺丝并微调,舵机臂与超声传感器尽量指向正前,因为舵机轴齿轮的问题,这一步可能无法完全对中,没关系,我们稍后再调整
● 运行程序04_Test_Servo_Sweep,这个程序可以让超声波探头慢慢的摇头
● 再来测试超声波探头,运行05_Test_Sensor_Distance,点击Arduino软件的数据流监视器图标,你应该能看到不断跳出来的测距读数,而且如果你在传感器之前挥舞你的手,测距读数应该有变化。如果你得到的读数始终是0或者255厘米或者别的什么错误的读数,检查你的接线是否有误,并且千万确定你的传感器没接反 :P
 

7.3   安装开关

/gkimage/wa/st/bp/wastbp.png

● 终于可以接电源开关鸟!把Arduino最后一次拆出来,为了装开关,需要把还没用到的电池引线的红线焊在开关的一端并且把另一跟红线焊在开关的另一端。同样别忘了把电池的黑色引线和另一个根黑线焊在一起
● 把线从机器人侧面的方形孔穿好,开关需要打在“1”的档位上,把开关塞进方孔里固定好,这个调整可能会用到钳子
● 把从开关出来的红色线脚接到原型板的RAW线脚上(这个线脚还连着Arduino的Vin线脚),把从电池出来的黑色线接到原型板的GND线脚上,如果你用的是Diecimila版本的话,把它的电源跳线调回到EXT档上
 

8   系统测试

/gkimage/ya/6c/u8/ya6cu8.png

● 现在所有的电子设备工作都正常鸟,小心的把所有东西塞回机器人里,啥也别落下。装好电池,把机器人放好,别摔了。用来传程序的USB接口应该能从侧面的孔里露出来
● 重新载入并运行01_Test_Motor_Rotation,注意,所谓前是指机器人的USB接口和传感器指向的方向,如果你的机器人反着跑,检查在线脚AOut1, AOut2, BOut1, BOut2, AIn1, AIn2, BIn1, 和 BIn2处的接线,可能也会需要反转驱动电机的连接
 

/gkimage/tn/9j/9u/tn9j9u.png

● 重新运行其他的测试程序,确认接线正常,测试完成后把舵机和传感器的线塞进外壳里,扣上顶盖,拧上4个螺丝固定,收工!
 

9   给你的WALL·E注入灵魂

/gkimage/dz/u4/8j/dzu48j.png

● 有时候你的硬件做好了你就没啥事可干了,不过你的程序是写不完滴。这也是你展示创造力的好时机
● 在代码中你需要使用digitalWrite和analogWrite这俩函数来控制驱动电机,通过传递值给电机驱动器的各3个线脚。其中一个可以接收介于0到255之间的值,用于控制传给电机的电流大小,这个是用来控制速度的。另外2个线脚则使用布尔型变量,用于决定每个电机两端的电位高低,这个可以决定电机的方向(当然电机两端只能一端是高电位)
● 你可以编写类似void Forward()这样的函数实现简单的动作,比如后退(两个电机同时反转),Spin_Left(原地左转,右轮正转左轮反转),Arc_Left(画弧左转,右轮正转左轮不动)之类的。Arduino的编程环境使你的代码实验和加载都很方便
● 另外一个好玩的事情是规避障碍,只要运行这样一个循环:往前走,读取测距信息,如果障碍物太近则采取躲避动作比如后退并转弯,返回循环体头部
 

10   关于Mini-Sumo(迷你相扑)比赛

● 在 Mini-Sumo 比赛中,两个自主机器人会被放置在一个用白色漆成的圆形场地中
● 只要换上窄一些的轮子,比如GM家卖的 这种 ,Makey就可以满足大赛要求的尺寸和重量上限:底面10厘米见方、500克。你极有可能需要另外的朝下的传感器用来观察那个白色的环(场地边界),不过Arduino有足够的能力处理其他多出来的信号
 

11   DIYer签到处

虽然这个项目很困难,不过也不是完全不能做。如果哪位蛋疼的同学把它做出来了…应该会很愿意在这里秀出来让大家围观吧…

资料来源

编译: 柚子

果壳DIY站微博: http://t.sina.com.cn/guokrdiy

LEAVE A COMMENT

This site uses Akismet to reduce spam. Learn how your comment data is processed.