机器谱

S143】轮履结合全地形小车

图文展示3264(1)

图文展示3264(1)

副标题

作品说明

作者:庄艾超 侯宇焘

单位:浙江警察学院

指导老师:陈东杰 许中石

      “探索者”平台是由机器时代推出的专业型机器人设备原型设计工具,包含机构件、舵机、传感器以及控制模块,机构零件全部按照国际零件标准设计,结构精密,各个结构零件之间能够通过螺钉任意角度连接,可组装四连杆、曲柄滑块、齿轮传动等各种典型机械传动机构和欠驱动机构。传感器、主控板等控制单元能够让使用者在实现机构运动的设计过程中,更全面地了解单片机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

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

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