发新帖本帖赏金 60.00元(功能说明)我要提问
返回列表
打印

【智能小车】+ 漫游者

[复制链接]
2802|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Luciusyan|  楼主 | 2015-12-20 12:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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》进行相应引脚配置。

特别感谢@逍遥李 耐心的指导。

截图03.jpg (136.56 KB )

底部孔的特写

底部孔的特写

截图04.jpg (113.29 KB )

平台

平台

截图05.jpg (113.63 KB )

平台

平台

截图07.jpg (85.02 KB )

USART2设置

USART2设置

截图06.jpg (110.66 KB )

参数设置

参数设置

MyCar_Con.rar

242.85 KB

打赏榜单

21ic小喇叭 打赏了 40.00 元 2016-01-13
理由:期待最后一点也能完成~~还有四个名额哟

21ic小喇叭 打赏了 20.00 元 2016-01-07
理由:DIY制作分享~~~~

相关帖子

沙发
dirtwillfly| | 2015-12-20 22:18 | 只看该作者

使用特权

评论回复
板凳
逍遥李| | 2015-12-21 08:31 | 只看该作者
客气了

使用特权

评论回复
地板
21ic小喇叭| | 2016-1-7 14:38 | 只看该作者
都是最后集中发帖呢

使用特权

评论回复
5
LguoFu| | 2016-1-14 09:27 | 只看该作者
不错哟!

使用特权

评论回复
发新帖 本帖赏金 60.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

6

帖子

0

粉丝