机器谱

S116】基于“探索者”模块化机器人平台的大小变换车

图文展示3264(1)

图文展示3264(1)

副标题

作品说明

作者:刘磊 常青

单位:北京石油化工学院

指导老师:陈亚

1. 市场调研

      大小变换车是一类通过机械构件改变车辆外形和行驶性能的轮式移动平台的总称。这种结构在军事和民用产品中都有很多应用。现代军用机器人很多都采用了可变形的履带式设计,这种结构有利于机器人适应野外复杂的地形,并且可以通过前履带的变形跨越一些较小的沟壑和障碍。需要在狭小空间内活动时,又可以收回前履带,保证机动灵活性。动力通常为电力驱动,噪声小,隐蔽性好。这一类机器人在战场侦察、扫雷排雷、伤员搬运等方面发挥了重要作用,如下图所示 [1]

作品说明

军用履带式变形机器人

      月球车为了节省运载火箭内宝贵的空间,一般也做成可变形的,在月球着陆后,展开电池板、车轮和探测装置。由于车轮是可升降折叠的因此可以提高底盘高度,提高复杂地形的通过性。    

      在汽车行业,一部分厂商开始试制纯电动折叠汽车,这些汽车主要定位人群为城市上班族,需要短途单人代步工具,而自行车、电动车全开放式的设计又不能帮人们挡风遮雨,于是电动汽车成了首选。此类汽车通常为单座或双座,有较小但是足够用的的储物空间。在行驶时可以完全展开,保证驾驶稳定性与舒适性,泊车时或者完全停入车位后又可以自动折叠,减少占地面积。一定程度上缓解了“停车难”的问题,如下图所示[2]

各种变形车方案

      折叠方向大多数为纵向折叠(长度变化)。因为在这个方向上折叠可以有效减少整车长度如下图所示,降低对停车位的空间要求,而且由于受力方向与车轮行进方向一致,对车轮施加的侧向力比较小,阻力也比较小。

沿长度方向折叠是最成熟的方案

      在空间布置上,如下图所示中瑞士RINSPEED公司的Presto折叠车选择了压缩空间的方法,所以在变形时后排座位不能有人和货物,因为这一部分空间会被折叠压缩。而另外两款车则选择了转移空间,通过向高处转移空间来减小水平面的占地面积。所以变形中不会影响车内空间[3]

压缩后座以减小车身长度

      房车是一类比较特殊的汽车,出门野营时既需要具有行驶功能,又需要有一定的生活空间。所以一部分房车也设计为生活空间可折叠或者可扩展的形式,在行驶时折叠起来,减少空气阻力,到营地完全展开,提供日常起居和休息空间,如下图所示

可扩展空间的变形房车

      由于这部分空间只需要承受日常生活中家具和人的重量,因此变形部分并不涉及车架部分,而是在车厢侧面安装导轨实现变形。这样一来就可以保证车架的整体性、强度、刚度、碰撞安全性不受影响,同时又可以极大地扩展居住空间[4]

      如下图所示的水陆两用沙滩车的底盘为全防水结构,提供浮力,在陆地行驶时与普通沙滩越野车相似。由沙滩开入水中后,四轮收起至船身吃水线以上,由内置喷水推进器提供推力,由矢量喷口控制方向,省去了传统快艇的螺旋桨和舵面,结构简洁安全,不易损坏。

水陆两用沙滩车

      “飞行汽车”如下图所示是汽车和固定翼飞机的融合体,实质上可以看做飞机的外形做成了汽车的形状。为了节省空间,这类汽车的机翼和尾翼通常是可折叠的,为减轻重量,车轮较小,只适合在平坦路面行驶,悬挂机构也尽量被简化。起飞时,通过机械结构展开主翼,启动螺旋桨,通过一段距离的加速飞离地面。因此不适合在堵车时垂直起飞,也不适合在有路灯、电线等障碍物的道路上起飞。只适合驾驶到机场跑道或者宽阔的路面上起飞[5]

飞行汽车

      在如下图所示的儿童玩具中,很多遥控汽车为了增加功能性,也加入了变形遥控功能,通过产品介绍不难发现,此类产品通常是利用电动马达和减速齿轮放大扭矩,再通过多杆机构实现运动,成本较低,运行稳定可靠,易于控制。

变形玩具车

2. 大小变换车研究现状

