stm32蓝牙模块控制小车_如何让电脑有蓝牙功能

stm32蓝牙模块控制小车_如何让电脑有蓝牙功能重要声明看过我前面51小车博客的都知道我是软件工程专业的,对于硬件方面都是因为感兴趣自学的,这不,因为今年寒假放假比较早,趁这个时间学习了STM32相关知识,经过近一个月的学习对于STM32算是入门了,为了检验自己的学习效果,我决定就着51小车的架子用STM32试试,经过一个下午的忙活算是成功了!!!所以再来和大家分享一下。所需知识贮备相信看到这篇文章的小伙伴都是有相关基础的,这里只是给和我一样自学的小伙伴提个醒。动手之前你需要这些:硬件电路连接相关能力C语言基础能力STM32定时器、中断、串

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

重要声明

看过我前面51小车博客的都知道我是软件工程专业的,对于硬件方面都是因为感兴趣自学的,这不,因为今年寒假放假比较早,趁这个时间学习了STM32相关知识,经过近一个月的学习对于STM32算是入门了,为了检验自己的学习效果,我决定就着51小车的架子用STM32试试,经过一个下午的忙活算是成功了!!!所以再来和大家分享一下。

所需知识贮备

相信看到这篇文章的小伙伴都是有相关基础的,这里只是给和我一样自学的小伙伴提个醒。动手之前你需要这些:

  • 硬件电路连接相关能力
  • C语言基础能力
  • STM32定时器、中断、串口等基础知识
  • 查阅相关元件开发手册的能力
  • 一定的动手能力

准备材料

正点原子STM32精英开发板(STM32F103ZET6)、LM2596降压模块、HC-06蓝牙模块、MG995系列180度舵机、L298N电机驱动、任意品牌遥控车车架带电机、12V聚合物锂电池一块

部分原始材料图片

在这里插入图片描述

程序设计思路

  • STM32利用L298N电机驱动模块控制前后两路直流电机
motor.c
#include "motor.h" //导入led头文件
#include "stm32f10x.h" //导入STM32官方库
#include "stm32f10x_rcc.h" //导入STM32的RCC时钟库
#include "delay.h" //延时库
void Motor_12_Config(void)  //定义初始化函数
{ 
   
GPIO_InitTypeDef GPIO_InitStructure;   //定义GPIO_InitTypeDef结构体
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOF, ENABLE);  //开启引脚时GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //定义IN引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //通用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  //设置输出功率
GPIO_Init(GPIOF, &GPIO_InitStructure);  //初始化GPIOF的引脚参数,写进
GPIO_ResetBits(GPIOF,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3); //所有引脚拉低
} 
void Motor_1_STOP(void)
{ 
   
	IN1(High);
	IN2(High);
} 
void Motor_1_PRun(void)
{ 
   
	IN1(Low);
	IN2(High);
} 
void Motor_1_NRun(void)
{ 
   
	IN1(High);
	IN2(Low);
}
void Motor_2_STOP(void)
{ 
   
	IN3(High);
	IN4(High);
}
void Motor_2_PRun(void)
{ 
   
	IN3(Low);
	IN4(High);
}
void Motor_2_NRun(void)
{ 
   
	IN3(High);
	IN4(Low);
}
motor.h
#ifndef __MOTOR1_H
#define __MOTOR1_H
#include "stm32f10x.h"
#include "stm32f10x_gpio.h" 
#define High 1
#define Low 0
#define IN1(a) if (a) \ GPIO_SetBits(GPIOF,GPIO_Pin_0);\ else \ GPIO_ResetBits(GPIOF,GPIO_Pin_0)
 
#define IN2(a) if (a) \ GPIO_SetBits(GPIOF,GPIO_Pin_1);\ else \ GPIO_ResetBits(GPIOF,GPIO_Pin_1)
 
#define IN3(a) if (a) \ GPIO_SetBits(GPIOF,GPIO_Pin_2);\ else \ GPIO_ResetBits(GPIOF,GPIO_Pin_2)
#define IN4(a) if (a) \ GPIO_SetBits(GPIOF,GPIO_Pin_3);\ else \ GPIO_ResetBits(GPIOF,GPIO_Pin_3)
void Motor_12_Config(void);
void Motor_1_STOP(void);
void Motor_1_PRun(void);
void Motor_1_NRun(void);
void Motor_2_STOP(void);
void Motor_2_PRun(void);
void Motor_2_NRun(void);
#endif
  • PWM波控制舵机角度用于转向
PWM.C
#include "PWM.h"
#include "stm32f10x.h"
/* 函 数 名 : pwm_init 函数功能 : IO端口及TIM3初始化函数 */

void PWM_Init(void)
{ 
   
	GPIO_InitTypeDef GPIO_InitStructure;   //声明一个结构体变量,用来初始化GPIO

	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器

	TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx

	/* 开启时钟 */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

	/* 配置GPIO的模式和IO口 */
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;// PC6
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	//TIM3定时器初始化
	TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值
	TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式
	TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);

	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射 //pC6

	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;

	TIM_OC1Init(TIM3,&TIM_OCInitStructure);
	
	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器
	TIM_Cmd(TIM3,ENABLE);
}
  • HC_06蓝牙模块用于通信(我用的是USART1串口)
    (这部分代码参照原子视频代码即可!)
    因为文章只是分享一个大概,具体的控制外设CSDN上也有很多可以参考的文章,大家有需要可以自行搜索查看,有问题也可以私信我)

接线示意

这里只是示意图,比较简略,只为了展示元件之间的接线,具体的供电根据自己的情况,建议L298N、STM32和舵机全部单独供电,避免产生影响,需要注意的是共地的问题,有基础的应该不难理解!!
在这里插入图片描述

