OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 767472021两轮自平衡小车DIY进程贴

共46条 1/5 1 2 3 4 5 ›| 跳转至

767472021两轮自平衡小车DIY进程贴

助工
2015-07-28 09:40:16    评分



关键词: 大家能学到知识是我最大的动力!    

助工
2015-07-28 09:55:34    评分
2楼

        实验一 小车开箱与组装

直接来组装吧,大家都开箱很多了,我第一次拿回来的时候由于与电机坏了一个所以杨哥有给我换了第二个,所以这是第二个了,这里要十分感谢@777-passoni,嘿嘿!




我们先把两个轮子上上去,这样比较容易固定住,然后把四个双通铜柱装上,记住,是双通,双通,双通,重要的话说三遍,然后装上电池,这个电池还是很给力的,上面标称1300ma,比之前说明的还要大一些,事实证明还是可以玩很久的。



    然后我们将OLED焊上排针,插在主控板上,其实我们可以匀一颗螺钉用来固定OLED,然后我们把主控板放在电池上面,对准孔位,找准机会插上四个单通铜柱,最后用螺钉固定上亚克力板,就成了!

整个小车还是很小巧的,接下来附上完整图:






助工
2015-07-28 10:29:13    评分
3楼

     实验二  小车测试与keil的安装程序下载

小车安装完毕之后,我们就可以插上电源线了,就是红色的那个超难插进去的那个接头,可能是方式松掉的设计吧,上好电后就可以波动那个铁的电源开关,按下白色按键,若果没有什么意外的话,小车这和时候就可以平衡了。不然就是你的车有些其他的问题了,小车的OLED共显示了6排信息如下:

     

第一排 的Kalman 问一下度娘就知道是卡尔曼的意思,当然初始的是方式1,即dmp方式

第二排显然就是温度了;

第三排第四排就是左右轮编码器的值了

第五排的就是当前电压值了,若果看到它低于12v,就说明你的小车已经饿了,你懂的!

第六排就是当前小车的偏角了

   这些我们先不管了,今后再讨论,然后我们现在来说说keil5怎么去安装吧,群里面经常有人安装出现各种问题,我这里有一些方法希望能帮到大家,由于本人热衷于装系统,从xp到win10,基本上一个月会换一次,多的时候是按星期算的(ps现在的win10 10240RTM版本非常的好用,兼容性好切稳定)偏题了,回归正题,如果我每次装完系统都配置一下,那我现在就不会在这里发帖了,早疯了估计,所以我都会将我安装好的keil保存在硬盘里就好,随时可以拿出来用的,现在我将我的keil5上传到云盘了,大家下载下来就直接能用了,不需要在经历那么多繁琐的步骤了,希望大家不要再为keil而烦恼了!

keil5:链接:http://pan.baidu.com/s/1gdev3W3 密码:hyt6

下载完了后解压在D盘根目录,如果没有解压在D盘的话就需要改一下这里


先点一下紫色框框选择的按钮,然后若果你的软件在c盘,就把绿色框框选中的地方改成C:\Keil\Keil_v5\ARM\ 就行了,接下来需要用注册机破解一下 注册机:keygen.zip

注册方法:运行keygen.exe(需要先解压,如果杀毒软件报毒,则暂时退出杀毒软件先),在CID栏,输入MDK License Management里面的CID号,点击Genrate,即可获得注册码,输入MDK License Management里面,完成注册。MDK License Management在keil左上角的File里面,这里就不再啰嗦了,至此,大家打开只需要两分钟的时间就可以搞定keil所有的安装问题了!




  接着简单的说一下程序的下载吧,其实就用提供的串口线就挺好的了,下面附上下载的方法 :


对了,下载的时候千万不要给串口线的vcc,gnd供电哦,那连个角是悬空的,切记,不然电脑坏了找谁修去啊!

   刚开始下载的时候我们会遇到这样的问题,那就是串口下载的插口真的是太紧了,插进去容易拔出来难(嘿嘿),于是我就试试稍微的将串口线碰到插口,发现这样也能的,而且下载完后红色开关可以不用拨到ON档就可以直接运行平衡了,这样我们下次下程序是就方便多了,特别是在调试pid的时候不用拔来拔去了!

ps(为什么排好的文字再次编辑时全变了,太忧桑了 ,可惜了在云笔记上的精心的排版了,争取再怒更两帖。)









助工
2015-07-31 17:25:26    评分
4楼

                    实验三   蓝牙控制及app微改动

   今天我们继续来看一下分析下一蓝牙的相关知识,首先,我们先来看看蓝牙是如何控制小车的,以下这段代码就是小车接收端的蓝牙控制程序:

#include "usart3.h"
u8 Usart3_Receive;
 u8 mode_data[8];
 u8 six_data_1[4]={6,5,4,0};
 u8 six_data_2[4]={4,5,6,0};

/**************************************************************************
函数功能:串口3初始化
入口参数:pclk2:PCLK2 时钟频率(Mhz)    bound:波特率
返回  值:无
**************************************************************************/
void uart3_init(u32 pclk2,u32 bound)
{  	 
	float temp;
	u16 mantissa;
	u16 fraction;	   
	temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
	mantissa=temp;				 //得到整数部分
	fraction=(temp-mantissa)*16; //得到小数部分	 
  mantissa<<=4;
	mantissa+=fraction; 
	RCC->APB2ENR|=1<<3;   //使能PORTB口时钟  
	RCC->APB1ENR|=1<<18;  //使能串口时钟 
	GPIOB->CRH&=0XFFFF00FF; 
	GPIOB->CRH|=0X00008B00;//IO状态设置
	GPIOB->ODR|=1<<10;	  
	RCC->APB1RSTR|=1<<18;   //复位串口1
	RCC->APB1RSTR&=~(1<<18);//停止复位	   	   
	//波特率设置
 	USART3->BRR=mantissa; // 波特率设置	 
	USART3->CR1|=0X200C;  //1位停止,无校验位.
	//使能接收中断
	USART3->CR1|=1<<8;    //PE中断使能
	USART3->CR1|=1<<5;    //接收缓冲区非空中断使能	    	
	MY_NVIC_Init(3,3,USART3_IRQn,2);//组2,最低优先级 
}

/**************************************************************************
函数功能:串口3接收中断
入口参数:无
返回  值:无
**************************************************************************/
void USART3_IRQHandler(void)
{	
	if(USART3->SR&(1<<5))//接收到数据
	{	  
	 static	int uart_receive=0;//蓝牙接收相关变量
		uart_receive=USART3->DR; 
		if(uart_receive<10)    mode_data[0]=uart_receive;

			if((mode_data[0]==six_data_2[0]
			  &&mode_data[1]==six_data_2[1]
			  &&mode_data[2]==six_data_2[2]
			  &&mode_data[3]==six_data_2[3])
			 ||(mode_data[0]==six_data_1[0]
			  &&mode_data[1]==six_data_1[1]
			  &&mode_data[2]==six_data_1[2]
			  &&mode_data[3]==six_data_1[3]))
		{	
			Flag_Stop=!Flag_Stop;
			    mode_data[0]=0;	mode_data[1]=0;	mode_data[2]=0;	mode_data[3]=0;
		}
		if(uart_receive==0x00)	Flag_Qian=0,Flag_Hou=0,Flag_Left=0,Flag_Right=0;//////////////刹车
		if(uart_receive==0x01)	Flag_Qian=1,Flag_Hou=0,Flag_Left=0,Flag_Right=0;//////////////前
		if(uart_receive==0x05)	Flag_Qian=0,Flag_Hou=1,Flag_Left=0,Flag_Right=0;//////////////后
		else if(uart_receive==0x02||uart_receive==0x03||uart_receive==0x04)	
													Flag_Qian=0,Flag_Hou=0,Flag_Left=0,Flag_Right=1;
		else if(uart_receive==0x06||uart_receive==0x07||uart_receive==0x08)	
													Flag_Qian=0,Flag_Hou=0,Flag_Left=1,Flag_Right=0;

		mode_data[7]=mode_data[6];
		mode_data[6]=mode_data[5];
		mode_data[5]=mode_data[4];
		mode_data[4]=mode_data[3];
		mode_data[3]=mode_data[2];
		mode_data[2]=mode_data[1];
		mode_data[1]=mode_data[0];
	}  											 
} 

 



助工
2015-07-31 19:04:11    评分
5楼

这段代码可以在HARDWARE文件夹下面的串口3『usart3.c』上找到,我们收手机上的app是一个圆圈可以向四周拨动,从代码上我们可以得到以下示意图:

从图上我们可以看到这个元被划分为八个部分,当我们在手机app上将圆圈波动到相应的方位,就会发送相应的指令,而小车的接收相应的指令后就可以控制完成动作了,从第63行到第69行中我们可以看到,当小车收到0x01时,小车前进标志位置1,其余置0,便是完成前进动作;当小车收到0x05时,小车后退标志位置1,其余置0,便是完成后退动作;当小车收到0x02、0x03、0x04时,小车右转标志位置1,其余置0,便是完成右转动作;当小车收到0x06、0x07、0x08时,小车左转标志位置1,其余置0,便是完成左转动作;这也就解释了为什么我们向右上方或者右下方拨动时依然是右转的。