2.1 大小变换机械机构

      从机械结构的设计来看,使用简单可靠的低副,包括移动副和转动副及其组合来设计具有很高的可靠性,而使用高副的案例暂未检索到。从可靠性的角度来看,机构越简单,可靠性越高。瑞士RINSPEED公司的Pestro折叠车只使用了1个移动副实现车身的前后伸缩,就实现了从3.7米变形到不足3米的长度,效果显著。其他变换车也只是选择了转动副或转动副组合成的多杆机构,以确保车身轻盈,变形可靠。

      市面上的房车则是另一种思路,并不是将原有的车身“缩小”,而是想办法“扩展”原有的空间。这种扩展机构有效的增加了房车的居住空间,并且十分可靠。然而,通过发现不难观察到,这些概念车的案例通常使用整体式底盘,除了在发动机与保险杠预留碰撞间隙之外,车架承受撞击的部位与主要承载部位是一个整体,并且遵循等强度理论设计,虽然这种结构十分简单,受力均匀,但是一旦受到撞击会导致整车底盘和车架严重变形,造成较大的损失。

2.2 市场前景

      目前的商品家用车很多都具备了自动泊车功能,一定程度上解放了驾驶员的双 手,降低了停车的难度。然而,对于稍小一点的空位却没有办法正常泊车,造成很 多道路空间的浪费。 目前已经有多家公司研发纯电动折叠车,主要用于城市代步出行,如上下班和 超市购物等距离不远,又需要舒适的乘坐空间和足够的储物空间的情景。但是这些 车型仍处于概念车阶段,并未量产。相比之下,折叠婴儿车、折叠自行车、折叠电 动车由于其结构简单,成本低,已经大范围商品化销售,在生活中也很常见。 如果可以将自动泊车技术与大小变换结构融合,可以最大限度利用现有的道路 资源,缓解泊车位紧缺的问题。

2.3 先进性

      由于大小变换车结构比较复杂,运动机构多,对整车可靠性、燃油经济性、碰撞安全性、外观都有比较大的影响。因此在量产家用车中几乎没有它的身影,即使在概念车中也很少见,只有少数厂商将其用于纯电动城市代步车的概念设计,而且尽可能减少变形机构的不利影响。由于可借鉴的经验很少,研究本课题对于未来小型电动代步车的可变形设计具有指导意义。

      自动泊车功能是现有商品车已有的功能,但是如果能与车身变形功能结合,将最大化提高泊车时的成功率和空间利用率,使原本不足以泊车的狭小空间也可以成功用来泊车。可以为今后的汽车设计提供有价值的参考依据。

3. 制作过程说明

3.1 初步设计方案

方案1:前后四轮变形结构

前轮单轴转动结构

      如上图所示,该方案车身前后连接伸出臂,可绕单轴转动,前轮不具备动力,但可以转向,后轮固定后伸出臂后部,提供驱动力[7]。当需要改变轴距时,前后伸出臂将原本置于车身前后的车轮转动至车身下部,整车抬高一定高度。

      优点:平稳抬升车身,充分利用高度空间

      缺点:转动机构受力较大,机构复杂,在前轮直立时前轮转向的方向会变为车身的左右运动,无法控制方向

方案2:两前轮驱动,后轮变形

两前轮驱动,后轮变形

      如上图所示,两前轮可独立调速,独立转向,刚性固定于主车身。后轮使用四杆机构连接,可伸出或缩回,用以调节轴距。后轮不具备转向和动力。

      优点:机构简单,控制灵活,受力合理。

      缺点:可借鉴资料少,不够成熟。

3.2 初步方案论证

      传统电动三轮汽车采用正三角布局如下图所示,转向结构简单,易于控制。但是在转向时由于车身惯性与向心力同时作用,极易发生向前侧方倾斜的问题,造成了安全隐患。

常规三轮汽车

      如下图所示,本方案采用两前轮结构设计,在紧急制动时前轮可以提供足够的制动力与稳定性,转弯时同样可以提供足够的向心力保证转弯灵活性。后轮不具备动力与转向功能,仅用作保持稳定与承重作用。机械结构的简化使得通过调整后轮改变轴距变得十分简单可靠[8.9]。由于设计定位为纯电动城市代步车,而非大空间私家车,因此设计乘坐2人,具备固定的储物空间。三轮底盘布局重量轻,能耗更低,适合使用最频繁的短途城市代步。

