搜索
bottom↓
回复: 63

DIY两轮小车全部开源(PCB+程序+......)超长~~~

  [复制链接]

出0入0汤圆

发表于 2014-12-11 15:27:18 | 显示全部楼层 |阅读模式
本帖最后由 生来孤独 于 2014-12-11 17:32 编辑

http://v.youku.com/v_show/id_XODQ2NTIzNTky.htmlhttp://v.youku.com/v_show/id_XODQ2NDgzMjEy.htmlhttp://v.youku.com/v_show/id_XODQ2NDgwNTYw.html前段时间DIY了一辆两轮平衡小车,感觉挺有意思。很多资料都是参考的其他大神的,本着受益于开源,回馈于开源的精神。现在也把自己的做品拿出来晒晒!

故事很长,不想听的建议倒着看~~~

//********************************************************************************************************//
大二的时候就想做一辆平衡小车玩,那时刚刚学习STM32基本上编程也是瞎搞的,很多都是直接copy  瞎改,效果可想而知  ....... 后来也不了了之放弃了   

附当时图片两张:

之后就没有再考虑平衡车,知道自己渣,做不出来~~~~~

转眼暑假,没有回家,留在学校里参加暑假的大学生电子科技比赛(TI杯),那时选择了个寻找铁疙瘩的题目~~~ 说起来比较简单了呐~~~就**的个传感器,跟循迹一样的原理但没做好~~~最痛苦的是接线,用了好多的杜邦线,乱七八糟的几十根有的~~
搞到 最后看到电线头都大了~~~
再来一张~~

暑假过后自己也没有回家,然后就在寝室里上上网,看看书,打打游戏,出去打打篮球等~~
最重要的是学习绘制电路板,,,,,开始安装了protle99,,,越用月感觉不对劲儿~~后查了查安装了Altium Designer14  之后就是宅寝室浑浑噩噩的看视频,照着比划了~~~~
当时自评价自己的一句话就是 忙忙碌碌却又碌碌无为~~~~(一个人挺伤感的...)


俗话功夫不负有心人自己画了自己的第一块板子---------STM32F103  64引脚的最小系统板


下面进入正题


先展示一张成品图吧:


主控芯片选用       STM32f103RBT6
电机驱动选用      东芝TB6612
传感器模块选择        MPU6050
蓝牙模块   (能连上就行)
电源供电 12V——(7805)——5V——(1117)——3.3V

然后就是设计板子外形尺寸然后布线

上面是控制板,还有一块电源板子,用于把12V电源稳压到5V 然后输送过来,另一方面为了给小车起到支撑作用,图就不上了,最后我会把工程上传上来的。

然后是还能接电路,为了焊好这东西自己也是蛮拼的,之前先买了一些焊接贴片元件的板子,用来练手。之后为了焊接QFN封装的芯片,还买风枪和一些QFN封装的芯片的模块,拆了焊焊了拆的~~~终究也是练到了好的技术
晒晒自己手工焊好的板子吧!!!!


哇哈哈,感觉很有成就感啊~~~~

再说一下电机和电池(排除广告嫌疑~~~~)


下面开始扯一下程序算法~!!!!!!
控制算法:

1.倾角环                        得到t时刻的小车平面 和 地理水平面的夹角(正负偏差) +        此夹角                                的变化速度
2.车速环                        得到小车整体的运动速度                得到小车的位移量

3.PWM输出                左右电机通过PWM驱动TB6612控制输出

定义变量:
Angle_err                小车平面和地理平面的角度偏差
Angle_Gyro                小车角度变化的速度        (角度偏差的变化速度【Gyro 陀螺仪】)
Moto_Speed_L        小车左边电机的速度
Moto_Speed_R        小车右边电机的速度
Moto_Disp_L                小车左边电机的位移
Moto_Disp_R                小车右边电机的位移


核心计算公式:
PWM_L =  (Kp_1 * Angle_err + Kd_1 * Angle_Gyro) +
(Kp_2 * Moto_Disp_L + Kd_2 *Moto_Disp_L)


PWM_R =  (Kp_1 * Angle_err + Kd_1 * Angle_Gyro) +
(Kp_2 * Moto_Disp_R + Kd_2 *Moto_Disp_R)


