开发环境:
STM32F103R8T6最小系统板(IO顺序引出)
3D建模蓝牙遥控小车STL
蓝牙遥控小车纯HAL库代码
TP-Bluetooth-Car.apk蓝牙apk
原理:(写代码前必须要知道模块的参数)
蓝牙模块HC-05使用指南
HC-05蓝牙模块AT指令 ERROR问题
探究L298N模块烧毁的原因
STM32串口详解
主页面
GPIO
TIM2
TIM3
接串口调试用
接蓝牙模块
main.c
/* USER CODE BEGIN PV */
extern uint8_t USART1_NewData;
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_4);
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_3);
HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1);
test();
/* USER CODE END 2 */
switch(USART1_NewData)
{
case '1' :
CAR_GO();
break;
case '2' :
CAR_BACK();
break;
case '3':
CAR_LGO();
break;
case '4' :
CAR_RGO();
break;
case '5' :
CAR_STOP();
break;
case '6' ://循迹模式
/*
此处填入循迹代码
*/
break;
}
car_control.c
#include "car_control.h"
/*
右侧
PB11 ENA TIM2-CH4 PB10 ENA TIM2-CH3
PB9 IN1 PB8 IN11
PC15 IN2 PC14 IN22
左侧
PC9 ENB TIM3-CH4 PC8 ENB TIM3-CH3
PC13 IN3 PC12 IN33
PC11 IN4 PC10 IN44
LED灯
PD0 BLUE
PD1 RED
1 0 go
0 1 back
0 0 stop
*/
/*
小车两个电机的正转,反转与停转的代码
*/
void R_MOTOR_GO()
{
HAL_GPIO_WritePin(GPIOB, IN1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, IN2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, IN11_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, IN22_Pin, GPIO_PIN_RESET);
}
void L_MOTOR_GO()
{
HAL_GPIO_WritePin(GPIOC, IN3_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, IN4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, IN33_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, IN44_Pin, GPIO_PIN_RESET);
}
void R_MOTOR_BACK()
{
HAL_GPIO_WritePin(GPIOB, IN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, IN2_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, IN11_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, IN22_Pin, GPIO_PIN_SET);
}
void L_MOTOR_BACK()
{
HAL_GPIO_WritePin(GPIOC, IN3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, IN4_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, IN33_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, IN44_Pin, GPIO_PIN_SET);
}
void R_MOTOR_STOP()
{
HAL_GPIO_WritePin(GPIOB, IN1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, IN2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, IN11_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, IN22_Pin, GPIO_PIN_RESET);
}
void L_MOTOR_STOP()
{
HAL_GPIO_WritePin(GPIOC, IN3_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, IN4_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, IN33_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, IN44_Pin, GPIO_PIN_RESET);
}
/*
小车动作的代码
*/
void CAR_GO()
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4,50);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4,50);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,50);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3,50);
L_MOTOR_GO();
R_MOTOR_GO();
}
void CAR_BACK()
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4,50);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4,50);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,50);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3,50);
L_MOTOR_BACK();
R_MOTOR_BACK();
}
void CAR_LGO()
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4,50);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4,50);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,50);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3,50);
L_MOTOR_BACK();
R_MOTOR_GO();
}
void CAR_RGO()
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4,50);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4,50);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,50);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3,50);
L_MOTOR_GO();
R_MOTOR_BACK();
}
void CAR_STOP()
{
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4,50);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4,50);
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_3,50);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3,50);
L_MOTOR_STOP();
R_MOTOR_STOP();
}
car_control.h
#ifndef _CAR_CONTROL__
#define _CAR_CONTROL__
#include "stm32f1xx_hal.h" //HAL库文件声明
#include <main.h>
void L_MOTOR_GO(void); //小车电机正转
void R_MOTOR_GO(void);
void L_MOTOR_BACK(void); //小车电机反转
void R_MOTOR_BACK(void);
void L_MOTOR_STOP(void);
void R_MOTOR_STOP(void); //小车电机停转
extern TIM_HandleTypeDef htim2;//声明TIM2的HAL库结构体
extern TIM_HandleTypeDef htim3;//声明TIM2的HAL库结构体
void CAR_GO(void); //小车前进
void CAR_BACK(void); //小车后退
void CAR_LGO(void); //小车原地左拐
void CAR_RGO(void); //小车原地右拐
void CAR_STOP(void); //小车停止
#endif
bluetooth.rc.c
#include "bluetooth_rc.h"
/*
接蓝牙
PA10 USART1-RX
PA9 USART1-TX
接串口调试
PA3 USART2-RX
PA2 USART2-TX
*/
uint8_t USART1_RX_BUF[USART1_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节.
uint16_t USART1_RX_STA=0;//接收状态标记//bit15:接收完成标志,bit14~0:接收到的有效字节数目
uint8_t USART1_NewData;//当前串口中断接收的1个字节数据的缓存
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//串口中断回调函数
{
if(huart ==&huart1)
{
USART1_RX_BUF[USART1_RX_STA&0X7FFF]=USART1_NewData;
HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1); //因为每执行完一次中断回调函数会将接收中断功能关闭,所以最后需要再开启接收中断
}
}
void test(void)
{
HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_0);
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_0);
HAL_Delay(500);
HAL_UART_Transmit(&huart2, (uint8_t *)"usart2 ok",9,0xFFFF); //将收到的信息发送出去
}
bluetooth.rc.h
#ifndef _BLUETOOTH_RC__
#define _BLUETOOTH_RC__
#include "stm32f1xx_hal.h" //HAL库文件声明
#include "main.h"
#include "car_control.h"
extern UART_HandleTypeDef huart1;//声明USART1的HAL库结构体
extern UART_HandleTypeDef huart2;//声明USART2的HAL库结构体
#define USART1_REC_LEN 200//定义USART1最大接收字节数
extern uint8_t USART1_RX_BUF[USART1_REC_LEN];//接收缓冲,最大USART_REC_LEN个字节.末字节为校验和
extern uint16_t USART1_RX_STA;//接收状态标记
extern uint8_t USART1_NewData;//当前串口中断接收的1个字节数据的缓存
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);//串口中断回调函数声明
void test(void);
#endif
多了一个带电量显示数码管,方便检测小车电量,以后会开源PCB