下来我们分析一下为什么在底部向右滑动会关闭电机,而向左滑动就会重新启动,这段代码其实很好看懂的,大家看看第51行到第60行代码中,six_data_2数组中的4个数据做与运算,six_data_2或者six_data_1数组中的数据被小车同时接收到数组中

的四个数据,那么 Flag_Stop=!Flag_Stop(第60行),每收到一次就取反一次,而在第4行和第5行中定义了这两个数组为4、5、6、0,因此是底部的三个滑动过去就刚好,如果你改成2、3、4、0,那就是从右侧向下滑动了,所以,其实我认为这里并不需要定义两个数组,定义一个数组,滑动一次关闭电机,再来一次,就开启,亲测可用,大家可以试试!

然后贴出我的APP图片:

这里有两处小小的突变和文字的改动,打开小车,在蓝色led闪烁的时候,手机端按菜单键链接蓝牙,然后可以输入配对密码默认1234,连接上就可以控制了,接下来奉上小车的首秀测试视频分享给大家。


视频地址:http://player.youku.com/player.php/sid/XMTI5ODQ1NTQ0MA==/v.swf

助工
2015-08-05 15:36:09    评分
6楼

           实验四 玩转PID

       最近这两天有一些同学在努力的调试PID并且尝试想让小车静止不动,论坛里面也有很多人来询问,群里面更是讨论的热火朝天。

所以这一次进程我想来一发家十分关心的关于PID参数的整定的一点个人见解,希望大家可以互相交流交流,大家有什么疑问或者我说的不正确的地方可以跟帖我们一起来讨论,谢谢。

在讲PID参数的整定之前,我们先来看看什么叫做PID参数:

P 就是比例,就是输入偏差乘以一个系数;

I 就是积分,就是对输入偏差进行积分运算;

D就是微分,就是对输入偏差进行微分运算;

而输入偏差又是什么鬼呢?

输入偏差是被调量减去设定值的插值,当然前提是设定值是不变的。

并且在一个系统中可以只用到PPIPD,或者PID其中的一种,并不是完全的要用上的。

很显然,在这段直立环控制函数中:

int balance(float Angle,float Gyro)

{

float Bias,kp=50,kd=0.13;

int balance;

Bias=Angle-4;

balance=kp*Bias+Gyro*kd;

return balance;

}

Bias=Angle-4;这行代码中,Bias我们可以理解为“相对重心角”,也就是我们所说的当前角度相对重心所在角度的差值,即小车的输入偏差,而我们的重心角度即设定值;

接下来,我给大家扽想两篇非常好的文章,大家仔细阅读之后,一定会对PID整定有所悟吧

1.由浅入深—吃透PID

