【S143】轮履结合全地形小车
作品说明 |
作者:庄艾超 侯宇焘
单位:浙江警察学院
指导老师:陈东杰 许中石
“探索者”平台是由机器时代推出的专业型机器人设备原型设计工具,包含机构件、舵机、传感器以及控制模块,机构零件全部按照国际零件标准设计,结构精密,各个结构零件之间能够通过螺钉任意角度连接,可组装四连杆、曲柄滑块、齿轮传动等各种典型机械传动机构和欠驱动机构。传感器、主控板等控制单元能够让使用者在实现机构运动的设计过程中,更全面地了解单片机PLC、计算机语言编程等学科知识。该平台开发环境软件采用国际通用的开源机器人软件,提供C语言结构的代码、图形化双界面,提供丰富的例程,可执行脱离电脑的、快速的示教编程。
1. 设计思路
1.1 设计要求
本作品根据现实生活中我们会遇到的一些行车状况而设计的,小车需要完成穿越下图所示的工业用1-栅格地毯、2-楼梯、3-管道、4-独木桥。
作品说明
障碍物类型分布示意图
1.2 设计思路
因全地形车需自主穿越障碍物场地,所以应采用以Basra主控板为核心的控制电路,采用模块化的设计方案,运用不同传感器实现小车在行驶过程中自动通过障碍物,并把行进数据传送至Basra主控板进行处理,实现全地形车的各种动作以穿越障碍物。
1.3 系统设计框架
系统由平台内提供的专用白标传感器、超声波传感器、Basra主控板、Bigfish扩展板和双轴直流电机驱动组成,框图如下所示:
① 主控板介绍
Basra主控板是一款基于Arduino开源方案设计的一款开发板,通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。主控板上的微控制器可以在Ardunio、eclipse、Visual Studio等IDE中通过c/c++语言来编写程序,编译成二进制文件,烧录进微控制器。Basra的处理器核心是ATmega328,同时具有14路数字输入/输出口(其中6路可作为PWN输出),6路模拟输入,1个16MHz晶体震荡器,1个USB口,1个电源插座,1个ICSP header和1个复位按钮。
主CPU采用AVR ATMEGA328型控制芯片,支持c语言编程方式,该系统的硬件电路包括:电源电路,串口通信电路,MCU基本电路,烧写接口、显示模块、AD/DA转换模块、输入模块、IIC存储模块等其他电路模块电路。控制板尺寸不超过 60*60mm,便于安装。CPU 硬件软件全部开放,除能完成对小车控制外,还能使用本实验板完成单片机所有基础实验。供电范围宽泛,支持5v~9v的电压,干电池或锂电池都适用。编程器集成在控制板上,通过USB大小口的方式与电脑连接。下载程序,开放全部底层源代码。控制板合3A的稳压芯片,可为舵机提供6v额定电压。板载8+*8led 模块采用MAX7219驱动芯片,板载一片直流电机驱动芯片FAN8100MTC,可同时驱动两个直流电机。板载USB驱动芯片及自动复位电路,烧录程序时无需手动复位,2个2*5的杜邦座扩展坞,方便无线模块、OLED、蓝牙等扩展模块直插连接,无需额外接线。
② 扩展板介绍
BigFish扩展板提供外围电路,可连接传感器、电机、输出模块、通信模块等,可靠稳定。
2. 机械设计及优化
2.1 通过独木桥的机械设计方案
通过独木桥障碍主要需要解决爬坡和下坡问题,如车轮不能与斜面产生足够的摩擦力,小车则无法攀爬上斜坡。为了增加摩擦力,全地形小车采用履带和轮子混合使用的方式。全地形小车重心也在小车的中间位置,防止全地形小车在上下坡时翻车。在小车设计的过程中,有一个版本由于重心过于靠前,导致下坡时,出现“脸刹”的状况。
2.2 通过管道的机械设计方案
通过管道需要该车具备自主转向的功能,可在车体四周装上导轮装置,从而改变运动轨迹。实际测试中发现,安装导轮后不能在短时间内转弯,且管道壁实际情况复杂,故采用超声波传感器来实现转弯的动作,并加装导轮作为辅助。当超声波传感器探测到与管道壁的距离低于设定的距离,全地形小车就开始利用轮速差开始转弯,重复超声波探测—调整角度—转向的过程,以通过管道。
2.3 通过台阶的机械设计方案
对于攀爬翻越台阶障碍,需要解决攀爬和防止翻车两个问题。为了让全地形车能够爬上台阶,小车采用履带和轮子混合的方式,并且履带前引导轮翘起,高过台阶,使全地形小车顺利爬上台阶。在测试过程中,发现只用履带作为前轮,小车的摩擦力不够,导致动力不足,很难爬上台阶,所以采用混合的方式。在测试过程中,还发现四轮轮式小车,在上台阶的过程中,虽然动力足够,但是只有前轮能够爬上台阶,后轮会卡在台阶上,最终导致小车不能通过台阶,所以后轮也采用了履带和轮子混合的方式,但是后轮履带翘起没有前轮翘起高,这样的设计可以解决后轮卡在台阶上的问题。
2.4 通过栅格地毯的机械设计方案
通过栅格地毯时遇到的主要问题是由于栅格间隔较大,全地形车通过时出现陷轮的情况,设置该障碍是为解决该车在不同平地地形正常行走的问题,最初采用四个后轮两个前履带的方式,这样的方式虽然能够通过栅格地毯,但是很不稳定,容易跑出栅格地毯,这样前后轮都用履带和轮子混合的方式,不仅加大了轮子的宽度,还增加了通过栅格地毯的稳定性。
3. 控制软件设计方案及优化
3.1 全地形小车循迹方案和优化
全地形小车安装了三个白标传感器,通过记录传感器返回值,编成一个二进制数,从硬件的角度来说,白标传感器是两个LED灯中间加一个光敏电阻,之后连接一个可以调节的可变电阻来调节光敏电阻的灵敏性,之后将高低电平发送到主控板上,使得主控板上能识别到01信号,碰到黑色则返回值为1,白色则相反,返回值为0;我们小组采用比例控制巡线,首先对不同的白标传感器返回值进行一个量化的处理;首先将白标灯进行分组,左边一个白标为一组,右边一个为一组,中间一个为一个组,再通过计算两边白标的差值来给出小车偏移的权值,再根据权值来进行微调。白标传感器还具有自定位功能,又对小车需要通过的独木桥、管道、台阶和栅格地毯,进行了特别的代码处理。
3.2 全地形小车代码
const int TrigPin = 2; const int EchoPin = 17; float distance; int segment = 00; void run(int speedl,int speedr); float echo(); void find(int speed1); void setup() { Serial.begin(9600); pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(9,OUTPUT); pinMode(10,OUTPUT); pinMode(18,INPUT);//center pinMode(16,INPUT);//right pinMode(14,INPUT);//left pinMode(TrigPin, OUTPUT); //超声波 pinMode(EchoPin, INPUT); } void loop() { Serial.println(segment); switch(segment){ case 0:{ find(180); if(analogRead(14)>650&&analogRead(16)>600) { run(0,0); delay(500); run(130,220); delay(1000); segment++; } break; } case 1:{ //上坡 if(analogRead(14)>650&&analogRead(16)>600) { run(180,230); delay(2200); segment++; run(0,0); delay(100); } break; } case 2:{ //下坡 run(220,220); if(analogRead(14)<600||analogRead(16)<600) { segment++; run(0,0); delay(500); run(200,0); delay(300); } break; } case 3:{ echo(); find(250); if(distance<20) { find(250); segment++; } else { run(160,160); delay(200); } break; } case 4:{ //过隧道1 echo(); if(distance<20) { run(200,200); delay(50); run(0,250); } else { run(0,250); delay(1000); run(250,0); delay(600); segment++; run(0,0); delay(50); } break; } case 5:{ find(180); if(analogRead(14)>650&&analogRead(16)>650) { run(200,200); delay(200); segment++; } break; } case 6:{ //上楼梯 find(250); if(analogRead(14)>650&&analogRead(16)>650) { run(220,220); delay(2000); segment++; run(0,0); delay(50); } break; } case 7:{ //下楼梯 run(220,220); if(analogRead(14)<650||analogRead(16)<650) { segment++;
} } case 8:{ echo(); if(distance>20) { find(220); } else{ run(220,220); delay(200); segment++; } break; } case 9:{ //隧道2 echo(); if(distance<20) { run(250,60); } else { run(250,0); delay(500); run(0,250); delay(200); segment++; } break; } case 10:{ find(180); if(analogRead(14)>650&&analogRead(16)>650) { run(200,200); delay(200); segment++; run(0,0); delay(1000); } break; } case 11:{ //过栅格 run(255,255); break; } } }
void run(int speedl,int speedr) { if(speedl>=0){ analogWrite(9,0); analogWrite(10,speedl); } if(speedl<0){ analogWrite(9,-speedl); analogWrite(10,0); } if(speedr>=0){ analogWrite(5,0); analogWrite(6,speedr); } if(speedr<0){ analogWrite(5,-speedr); analogWrite(6,0); } }
float echo() { // 产生一个10us的高脉冲去触发TrigPin digitalWrite(TrigPin, LOW); delayMicroseconds(2); digitalWrite(TrigPin, HIGH); delayMicroseconds(10); digitalWrite(TrigPin, LOW); // 检测脉冲宽度,并计算出距离 distance = pulseIn(EchoPin, HIGH) / 58.00; //Serial.println(distance); //delay(1000); return distance; }
void find(int speed1) { int sl=analogRead(14); int sc=analogRead(18); int sr=analogRead(16); int speed; speed = speed1; if(sl>670&&sc<750&&sr<600) { run(0,speed); delay(10); } if(sr>600&&sc<750&&sl<670) { run(speed,0); delay(10); } if(sc>750&&sr<600&&sl<670) { run(speed,speed); delay(10); } if(sc>750&&sr>600&&sl>670){ run(180,180); delay(10); } if(sc>750&&sr>600&sl<670) { run(speed,100); delay(10); } if(sc>750&&sl>670&&sr<600) { run(100,speed); delay(10); } if(sc<750&&sr<600&sl<670) { run(0,speed); delay(10); } run(speed,speed); delay(5); run(0,0); } |
4. 项目总结
4.1可能存在的问题
① 电池的问题
电池的电压输出会随着使用时间的长度而发生改变,因为电压的降低,导致小车动力不足,难以完成爬坡、爬阶梯等任务。
② 白标传感器过少
由于只有三个白标传感器,导致采集的数据较少,巡线容易出现偏差。
4.2处置预案
① 提前到比赛场地进行调试。
② 电池的问题初步决定备两块备用电池和一块使用的电池。
③ 其它问题见机行事。
参考文献
[1]林彤,金濯,任玲.基于探索者机电创新平台的全地形车研制[M].2016
* 本项目未获得作者开源授权,无法提供资料下载。
|