双前轮三轮汽车

      初步方案选择标准PWM信号控制的圆周舵机和标准舵机。由于小车需要2个前轮圆周舵机、2个转向标准舵机,1个变形圆周舵机,因此共需要设定5个变量用于控制舵机。

      混合控制功能是一种可实现多通道同时动作的辅助功能。在手动驾车模式下,传统控制手柄只能单个控制某一通道连接的单个舵机转动,不能同时操作多个舵机。初步方案计划通过对混合控制功能合理设置,实现双前轮转动及摆动的灵活控制,进一步提高手动泊车时的操控灵活性。

3.3 后轮模块

      后轮模块由一组四杆机构组成,由于实体四杆机构的连杆具有一定厚度,在承重状态下其结构完全可以承受车身重量而不需要给舵机施加额外载荷。由于后轮既不具备动力,又不具备转向功能,选择使用后轮模块改变轴距会十分简单可靠。

      标准舵机具备正负90°共180°行程,扣除机架长度与零件宽度后,仍然具备120°有效行程。当连杆长度为l为55mm时,其连杆的单边活动距离S见如下公式

      双边距离为95.26mm。在早期方案中,舵机通过另外一组连杆将动力输出到四杆机构上,然而这种方式会增加机构复杂程度,降低控制精度及可靠性。由于舵机输出齿轮通常需要承受较大的扭矩和剪切力,在设计舵机时已经充分考虑到这一点,会在舵机内部将输出轴与舵机外壳可靠连接。部分高档舵机使用超薄轴承支承主轴以提高控制精度和减少摩擦力,其结构如下图所示

具备轴承的金属齿轮舵机

由于舵机在设计时已经考虑到了输出轴的受力,所以完全可以直接将舵机输出轴作为四杆机构的一个铰链,构成的铰链四杆机构如下图所示

四杆可变轴距机构运动简图

      为验证后轮模块改变轴距对于提高稳定性的作用,可以通过计算得出具体数值,以便进行定量分析。假设每只车轮负担的重量一致,当车身处于静止状态时,由于力矩平衡,可计算得到重心位于轴距前33%处。当障碍物高度为车轮半径的60%时,通过计算可知,折叠模式下车身颠簸幅度为13.7mm,展开模式下颠簸幅度为13.3mm。车身倾斜角度减少28.5%,重心颠簸幅度减少2.9%。最终定型的后轮模块如下图所示

后轮模块

