x资金充值
畅学电子网支付宝充值
充值最小金额:10元
  • 李克强仁显“人民总理为人民”基因血性!—吴建勋的博客—强国博客—人民网 2019-08-15
  • 女性之声——全国妇联 2019-08-15
  • 山西太原:巧手大妈社区包爱心粽 粽香传爱庆端午 2019-08-11
  • 九成AI企业亏损:人工智能遭遇商业落地之痛 2019-08-08
  • 《智者有言》第三期 邓中翰:破“缺芯”困局 要占领产业“无人地带” 2019-08-08
  • 想家了!红红火火迎新年 青城呼和浩特年味十足 2019-08-07
  • 日本大阪6.1级地震 镜头记录事发那一刻 2019-08-07
  • 泛海助学行动获第十二届人民企业社会责任奖年度案例奖 2019-08-05
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就 2019-08-05
  • 在知识分子、劳动模范、青年代表座谈会上的讲话 2019-08-05
  • 推进国防和军队现代化 2019-08-04
  • 蚂蚁金服向行业全面开放“定损宝” 2019-08-02
  • 宁夏科技馆科普“粽”宴等你来 2019-08-02
  • 宜春:烈日炎炎赛龙舟 “晒”出交警好警容(图) 2019-07-27
  • 歪歪楼视频来了 重庆百米高楼歪而不倒 2019-07-27
  • 开源项目>智能车>两轮自平衡小车

    [开源项目] 两轮自平衡小车

    (审核中,该项目暂时只有您自己可见)

    (该项目未通过审核,只有您自己可见)

    时间:06-23 17:31浏览:46836次
    程序采用的是互补滤波与PID控制,感觉程序还是有一定的问题与改进空间,想着以后慢慢优化。无奈半成品状态后一直无心继续改进,期间还出现了硬盘出现故障,差点所有成果毁灭的事故;虽然作品不是很完美,跟大家共享交流一下。
    资料下载
    附件:两轮自平衡小车资料.rar
    立即下载 文件大?。?.53 MB

    最新下载( 下载次数:644次 )

    • 兜瑞米饭
    • xinshushu
    • ZHAOCHUAN
    • 算法机械狗
    • 拐角处的回眸
    • 小时SSN
    • fghhj
    • yayarong
    • 面具丑恶
    • Producer

    分享到:

    详细介绍

    连码专家 六肖复式连 www.clexh.tw 一、前言

      好多年前,看到电视新闻上介绍segway,很是惊叹。然后大概是2、3年前吧,看到网上有人做出了2轮自平衡小车,然后我也很想自己也做一个来玩。无奈于自己的水平有限,对硬件一窍不通,动手能力有限,故也没有做成。(那时候的加速度传感器还是每个ic一个维度的,不像现在的MPU6050一个ic就集成了6个输出量,对电路设计和手工焊接能力要求都挺高的)。
      去年的时候吧,网上发现出现了很多加速传感器的集成???,cortex-m3风头正盛,自己工作也算比较稳定清闲,感觉时机成熟了,便开始了两轮自平衡小车的制作,到去年底大概成型。程序采用的是互补滤波与PID控制,感觉程序还是有一定的问题与改进空间,想着以后慢慢优化。无奈半成品状态后一直无心继续改进,期间还出现了硬盘出现故障,差点所有成果毁灭的事故;虽然作品不是很完美,跟大家共享交流一下。

    成品效果图:

    二、硬件选择与方案设计

      胶枪、电转、电表等耐用品工具的价格不计算在内,下列原件总共花了我大概450元吧。无意给淘宝商家做广告,所以请大家自动略过图片中的商家logo。

    1. 控制板采用原子的STM32 MINI开发板,不带屏的话138元吧。??厥褂冒迳系暮焱饨邮掌?,当然理论上也可以使用板上的rf无线??榻涌?。



    2. 方位传感器采用iic接口的9轴???,花了我88大洋。包括加速度、角速度、气压、地磁传感器,主要是考虑到以后别的用途,如果采用6轴??榈幕?,应该可以降到50元以内吧。
      自平衡小车需要使用到1个角速度分量和2个加速度分量,通过融合滤波得到较为准确的小车倾斜角度值。查看网上几年前的小车,都是使用3个独立ic搭建的,而且还是使用模拟量输入;查找网上资料,现在都是集成ic,接口主要有spi和iic,而且还有中断输入。我买的这个??橹挥衖ic接口,而且没有中断输出,iic接口,故只能采用周期性查询方式;加速度传感器采用的是ADXL345,角速度传感器采用L3G4200D,这两个ic的手册资料是比较齐全的,便于学习。



    3. 采用9v减速电机与铝合金支架、轮胎,指导价格98元。卖家给的资料有限,电机的参数不明,减速比都是自己测的。
      经过实测,电机的减速比大概为150。感觉小车的力矩还是比较大的,但是反应速度不够快;采用减速比100的电机或是大轮胎,应该能够改善小车的动力性能。电机有两个电源输入端口,通过改变电压的正负极,可以改变电机的转动方向;通过改变驱动电压的大小,可以改变电机的转速。




    4. 电机驱动??椴捎萌衾氲腖298N驱动板,抗干扰,30元。如果不是光耦隔离的话会便宜很多。卖家给的实物和照片不太一样,有一条pwm控制线5v有效,3.3v无效,说明商家卖出之前没完整的做过测试。我自己并了个电阻搞定了,也便没有跟卖家纠缠了。
      ??橛?个逻辑控制输入端口,接控制器的4个io口,控制2个电机的转向与停止;2个pwm输入,接控制器的pwm输出,控制2个电机的转速;1个逻辑电源输入接口,从stm32控制板上取电。驱动部分,2个电源输入端口,接聚合物锂电池,考虑到5v稳压??榇拥绯厝〉?,减速电机又是9v的,建议采用9v以上的电池(我采用的是12v);4个驱动输出接2个减速电机的4个输入口。



    5. 电池采用12v 3000mah的聚合物锂电池,65大洋,不包括充电器的价格。恒定放电电流可达4A,瞬间可达40A。不知道用9v的电池可不可以,当时怕电压太小,所以就没有买。据说普通的电池不能用在小车上,因为电机的瞬间电流很大,普通电池无法提供。



    6. 逻辑电路5V供电???,采用LM2596降压??榇?2v锂电池取电,6元。
      该??榈氖涑龅缪箍傻?,我调整到了5v输出。



    7. 测速码盘,1个18元。
      为了省钱省地方,我只用了1个,有了这个就可以得到电机的速度反馈,再通过控制调整小车的速度、位置。小车的动力部分其实不一定要使用减速电机,而可以使用步进电机,这样就可以省掉编码器,而且控制性能更加良好。但这样带来的是需要采用专门的步进电机控制板,还有成本的攀升。不差钱的同志可以考虑采用步进电机方案。



    8. 铜柱、洞洞板、连接线等若干。

    三、 STM32F103RBT6 资源的使用:

    (一)控制小车需要的端口如下:

    1、2个pwm输出,用于控制2个电机的转速,我们用pwm1和pwm2表示。在此使用定时器0的两个pwm输出端口PA0和PA1。
    2、4个数字gpio输出,用于控制2个电机的正方转与停止,我们用motor1-1、motor1-2、motor2-1和motor2-2表示。
    3、1个数字gpio输入,用于接收红外??仄鞣⒊龅男藕?,我们用ir表示。
    4、2个iic模拟gpio端口,用于控制获取9轴??榈氖?,我们用iic-scl和iic-sda表示。
    5、2个编码器信号输入接口。每个编码器需要2个接口,我只使用了1个编码器,故需要2个端口。使用了定时器4的编码器模式,故需连接到定时器4的t4ch1和t4ch2端口。

      以上端口共11个。为了减少和板上资源的冲突,使板上的SD卡、FLASH和EEPROM等可以同时使用,11个端口经过尽心挑选,比如ir使用跳线连接到了PC1,使用与FLASH、SD卡同一个模拟iic端口等。当然,也牺牲了一些板上的功能,如:触摸屏、WK_UP按键等。如果要使用2个编码器的话,可以考虑另外使用定时器1的t1ch1和t1ch2端口或者是t1ch1n和t1ch2n。通过一定的编程技巧,理论上可以使液晶屏能够显示图像,同时不影响2个编码器的使用。

    (二)板上资源的使用:

      开发板所使用的芯片采用64管脚封装,51个可用IO。
    51个IO包括:PA 0-15、PB 0-15、PC 0-15、PD 0-2。板上io的使用情况与小车io对应情况如下(加*标志的表示楼主“尽量”不去占用的io端口,避免与板上资源冲突):


    PA0 -WK_UP/温度传感器  ---------------------- pwm1
    PA1 -红外传感器/JF24_FIFO*  ------------------ pwm2
    PA2 -FLASH_CS/U2TX*
    PA3 -SD_CS/U2RX*
    PA4 -SPI1_NSS/NRF_CE/JF24_RST
    PA5 -SPI1_SCK
    PA6 -SPI1_MISO
    PA7 -SPI1_MOSI
    PA8-LED0*  ------------t1ch1
    PA9-串口1RX* ----------t1ch2
    PA10-串口1TX*
    PA11-USB_D- -------------------
    PA12-USB_D+ --------------------
    PA13-KEY0/JTAG/SWDIO/SP2*
    PA14-JTAG-----------------------
    PA15-KEY1/JTAG/PS2*

    PB0~15-液晶数据端口
    PB6   ------------t4ch1
    PB7   ------------t4ch2
    PB13  ------------t1ch1n
    PB14  ------------t2ch2n

    PC0 -T_SCK ---------- motor2-1
    PC1 -T_PEN ---------- ir
    PC2 -T_MISO --------- motor1-2
    PC3 -T_MOSI --------- motor1-1
    PC4 -NRF_CS  JF24_CS
    PC5 -NRF_IRQ JF24_BKT
    PC6 -LCD_RD*
    PC7 -LCD_WR*
    PC8 -LCD_RS*
    PC9 -LCD_CS*
    PC10-LCD_BL*
    PC11-IIC_SDA ------------------------------- iic-sda
    PC12-IIC_SCL -------------------------------- iic-scl
    PC13-T_CS/侵入检测/RTC输出* ----------- motor2-2
    PC14-RTC晶振*
    PC15-RTC晶振*

    PD0 -系统晶振*
    PD1 -系统晶振*
    PD2 -LED1*

    可以输入模拟量的io:PA0-7,PB0-1,PC0-5

    四、主程序框架

      其实一开始是想使用rt-thread操作系统的,不过这样以来就增加了程序的复杂性了。程序处于调试阶段,还是老老实实的使用大循环吧。帖几段伪代码,还有一些注释,作为程序框架的介绍。
    ----------------------------------------
    int main(void)
    {
        ~~~~//各种系统资源的初始化
        while(1)
        {
            if(tick_flag)// SysTick时钟中断每10ms使tick_flag置1。
            {//大部分程序都采用10ms的控制周期,不过也可以考虑更高的控制频率,毕竟cortex-m3的运算能力比起前人的51、avr强太多了。
                tick_flag = 0;
                balance_proc();//根据9轴??榈氖?,PID调整pwm的输出
                control_proc();//读取ir输入,调整pwm的输出
            }
        }
        return 0;
    }
    ----------------------------------------
    void control_proc(void)
    {
    //----------??仄鞣蠢】刂撇糠?---------
        int i = ir_key_proc(); // 将红外接收到的按键值,转换为小车控制的相应按键值。

        switch(i)
        {
            ~~~~//根据按键值,修改pwm_speed和pwm_turn的值。
        }

        pwm_turn *= 0.9; // pwm_turn的值以0.9的比例衰减,使小车在接收到一个转向信号后只转动一定的时间后停止转动。


    //----------编码器反馈控制部分----------
        speed = speed*0.7 +0.3*(encoder_read()); // 定周期(10ms)读取编码器数值得到实时速度,再对速度进行平滑滤波
        encoder_write(0);       // 编码器值重新设为0

        distance += speed;       // 对速度进行积分,得到移动距离

        if(distance>6000) distance = 6000;   // 减少小车悬空、空转对控制的影响
        else if(distance<-6000) distance = -6000;

    }

    ----------------------------------------

    void balance_proc(void)
    {
        static unsigned int err_cnt=0;

        int pwm_balance;
        float radian, radian_pt;   // 当前弧度及弧度的微分(角速度,角度值用弧度表示)


        adxl345_read(&acc);   // 读取当前加速度。由于传感器按照的位置原因,传感器的值在函数内部经过处理,变为小车的虚拟坐标系。
        l3g4200d_read(&gyr);  // 读取当前角速度。同样经过坐标系变换。


    // 此段程序用于传感器出错时停止小车
        err_cnt = err_cnt*115>>7; // err_cnt以0.9的比例系数衰减(115>>7的值约为0.9,避免浮点数,提高速度)
        if(acc.flag != 0x0F || gyr.flag != 0x0F)   // 读取的角度、角速度值有误??赡苁堑绱鸥扇?、iic线太长等导致出错。
        {
             LED0_ON();  // 亮红灯
             err_cnt +=100; // 等比数列,比例系数0.9(115>>7),常数项100;根据公式,连续10项的和约为657
             if(err_cnt>657) goto err; // 当连续发生约10次(约0.1秒)错误则超过657而溢出。
        }


    // 此段程序用于倒立或失重时停止小车
        if(acc.z<=0)
        {
             goto err;
        }


    // 小车的虚拟x轴方向为小车前进方向,虚拟y轴为小车左边,虚拟z轴为小车上升方向。
    // 前倾角度为负,后倾角度为正。
    // 通过计算加速度分量,得到小车倾斜弧度(未滤波)
        radian = (float)(acc.x)/acc.z; //  一阶展开:Q =f(x)=x-x^3/3+x^5/5+...+(-1)^k*x^(2k+1)/(2k+1)+...
    // 通过角速度传感器,得到小车的角速度(单位为 弧度/秒)
        radian_pt = gyr.y*RADPT;
        radian_filted = ofme_filter(radian_filted, radian, radian_pt);  // 互补滤波得到小车的倾斜角度

    // 此段程序用于小车倾斜角度过大时,停止小车
        if(radian_filted> ANGLE_RANGE_MAX || radian_filted<ANGLE_RANGE_MIN)
        {
             goto err;
        }

    // 通过PID计算,得到保持小车角度为零所需要的电机pwm输出
        pwm_balance = pid_proc(&sPID, radian_filted, radian_pt);
    //小车角度为零不代表小车重心为零,还需要通过小车移动速度与移动距离等信息,调整小车平衡所需的pwm输出
        pwm_balance += (speed*6+distance*0.1);

    // 在pwm_balance的基础上,加上速度分量与转动分量,调整小车两个电机的转速。
        pwm_control(pwm_balance+pwm_speed+pwm_turn, pwm_balance+pwm_speed-pwm_turn);

    // 如果pwm超出有效值,红灯亮。用于调试,了解系统状态。
        if(pwm_balance>=1000||pwm_balance<=-1000) LED1_ON();
        LED0_OFF();
        return;
    err:
        puts("balance error.\r\n");
        pwm_control(0, 0);       // 关闭电机
        return;
    }

    ----------------------------------------
    程序列表说明:

     

     

    已有20条评论

    • 尘影
      尘影04-20 09:47

      为什么下载不了

    • shine23
      shine2311-26 09:24

      666666666

    • HAHP
      HAHP08-18 15:47

          回复 凯瑞:您好,今年我做自平衡的车,可是最后没能得到有效的指导,自平衡一直没有实现??梢缘幕?,您可以指导一下我吗?谢谢了

    • HAHP
      HAHP08-18 15:45

          回复 中国汉字:你在做飞思卡尔?

    • 智能硬件Jeo
      智能硬件Jeo05-27 09:29

      我最近在做这个小车,但是出现的现状就是站立的平稳,但是给它一个扰动的时候就会向一个方向加速运动倒下,不知道是什么原因,调了好长时间的参数,都是这个效果。求大神指点一下。

    • 中国汉字
      中国汉字11-17 13:00

          回复 凯瑞:我的QQ1319540839 我想做平衡小车

    • 中国汉字
      中国汉字11-17 12:59

          回复 凯瑞:你参加过飞思卡尔?

    • 第二仲
      第二仲10-09 20:17

      初学,继续深造

    • Princeb
      Princeb09-30 00:20

      有意思啊

    • 西点
      西点09-07 21:16

      做的不错呀?。。?!赞一个

    • 小嗡嗡
      小嗡嗡08-11 16:46

      飞思卡尔比赛的直立车都已经跑的飞快了~~

    • 3w之王少
      3w之王少08-04 23:51

      不会是国赛题吧?。??

    • ljy00199
      ljy0019904-30 20:11

          回复 凯瑞:这个还是看不懂,求教

    • 凯瑞
      凯瑞04-16 08:40

      我做过飞思卡尔的平衡车比赛,有需要的话可以找我交流

    • 夜未央
      夜未央03-11 19:23

      牛逼!

    添加一条评论

    只有登录用户才能评论,请先登录注册哦!

    项目分享者

    永不止步步
    金币:67265个|学分:209605分

    立即注册
    畅学电子网,带你进入电子开发学习世界
    专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

    x

    畅学电子网订阅号

  • 李克强仁显“人民总理为人民”基因血性!—吴建勋的博客—强国博客—人民网 2019-08-15
  • 女性之声——全国妇联 2019-08-15
  • 山西太原:巧手大妈社区包爱心粽 粽香传爱庆端午 2019-08-11
  • 九成AI企业亏损:人工智能遭遇商业落地之痛 2019-08-08
  • 《智者有言》第三期 邓中翰:破“缺芯”困局 要占领产业“无人地带” 2019-08-08
  • 想家了!红红火火迎新年 青城呼和浩特年味十足 2019-08-07
  • 日本大阪6.1级地震 镜头记录事发那一刻 2019-08-07
  • 泛海助学行动获第十二届人民企业社会责任奖年度案例奖 2019-08-05
  • 四大名著剧组首次同台忆往事 经典影视剧如何铸就 2019-08-05
  • 在知识分子、劳动模范、青年代表座谈会上的讲话 2019-08-05
  • 推进国防和军队现代化 2019-08-04
  • 蚂蚁金服向行业全面开放“定损宝” 2019-08-02
  • 宁夏科技馆科普“粽”宴等你来 2019-08-02
  • 宜春:烈日炎炎赛龙舟 “晒”出交警好警容(图) 2019-07-27
  • 歪歪楼视频来了 重庆百米高楼歪而不倒 2019-07-27
  • 中国体彩网网络服务协议 北京pk计划软件三码 华东六省十五选五 安徽十一选五走势 360江西时时走势图 深圳36选7走势图 云南福利彩票走势图 2018年最快香港开奖结果 辽宁风彩了5选7走势图 广东36选7好彩1走势图