【S096】机械暴龙兽
产品简介 |
作者:卫博文 赵路杰
单位:上海交通大学
指导老师:王留芳
1. 作品设计思路
作品灵感最初起源于儿时的动画片《铁甲小宝》,起初我们想做一个可以变身的机器人——类似于动画片里那样,铁甲小宝玩具变身的主要一点是:它的头会从肚子里变出来。从这一点出发,大家提出可以做一个慢慢孵化的小鸡,随后我们又进一步提出小鸡吃食、消化和排便等功能。之后在实现过程中,发现机器人结构十分紧密,根本无处安放消化道,并且做消化道的难度也太大,与此同时,做出来的鸡爪很精致但是也有点大,于是便决定做成机械暴龙兽,消化功能取消,做成可填弹的排便功能。虽然成品与最初的想法有一点不同,但是作为机械暴龙兽,它依然是非常精致而且强悍的。
作品说明
机械暴龙兽
2. 作品功能介绍及先进性说明
2.1 功能简介
① 形似暴龙兽,打开开关,触发后可以双足直立行走及转弯(触须传感器)
② 当外界给它声音信号“吃”时,它可以弯下脖子吃到前方食物(声控传感器)
③ 暴龙兽行走时碰到障碍物时可以自主转弯(在头部有触碰传感器)
④ 遇到黑标时,它可以模仿恐龙进行“排便”(黑标传感器感应)
⑤ 装置可以通过传感器随时启动和停止(与第一个功能的实现用的同一传感器)
2.2 先进性创新性说明
作品的智能性在于,运用多个传感器,尽可能真实地模仿出暴龙面对不同环境时做出的反应。具体创新性在于:
① 支架轮结构的应用
② 暴龙兽爪子的设计
③ 排泄部分:排泄方式、存弹装弹停靠部分
3. 作品制作过程
首先,搭建了机械暴龙兽的基础部分——双足机器人,实现了双足行走的目标。但是接下来,双足行走无法实现拐弯,于是我们决定还是做出形象上的让步——在脚上再安装轮子。设计确定了之后,进行脚上轮子的安装。脚上的轮子要转就必须再在脚上安装两个圆周舵机,这些机构的设计与搭建都有一定的工作量。与此同时,大家分工,一人进行脚及轮子的安装,另一人进行暴龙兽脖子和嘴部分的设计安装,这部分的设计安装结构上并不复杂,就是采用机械臂的远离进行的设计,脖子的转动用一个标准舵机,嘴的张合用一个标准舵机。当嘴和脚都有了雏形之后,便开始先编写简单的程序进行机构的调试。调试发现由于轮子很重无法离地并且轮胎摩擦力过大,当暴龙兽进行双足行走时,根本无法前进。然后对暴龙兽的脖子和嘴进行了改造:原本是下颌从下往上咬,但是由于这样实在是很不像真实的暴龙兽,于是改成了上颌从上往下咬。在拐弯与双足行走出现对立的时候,无意中看到一个支架轮结构,突然觉得这个结构可以用到我们的转弯上,于是做出两个支架轮,将原本装在脚上的轮子用支架轮代替,实现了行走与转弯两不误的功能——支架轮在不转的时候摩擦力较小,对行走基本不产生影响,而在转到时候由于它有突起,所以可以通过突起的击地来实现转动。不知不觉中用掉了5个电机。我们将最后一个电机用来实现我们最后一个功能:排便。排便的想法最初是由消化道演变而来的,结构原理设计十分精巧。我们用圆周舵机不停地旋转来发射排泄物;用一根长螺丝穿过工件中间的孔来实现存弹的功能;为了填弹方便我们用另一根长螺丝将装弹的部分挂起,这样装弹部分可以选装上来方便装弹;同时我们设计了停靠装置,这样当我们把装弹部分放下时,装有工件(排泄物)的长螺丝会自然处于竖直状态,不再需要人为地调整。
在我们要用的电机基本都安装完毕之后,便开始烧程序进行调试。此时为了方便所有的传感器都用触碰传感器,以检验功能的完备性,两个人分工合作,一个人主要负责编写和烧写程序以及检验传感器,另一个人主要负责机构的搭建,制作暴龙兽的利爪,最终机构都搭好之后,传感器也都就绪之后,将单片机安装到了暴龙兽的背部。为了方便放电池,还特意设计了一个放电池的地方,然后将要用的传感器都安好,把线都规整好。
4. 遇到的主要问题及解决方法
① 首先一个很大的问题便是:双足无法拐弯。
最终的解决措施是利用支架轮结构。在制作过程中,另一个消耗了很长时间的问题是:排泄部分与双足部分的衔接。由于我们是靠双足行走,在双足行走的过程中,腿会影响到排泄部分圆周舵机的转动,这样我们需要将排泄部分向后移,在移的过程中反复尝试。紧密的结构致使拆的时候和再搭的时候都很困难。没有好的解决办法,只有通过两人合作慢慢完成。
② 然后的困难是:双足行走的过程中,“脚后跟”总是能磕到地面,致使行走速度极其缓慢。
我们通过机构拆了,重新调整改善了这一问题,并且在安上爪子之后,支持重心靠前了一些,这个问题基本得到解决。
③ 另一个问题是:排泄物装卸太麻烦。
问题的解决办法是:我们通过用长螺丝穿过工件中间的孔来存放”排泄物“,将另一根水平的螺丝固定住,然后用螺柱将屯有工件的部分可调节松紧地固定在水平的长螺丝上,再在一侧设计一个停靠装置,这样既方便了填弹,同时当长螺丝下垂是可以自己就保持竖直状态,不再需要人工调节。
④ 排泄部分的另一个问题是:圆周舵机所连接的杆在转动时,有几率与存放排泄物的底盘卡住。这个问题本是个很困扰人的问题,因为这不是结构的问题,是工件厚度无法完全一致和螺丝拧紧的程度可能会随着舵机的转动而改变这两个系统误差导致的,很难人工去除。
提出的解决方法是:不改变任何结构,用两层纸将固定排泄所用的圆周舵机稍稍垫高。这样一个简单的纸片的增加,解决了一个恼人的问题。
⑤ 还有问题就是:行走速度太慢。圆周舵机的速度已经调到最快,但是可能是限于功率的原因,速度始终提不起来。而且在双足的偏心轮结构中,如果将偏心轮结构部分的螺母拧得过紧,会导致其无法转动,但是如果不将其拧紧,在行走的过程中,螺母会慢慢松动。
我们解决这个问题的办法是:将螺母换为螺柱,螺柱在不拧得很紧的情况下,也可以由比螺母更好的稳定性。并且为了增加行走速度,我们让暴龙兽靠双足行走一段时间,靠支架轮转动走一段时间。
5. 控制程序代码
/******************** (C) COPYRIGHT 2012 Robottime ******************** * 文件名 : main.c * 作者 : sinbad * 版本 : V1.0.0 * 日期 : 2012.3.7 * 所属产品 : 探索者ARM7 LPC2138主控制板 * 功能 : 库函数例程三:舵机控制 * 接口/设备: 输出端口1接入标准舵机或圆周舵机 ********************************************************************/
#include "config.h" #include "lib_io.h" #include "lib_arm.h"
//1正面左轮 //2正面右轮 //3控制恐龙嘴的闭合 //4控制恐龙脖子的摆动 //5控制双足电机的正反转 //6控制排泄物的开关电机 //传感器1 红外传感器 位于恐龙身体上方 //传感器2 触碰传感器 位于恐龙头前 //传感器3 黑白标传感器 位于恐龙下侧
int main(void) { int i=1; int yushu; int yushu2; int kaishi=-1; Initial_ARM(); Delay(1000); while(1) { if (Input(4,1)==1) { kaishi=kaishi*(-1); } if(kaishi==1) { LedIn(1,2); //开始启动标识
i=i+1; yushu=i%3; yushu2=i%50; if (yushu2==0) { Servo(2,65); Servo(1,104); Delay(1000); //两个轮子同时前进一段距离 Servo(2,84); //左轮静止 Servo(1,85); //右轮静止 Delay(100); } Servo(3,120); Delay(200); Servo(4,100); //每次开始时对恐龙的脖子和嘴的位置进行初始化 Delay(200); if (Input(2,1)==1) //如果恐龙在前进的过程中碰到障碍物则转弯 { LedIn(2,2); Servo(5,88); //让5号驱动双足的舵机停止下来 Delay(100); Servo(1,50); Servo(2,119); Delay(3000); //两个轮子同时后退一段距离 if (yushu==0) { Servo(1,45); Servo(2,45); Delay(1500); //右转一段距离 Servo(2,84); //左轮静止 Delay(50); Servo(1,85); //右轮静止 Delay(100); } else { Servo(2,125); Servo(1,125); Delay(1500); //左转一段距离 Servo(2,84); //左轮静止 Delay(50); Servo(1,85); //右轮静止 Delay(100); } Servo(5,50); //重复第二遍,防止因双脚位置不正,使得轮子不接地 Delay(500); Servo(5,88); Delay(100); Servo(1,50); Servo(2,119); Delay(1000); //两个轮子同时后退一段距离 Servo(2,84); //左轮静止 Servo(1,85); //右轮静止 Delay(100); if (yushu==0) { Servo(1,45); Servo(2,45); Delay(1500); //右转一段距离 Servo(2,84); //左轮静止 Servo(1,85); //右轮静止 Delay(100); } else { Servo(2,125); Servo(1,125); Delay(1500); //左转一段距离 Servo(2,84); //左轮静止 Servo(1,85); //右轮静止 Delay(100); } Servo(5,50); //重复第三遍,防止因双脚位置不正,使得轮子不接地 Delay(500); Servo(5,88); Delay(100); Servo(1,50); Servo(2,119); Delay(1000); //两个轮子同时后退一段距离 Servo(2,84); //左轮静止 Servo(1,85); //右轮静止 Delay(100); if (yushu==0) { Servo(1,45); Servo(2,45); Delay(1500); //右转一段距离 Servo(2,84); //左轮静止 Servo(1,85); //右轮静止 Delay(100); } else { Servo(2,125); Servo(1,125); Delay(1500); //左转一段距离 Servo(2,84); //左轮静止 Servo(1,85); //右轮静止 Delay(100); } Servo(2,84); //左轮静止 Servo(1,85); //右轮静止 Delay(100);
} else if (Input(1,1)==1) //如果头顶的传感器感应的信号则低头吃东西 { Servo(3,90); LedIn(1,2); Servo(5,88); //让5号驱动双足的舵机停止下来 Delay(100); Servo(3,60); // 打开恐龙的嘴 Delay(100); Servo(4,70); Delay(100); Servo(4,50); Delay(100); //分多次将恐龙的脖子低下 Servo(1,145); Servo(2,24); Delay(800); //两个轮子同时前进一段距离 Servo(2,84); //左轮静止 Delay(100); Servo(1,85); //右轮静止 Servo(5,50); //重复第二遍,防止因双脚位置不正,使得轮子不接地 Delay(1000); Servo(5,88); Delay(100); Servo(3,60); // 打开恐龙的嘴 Delay(100); Servo(4,70); Delay(100); Servo(4,50); Delay(100); Servo(4,39); Delay(100); //分多次将恐龙的脖子低下 Servo(1,145); Servo(2,24); Delay(800); //两个轮子同时前进一段距离 Servo(2,84); //左轮静止 Delay(100); Servo(1,85); //右轮静止 Delay(100); Servo(3,120); Delay(3000); } else if (Input(3,1)==1) //如果传感器3感应到信号则带动6号舵机,释放排泄物 { LedIn(3,2); Servo(5,88); //让5号驱动双足的舵机停止下来 Servo(6,50); Delay(3500); Servo(6,82); Delay(1000); Servo(5,130); Delay(5000); Servo(5,88); Delay(200); } else { Servo(5,130); //开始时恐龙向前走 } } else //终止程序运行 { Servo(5,88); //让5号驱动双足的舵机停止下来 Delay(100); Servo(2,84); //左轮静止 Delay(100); Servo(1,85); //右轮静止 Delay(100); Servo(6,82); Delay(100); Servo(3,120); Delay(100); Servo(4,100); //每次开始时对恐龙的脖子和嘴的位置进行初始化 Delay(100); } } } |
* 本项目未获得作者开源授权,无法提供资料下载。
|