3.4 前轮模块

      为了进一步提高转向灵活性,采用混合控制技术可以充分发挥双前轮结构的优势。对于本设计中的每一个前轮模块,其车轮对于地面的推力方向,正负,大小都是可以独立控制的,转向控制灵活。与传统汽车底盘相比,其双前轮不带动力,转向只能同向运动,局限性较大。

      由于前轮舵机型号丰富,需要对整车受力进行计算以确定圆周舵机的型号。假设整车质量为0.8kg,负载质量为车身质量的0.3倍,这一比例与普通家用车相同,行驶速度100mm/s。则车轮与地面的摩擦力见公式(1两只前轮使用65mm轮胎时,每只电机所受到的扭矩见公式(2车轮每转360°行驶的距离见公式(3电机选型所需转速见公式(4

舵机选型图

      由选型图可知,小圆周舵机具备2.4kg·cm的扭矩和0.16Sec/60°的转速,完全可以胜任驱动轮的负载要求,因此选择小圆周舵机作为前轮驱动舵机。由于前轮带有动力,如果为了安装方便随意指定旋转轴,容易在左右转向时会遇到较大的阻力,受力不合理,也容易损坏部件。所以需要设计为原地转轮结构,也就是前轮转轴位于前轮与地面的接触点。为了避免摇杆与车轮发生摩擦,需要用延长架将其垫高如下图所示

车轮旋转轴的位置十分重要

      当转动中心确定后,摇杆随之确定,曲柄可以直接使用舵机方盘。由于摇杆与曲柄都需要刚性固定于机架,本文使用一根带有角度的支架作为机架,如下图所示

前轮模块与方向舵机的连接

      由于前轮左右对称,这里使用一根长支架将左右前轮连接为一个整体,最后制作一根可调长度的连杆连接舵机盘与前轮,通过调节V型开口角度调节好连杆长度,就可以通电测试前轮模块了如下图所示

前轮模块连接

3.5 几何尺寸设计与计算

      由于车轮使用橡胶材料且车身具有一定重量,可以假设车轮只能做纯滚动运动及原地转向,滚动速度垂直于轮轴,不发生侧向滑动。因此,当前轮转向时,前后轮轴连线交点即为转弯圆弧所对应的圆心。圆心到后轮中心的距离即为转弯半径。

      选择适当的软件,建立几何图形计算运动轨迹。为确保前轮转向时传动机构具有较高的传动效率和较小的压力角,前轮转动范围取±35°,前轮间距为175mm。如下图所示,当前后轮轴距为270mm时,转弯半径R为

轴距与转弯半径关系图

下图所示,当轴距185mm时,转弯半径为

折叠模式转弯半径

      通过几何作图法充分验证了轴距变换对于减小转弯半径,提高转弯灵活性的作用。两前轮模块安装完成后,只需要与后轮模块刚性连接,整车装配即可完成。这里选择后轮模块的舵机架作为受力点,同时也是运动机构的机架。

整车装配图

4. 控制系统

4.1 手动驾车模式硬件调试

      由于需要控制2个圆周舵机,2个标准舵机,1个手动/自动切换功能,需要具备至少5个通道的无线电控制器。

      这里选择WFT08无线电控制器作为手动模式的输入设备。如下图所示,与红外线控制器相比,该控制器具备8个比例通道,1024点摇杆分辨率[10],控制信号细腻精确,搭配DSM2制式高频头模块,可以实现6个比例通道,5路可编程普通混控,2路可编程曲线混控完全可以实现前轮机构在手动模式下的的灵活控制。控制器采集摇杆及开关的信号后,通过2.4GHz高频模块发射信号,无线电接收机接收后转换为PWM控制信号驱动舵机。

对比两种控制方案

      当前两轮向内侧转动,且车轮转向如图所示时,受力情况如下图所示。车轮的驱动力F可分解为垂直于后轮旋转半径的切向力Ft与平行于后轮旋转半径的径向力Fr。整车以后轮接触点为支点,受到转矩M的作用,而两前轮的侧向分力则由车身传递互相抵消。此时只要适当控制车轮转速即可控制整车绕后轮原地旋转,转弯半径大大减少。

灵活模式受力分析

为实现灵活操控,需要利用无线电控制器进行编程,开关定义如表1所示:

1 控制器操作定义

方向

左摇杆

右摇杆

开关D

开关F

向前

前进

灵活模式



向后

后退



向左

灵活模式左转

标准模式左转



向右

灵活模式右转

标准模式右转



位置2



混控开

手动模式

位置0



混控关

自动模式



模式

灵活模式

控制方式

轴距(mm)

所需空间(mm)

节省空间

标准模式


自动

270

550


折叠模式


自动

185

480

12.7%

折叠模式


手动

185

400

27.3%

折叠模式


手动

185

340

38.2%




#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列单片机头文件

//通道1-5电平0/1控制

sbit ZL = P1^7; //左轮

sbit YL = P1^6; //右轮

sbit ZZ = P1^5; //左转向

sbit YZ = P1^4; //右转向

sbit TRS = P1^3; //变形 0.5ms-2.5ms 对应180°

sbit KEY = P1^2; //开关

sbit LED_MAIN = P1^1;

sbit LED_PARKING = P1^0;

sbit BX = P3 ^ 7;

//sbit STOP = P1 ^ 1;

unsigned char base;//舵机1.5ms高电平基准中立点

//设定转速 0-255

unsigned char SPD1;

unsigned char SPD2;

unsigned char SPD3;

unsigned char SPD4;

unsigned char SPD5;

//各通道输出转速 0-255

unsigned char OUT1;

unsigned char OUT2;

unsigned char OUT3;

unsigned char OUT4;

unsigned char OUT5;

unsigned char M;

unsigned char a;

unsigned int i;//累加变量

/********************************************************************/

函数名:延时0.1ms

  用:DELAY_MS (?);

  数:1~65535(参数不可为0)

返回值:无

  果:占用CPU方式延时0.1毫秒的倍数

  注:应用于1T单片机时i<600,应用于12T单片机时i<125

/********************************************************************/

void DELAY_MS (unsigned int a){

unsigned int i;

while( a-- != 0){

for(i = 0; i < 60; i++);

}

}

/********************************************************************/

/********************************************************************

函数名:前进一段距离

  用:GO (?);

/********************************************************************/

void GO (unsigned char go){//b为循环次数

OUT1 = (base-SPD1);// 左轮 +后退 –前进

OUT2 = (base+SPD2);// 右轮 +前进 –后退

  for(i=0;i<go;i++){

         ZL = 1; //通道1

         DELAY_MS (OUT1);//10-20最低/最高速度,中点15

         ZL = 0;

         DELAY_MS (200-OUT1);//200-延时

         YL = 1; //通道2

         DELAY_MS (OUT2);//10-20最低/最高速度,中点15

         YL = 0;

         DELAY_MS (200-OUT2);//200-延时

         }

}

/********************************************************************/

/********************************************************************

函数名:停止一段时间

  用:STOP (?);

/********************************************************************/

void STOP (unsigned char stop){//b为循环次数

  for(i=0;i<stop;i++){

        ZL = 1; //左轮

YL = 1; //右轮

         DELAY_MS (15);//10-20最低/最高速度,中点15

        ZL = 0;

YL = 0;

         DELAY_MS (185);//200-延时

         }

}

/********************************************************************/

/********************************************************************

函数名:后退一段距离

  用:BACK (?);

/********************************************************************/

void BACK (unsigned char back){//bk为循环次数

OUT1 = (base+SPD1); // 左轮 +后退 –前进

OUT2 = (base-SPD2); // 右轮 +前进 –后退

  for(i=0;i<back;i++){

         ZL = 1; //通道1

         DELAY_MS (OUT1);//10-20最低/最高速度,中点15

         ZL = 0;

         DELAY_MS (200-OUT1);//200-延时

         YL = 1; //通道2

         DELAY_MS (OUT2);//10-20最低/最高速度,中点15

         YL = 0;

         DELAY_MS (200-OUT2);//200-延时

         }

}

/********************************************************************/

/********************************************************************

函数名:两轮右转一定角度

  用:RT ();

/********************************************************************/

void RT (){     

  for(i=0;i<7;i++){

         ZZ = 1; //左转向舵机

         DELAY_MS (20);//10-20最低/最高速度,中点15

         ZZ = 0;

         DELAY_MS (180);//200-延时

YZ = 1; //右转向舵机

         DELAY_MS (20);//10-20最低/最高速度,中点15

         YZ = 0;

         DELAY_MS (180);//200-延时

         }

}

/********************************************************************/

/********************************************************************

函数名:两轮左转一定角度

  用:LT ();

/********************************************************************/

void LT (){   


  for(i=0;i<7;i++){

         ZZ = 1; //左转向舵机

         DELAY_MS (10);//10-20最低/最高速度,中点15

         ZZ = 0;

         DELAY_MS (190);//200-延时

YZ = 1; //右转向舵机

         DELAY_MS (10);//10-20最低/最高速度,中点15

         YZ = 0;

         DELAY_MS (190);//200-延时

         }

}

/********************************************************************/

/********************************************************************

函数名:两轮回中

  用:MID ();

/********************************************************************/

void MID (){

  for(i=0;i<20;i++){

         ZZ = 1; //左转向舵机

         DELAY_MS (15);//10-20最低/最高速度,中点15

         ZZ = 0;

         DELAY_MS (185);//200-延时

YZ = 1; //右转向舵机

         DELAY_MS (15);//10-20最低/最高速度,中点15

         YZ = 0;

         DELAY_MS (185);//200-延时

         }

}

/********************************************************************/

/********************************************************************

函数名:轴距变短

  用:SHT ();

/********************************************************************/

void SHT (){

  for(i=0;i<40;i++){

         TRS = 1; //变形舵机

         DELAY_MS (8);//5-25最低/最高角度,中点15

         TRS = 0;

         DELAY_MS (192);//200-延时

         }             

}

/********************************************************************/

/********************************************************************

函数名:后轮回中点

  用:ZD ();

/********************************************************************/

void ZD (){

  for(i=0;i<40;i++){

         TRS = 1; //变形舵机

         DELAY_MS (15);//5-25最低/最高角度,中点15

         TRS = 0;

         DELAY_MS (185);//200-延时

         }             

}

/********************************************************************/

/********************************************************************

函数名:轴距变大

  用:BIG ();

/********************************************************************/

void BIG (){

  for(i=0;i<40;i++){

         TRS = 1; //变形舵机

         DELAY_MS (24);//5-25最低/最高角度,中点15

         TRS = 0;

         DELAY_MS (176);//200-延时

         }             

}

/********************************************************************/

/********************************************************************

函数名:主函数

  用:无

  数:无

返回值:无

  果:程序开始处,无限循环

  注:

/********************************************************************/

void main (void){

INT_init(); //外部中断初始化

P1M0 = 0x00; //0000 0000

P1M1 = 0xfb; //1111 1011

base = 0x0F; //1.5ms基准时长

SPD1 = 0x05; //0-5转速控制

SPD2 = 0x05; //0-5转速控制

SPD3 = 0x05; //0-5角度控制

SPD4 = 0x05; //0-5角度控制

SPD5 = 0x02; //0-10角度控制

  while(1){

if(BX==0){

DELAY_MS (50);

if(BX==0){

a=1000;

M++;

while(BX==0);

DELAY_MS (50);

}

}

if(a!=0){

a--;

if(a==0){

M=0;

}

DELAY_MS (1);   

}

if(M==1)BIG ();

if(M==2)SHT ();

  while(KEY==0){   //有障碍才前进

   LED_PARKING = 0;   //绿灯灭

   LED_MAIN = 1;   //红灯亮

   GO (1);        //直行走过障碍区 边走边判断

   if(KEY == 1){ //如果没有障碍

   GO (55);//直行停车距离

   if(KEY == 1){   //停车距离内没有障碍

       GO (30);

       SHT ();        //缩小轴距

   MID ();   //停车准备倒车

   RT ();   //两轮右转

   BACK (53);   //后退一定距离

   LT ();   //两轮左转

   BACK (53);   //后退一定距离,泊车完成

   MID ();   //两轮回中

   }

   }

    }

}

}

/********************************************************************/






下图所示,设置两前轮混合控制转速:

      MENU键进入参数设置。

      “+”键找到高级设置。

      OK键进入高级设置,找到V翼(CH2与CH4通道)混控。

      “+”键打开混控,调整参数

设置前轮转向混控

下图所示,设置两前轮转向舵机:

进入高级设置,选择可编程普通混控1并进入。

“+”“-”键设置油门(CH3通道)到起落(CH6通道)的混控功能,比率参数。

设置前轮转向混控

下图所示,按照相同的方法设置油门(CH3通道)到副翼(CH1通道)及油门到起落(CH5通道)的混控模式即可。

混控模式设置

4.2 自动泊车系统硬件

      由原理图可知,共需5个舵机和1个传感器模块连接单片机,所以这里选择STC12C4052AD单片机作为控制器。为了方便快速搭建电路与调试电路,这里选择面包板作为载体,相比洞洞板与开发板如下图所示而言,面包板不需要焊接,可以快速连接电路,相比开发板而言,面包板可以任意连接电路,不受板载接口的局限,学习效果也更好[11]

洞洞板与开发板

      由于该单片机自带复位电路,无需外部复位电路,其电压兼容USB接口,无需外部降压电路,可直接由下载模块供电,只需要连接直流电源与时钟电路,就可以正常工作了与机械结构类似,控制系统也使用了模块化设计。根据真车比例推算,泊车时车身一侧与路边车辆的距离至少为车身宽度的30%,换算后至少需要52mm感应距离。

      DYS412[12]红外线传感器具备200mm可调感应距离。如下图所示,与传统红外线传感器相比,该传感器自带芯片可以实现防强光、防干扰等功能,可快速设置感应距离并永久记忆。使用5V供电,兼容单片机电源。双临界值设计,防止跳变。可以有效节省单片机有限的CPU资源。

DYS412红外线传感器

      传感器的电路连接如下图所示,VCC与GND连接5V直流电,S端连接单片机,当传感器未检测到信号时,输出高电平,检测到障碍时,输出低电平。

传感器电路原理图

     使用的舵机采用PWM信号驱动。通过高电平时长表示输出信号值的大小。这种方式可以保证输出信号不受电压波动的干扰。在程序中,只要设置单片机I/O口的电平状态与对应的延时时间即可使用单片机控制舵机[13]。如下图所示,当高电平时长为1.5ms时,标准舵机处于中立位置,圆周舵机停止转动。当高电平时长为1ms时,标准舵机正转45°,圆周舵机正转。当高电平时长为2ms时,标准舵机反转45°,圆周舵机反转。由于套件中的标准舵机支持180°转动,只需要调整高电平时长分别为0.5ms和2.5ms即可实现0到180°转动,该功能可用于后轮模块的大小变形。

      由于无线电接收器与单片机都可以发出舵机控制信号,如何选择控制权也就成了手动控制与自动控制切换的难题。最初的设想为并联控制,当断开单片机电源时,为手动控制,接通时为自动控制。但由于信号干扰严重,最终不得不放弃该方案。

舵机信号时序图

      最终采用的方案为机械式切换,因为这种方式十分稳定可靠。开关置为一边时,舵机与接收机相连,可以实现手动驾车,置为另一侧时,舵机与单片机相连,可实现自动控制。但如何操作4个开关控制4只舵机的通断成了问题。如下图所示,如果采用4只舵机并联推动4只开关,那么无疑将大大增加机械结构的复杂程度与连线复杂程度。继电器方案同样存在连接过于复杂的问题。

传统继电器与开关方案

       如下图所示,琴键开关[14]是一种将4个单刀开关并联而成的开关,只需要1只舵机就可以切换4路开关,非常适合作为多通道控制系统的切换开关。切换舵机连接到接收机的6通道,由无线电发射机的开关控制切换动作。

琴键开关及原理图

      实验中,由于使用的舵机耗电最高可达到2A,普通移动电源难以稳定供电。由于单片机、舵机、传感器、接收机使用的电压均为5V直流电,难以找到恰好合适的电池,因此需要使用稳压模块。如下图所示,虽然移动电源可通过USB接口输出5V直流电,但由于USB接口内部的升压电路设计使用电流为1A,只适合用于手机等移动设备的充电,难以满足多个舵机同时工作所需的电流。

      本设计使用的是DC-DC直流降压模块与7.4V聚合物锂离子电池组作为电源。这种降压模块采用与传统的线性降压模块相比,发热小,效率高,体积小,重量轻。通过调节多圈可调精密电位器,可以得到十分精准的输出电压值,并且在电池工作中,不会因电量和电压降低而影响输出电压,实现自动稳压。

对比两种供电方案

      整体电路图如下图所示,舵机1,舵机2分别为左轮和右轮圆周舵机。舵机3和4为左转和右转标准舵机,舵机5为后轮变轴距控制舵机。芯片采用STC12C4052AD,外接12MHz晶振和两个30pF电容作为外部时钟。琴键开关采用一只5g微型舵机控制,转速为0.12Sec/60°,扭矩0.8kg·cm。连接完成的硬件电路如所示

自动泊车电路原理图

硬件电路实物图

4.3 自动泊车软件编程

      使用自动泊车功能时,应先将车辆行驶至车位近端相邻车辆附近,当传感器检测到信号时,使用无线电控制器切换至自动泊车模式即可。如下图所示,程序检测到右方有车,执行循环程序,一边前进一边检测是否行驶至车位空间。到达目标位置时,前进20个单位长度对应的安全距离。如果安全距离内没有障碍,即可执行泊车程序,如果有障碍,继续前进直至找到没有障碍的泊车空间。自动泊车程序所对应的程序流程图如下所示

程序流程图

      软件主要分为四大部分:程序开头、头文件及定义、子程序及功能初始化、主程序。在编程前,需要先大致构思所采用的程序结构及算法,可能遇到的问题与多个解决方案。由于本设计采用双前轮驱动及双前轮转向,需要较复杂的动作,因此需要通过调用子程序编写主程序。

      如下图所示,程序开头需要注明程序名称、用途、所用硬件接口、编程人与时间、注意事项、更新日志等基本信息,以便日后查阅、排除故障以及技术交流。

程序开头形式

      根据单片机型号加载合适的头文件,并定义所需的变量。需要注意,为避免日后遗忘,应尽量用注释信息说明各个变量的用途,变量名也应尽量用易于理解的拼音缩写而非英文单词。

sbit ZL = P1^7; //左轮

sbit YL = P1^6; //右轮

sbit ZZ = P1^5; //左转向

sbit YZ = P1^4; //右转向


void main (void){

P1M0 = 0x00; //0000 0000

P1M1 = 0xfb; //1111 1011

}


/***************************************************************/

函数名:前进一段距离

  用:GO (?);

  果:前进指定个单位长度

  注:

/****************************************************************/

void GO (unsigned char go){//b为循环次数

       SPD1 = 0x05; //0-5转速控制

       SPD2 = 0x05; //0-5转速控制

OUT1 = (base-SPD1);//   左轮 +后退 -前进

OUT2 = (base+SPD2);//   右轮 +前进 -后退

  for(i=0;i<go;i++){

         ZL = 1; //通道1

         DELAY_MS (OUT1);

         ZL = 0;

         DELAY_MS (200-OUT1);//200-延时

         YL = 1; //通道2

         DELAY_MS (OUT2);

         YL = 0;

         DELAY_MS (200-OUT2);//200-延时

     }

}

/***************************************************************/


while(KEY==0){          //有障碍才前进

    LED_PARKING = 0;     //绿灯灭

LED_MAIN = 1;      //红灯亮

GO (1);                //直行走过障碍区 边走边判断

if(KEY == 1){          //如果没有障碍

    GO (55);//直行停车距离

    if(KEY == 1){      //停车距离内没有障碍

        GO (30);

        SHT ();        //缩小轴距

        MID ();   //停车准备倒车

        RT ();      //两轮右转

        BACK (53);   //后退一定距离

        LT ();      //两轮左转

        BACK (53);   //后退一定距离,泊车完成

        MID ();   //两轮回中       

    }

}


      然而,普通单片机I/O口的输出电流强度并不高,即使作为控制信号,也很难被舵机识别。传统方法为使用三极管对信号进行放大,但在面包板上这将会大大增加连线复杂程度。这里采用的解决方案是利用单片机的推挽输出功能输出较强的信号。

      推挽输出是用两个晶体管或者场效应管构成的推挽电路,该电路的特点是输出电阻小,所以能够驱动大的负载,从而能够使得单片机管脚直接输出舵机驱动信号,而无需使用三极管进行放大,驱动效果如下图所示。根据数据手册[15]可知,推挽输出所对应的程序为:

有无推挽输出效果对比

      对于控制运动的程序,由于需要在主程序中反复调用,应写成子程序形式进行调用。这样可以使主程序更简洁易懂,调试参数也更加方便。一前进一段距离的程序为例。当在主程序中调用“GO (?);”函数时,只需要在问号处填入数字即可表示对应的距离长度,单位为1个脉冲对应的行驶距离,数值范围为1-255。

      由于单片机只支持单线程,不能同时为舵机发送驱动信号和判断传感器状态,本主程序采用while循环进行程序嵌套,可实现一边前进一边判断障碍。确认无障碍后,前进一端安全距离用于停车,然后判断是否有障碍,当前进一段距离仍然无障碍时,则可判断该段距离内无障碍物,继续直行一段距离达到泊车所需距离后就可以执行泊车程序了。

5. 实验验证与数据采集

5.1 实验场地搭建

      如下图所示,实验场地采用5mm发泡聚苯乙烯覆膜板搭建制作,主要尺寸为1700mm×900mm,足够容纳多种泊车模式进行实验。使用白色、棕色两种颜色的硬质纸板作为障碍物,确保所测得的实验数据稳定可靠。

实验场地搭建

5.2 实验对比与数据采集

      整车装配完成后经检查各处连接正确无误即可进行通电调试。经过测量,后轮模块摆角可达120°,轴距变化范围为175mm到272mm。前轮模块转向机构灵活可靠,前轮模块转向角度科大35°,轮胎可原地转向,驱动电机可随意调节转速转向,整车行驶转向灵活,手动模式与自动模式可随意切换。该实验证明所设计的后轮模块尺寸合理,可实现所设计的变距要求。前轮模块转向机构合理可靠,舵机与电机选型正确,车身结构稳定可靠。

      经过自动泊车实验与测量,测得在标准模式下轴距为270mm时,使用65mm车轮,车身总长为335mm,自动泊车所需的车位长度至少为550mm,如下图所示

标准模式泊车

      如下图所示,折叠模式下,程序判断车位尺寸足够后,轴距自动减小为185mm,车身长度为230mm,自动泊车需要480mm车位长度,手动泊车需要400mm车位长度。

折叠模式泊车

      由于前轮具备混合控制功能,在车位过小的状况下可以使用手动驾车驶入停车位,此时轴距仍为185mm,但由于泊车转向灵活,无需向后倒车即可调整整车角度,只需要340mm泊车位尺寸即可。混合控制技术虽然没有减少轴距,但大大减少了传统倒车所需的活动空间,因此不需要太大的泊车位即可完成泊车,如下图所示

灵活模式泊车

5.3 实验结果分析

实验结果如下表所示:

1 泊车实验数据

      通过按此比例推算实际车位长度,可计算出实际可节省的车位长度。标准车位尺寸为2.6米×5.3米,典型家用轿车长度平均为4.2米,轴距2.4米。如使用折叠模式,可减少25.4%车身长度,即1.0米。车位尺寸只需3.9米,节省1.4米。

      如下图所示,本文通过对长度为430米的典型城市道路测算,扣除100米公交站、单位正门等不可用于停车的长度,可将车位个数从54个提高到73个,增加26%。

实地测算车位

6. 程序源代码

* 本项目未获得作者开源授权,无法提供资料下载

© 2024 机器时代(北京)科技有限公司  版权所有
机器谱——机器人共享方案网站
学习  开发  设计  应用