2.直立行车参考设计方案(经典

第一篇文章是让大家对PID有一个更加全面的认识,而且作者叙事的方式也十分幽默有趣,重点突出,大家可以从第二章开始看起。

这第二篇文档是由版主提供给大家的,我之所以拿出来,是希望引起大家的重视,因为这边文档里面讲的实在是太好了,对于平衡车的PID调试里面给出了详细的指导性意见。

当然了,如果大家认为读这两篇文档需要很长时间的话(ps其实大致的读一读也浪费不了太多时间),我还给大家准备了配套的视屏,是不是突然觉得我很贴心有木有啊我相信大家看完这段短短半个小时的视频之后,一定会掌握一些基本的PID调试技巧的。

看不了全屏的点右下角的优酷就可以全屏了哈




视频地址:http://player.youku.com/player.php/sid/XMTMwMDAxMTY4OA==/v.swf

助工
2015-08-05 15:40:26    评分
7楼

    什么,你说半个小时还是太长了怎么半?好吧,只要大家不觉得我讲的不好的话,可以抽出五分钟不到的时间listen一下我的个人看法咯。小车程序中有直立环、速度环、转向环,其中直立环和转向环用到了比例微分参数,速度环用到了比例积分参数。之前看到很多的朋友说,为什么我屏蔽了速度环转向环,直立环调的好好的,都快可以静止了,可是加上速度环之后,小车就疯了呢,素的,你的直立环确实调好了,然而你加上速度环的时候,有没有想过它会影响你的直立环,其实直立环和速度环是存在耦合关系的,因此我们不能够完全将他们分开来调整,我认为我们在调试直立环的时候,不应该直接屏蔽速度环,而是应该保留,不过转向环就无所谓了,可以屏蔽掉。在直立环中,我们用到了比例参数和微分参数,这是我们就可以先比例后微分,意思就是先让微分参数为0,慢慢增大比例参数到能立稳并来回摆动,在慢慢增大微分参数,直到小车在外力推动的情况下比较稳定不抖动,最后我们在根据小车运动现象在刚刚得到的数字附近进行粗调,那么怎么看现象粗调呢?

    要想做到看着现象粗调,我们就必须得了解在直立环中的比例参数和微分参数到底代表着什么,又或者给整个平衡系统带来哪些影响。

比例参数在整个平衡系统中相当于倒立摆的回复力。这个参数需要大于重力加速度所产生的效果才能够使得车模保持直立。随着这个参数逐步增大,车模开始能够保持直立。该参数进一步加大,车模开始出现来回的摆动现象。

微分参数在整个平衡系统中相当于倒立摆中的阻尼力,它可以有效的抑制车模的摆动。当该参数过大时,会引起车模本身的震动。这是由于车模本身不是一个刚体,车体具有一定的共振频率。微分参数过大时会使得车模在电机的驱动下产生车体的共振。

知道了这些,我们就以大致的找到一组不错的参数。

    另外,在直立环中,大家千万不要忽略这行代码:

        Bias=Angle-4;

    这里的减4是我的小车的数字(ps是我放超声波的时候的),可能和你的不一样,又或者你动一下加个东西应为重心改变而不一样,重心一旦改变,需要改的就不仅仅是这里了,整的平衡的PID参数都需要做出相应的调整,不信大家可以看看接下来的视频:




视频地址:http://player.youku.com/player.php/sid/XMTMwMTExNjE1Ng==/v.swf

    那怎样找到重心呢,其实很简单,当你小车打开但是不开启平衡,将小车立于平处,能短暂的立者或者随时有可能向两边任何一方倾倒的时候,显示屏上所显示的角度,就是我们所需要减掉的,如果这种方法不好拿捏的话,还有方法二,那就是开启小车自平衡立于平地,这是小车微微来回摆动,oled屏幕上的角度数值会在三个连续的数之间来回的跳变,比如说 3,4,5,这个时候我们就取中间的,也就是4

    说完了直立环,也只能是抛砖引玉一下了,具体还要考大家耐心调试了,毕竟速度环与直立环存在耦合,这里提醒一下同学们,在调速度环的时候,要先积分再比例,顺序和之前颠倒过来,并且调大速度环的时候可以等比例稍微调小一些直立环参数。

最后也希望大家能调试好属于自己的PID,真正玩转PID,不一定要调到静止,那很难做到,不仅仅只是让小车处于非欠阻尼状态下这么简单,除非地面阻力够大,像一下这段我拍的视频一样:



视频地址:http://player.youku.com/player.php/sid/XMTMwMTExNjE0OA==/v.swf

    静止了,难道就一点最优吗,大家可以试试,跑起来就真的稳定吗,其实版主发货的时候的一组参数还是算还可以的啦

最后的最后,给大家一点小技巧,大家调试PID的时候频繁的插拔,波动开关,编译,并且很难拔出来,编译时间长,开关拨来拨去麻烦,调试一次一二十秒,你可能会问为什么不用像32战舰板一样一键下载运行呢,也可能吐槽为什么不能蓝牙在线调试PID呢?但是我们目前也只有这样的条件不是吗,因此我们得适应,还得心平气和的调试,所以我建议大家先不要用最新的代码,这样下载完之后不需要波动红色开个可以直接运行了,下次编译时也不需要,将下载软件的下载波特率调到最高,也就是460800,把编程后执行勾选上,下载好了就可以直接运行了,下载的时候不要把下载线插进去,稍微接触就好,这样就不要费很多时间去拔出来了,或许这些真的能在大家调试PID需要大量次数的修改程序时给大家节约点时间呢(psslink的就当我没说)

提前祝大家玩转PID,我说的不对的地方,欢迎大家指正!




菜鸟
2015-08-05 23:48:53    评分
8楼
讲的很好,PID这一块本身就是云里雾里的,看到楼主的PID解答与手机蓝牙APP讲解,明白很多,多谢楼主无私奉献宝贵的经验

菜鸟
2015-08-06 00:33:07    评分
9楼
楼主,波形显示上位机软件   ,红色曲线显示的是角度值,可以看到Y轴显示角度数值作为小车静止平衡的角度值吗?2者有什么关系,看波形上位机对程序有什么作用?看上位机波形需要看到什么波形是我们需要的?都困惑好久了;PID调节再能说的更详细些吗?看了你讲的,对PID有点感觉了;楼主有专调PID    3个参数的上位机软件吗?网上找了没有找到合适的

工程师
2015-08-06 13:47:07    评分
10楼
楼主花这么多精力,一定要顶下!

共46条 1/5 1 2 3 4 5 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]