硬件篇:教你做STM32蓝牙小车(基于STM32F103ZET6)

news/2024/10/20 20:52:39/

重要声明

看过我前面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;   //声明一个结构体变量,用来初始化GPIOTIM_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;// PC6GPIO_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_timTIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//TIM向上计数模式TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射	//pC6TIM_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);	 //串口初始化为115200Motor_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地址:点击这里跳转源码仓库!!!!!
别忘了关注哦~~
在这里插入图片描述


http://www.ppmy.cn/news/461315.html

相关文章

Android 蓝牙 bluetoothle 开发

前段时间项目中用到了bluetoothle 方面的开发,项目结束后总结一下,开发的流程与一些思路; 主要步骤 一:注册蓝牙所需权限 二:Android 6.0 以上权限获取定位权限 三:开启蓝牙 四:注册一个专门…

蓝牙开发|蓝牙技术介绍

蓝牙技术介绍 1. 蓝牙概述 蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通…

BLE蓝牙设备开发

(ps. 根据网上的知识进行的学习总结) 1、蓝牙模块概述 1.1 蓝牙模块 蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行…

微信小程序使用蓝牙通信协议连接硬件整理总结(初始化蓝牙、搜索设备、展示设备)

前言 最近我们上线了个小程序的项目,全国独家的~主要就是检测人身体的一些基本生命体征的,比如检测心电图、心率、血氧饱和度、血糖、尿酸等等,因为产品是我们自主研发的,硬件也是我们自己造的,所以软件也是由我们整个…

蓝牙Bluetooth模块介绍

1,蓝牙模块——基础知识介绍 https://blog.csdn.net/wwt18811707971/article/details/77833602 2,常见蓝牙模块介绍和AT指令 https://blog.csdn.net/qlexcel/article/details/103815926 3,app怎么传信息给蓝牙模块_如何使用蓝牙模块&…

Android - 蓝牙开发

文章目录 科普SIG类型制式选择逻辑链路控制适配协议 (L2CAP)L2CAP的功能 蓝牙框架和 RFCOMM 协议蓝牙安全白名单机制 编程蓝牙权限Classic BluetoothBluetooth Low Energy术语角色 & 职能查找 BLE 设备连接设备上的 GATT 服务器绑定服务蓝牙设置连接到设备连接到 GATT 服务…

手把手教你智能硬件开发(四) 蓝牙传输

第4节 蓝牙传输 智能硬件基本上都需要和手机相连,然后让手机控制这些硬件的工作。相连的方式不外乎以下三种, 数据线有线连接,通过一根数据线把智能硬件和手机连接起来。采用这种方式,需要一个特殊的带USB HOST功能的扩展板&…

KT6368A国产蓝牙BLE芯片驱动程序硬件注意事项

目录 1.1 简介 KT6368A芯片是一款支持蓝牙双模的纯数据芯片,蓝牙5.1版本。芯片的亮点在超小尺寸,超级价格。以及简单明了的透传和串口AT控制功能。大大降低了嵌入蓝牙在其它产品的开发难度和成本 1.2 硬件说明 1.3 芯片功耗初步说明 1.4 芯片的简单…