这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 中科院的两轮平衡车创造进程帖

共15条 1/2 1 2 跳转至

中科院的两轮平衡车创造进程帖

助工
2015-05-28 17:49:46     打赏

1.两轮平衡车的产品性能评价 http://forum.eepw.com.cn/thread/273290/1#2

2.LED灯的操作--GPIO的处理 http://forum.eepw.com.cn/thread/273290/1#6

3.基本平衡的原理--http://forum.eepw.com.cn/thread/273290/2#11

4.超声波模块的说明-http://forum.eepw.com.cn/thread/273290/2#12

5.超声波模块的使用-http://forum.eepw.com.cn/thread/273290/2#14

6.蓝牙模块的说明-http://forum.eepw.com.cn/thread/273290/2#15

7.直立调试的说明-http://forum.eepw.com.cn/thread/273290/2#16

8.浏览器的刷新问题导致写的一篇超级详细的帖子丢了-http://forum.eepw.com.cn/thread/273290/2#18

9.一些感悟-http://forum.eepw.com.cn/thread/273290/2#19

10.宇宙最强贴之--打造最强的STM32 IDE-http://forum.eepw.com.cn/thread/273290/2#20



助工
2015-05-28 18:59:19     打赏
2楼

收到小车后,小小感叹了一下这小车做工的优良,还有品质的把控,简直完虐其他的产品好几条街,这样的产品真的非常赞,非常喜欢    KXX,STM32F4系列芯片,虽然STM32F103无法与K60性能进行比较,但是作为智能车控制芯片也是绰绰有余!就按照说明书安装好了小车,当然再安装了自己的OLED,超声波,还有无线数据传输模块NRF24L01。

由于拍照水平的问题,就传一些自己觉的可以的图:








图1.组装过程之----安装4个铜柱

图2:安装我的破烂的OLED

图3:小车直立时的样子





助工
2015-06-02 01:43:50     打赏
3楼
中科院的两轮平衡车创造进程帖

由于自己的疏忽,还有之前同学四轴的Linux的一些问题,导致了自己在完成了许多基本STM32的实验之后都没有上传自己的进程,开源的硬件,MBED玩HIGH了,就有些不习惯K60,STM32之类ARM-M3,M4的编程习惯,不过下午被老师‘批斗’了,因为他认为我编程风格太随意了,虽然结果一样,但是我如果继续这样,以后会迟早遇到大问题。

其实我也清楚,主要是我喜欢找代码,在做数学建模,做智能车时,首先我不是自己去写代码,而是去找学长的代码,找网上的代码,在此基础修改相关的代码,所以我看代码快,写代码慢。

先贴一个LED1一直亮的代码。还有一个注意的地方,就是一定不要让别人随便动你的小车,我小车被同学拿去玩了一下CCD摄像头,结果就把小车主控芯片烧坏了,我重新焊接了芯片才使得代码完好运行。

不过、、真的找不到在什么地方上传视频。Flash那个也使用有问题,哎,再接再励,发一下我的LED代码吧,K5LED1.zip/,真的好伤心啊,我的串口模块也是之前借同学拿回来没注意直接插上下载程序导致芯片被烧毁。希望大家在使用之前一定要检查相关电路的电压值什么的。




助工
2015-06-06 21:52:29     打赏
5楼

如何让小车检测到一个坡度?这就要涉及卡尔曼相关算法。

