| 本帖最后由 Luciusyan 于 2015-12-20 12:45 编辑 
 1、完成情况
 1.1 基本功能
 1)能通过手机蓝牙4.0遥控;
 2)小车具有漫游模式和对战模式;
 3)漫游模式下,能实现无人控制,主动避障; 4)对战模式下,人手动控制蓝牙4.0小车,能发射虚拟子弹,被攻击的小车中弹后,掉血。血量掉到0后,小车死亡,游戏结束;1.2 附加功能
 3、平台搭建1)通过红外对管,来发射和接收子弹信号; 2)中弹后蜂鸣器发声; 4)手机可以实时显示小车当前血量和中弹情况;2 方案介绍
2.1 平台介绍 
1)小车平台:由于以后想继续做自平衡小车,所以购买的比较好点的电机。 
2)开发板:论坛送的STM32F070:lol 
3)软件:STM32CubeMX+Keil,蓝牙4.0 IOS软件LightBlue
2.2 实现方式介绍 发射和接收子弹:通过红外对管来实现(对战模式下);主动避障:采用与对战模式下相同的红外对管,对战模式下用于发射和接收子弹,漫游模式下用于避障;
 手机控制:使用蓝牙4.0,由于手机系统版本较低,买蓝牙模块带的控制程序无法使用,使用的IPad下载的LightBlue来实现的基本控制;
 中弹掉血:小车初始血量100,当接收到中单信号后,血量减1,并通过蓝牙发送到手机,手机实时显示当前血量值。由于目前对APP开发不熟悉,所以仅能以数字形式显示当前血量值。并且掉血同时,蜂鸣器发声,蜂鸣器是购买的无源蜂鸣器以及相应的控制板;
 
接下来就逐个详细说明。
模式切换 :通过开发板上的蓝色按钮切换两种不同运行模式。
由于一直幻想能够自己做一次自平衡车,因此为了参加完这次活动进一步的学习,便买了比较好的电机,下图是购买的器件清单。以及组装后的截图。
 
 过程就不详细写了,自己画线,自己打孔,有点费劲,最后实在不耐烦,然后把底盘打满了孔4、功能实现 
  
 板子是论坛送的,送了一直也没玩过,所以,开始做小车前,除了学过的课,几乎对控制这部分是小白,要从最基本的学起。那接下来就说说整个的学习和实现的过程。4.1 串口
 由于资源有限,板子上也只有一个灯,在调试阶段为了明确自己代码执行没执行某程序块,最好的办法就是在某时刻能够输出特定字符说明。因此首先实现了printf函数功能。
 STM32F070板子和电脑可以使用USART2经过USB数据线通信。
 
    本以为这样设置好了就可以使用Printf了,怎么都不行。折腾了好久,百度,问同学,然后才知道应该将printf重定向,在main函数里加入如下代码:
 
 
 然后,打开串口调试工具,设置同样的频率等后就能看到printf的输出了。
 4.2 蓝牙
 蓝牙模块使用的是USART3通过中断方式来接收蓝牙信息的
 
 在Main文件中加入以下代码
 首先定义一个变量来存储收到的蓝牙的信息,并采用中断的方式获得该变量的值:
 
 
 
 将蓝牙接收的数据通过printf打印到调试端口测试,很容易知道蓝牙是否调好了。
 4.3 电机控制
 电机驱动采用的L298N模块,使用TIM1产生2路PWM波,分别控制2个电机。STM32CubeMX中设置如下所示
 
 原工作频率是48MHz,经23分频后是2MHz,向上计数,当记到999时,每个周期是是2KHz,用于控制电机。
 PC9和PA10 引脚用于控制电机的正反转。由于采用的PWM的高电平有效,因此,可以使用    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET);
 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
 实现电机正转。
 使用
 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
 实现电机反转。
 其中PB13,PB14用于相应电机控制器上引脚的使能,控制电机的起转与停止。
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_SET);
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_SET);
 用于启动电机,使其运转,
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET);
 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_14,GPIO_PIN_RESET);
 用于是电机停止运转。
 附件中Car.m是控制电机的基本函数。
 4.4 避障
 买了2个红外模块,在漫游模式下用于避障。
 哪边的红外先检测到障碍,就向相反方向转动,都有障碍的话左转,知道没有障碍,前进。代码如下(详细代码参见附件):
 if (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)==RESET && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_10)==SET)5、下一步计划{
 Car_TurnL();
 osDelay(500);
 }
 else if (HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_10)==RESET && HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)==SET)
 {
 
 Car_TurnR();
 osDelay(500);
 }
 else if (HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_10)==RESET && HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)==RESET)
 {
 
 Car_TurnL();
 osDelay(500);
 }
 else if (HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_10)==SET && HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)==SET)
 {
 
 MyCar_Init();
 Car_Start();
 }
 4.5 对战模式
 对战模式下实现了蓝牙对小车的控制,这个在调好了蓝牙后见4.2,通过if判断接收的指令,很容易实现。代码如下:
 if (Bluetooth_code==0xE && Bluetooth_Receved==0x01)//The car start when the bluetooth received 0xE;
 {
 Car_Start();
 Bluetooth_Receved=0x0;
 }
 else if (Bluetooth_code==0xB && Bluetooth_Receved==0x01)//The car stop when the bluetooth received 0xB;
 {
 Car_Stop();
 Bluetooth_Receved=0x0;
 }
 else if (Bluetooth_code==0xA && Bluetooth_Receved==0x01)//The car speedup when the bluetooth received 0xA;
 {
 Car_SpeedUp();
 Bluetooth_Receved=0x0;
 }
 else if (Bluetooth_code==0xD && Bluetooth_Receved==0x01)//The car stop when the bluetooth received 0xD;
 {
 Car_SpeedDown();
 Bluetooth_Receved=0x0;
 }
 else if (Bluetooth_code==0xC && Bluetooth_Receved==0x01)//Initiallize
 {
 MyCar_Init();
 Car_Start();
 Blood=99;
 Bluetooth_Receved=0x0;
 }
 else if (Bluetooth_code==0xF && Bluetooth_Receved==0x01)//Turn right
 {
 Car_TurnR();
 Bluetooth_Receved=0x0;
 }
 else if (Bluetooth_code==0xFF && Bluetooth_Receved==0x01)//Turn light
 {
 Car_TurnL();
 Bluetooth_Receved=0x0;
 }
 else if (Bluetooth_code==0xDD && Bluetooth_Receved==0x01)//Backward
 {
 BackWard();
 Bluetooth_Receved=0x0;
 }
 else if (HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_15)==RESET && carstarting==1)
 {
 Blood--;
 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
 osDelay(500);
 HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
 printf("Blood:0x%X\r\n",Blood);
 if (Blood <=1)
 Car_Stop();
 }
 
 
 接下来想开发一个APP,可以利用手机的重力感应通过蓝牙发送相应数据来控制小车。程序安装中,希望能尽快完成:lol6、总结
 通过这个活动,学到不少东西,距离一直以来要实现两轮自平衡车的想法近了很大一步,由于初学加上时间有限,没能按照活动规则完成全部要求,接下来有时间继续进行。最近一段时间,先看一下Android的APP开发,完善手机重力感应的控制。
 本人新手,疏漏之处,恳请各位指正。:lol 附件是程序源码,请配合《程序说明.txt》进行相应引脚配置。
 特别感谢@逍遥李 耐心的指导。 
 |