核心代码注释:
void IMU_GetAngle_Now_(float *Ang)
{

        float Angle_1;                                
        float Angle_2;
        short acc[3];                                                                存放加速度数据  0,1,2, 对应  XYZ
        short gyro[3];                                                                存放陀螺仪数据        0,1,2  对应 XYZ

        MPU6050ReadAcc(acc);                                        读取传感器的XYZ轴的加速度分量AD
0~2`16
        Angle_1 = atan((acc[0]*1.0f) / (acc[2]*1.0f));        Angle_1 计算当前的角度值 反正切
        Angle_1 = (Angle_1 * 180 ) / 3.14 ;                        反三角函数计算得到的是弧度制,抓换为                                                                                        角度值
        MPU6050ReadGyro(gyro);                                        得到传感器的角速度 (通过陀螺仪)

        Gyro += ( -gyro[1] / 16.4f )*0.02 ;                                AD值 转换为角度值 计算原理参见传                                                                                        感器数据手册
转换为角度值后进行积分处理0.02为积        分采样时间20ms

        Angle_2 = 0.98 *  Gyro + 0.02 * Angle_1;                角度的低通滤波,以消除震动和干扰误差

        Gyro = Angle_2 ;                                                                              防止陀螺仪误差积分漂移
        Ang[0] = Angle_2+3.18;                                                Ang0】 当前偏差角度  + 3.18 传感器                                                                                        安装偏差(零偏)
        Ang[1] = (-gyro[1] / 16.4f) * 0.01;                                纠正陀螺仪方向 返回角速度
}
滤波效果图:(说真的,没搞懂卡尔曼滤波~~~~~这个效果也不差,还简单)



绿色 加速度计算角度   黄色 低通输出曲线                红色 陀螺仪跟踪曲线

输入参数 当前角度   角速度
输出参数        void
void IMU_Control_Gyro4(float Angle ,float Gyro)
{
        static int speed[9] ;
        int Left , Reght ;

        if(Angle > -45 && Angle < 45)                        当前角度情况判断
        {
                //得到 速度 和 位移
                //speed[0]           speed_L                左边速度         
                //speed[1]   speed_R                右边速度
                //speed[2]  
                //speed[3]
                //speed[4]    speed_move_L        位移L
                //speed[5]         speed_move_R        
                MOTO_Get_Speed2(speed);        
                //直立
                Left = Angle * 75 + Gyro * 75 ;               
                Reght = Angle * 75 + Gyro * 75 ;        
                //叠加速度位移控制
                speed[7] = speed[4] * 2.0 + speed[0] * 28 ;
                speed[8] = speed[5] * 2.0 + speed[1] * 28 ;
                //对叠加的速度位移控制做平滑输出处理
                speed[7] *= 0.09 ;
                speed[8] *= 0.09 ;
                //直立控制和平滑后的速度位移控制相叠加
                Left += speed[7] ;
                Reght += speed[8] ;
                //PWM通过电机驱动模块输出到电机
                TIM3_Pwm_Set(Left,Reght);
        }
        else
        {
                NC = 0 ;                                关闭电机
                LED1 = !NC ;                        LED关闭   
        }
}








void MOTO_Get_Speed2 (int *V)
{
        int I_ = 1000 ;
        //得到计数器值
        V[0] =  TIM_GetCounter(TIM2);                        //A0                        
        V[1] =  TIM_GetCounter(TIM1);                        //A12                        
        //计数器清零,准备下一次采样
        TIM_SetCounter( TIM1,0);                /
        TIM_SetCounter( TIM2,0);
        //由电机当前的驱动方向,判断电机转动方向的正负,进而判断速度的正负
        if(AIN_1==1)
                V[0] = -V[0] ;
        if(BIN_1==1)
                V[1] = -V[1] ;        
        //对速度做平滑处理,类似之前的角度处理方法
        V[0] = V[2] * 0.7 + V[0] * 0.3 ;
        V[1] = V[3] * 0.7 + V[1] * 0.3 ;

        V[2] = V[0] ;
        V[3] = V[1] ;
        //左右车轮取平均值输出 使其做直线运动  V4】当前的车速
        V[0] = ( V[0] + V[1] ) / 2 ;
        V[1] = V[0] ;
        //速度累加 的到位移  左右车轮的位移
        V[4] += V[0] ;        
        V[5] += V[1] ;
        //对位移(积分)的饱和处理 防止误差积分偏移过远 造成速度位移控制的不稳定
        if(        V[4] < -I_)        V[4] = -I_ ;
        if( V[4] > I_ )        V[4] =  I_ ;
        if( V[5] < -I_) V[5] = -I_ ;
        if( V[5] > I_ ) V[5] =  I_ ;
        //增加小车的位移控制量 前进 后退 左转 右转
        V[4] = V[4] + MOTO_SPEED_L ;
        V[5] = V[5] + MOTO_SPEED_R ;
}





void TIM3_Pwm_Set(int LL,int RR)
{
        **************************************************
        if(RR<0)
                AIN_1=1,AIN_2=0;
        else
                AIN_1=0,AIN_2=1;

        if(LL<0)
                BIN_1=1,BIN_2=0;
        else
                BIN_1=0,BIN_2=1;
        **************************************************
        LL = abs(LL)+25;                        增加控制死区
        RR = abs(RR)+25;

        if(LL>=999) LL=999;                控制饱和处理
        if(RR>=999) RR =999;

        TIM_SetCompare2(TIM3,LL);                电机对应的PWM通道输出
        TIM_SetCompare1(TIM3,RR);
}

中断判断标志位:

if(TIM4_IMU)
                        {
                                IMU_GetAngle_Now_(IMU);
                                IMU_Control_Gyro4(IMU[0],IMU[1]);
                                 TIM4_IMU=0;
                        }

最后再上一张示意图,,,,,有点抽象,自己画的

嗯,,,,,,,,,该说的都说完了~~~  上电,烧程序,小车跑起来了~~~
下面2楼上传视频和工程代码.........(不要和我抢!!!!!)





关于遥控,自己只做了按键的控制,没有再做6050的姿态控制,本打算通关按键切换控制模式,既可以按键控制也可以6050姿态控制(类似空中鼠标把),后来事情有点多,拖一拖,回头再弄,大体上已经完成!!!!小车一些参数可能还要再细细调一调!!!!!



画了多少钱????
八九百吧~~~~~乱七八糟的,打板子画了400大样,有很多设计废的~~~~     买芯片什么的,差不多就是这个数!!!不过感觉还是很值得的!!!远比要买一个现成的划算得多!!


写的哼乱啊啊~~~
资料在七楼和十楼!!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2014-12-11 15:30:46 | 显示全部楼层
很多图片都看不到

出0入0汤圆

发表于 2014-12-11 15:30:54 | 显示全部楼层
你说你是多想被XX啊

出0入0汤圆

发表于 2014-12-11 15:33:02 | 显示全部楼层
你的图片挂了

出0入0汤圆

发表于 2014-12-11 15:33:18 | 显示全部楼层
谢谢LZ的分享哈,不过貌似图全挂了。。。

出0入0汤圆

发表于 2014-12-11 15:34:59 | 显示全部楼层
本帖最后由 zjk 于 2014-12-11 15:38 编辑

LZ换个图库吧

出0入0汤圆

 楼主| 发表于 2014-12-11 15:50:39 | 显示全部楼层
工程文件:

遥控好像暂时上传不了了~~~视频太大,上传到优酷待审核中

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-12-11 15:52:20 | 显示全部楼层
zjk 发表于 2014-12-11 15:33
谢谢LZ的分享哈,不过貌似图全挂了。。。

是吗????? 我再看看

出0入0汤圆

发表于 2014-12-11 15:55:53 | 显示全部楼层
生来孤独 发表于 2014-12-11 15:52
是吗????? 我再看看

你的图片直接从QQ空间上复制链接过来的,被屏蔽了,把图片直接上传到论坛吧。你自己可能发现不了,用另一个浏览器,或另一个电脑,也许就发现问题了。

出0入0汤圆

 楼主| 发表于 2014-12-11 15:56:27 | 显示全部楼层
生来孤独 发表于 2014-12-11 15:52
是吗????? 我再看看

遥控程序和遥控PCB与原理图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-12-11 15:57:17 | 显示全部楼层
zysblog 发表于 2014-12-11 15:55
你的图片直接从QQ空间上复制链接过来的,被屏蔽了,把图片直接上传到论坛吧。你自己可能发现不了,用另一 ...

谢谢,提醒,阿莫就没有个截图的工具吗

出0入0汤圆

发表于 2014-12-11 15:58:05 | 显示全部楼层
图片几乎全挂了

出0入0汤圆

发表于 2014-12-11 15:59:54 | 显示全部楼层
生来孤独 发表于 2014-12-11 15:57
谢谢,提醒,阿莫就没有个截图的工具吗


给你个超级好用的截图工具:FSCapture .该软件支持滚动屏幕截图,非常强大,截完图后,可以进行简单编辑。阿莫论坛,应该不支持编辑状态下截图,没发现。

出0入0汤圆

发表于 2014-12-11 16:05:25 | 显示全部楼层
你的图挂了

出0入0汤圆

发表于 2014-12-11 16:11:56 | 显示全部楼层
真的不错,也在做类似的东西,

出0入0汤圆

发表于 2014-12-11 16:15:54 | 显示全部楼层
赞赞赞赞赞赞赞赞,,,,很不错,生命在于折腾。。。。。。。

出0入0汤圆

发表于 2014-12-11 16:18:37 | 显示全部楼层
相当赞~如果能再编辑一下就好了,看着很乱感觉

出0入0汤圆

发表于 2014-12-11 16:29:02 | 显示全部楼层
哈哈,TI的那个金属探测是吧我黑龙江的也做了

出0入0汤圆

发表于 2014-12-11 16:29:40 | 显示全部楼层
羡慕楼主大学有如此好的宿舍

出0入0汤圆

发表于 2014-12-11 16:34:12 | 显示全部楼层
楼主的皮鞋好酷的样子

出0入85汤圆

发表于 2014-12-11 16:38:45 | 显示全部楼层
不错~~~·

出0入85汤圆

发表于 2014-12-11 16:39:06 | 显示全部楼层
不错~~~~~~~~

出0入0汤圆

发表于 2014-12-11 19:01:52 | 显示全部楼层
楼主电机的广告还是可以做一做的嘛。。。淘宝上有吗?

出0入0汤圆

 楼主| 发表于 2014-12-11 20:21:31 | 显示全部楼层
eva015401 发表于 2014-12-11 16:29
羡慕楼主大学有如此好的宿舍

我们寝室是真个楼栋最差的~~~

出0入0汤圆

 楼主| 发表于 2014-12-11 20:22:02 | 显示全部楼层
Vampireyifeng 发表于 2014-12-11 16:34
楼主的皮鞋好酷的样子

迪卡侬的运动鞋好不好~~~

出0入0汤圆

发表于 2014-12-11 20:41:50 | 显示全部楼层
这电机没霍尔?

出0入0汤圆

发表于 2014-12-11 22:19:21 | 显示全部楼层
顶一把,顺便mark

出0入0汤圆

发表于 2014-12-11 22:35:28 | 显示全部楼层
好东西,这一套大概要多少钱,不做板子,手焊的话,一直想做一个,好久不干电子了,没时间研究啊。。。。

出0入0汤圆

发表于 2014-12-11 22:36:46 | 显示全部楼层
还有一个问题 我没有示波器啊 能做吗

出0入0汤圆

发表于 2014-12-11 22:49:27 | 显示全部楼层
做了一次小车已经对你很熟了!

出0入42汤圆

发表于 2014-12-11 23:40:17 | 显示全部楼层
谢谢分享 ,学习了!

出0入0汤圆

 楼主| 发表于 2014-12-14 11:48:14 | 显示全部楼层
sisia 发表于 2014-12-11 22:36
还有一个问题 我没有示波器啊 能做吗

完全可以的!!!

出0入0汤圆

发表于 2014-12-14 12:10:06 来自手机 | 显示全部楼层
.速度控制不是调pi的吗

出0入0汤圆

发表于 2014-12-14 21:24:20 | 显示全部楼层
感谢楼主的分享,刚看了楼主的程序和原理图,二者有出入,程序中定义的引脚和原理图中不一致。。。

出0入0汤圆

发表于 2014-12-14 21:49:36 | 显示全部楼层
不错,做的很认真,你的车子用这个电机速度能起来么?

出0入0汤圆

发表于 2014-12-14 22:18:44 | 显示全部楼层
问一下 楼主减速电机的型号是什么 最好给一下淘宝链接

出0入0汤圆

发表于 2014-12-19 11:37:48 | 显示全部楼层
楼主的这个厉害,值得学习!!!!

出0入0汤圆

 楼主| 发表于 2014-12-22 13:44:56 | 显示全部楼层
RudeBoy 发表于 2014-12-14 21:49
不错,做的很认真,你的车子用这个电机速度能起来么?

速度还好吧,相比飞思卡尔他们那个嗖嗖跑的差远了~~~但也不满

出0入0汤圆

 楼主| 发表于 2014-12-22 13:48:01 | 显示全部楼层
might2014 发表于 2014-12-14 21:24
感谢楼主的分享,刚看了楼主的程序和原理图,二者有出入,程序中定义的引脚和原理图中不一致。。。 ...

一个是遥控的,一个是小车的     二者PCB和程序都有上传,,可能你看差了吧,,,,,

出0入0汤圆

发表于 2014-12-22 20:03:04 | 显示全部楼层
很不错的作品哦,谢谢共享

出100入101汤圆

发表于 2014-12-22 20:54:48 | 显示全部楼层
生来孤独 发表于 2014-12-22 13:44
速度还好吧,相比飞思卡尔他们那个嗖嗖跑的差远了~~~但也不满

速度差别的原因是因为选的电机么?

出0入0汤圆

发表于 2014-12-22 21:39:04 | 显示全部楼层
顶一把,顺便mark

出0入0汤圆

发表于 2014-12-23 00:08:20 | 显示全部楼层
做的真心不错。高手都是钻研出来的。

出0入0汤圆

发表于 2014-12-23 15:50:07 | 显示全部楼层
确实好长.....   楼主宿舍不错哈。。。 有车有床有沙发

出0入0汤圆

 楼主| 发表于 2014-12-24 10:55:06 | 显示全部楼层
fengyunyu 发表于 2014-12-22 20:54
速度差别的原因是因为选的电机么?

恩,本身电机为了增加扭矩就减慢了速度极限速度跑不快,,,,,,,我感觉不安装减速器直接拿电机驱动也可以的!!

出0入0汤圆

发表于 2015-1-14 11:27:16 | 显示全部楼层
好象是在校生,又一力作呀!

出0入0汤圆

发表于 2015-1-15 19:43:44 | 显示全部楼层
楼主你那遥控器上的摇杆按键哪儿买的?

出0入0汤圆

发表于 2015-1-16 12:57:16 | 显示全部楼层
支持楼主的开源精神,我也在做类似的,有空一起交流啊1164512033

出0入0汤圆

 楼主| 发表于 2015-4-7 14:26:31 | 显示全部楼层
江湖笑 发表于 2015-1-15 19:43
楼主你那遥控器上的摇杆按键哪儿买的?

T宝,五相摇杆按键

出0入0汤圆

 楼主| 发表于 2015-4-7 14:37:35 | 显示全部楼层
今天自己下来看看之前上传的小车PCB好像传错了,现在补上

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-4-26 14:50:49 | 显示全部楼层
好贴!不错!

出0入0汤圆

发表于 2015-5-12 11:12:24 | 显示全部楼层
顶一下,不错!

出0入0汤圆

发表于 2015-5-13 05:48:57 来自手机 | 显示全部楼层
记号笔

出0入0汤圆

发表于 2015-5-13 14:04:43 | 显示全部楼层
很好,谢谢分享

出0入0汤圆

发表于 2015-5-13 16:25:01 | 显示全部楼层
楼主QQ号多少?想向您学习,我的QQ:394519046

出0入0汤圆

发表于 2015-9-28 15:44:48 | 显示全部楼层
非常好 学习学习

出0入0汤圆

发表于 2015-9-28 16:30:47 | 显示全部楼层
支持楼主~~很厉害吖~~

出0入0汤圆

发表于 2015-9-29 00:00:21 | 显示全部楼层
楼主挺有钻研精神的,赞一个。
有没有啥入门资料啊,感觉对于自平衡小车的原理不太懂

出0入0汤圆

发表于 2015-11-3 22:10:48 | 显示全部楼层
思路讲的不错,LZ还是很棒的

出0入0汤圆

发表于 2015-11-8 22:50:25 | 显示全部楼层
打算用TB6612驱动电机, 从网上找的五花八门的资料我已经懵了。请教一下LZ,对TB6612的输入,
主控是输出两路PWM给 PWM_A、PWM_B,用GPIO控制 AIN_1、AIN_2、BIN_1、BIN_2;
还是要输出4路PWM给AIN_1、AIN_2、BIN_1、BIN_2,用GPIO控制  PWM_A、PWM_B  ?
       
       

出0入0汤圆

 楼主| 发表于 2015-11-9 15:38:45 | 显示全部楼层
mtlsh 发表于 2015-11-8 22:50
打算用TB6612驱动电机, 从网上找的五花八门的资料我已经懵了。请教一下LZ,对TB6612的输入,
主控是输出两 ...

主控是输出两路PWM给 PWM_A、PWM_B,用GPIO控制 AIN_1、AIN_2、BIN_1、BIN_2控制方向

出0入0汤圆

发表于 2015-11-12 15:58:28 | 显示全部楼层
大神你好 最近我也在做平衡小车, 但是无论如何直立环都立不起来
调了2天了,你能方便和我讨论下吗,谢谢了

出0入0汤圆

 楼主| 发表于 2015-11-14 16:53:59 | 显示全部楼层
a85921819 发表于 2015-11-12 15:58
大神你好 最近我也在做平衡小车, 但是无论如何直立环都立不起来
调了2天了,你能方便和我讨论下吗,谢谢 ...

控制工程不太懂,全凭感觉~~

出0入0汤圆

发表于 2016-1-20 11:11:28 | 显示全部楼层
控制工程不太懂,俺也是全凭感觉~~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 05:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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