简单来说,卡尔曼滤波器是一个“optimal recursive data processing algorithm(最优化自回归数据处理算法)”。对于解决很大部分的问题,他是最优,效率最高甚至是最有用的。他的广泛应用已经超过30年,包括机器人导航,控制,传感器数据融合甚至在军事方面的雷达系统以及导弹追踪等等。近来更被应用于计算机图像处理,例如头脸识别,图像分割,图像边缘检测等等。 卡尔曼滤波器的介绍 : 为了可以更加容易的理解卡尔曼滤波器,这里会应用形象的描述方法来讲解,而不是像大多数参考书那样罗列一大堆的数学公式和数学符号。但是,他的5条公式是其核心内容。结合现代的计算机,其实卡尔曼的程序相当的简单,只要你理解了他的那5条公式。 在介绍他的5条公式之前,先让我们来根据下面的例子一步一步的探索。 假设我们要研究的对象是一个房间的温度。根据你的经验判断,这个房间的温度是恒定的,也就是下一分钟的温度等于现在这一分钟的温度(假设我们用一分钟来做时间单位)。假设你对你的经验不是100%的相信,可能会有上下偏差几度。我们把这些偏差看成是高斯白噪声(White Gaussian Noise),也就是这些偏差跟前后时间是没有关系的而且符合高斯分布(Gaussian Distribution)。另外,我们在房间里放一个温度计,但是这个温度计也不准确的,测量值会比实际值偏差。我们也把这些偏差看成是高斯白噪声。 好了,现在对于某一分钟我们有两个有关于该房间的温度值:你根据经验的预测值(系统的预测值)和温度计的值(测量值)。下面我们要用这两个值结合他们各自的噪声来估算出房间的实际温度值。 假如我们要估算k时刻的实际温度值。首先你要根据k-1时刻的温度值,来预测k时刻的温度。因为你相信温度是恒定的,所以你会得到k时刻的温度预测值是跟k-1时刻一样的,假设是23度,同时该值的高斯噪声的偏差是5度(5是这样得到的:如果k-1时刻估算出的最优温度值的偏差是3,你对自己预测的不确定度是4度,他们平方相加再开方,就是5)。然后,你从温度计那里得到了k时刻的温度值,假设是25度,同时该值的偏差是4度。 由于我们用于估算k时刻的实际温度有两个温度值,分别是23度和25度。究竟实际温度是多少呢?相信自己还是相信温度计呢?究竟相信谁多一点,我们可以用他们的协方差(covariance)来判断。因为Kg=5^2/(5^2+4^2),所以Kg=0.61,我们可以估算出k时刻的实际温度值是:23+0.61*(25-23)=24.22度。可以看出,因为温度计的协方差(covariance)比较小(比较相信温度计),所以估算出的最优温度值偏向温度计的值。 现在我们已经得到k时刻的最优温度值了,下一步就是要进入k+1时刻,进行新的最优估算。到现在为止,好像还没看到什么自回归的东西出现。对了,在进入k+1时刻之前,我们还要算出k时刻那个最优值(24.22度)的偏差。算法如下:((1-Kg)*5^2)^0.5=3.12。这里的5就是上面的k时刻你预测的那个23度温度值的偏差,得出的3.12就是进入k+1时刻以后k时刻估算出的最优温度值的偏差(对应于上面的3)。 就是这样,卡尔曼滤波器就不断的把(协方差(covariance)递归,从而估算出最优的温度值。他运行的很快,而且它只保留了上一时刻的协方差(covariance)。上面的Kg,就是卡尔曼增益(Kalman Gain)。他可以随不同的时刻而改变他自己的值,是不是很神奇!


助工
2015-06-10 16:33:57     打赏
6楼

最近事情比较多,但是也不能阻挡我发一些自己的学习eepw小车的一个进度:

超声波模块

有4个引脚

1号是VCC,2号是TRIG,3号是ECHO,4号是GND。

这是超声波的一个协议的时序:

超声波模块基本是可以测定3米的距离。

好一些的可以达到5米距离。

接着就是超声波测距的小车的代码了。


助工
2015-06-21 23:19:55     打赏
7楼

这周末楼主有幸去到深圳maker faire活动。楼主有五个非常强烈的感受,最主要的就是共享,1+1+1>3.第二点就是有问题就提出来,创新精神,就来源于不停的提问,然后,就是从立下一个技术可以创造世界的念头,第四点就是maker其实可以是非常热爱生活的人,技术不一定宅,最后一个就是在这个时代创新创业真的非常方便,在这个时代,就许多硬件都开源了,再加上3D打印机,产品设计建模什么的都不用太担心,软件也有一大堆可以供你使用,所以制作新的产品真的像是搭建乐高积木一般的\(^o^)/~。我只说前3点LA:maker就是有一种共享精神在里面。无论是maker的基本利器arduino,还是3D打印机,共享,开源几乎是maker的支柱,以前很NB的技术,何止是软件,就连算法都有着很多大牛做出类似的开源版本。好比谷歌的mapreduce算法,就有Apache Hadoop作为开源的版本。而在硬件领域,也有好比我们的EEPW举行的各种DIY活动。硬件DIY本身就是共享的maker精神的代表。还有我们的passoni同学的优秀的源代码可供参考和jackwang和活动主办方的组织,都是这次智能平衡车DIY活动办的好的保障,而在这次的深圳的活动之中,遇到了许多抱着技术改变世界的技术达人,无论是从飞行四轴多轴飞行器还是航空火箭,或者是图像识别的打飞行器机器人,再或者是Arm的mbed工作坊。节目呢真的是非常的好。这次,一个香港的参会的人和我聊到了这个趋势,他提到了怎么就可以说这不会变成一次高潮,完了几年之后,就又消失无见。我也考虑很久,其实,技术这东西,不就是一代替换一代吗?现在stm32好用,但是几年之后呢,几十年之后呢?现在是使用KEIL,IAR完成代码编写的,以后会不会变为labview+图形化拖拽完成功能,还有就是遇到问题该肿么办?寻找开源的东西使用吗?开源的就是好用,但是符合你的要求吗?就像jackwang说的,要把遇到的问题提出来,有我们的passoni同学为代表的一群同学帮你解答,不要因为不好意思,或者怕别人嘲笑自己没有视频就把问题匿了,这是最最糟糕的一种做法╮(╯_╰)╭



助工
2015-06-22 21:10:11     打赏
8楼

超声波模块的使用及程序

主要是要看懂上面的一个时序图

主要的代码如下



 
		GPIO_SetBits(GPIOA,GPIO_Pin_2);
		delay_us(20);//拉高超过10us,发射超声波
		GPIO_ResetBits(GPIOA,GPIO_Pin_2);
		
		TIM2->CNT=0;//计数器清0
		while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==0);//等待ECHO脚高电平		
		TIM_Cmd(TIM2, ENABLE);// TIM2 enable counter [允许tim2计数]		
		while((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_3)==1)&&(TIM2->CNTARR-10));
		TIM_Cmd(TIM2, DISABLE);

		count=TIM2->CNT;//ECHO脚低电平后读取计数器的值,从而算出往返时间
		length=count/58.0;
		
		printf("测试距离=%fcm\r\n",length);
		