主程序代码

#include "stm32f10x.h" //官方库
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "sys.h" 
#include "delay.h"
#include "motor.h"
#include "PWM.h"
#include "led.h"
#include "usart.h"
#include "beep.h"
int main()  
{ 
	
u16 RxData;	
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级 
uart_init(115200);	 //串口初始化为115200
Motor_12_Config(); //电机的初使化
PWM_Init();         //舵机初始化
BEEP_Init();         	//初始化蜂鸣器端口
delay_init();  //延时函数初始化
LED_Init();    //初始化LED端口
while(1)  
{ 

if(USART_GetFlagStatus( USART1, USART_FLAG_RXNE))
{ 

USART_ClearFlag(USART1, USART_FLAG_RXNE);
RxData=USART_ReceiveData( USART1);
}
if(RxData == 0x01){ 
	    //前进
//GPIO_ResetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉低,亮 等同LED1=0;
//GPIO_ResetBits(GPIOB,GPIO_Pin_5);//LED0对应引脚GPIOB.5拉低,亮 等同LED0=0
//GPIO_SetBits(GPIOB,GPIO_Pin_8);
Motor_1_PRun();
Motor_2_PRun();
}
if(RxData == 0x02){ 
             //后退
Motor_1_NRun();
Motor_2_NRun();
}
if(RxData == 0x03){ 
         //左转
TIM_SetCompare1(TIM3,190);
}
if(RxData == 0x04){ 
        //回中
TIM_SetCompare1(TIM3,185);
}
if(RxData == 0x05){ 
     
TIM_SetCompare1(TIM3,180);   //右转
}
if(RxData == 0x06){ 

GPIO_SetBits(GPIOB,GPIO_Pin_8);				
}
if(RxData == 0x07){ 
         
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
}
if(RxData == 0x00){ 

//GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED0对应引脚GPIOB.5拉高
//GPIO_SetBits(GPIOE,GPIO_Pin_5); //LED1对应引脚GPIOE.5拉高 
//GPIO_ResetBits(GPIOB,GPIO_Pin_8);
Motor_1_STOP();
Motor_2_STOP();
}
}       
}  

成品展示

请忽略这草率的走线和供电,因为我只是对自己所学的一个检验,并没有像51小车那样把走线完善好,至于为什么没有放在地上跑,这看着也很明显啊,走线不允许啊!!!而且这里我用的精英开发板,如果是要做项目还是推荐mini板啊。
在这里插入图片描述

手机遥控界面

((((安卓的SPP蓝牙串口)))))
个人认为这款蓝牙助手用于开发界面简洁高效,推荐一波!(我可没收广告费)
在这里插入图片描述

总结

这次相对于上一次的51小车来说轻松了不少,一来是因为51给我奠定了一定的基础,对于硬件的理解更近了一步,二来是这次的时间更加充裕,我能够把STM32的基础知识都过一遍,文章写的比较简略,很多原理都没有细说!有需要的可以评论留言!
需要源码的评论区留言!
有做的不好的地方欢迎大家指出!

最近获取源码的小伙伴比较多,所以将源码放在了Gitee上,有需要的自取哦~
Gitee地址:点击这里跳转源码仓库!!!!!
别忘了关注哦~~
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/184014.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 模仿学习与强化学习的结合(原理讲解与ML-Agents实现)「建议收藏」

    模仿学习与强化学习的结合(原理讲解与ML-Agents实现)「建议收藏」模仿学习与强化学习结合能产生超级强悍的训练效果,是训练困难任务的必备框架

  • Windows 10 本地 IIS Web服务器搭建

    Windows 10 本地 IIS Web服务器搭建IIS服务器搭建启用功能①右击我的电脑点击属性,进入windows10控制面板。然后点击控制面板②点击进入程序和功能,然后点击启用或关闭windows功能,打开windows功能窗口,选择InternetInformationServices选项,将里面的内容全部勾选。如图:③勾选完成后,点击确定按钮,windows自动安装IIS功能,完成…

  • 负载均衡、Apache 负载均衡配置[通俗易懂]

    负载均衡、Apache 负载均衡配置[通俗易懂][1]Apache负载均衡设置方法mod_proxy使用介绍一般来说,负载均衡就是将客户端的请求分流给后端的各个真实服务器,达到负载均衡的目的。还有一种方式是用两台服务器,一台作为主服务器(Master),另一台作为热备份(HotStandby),请求全部分给主服务器,在主服务器当机时,立即切换到备份服务器,以提高系统的整体可 第一次看到这个标题时我也很惊讶,Apache居然还能做负载

  • maven install 跳过 测试 test

    maven install 跳过 测试 testmaven install 跳过 测试 test

  • 变异系数(测算数据离散程度相对指标)

    变异系数(测算数据离散程度相对指标)变异系数/差异系数(coefficientofvariation):是一种相对差异量数(不带测量单位),因而适用于测量单位不同或测量单位相同但集中量数相差较大的数据变异情况的比较M:平均数(下方r)S(StandardDeviation):标准差,用σ表示σ反映了一个数据集的离散程度,但其运算结果与测量单位有关联,如需要比较两组不同测量单位的σ,需要使用CV…

  • 机器学习降维之主成分分析

    1.主成分基本思想主成分基本思想:在主成分分析中,首先对给定数据进行规范化,使得数据每一个变量的平均值维0,方差为1,之后对数据进行正交变换,原来由线性相关变量表示的数据,通过正交变换变成由若干个

    2021年12月30日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号