请选择 进入手机版|继续访问电脑版
返回列表 发新帖回复

[教程] 自制爬楼梯小车,包括全套流程和代码

[复制链接] 【【【进入图片模式】】】
  • TA的每日心情
    可爱
    2017-8-1 12:46
  • 2

    主题

    7

    帖子

    79

    积分

    初级学士

    Rank: 2

    积分
    79
    发表在  2017-8-8 13:16:52  | 显示全部楼层 | 阅读模式
    近日心血来潮用Makeblock的零件搭了个自动爬楼梯的小车
    废话少说先上视频


    下面给大家介绍一下如何搭建这个案例。由于是自动爬行,那么自然有各种传感器。什么巡线(当接触开关用),超声波,限位开关,陀螺仪~~

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码


    首先先简单介绍一下实现原理
    额。。理想状态下一共有8个阶段,其中1号轮子和4号轮子都是带电机的主动轮,其他都是从动轮,而且升降装置装在2号和4号轮子上
    阶段1
    前进

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码


    阶段2
    超声波检测到前方有障碍(这里指的是楼梯)
    车体上升,1号和2号升降装置把1号和3号轮子升起来直到超声波传感器检测不到楼梯

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码


    阶段3
    1号和4号轮子推动小车前进

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码


    阶段4
    2号轮子的巡线传感器检测碰到楼梯了,1号升降装置把2号轮子收回去

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码


    阶段5
    1号和4号轮子推动小车前进

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码


    阶段6
    4号轮子上的限位开关检测到4号轮子已经碰到楼梯,主动轮停止转动,2号升降装置把4号轮子收回去

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码


    阶段7
    1号轮子推动小车前进 也就是阶段1

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码


    阶段8
    也就是阶段2,小车继续前进直到超声波检测到楼梯然后开始循环

    自制爬楼梯小车,包括全套流程和代码

    自制爬楼梯小车,包括全套流程和代码


    额。。攀爬原理差不多就是这样了,接下来给大家介绍一下搭建方法以及调试过程中碰到的一些问题
    回复

    使用道具 举报

  • TA的每日心情
    可爱
    2017-8-1 12:46
  • 2

    主题

    7

    帖子

    79

    积分

    初级学士

    Rank: 2

    积分
    79
    发表于 2017-8-8 13:17:42  | 显示全部楼层
    这个案例在机械结构方面的一个特色就是这个升降的装置,既要可靠,又要比较迅速地升降。所以我选择了齿条齿轮的配合方式,并且使用单孔梁作为滑轨,用3*3的同步带固定片配合双孔梁做了个简易滑块。
    下面是搭建使用的材料和方法。

    升降装置1
    181315fd8t8tqq8ttks7ap.jpg.thumb.jpg

    双孔梁032*4
    双孔梁160*2
    M4*22螺丝*8
    M4螺母*8
    181310htykatvrv80rzcas.jpg.thumb.jpg

    181312eh01d1e1dyzh10p1.jpg.thumb.jpg

    然后使用下面的材料把上面搭好的结构连接起来
    181307pn2af4cfflif2edf.jpg.thumb.jpg

    3*3同步带固定片*4
    M4*8螺丝*16
    181306z30pfvvcwcgf0m0m.jpg.thumb.jpg

    181303moo7zhsitp3tsxso.jpg.thumb.jpg

    额。。这样滑块就搭好了
    181300lqqqiiyv7xxx3xpo.jpg.thumb.jpg

    拿两根0808*312的单孔梁刚好能穿过滑块

    接下来我们来搭齿条
    由于我们这个自动爬楼梯小车比较智能,能够适应不同高度的楼梯,所以我们的滑轨和齿条都要准备的长一点,既然滑轨都有312mm那么长了,齿条肯定不能短
    181259impnrssrwst43vp0.jpg.thumb.jpg
  • TA的每日心情
    可爱
    2017-8-1 12:46
  • 2

    主题

    7

    帖子

    79

    积分

    初级学士

    Rank: 2

    积分
    79
    发表于 2017-8-8 13:19:07  | 显示全部楼层
    所以我使用了4段齿条拼接起来,至于为什么上面的材料图片中有一根312的单孔梁呢,这是有原因的。光靠齿条拼接的话在升降过程中齿条与齿条之间的连接处会弯,这一弯齿轮和齿条的啮合就出问题了,哒哒哒滑齿了。至于为什么我会发现这个问题呢,这个就不解释了,说多了都是泪。所以我们要把齿条固定在这根单孔梁上。如下
    181257nmzi3i1i6d5tii8z.jpg.thumb.jpg

    181256n4u6cvmk743ckolx.jpg.thumb.jpg

    181254labpiblw5cnav5zp.jpg.thumb.jpg

    接下来把导轨和齿条固定在一起
    材料如下
    144双孔梁*1
    M4*22螺丝*3
    M4螺母*2
    181251lwet9zroe9lt8azr.jpg.thumb.jpg

    176双孔梁*2
    M4*22螺丝*6
    M4螺母*6
    181249nos4kvsrlptmfrkv.jpg.thumb.jpg
    181248coczuvunan2hd4hz.jpg.thumb.jpg
    装上2号轮子(从动轮)
    使用以下材料
    181243powwc9woooc76p0t.jpg.thumb.jpg

    轮胎*2
    90T同步带轮*2
    螺丝轴*2
    法兰轴承*4
    M4螺母*2
    M3*5无头螺丝*2
    4*2塑料垫片*4
    181239rzekgugg3ah2emqa.jpg.thumb.jpg
    181237g9jvawpwwwafa9bv.jpg.thumb.jpg
    把轮子固定在双控梁的端面
    181236je4orzrxzl32oqz3.jpg.thumb.jpg

    2号轮子和1号升降装置搭建完毕
    接下来搭建4号轮子和2号升降装置
    2号升降装置结构和1号一样
    所需材料也一样
    只不过把032双孔梁固定在下图的位置
    181355sx09k0fuxu0ueevf.jpg.thumb.jpg
  • TA的每日心情
    可爱
    2017-8-1 12:46
  • 2

    主题

    7

    帖子

    79

    积分

    初级学士

    Rank: 2

    积分
    79
    发表于 2017-8-8 13:19:56  | 显示全部楼层
    导轨和齿条的搭建与1号升降装置一样
    上端的连接使用080双孔梁替代144双孔梁
    181346dhz1z9stzaatvnm1.jpg.thumb.jpg

    181341fmztz7xt6i64c6ny.jpg.thumb.jpg
    128双孔梁*1
    M4*22螺丝*6
    M4螺母*6
    181339l11f7yxxe7fpe1qc.jpg.thumb.jpg


    装上L形支架,用
    M4*14螺丝*2
    M4螺母*2
    固定在梁上
    181333ner52r32ogagb18j.jpg.thumb.jpg

    181331tevoc13ckh2k11so.jpg.thumb.jpg


    完成2号升降装置的搭建后就可以开始搭建4号轮子(主动轮)
    所需材料如下
    181329xhlvwkwwiwq6wrwh.jpg.thumb.jpg

    25mm电机*1
    90T同步带轮
    25mm电机支架
    传动固定盘
    M3*5螺丝
    M4*14螺丝
    181326b2gk6nsff2p6rm1h.jpg.thumb.jpg

    套上轮胎,用
    M4*14螺丝*2
    螺母*2
    固定在L形支架上
    181323q11akzk8rvx4ri1d.jpg.thumb.jpg


    完成1、2号升降装置和2、4号轮子搭建,整车结构就完成一半了
    181234llqg3zxmxm4m3bcl.jpg.thumb.jpg

    接下来开始搭建主车架、1号和3号轮子

    首先,把1号轮子(主动轮)搭建好
    轮胎*2
    90T同步带轮*2
    传动固定盘*2
    M4*14螺丝*8
    M4螺母*4
    M3*5螺丝*4
    M3*5无头螺丝*2
    25mm电机*2
    25mm电机支架*2
    064双孔梁*2
    181246c2mxvk6hovv6ov0h.jpg.thumb.jpg

    181233keytsqj7qqqtofwt.jpg.thumb.jpg


    搭建前防撞杠

    181229ggnv9so5sj2zu5um.jpg.thumb.jpg

    160双孔梁*1
    L形支架*2
    M4*14螺丝*4
    M4螺母*4

    181227d1rlhpjfjjfrjrh1.jpg.thumb.jpg


    搭建主车架
    181226izrxkk022s5f9xck.jpg.thumb.jpg
    192双孔梁*2
    防撞杠*1
    前轮*2
    M4*30螺丝*6
    M4螺母*6

    181224lppu392y2iypepeg.jpg.thumb.jpg
    搭建3号轮子(从动轮)
    181222k7lfl0lxyc1xcdpq.jpg.thumb.jpg


    轮胎*2
    90T同步带轮*2
    088单孔梁*2
    法兰轴承*4
    螺纹轴*2
    4*2塑料垫片*4
    螺母*2
    M3*5无头螺丝*2
    181221oldn2hlwry2qqsqx.jpg.thumb.jpg

    使用
    M4*22螺丝*4
    M4螺母*4
    181219tzi1ln538352gzwx.jpg.thumb.jpg

    把3号轮子固定在车架上
    181217dre6ehp9bf9vrvzl.jpg.thumb.jpg

    181216qfqh66wrg1suzx6j.jpg.thumb.jpg
    装上2号升降装置
    181214ezn57knz1ly7kln6.jpg.thumb.jpg
    使用M4*14螺丝*8
    181212rf3yhfyz3vplqpfj.jpg.thumb.jpg

    181211l2f3xyvhluh2vzvv.jpg.thumb.jpg
    装上1号升降装置
  • TA的每日心情
    可爱
    2017-8-1 12:46
  • 2

    主题

    7

    帖子

    79

    积分

    初级学士

    Rank: 2

    积分
    79
    发表于 2017-8-8 13:20:48  | 显示全部楼层
    使用M4*14螺丝*6
    181209u413ggs3oa2hzo61.jpg.thumb.jpg

    181207fq83shbgmc3usy5m.jpg.thumb.jpg
    181204sce22uzoosqq2pms.jpg.thumb.jpg

    由于楼梯宽度有限,轮子又比较大所以只能把轮子错开安装,为了节约搭建时间和材料,4号轮组之用了一个电机和一个轮子



    再安装升级装置的电机
    181203w5t154o5my6b1bty.jpg.thumb.jpg


    37电机(装好电机支架)*2
    18T齿轮*2
    M3*5无头螺丝*2
    M4*8螺丝*4
    调整好齿轮和齿条的距离分别固定在1号、2号升降装置双孔梁的螺纹槽上
    181201o004n5604jniql1e.jpg.thumb.jpg

    181158oh3hh3h7ymzzmssm.jpg.thumb.jpg

    181148v99zz7cq7c089996.jpg.thumb.jpg

    181144c5z9h39l7r9l7lll.jpg.thumb.jpg

    完成机械搭建


    接下来开始安装传感器
    限位开关*1
    181141vhswhsw4pbthatt9.jpg.thumb.jpg

    装在2号升降装置侧面
    181138l69f8cm8nzyzyph9.jpg.thumb.jpg
    限位开关*2
    181133u0lbbi1484cbb8c7.jpg.thumb.jpg

    分别装在1号2号升降装置的梁上。(作用:限制抬升高度)
    181129kwaw00y0iw1wu0zr.jpg.thumb.jpg

    181126bdi6d6znk6x0j8ir.jpg.thumb.jpg
    安装电机驱动
    181119or0ycdbm58qqbrd8.jpg.thumb.jpg


    181116j4jbgt7yydd7z4y4.jpg.thumb.jpg
    安装巡线传感器
    181114ngdfs7smypuibum2.jpg.thumb.jpg

    M4*22螺丝
    4*10塑料圆柱
    4*2塑料垫片*4
    巡线传感器*1
    181113dxn299kbc9vno3j7.jpg.thumb.jpg

    安装陀螺仪
    181111sn2ktth932kkh6n9.jpg.thumb.jpg

    安装超声波传感器
    181109hj04fr0fmfpmk7au.jpg.thumb.jpg

    181107yunft9emnp6ojmuh.jpg.thumb.jpg
    由于超声波模块没办法检测0-30mm的距离,所以放里面去了 让防撞杆去撞楼梯,小车撞上障碍后刚好是30mm多点,顺利检测到(这都是调试后才发现的~_~!!)
    181105y6fc30aj4byfby4a.jpg.thumb.jpg
    安装主控板

    181101z9wn16g1chwcp5n6.jpg.thumb.jpg
    181057xkkdozxd7iaxraof.jpg.thumb.jpg
    181053sdhs3iz9zxrlubx3.jpg.thumb.jpg
    安装适配器(限位开关用)
    181048mnjtjjjnjqhznchj.jpg.thumb.jpg

    181045w7yrs72heywhflqj.jpg.thumb.jpg
    额。。基本上传感器安装好了,现在介绍一下各个整车结构和传感器
    181041v21im9iq1cd2xx7e.jpg.thumb.jpg

    整车从左到右可以按轮子分成4个部分,其中1号轮子和4号轮子是主动轮(驱动轮),2号和3号轮子是从动轮
    180947rq77cr7al0qqja0w.jpg.thumb.jpg
    其中1号和2号升降装置控制2号和4号轮子的位置
    181037vin1arzwrb5e5rez.jpg.thumb.jpg
    181034qvvp9sglnudqntsl.jpg.thumb.jpg
    181032h1rta0e7tigo29z6.jpg.thumb.jpg
    181013f8gs16nw1w5r6si5.jpg.thumb.jpg
    这里加装陀螺仪是因为我们升降装置用的是直流电机,没办法保证车体平衡,所以加入陀螺仪调整电机抬升速度
  • TA的每日心情
    可爱
    2017-8-1 12:46
  • 2

    主题

    7

    帖子

    79

    积分

    初级学士

    Rank: 2

    积分
    79
    发表于 2017-8-8 13:22:18  | 显示全部楼层
    整车图
    181005kp9q98bssqsppgbm.jpg.thumb.jpg

    180959lsz9jidakg9uz2vj.jpg.thumb.jpg
    180954v3f2lmd1ssmt3elt.jpg.thumb.jpg

    接线图
    181357mj6rzezarm6owrsl.jpg.thumb.jpg


    代码如下:#include "MeOrion.h"
    #include

    MeGyro gyro;
    MeDCMotor lifer1(PORT_1);  //升降1
    MeDCMotor lifer2(PORT_2);  //升降2
    MeDCMotor rw(M2);  //1号驱动轮
    MeDCMotor fw(M1);  //4号驱动轮
    MeLineFollower lineFinder1(PORT_7);  // 巡线
    MeLimitSwitch upWard1(PORT_3, SLOT2);  // 1号升降限位开关
    MeLimitSwitch forWard2(PORT_4, SLOT1);   // 4号轮子限位开关
    MeLimitSwitch upWard2(PORT_4, SLOT2);  // 2号升降限位开关
    MeUltrasonicSensor ultraSensor(PORT_8);  // 1号轮子超声波

    void setup()  // 初始化,前后升降装置回收
    {
      Serial.begin(9600);  
      gyro.begin();
      lifer1.run(-250);
      while (!upWard1.touched());
      lifer1.stop();
      lifer2.run(-250);
      while (!upWard2.touched());
      lifer2.stop();
    }



    void Step2()
    {
        float p = 15;
        float i = 0.01;
        float angle = 0;
        float targetAngle = 0;
        float integration = 0;
        float err = 0;

        while (NotStop())
        {
            gyro.update();
            float angle = gyro.getAngleX();
            err = angle - targetAngle;
            integration += err;

            int speed1 = 200;
            int speed2 = 200;

            speed2 = speed1 + err * p;// + integration * i;

            lifer1.run(speed1);
            lifer2.run(speed2);
            //delay(10);
        }
        lifer1.stop();
        lifer2.stop();
    }

    int startTiming = 0;
    unsigned long startTime = 0;

    int NotStop()
    {
        int16_t distance;
        distance = ultraSensor.distanceCm();
        delay(10);
        if (0 == startTiming)
        {
            if ((distance < 10) && (distance > 1))
            {
                return 1;
            }
            else
            {
                startTiming = 1;
                startTime = millis();
                return 1;
            }
        }
        else
        {
            unsigned long currentTime = millis();
            if (currentTime - startTime < 2500)  //超声波检测不到楼梯后延时2.5秒
            {
                return 1;
            }
            else
            {
                return 0;
            }
        }
    }


    void loop()
    {
      startTiming = 0;
      startTime = 0;
    //阶段1 小车前进
      fw.run(60);  
      rw.run(60);  //1号 4号轮子推动小车前进

      int16_t distance;
      do
      {
          distance = ultraSensor.distanceCm();
          delay(10);
      }
    //阶段2 碰到楼梯 主动轮停止 整体车架上升
      while (!((distance < 4) && (distance > 1)));  //如果碰到楼梯

      fw.stop();
      rw.stop();
      Step2();
    //阶段3 1号 4号轮子推动小车前进
      fw.run(60);
      rw.run(60);
    //阶段4 2号轮子巡线传感器检测到楼梯 主动轮停止 升降装置1把2号轮子收回去
      while (!(lineFinder1.readSensors() != S1_IN_S2_IN));
      lifer1.run(-250);
      fw.stop();
      rw.stop();

      while (!upWard1.touched());  //1号升降限位开关检测升降结束
      lifer1.stop();

      Adjust();
    //阶段5 1号 4号轮子推动小车前进  
      fw.run(60);
      rw.run(60);
    //阶段6 4号轮子限位开关检测到4号轮子碰到楼梯 主动轮停止 2号升降装置回收4号轮子
      while (!forWard2.touched());
      lifer2.run(-250);
      fw.stop();
      rw.stop();

      while (!upWard2.touched()); //1号升降限位开关检测升降结束
      lifer2.stop();
    //阶段7 循环阶段1  
    //阶段8 循环阶段2  
    }

    void Adjust() //陀螺仪控制1、2号升降电机控制平衡
    {
        int p = 40;
        //float i = 0.05;
        float angle = 0;
        float targetAngle = 4;
        //float integration = 0;
        //float err = 0;

        do
        {
            gyro.update();
            angle = gyro.getAngleX();
            //err = (angle - targetAngle);
            //integration += err;
            lifer2.run((angle - targetAngle) * p);// + i * integration);
            //delay(10);
        }
        while(fabs(angle - targetAngle) > 1);

        lifer2.stop();
    }

















    181123kkk1d202de5n4pv2.jpg.thumb.jpg
    181152ht51wwbwbkbkbw1w.jpg.thumb.jpg
    181155di9zic29lzui9guo.jpg.thumb.jpg
    181231eka7wgoopk7wang4.jpg.thumb.jpg

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

    本版积分规则

    快速回复 返回顶部 返回列表