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

共22条 1/3 1 2 3 跳转至

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-13 19:34:29     打赏
8楼

                       实验五   编码器控制

       抱歉,这一次的更新让大家等待了这么久,好在我又回来了,今天我们来看看小车的编码器,来仔细分析一下我们是怎么控制电机的运转的,还是那句话,有什么说的不对的或者有好的见解地方希望大家跟帖指正交流。

       首先,既然要来分析编码器,我们得先看看编码器长啥样在哪里不是、、、

       在了解了编码器长啥样了之后,我们接下来看看PWM电机调速的工作原理:

       对于电机的转速调整,我们是采用脉宽调制(PWM)办法,控制电机的时候,电源并非连续地向电机供电,而是在一个特定的频率下以方波脉冲的形式提供电能。不同占空比的方波信号能对电机起到调速作用,这是因为电机实际上是一个大电感,它有阻碍输入电流和电压突变的能力,因此脉冲输入信号被平均分配到作用时间上,这样,改变在输入方波的占空比就能改变加在电机两端的电压大小,从而改变了转速。简单点说就是输入方波占空比越大,小车速度越快,当我们将电源直接接在电机两端时,就相当于100%的占空比时,小车速度也就达到极致了。至于PWM信号打哪儿来的,我们稍后继续讨论!


       当然了,这只是个示意图,看完了编码器上的接线说明,我们继续分析电机的驱动,因为我们这里的直流电机是需要足够的电流才可以驱动,而主控芯片的IO口所提供的电流显然达不到这个要求,所以我们就需要一块电机驱动芯片来对电流进行放大。我们这次的小车用的驱动芯片是TB6612FNG,它的原理图如下:

                                         

   可能大家看到这个原理图会说,然而这并没有什么卵用,应为大家都知道它的实质其实基于MOSFETH桥集成电路,其效率高于晶体管H桥驱动器

             

   大家都知道,电流经过直流电机的方向不一样是,转动的方向是相反的,那么假设S1和S4闭合时直流电机是正向转动的,那么S3和S2闭合时直流电机显然就是反向转动的。

void Set_Pwm(int moto1,int moto2)
{
	   if(moto1<0) AIN2=1, AIN1=0; else AIN2=0, AIN1=1;
           PWMA=myabs(moto1); 
           if(moto2<0) BIN1=0, BIN2=1; else BIN1=1, BIN2=0;
           PWMB=myabs(moto2); 
}

这段代码就能很好的证明了。

那么接下来我们看看TB6612FNG这款驱动芯片的真值表吧:



   首先,STBY很明显是使能端信号,高电平有效的。

   其次,IN1IN2是控制电流流过的方向,可以控制电机的正反转。

   最后,PWM信号为低电平时,可以短暂制动,脉冲输入信号被平均分配到作用时间上,因此通过占空比的调节可以调整转速,前面也已经讲过了。

   好了,前面的基本知识我们也已经讲解的比较仔细了,现在我们来解析一下代码是怎么写出来的。在motor.c这段代码中(ps710号版本),我们可以很看到通过TIM3(定时器3)作为电机的PWM源信号产生,并且都工作早PWM1模式下,而在PWM1模式下,变化的计数器不断与CCRy进行比较。假设计数器采用加计数方式,当计数器的值TIMx_CNT小于TIMx_CCRy时,PWM信号保持高电平。当TIMx_CNT不断增加,直到大于TIMx_CCRy时,PWM变成低电平。TIMx_CNT继续增加,当达到TIMx_ARR预设的值后,复位返回0值。在第15行代码中:

           TIM3->ARR=arr;//设定计数器自动重装值

   可以看到,TIM3->ARR决定了PWM信号的周期

   在encoder.c中,TIM2TIM4被初始化为编码器接口模式

int Read_Encoder(u8 TIMX)
{
   int Encoder_TIM;    
   switch(TIMX)
	 {
	 case 2:  Encoder_TIM= (short)TIM2 -> CNT;  TIM2 -> CNT=0;break;
	 case 3:  Encoder_TIM= (short)TIM3 -> CNT;  TIM3 -> CNT=0;break;
	 case 4:  Encoder_TIM= (short)TIM4 -> CNT;  TIM4 -> CNT=0;break;
	 default:  Encoder_TIM=0;
	 }
		return Encoder_TIM;
}     


   在这段程序中,很容易看出来,TIM2 -> CNT决定了PWM信号的占空比,也就是决定了速度,因此,返回值Encoder_TIM如注释所说为速度值。