加一个循环就可以了

程序每一次上传显示上传成功我插入却没有反应,正在申请百度云,准备完了放到云网盘上面。



助工
2015-06-24 00:44:53     打赏
9楼
蓝牙模块,使用的是SPP-CA模块,淘宝上面可以搜索到的,非常nice的一个无线通信设备。
相对于WiFi,ZigBee,2.4g等通信方式,蓝牙有其独特的应用之处,有其最近一段时间,蓝牙由于其安全通信的特点被应用于一些密匙上面。RSSI的特点可以使用来室内定位,所以其应用领域还是非常广泛的。
接下来就说怎么样写程序做一个简单蓝牙对话吧!
首先是看原理图,顺便看了原版程序关于蓝牙的程序,感觉有些乱,所以楼主自己又从头写了一个驱动。
既然要自己写,那么就要考虑首先是使用寄存器还是库函数,库函数是使用cmsis还是hal,最后还是选择先把大多数人使用的cmsis写了。
由于一直无法以附件形式上传,所以只能通过每一个模块函数,具体的实现来说明
main函数关于蓝牙的归结为非常简单的四个函数

RCC_Configuration(); //系统时钟初始化
GPIO_Configuration();//端口初始化
USART_Configuration();//串口初始化 NVIC_Configuration();
然后就是串口初始化具体实现:
void USART_Configuration(void)
{
USART_InitTypeDef  USART_InitStructure;

USART_InitStructure.USART_BaudRate=9600;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

USART_Init(USART3,&USART_InitStructure);
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
USART_Cmd(USART3,ENABLE);

USART_ClearFlag(USART3,USART_FLAG_TC);
}

接下来就是端口的实现


void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//TX
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//RX
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}


接着是时钟的部分



与蓝牙有关的也是简单的  四个函数



SystemInit();//72m
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);





最后是嵌套中断的部分


NVIC_InitTypeDef NVIC_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);



然后就是处理蓝牙通信事务的部分:


void USART3_IRQHandler(void)
{
u8 temp=0;
if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
{
temp=USART_ReceiveData(USART3);

USART_SendData(USART3,temp+4);
while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
}
}
/*
powered by zhongkeyuan
*/




具体到学习蓝牙通信的协议,以及其他一些SPP-CA附件,可以到http://pan.baidu.com/s/1c0D3bdm来下载







助工
2015-10-21 23:23:45     打赏
10楼

PID的基本概念:

1、被调量

被调量就是反映被调对象的实际波动的量值。被调量是经常变化的。
2、设定值
PID调节器设定值就是人们期待被调量需要达到的值。设定值可以是固定的,也可以是变化的。
3、控制输出
控制输出指PID调节器根据被调量的变化情况运算之后发出的让外部执行结构按照它的要求动作的指令。在PID调节器和执行机构之间还会有其他环节,比如限幅、伺服放大器等。限幅功能通常在PID调节器内完成;如果如果将PID、限幅和伺服放大器功能做在一台仪表内就构成阀位控制PID调节器;将伺服放大器和限幅做在执行机构里就构成智能执行机构。
4、输入偏差
输入偏差是被调量和设定值之间的差值
5、P(比例)
P就是比例作用,简单说就是输入偏差乘以一个系数。
6、I(积分)
I就是积分,简单说就是将输入偏差进行积分运算。
7、D(积分)
D就是微分,简单说就是将输入偏差进行微分运算
8、PID基本公式
PID调节器参数整定过程通俗讲就是先把系统调为纯比例作用,逐步增强比例作用让系统振荡,记录下比例作用和振荡周期,然后这个比例作用乘以0.6,积分作用适当延长 KP=0.6 Km
KD= KP×π/4ω
KI= KP×ω/π
公式中KP为比例控制参数;KD为积分控制参数;KI为微分控制参数;Km为系统开始振荡是的比例值;ω为极坐标下振荡时的频率

PID调试的基本方法:

直立控制:PD 控制,这是最核心的控制,其他的控制相对直立控制而言都是干扰。

速度控制:PI 控制对编码器信息进行低通滤波可以削弱电机控制的比重, 提高系统稳定性。

转向控制:PD 控制结合了Z 轴陀螺仪PD控制。

在一个系统中可以只用到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我们可以理解为“相对重心角”,也就是我们所说的当前角度相对重心所在角度的差值,即小车的输入偏差,而我们的重心角度即设定值;





共15条 1/2 1 2 跳转至

回复

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