本帖最后由 Luciusyan 于 2015-12-20 12:45 编辑
1、完成情况
1.1 基本功能
1)能通过手机蓝牙4.0遥控;
2)小车具有漫游模式和对战模式;3)漫游模式下,能实现无人控制,主动避障; 4)对战模式下,人手动控制蓝牙4.0小车,能发射虚拟子弹,被攻击的小车中弹后,掉血。血量掉到0后,小车死亡,游戏结束;
1.2 附加功能 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开发不熟悉,所以仅能以数字形式显示当前血量值。并且掉血同时,蜂鸣器发声,蜂鸣器是购买的无源蜂鸣器以及相应的控制板;
接下来就逐个详细说明。
模式切换:通过开发板上的蓝色按钮切换两种不同运行模式。
3、平台搭建
由于一直幻想能够自己做一次自平衡车,因此为了参加完这次活动进一步的学习,便买了比较好的电机,下图是购买的器件清单。以及组装后的截图。
过程就不详细写了,自己画线,自己打孔,有点费劲,最后实在不耐烦,然后把底盘打满了孔
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)
{
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();
}
5、下一步计划
接下来想开发一个APP,可以利用手机的重力感应通过蓝牙发送相应数据来控制小车。程序安装中,希望能尽快完成:lol
6、总结
通过这个活动,学到不少东西,距离一直以来要实现两轮自平衡车的想法近了很大一步,由于初学加上时间有限,没能按照活动规则完成全部要求,接下来有时间继续进行。最近一段时间,先看一下Android的APP开发,完善手机重力感应的控制。 本人新手,疏漏之处,恳请各位指正。:lol 附件是程序源码,请配合《程序说明.txt》进行相应引脚配置。
特别感谢@逍遥李 耐心的指导。
|