通过这里的Read_Encoder函数,我们就可以的到左右轮的编码值了,这个可以在最重要的控制文件control.c中的第13行和第17行中看到:

        Encoder_Right=Read_Encoder(4);  
        Encoder_Left =-Read_Encoder(2);


   得到的左右轮编码值会作为速度PI控制函数的入口参数。

   在上位机中,我们得到的左右轮编码值空转时都接近600左右,基本保持一致:



   这次的编码器实验我没能写的太清楚,可能自己理解的还不够透彻,有什么问题希望大家不吝赐教,谢谢。







助工
2015-08-13 19:56:14     打赏
9楼

大家都来这里交流交流啊!



助工
2015-08-19 09:17:01     打赏
10楼

                   实验六 2.4G无线通信控制小车

      本次实验我们来简要的讨论如何利用nrf24l01+来控制小车的运转,因为后面我们会重点关注体感小车的制作,所以本节主要以程序分析为主,稍后会奉上接受发送端源代码以及运行视频,谢谢大家关注和指正。

首先,我们要准备的工具有两块nrf24l01+芯片一块stm32的最小系统板,stm32的开发板也行,我用的就是正点原子的战舰stm32mini板。有了这个我们就可以看我们的实验了。因为stm32mini板和小车都带有nrf24l01+的接口,所以这里就不讲芯片原理图和接口配置了,大家的如果不一样的话改改IO口的配置就好了嘛。

我们先看看接收端(也就是小车) 的程序,小车的接收程序显然就在24l01.c里面:

 if(mode==0)//RX模式
{
    RX_Mode();   
    while(1)
     {               
     if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
     {
          printf("%d\r\n",tmp_buf[1]); 
          if(tmp_buf[1]>120)Flag_Left=1,Flag_Right=0;
          else if(tmp_buf[1]<60)Flag_Left=0,Flag_Right=1; else Flag_Left=0,Flag_Right=0; }else delay_us(100); }; }



        这就是接收端的控制核心代码了,在nrf24l01.c里面的169到183行。

从程序中我们清楚的看到,控制小车左右的是接收到的tmp_buf[1]的值决定的,当tmp_buf[1]<60时,Flag_Right=1,那么右转。tmp_buf[1]>120时,Flag_Left=1,那么左转。

       我们做如下修改,修改后代码如下:


if(mode==0)//RX模式
{
RX_Mode();   
//while(1)
{               
if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
{
    printf("%d\r\n",tmp_buf[1]);
    if(tmp_buf[1]==30)       
         {Flag_Left=0,Flag_Right=0,Flag_Qian=0,Flag_Hou=0;} 
    if(tmp_buf[1]==40)   
         {Flag_Left=0,Flag_Right=0,Flag_Qian=1,Flag_Hou=0;}
    if(tmp_buf[1]==50)
         {Flag_Left=0,Flag_Right=0,Flag_Qian=0,Flag_Hou=1;}
    if(tmp_buf[1]==60)
         {Flag_Left=1,Flag_Right=0,Flag_Qian=0,Flag_Hou=0;}
    if(tmp_buf[1]==70)
         {Flag_Left=0,Flag_Right=1,Flag_Qian=0,Flag_Hou=0;}
 }
    else 
    delay_us(100);    
};



       在这里,我们注释掉了while(1)语句,不注释的话显示屏就不会显示,然后我还将接受控制函数稍作修改,为后面的体感小车做铺垫。

最后我们移步到Minibalance.c(7.10更新的最新代码)中看看,

首先将第38行的 “NRF24L01_Init(); ”NRF24L01模块初始化函数取消注释;

然后将第40行的“NRF24L01_FindMyself(); ”NRF24L01自检程序取消注释;

首先将第45行的 “NRF24L01(); ”     NRF24L01模块收发函数取消注释;

好了,接收端函数就先讲这些了,接下来我们看看发送端程序:

        发送端程序我采用的是在正点原子的stm32系列教程中关于无线通信实验的例程的基础上进行修改的,现在简要说下主要思想:

while(1)
{         
if(NRF24L01_TxPacket(tmp_buf)==TX_OK)
{
     key=KEY_Scan(0);
     if(key==KEY0_PRES)
      {
      tmp_buf[1]=70; 
       }
     else if(key==KEY1_PRES)
       {
        tmp_buf[1]=60;
       }
     else tmp_buf[1]=30; 
}else
    LED0=!LED0;
    delay_ms(1000);     
};



       这里是两个很简单的if语句就可以实现我们的方向控制了。那么最后就放出整个发送端和接收端的程序打包给大家:

STM32无线遥控小车源代码.zip

然后还有一段演示视频。


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

大家有什么好的建议或者疑问可以留言哦,我一定尽我所能给大家答复。


共22条 1/3 1 2 3 跳转至

回复

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