stm32蓝牙遥控小车(hal库)

这篇具有很好参考价值的文章主要介绍了stm32蓝牙遥控小车(hal库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.cubemx配置

stm32hal库蓝牙,HAL库小车制作之路,stm32,单片机,嵌入式硬件

 我使用的板子是stm32f103rct6,这里我们使用串口1,选择异步模式,注意波特率的选择,一般是9600或者115200,如果波特率选择不对的话是不能进行通讯的(我小车怎么也动不了搞了好久最后发现是波特率选错了,气死了),我用的蓝牙模块是HC-05(ps:我的stm32f103rct6的板子的串口波特率时9600,stm32f407vgt6的板子的波特率是28800)

stm32hal库蓝牙,HAL库小车制作之路,stm32,单片机,嵌入式硬件

                                                       stm32hal库蓝牙,HAL库小车制作之路,stm32,单片机,嵌入式硬件

 打开串口1的中断,中断优先级根据自己的实际需求选择。

stm32hal库蓝牙,HAL库小车制作之路,stm32,单片机,嵌入式硬件

 这样就配置完了,连线的时候stm32hal库蓝牙,HAL库小车制作之路,stm32,单片机,嵌入式硬件,注意蓝牙的RX连接PA9,TX连接PA10,不要连错了。

二.代码部分

代码直接从keil5里复制粘贴中文注释部分会乱码,过两天我再给修改一下,主函数循环前不要忘了开启串口1的接收中断。

HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1);

 Car_Move.c

#include "tim.h"
#include "Car_Move.h"
#include "gpio.h"


void Motor1Forward(int16_t speed)
{
	HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
  
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);

  __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1, speed);
}

void Motor2Forward(int16_t speed)
{
	HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);
	
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_SET);
	
	__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, speed);
}
void Motor3Forward(int16_t speed)
{
	HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);
	
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,GPIO_PIN_SET);
	
	__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_3, speed);
}
void Motor4Forward(int16_t speed)
{
	HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_4);
	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,GPIO_PIN_SET);
	
	__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_4, speed);
}
/************************************************/
void Motor1Stop(void)
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8,0);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,0);
}
void Motor2Stop(void)
{
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,0);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,0);
}
void Motor3Stop(void)
{
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,0);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,0);
}
void Motor4Stop(void)
{
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,0);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,0);
}
/*********************************************/
void Motor1Back(int16_t speed)
{
	HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_1);
  
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);

  __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1, speed);
}
void Motor2Back(int16_t speed)
{
	HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_2);
	
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4,GPIO_PIN_SET);
	
	__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2, speed);
}
void Motor3Back(int16_t speed)
{
	HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_3);
	
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13,GPIO_PIN_SET);
	
	__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_3, speed);
}
void Motor4Back(int16_t speed)
{
	HAL_TIM_PWM_Start(&htim8, TIM_CHANNEL_4);
	
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1,GPIO_PIN_RESET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0,GPIO_PIN_SET);
	
	__HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_4, speed);
}
/*********************************************/
void Move_Forward(uint16_t speed)
{	
	Motor1Forward(speed);
	Motor2Forward(speed);
	Motor3Forward(speed);
	Motor4Forward(speed);	 				
}
void Move_Back(uint16_t speed)
{
	Motor1Back(speed);
	Motor2Back(speed);
	Motor3Back(speed);
	Motor4Back(speed);	 				
}
void TurnLeft(uint16_t speed)
{
	Motor1Back(speed);	
	Motor2Forward(speed);
	Motor3Back(speed);	
	Motor4Forward(speed);					
}
void TurnRight(uint16_t speed)
{
	Motor1Forward(speed);
	Motor2Back(speed);
	Motor3Forward(speed);
	Motor4Back(speed); 				
}	
void Move_Stop(void)
{
	Motor1Stop();
	Motor2Stop();
	Motor3Stop();
	Motor4Stop(); 				
}
void Move_Right(uint16_t speed)
{
	Motor1Forward(speed);
	Motor2Back(speed);
	Motor3Back(speed);
	Motor4Forward(speed); 
}
void Move_Left(uint16_t speed)
{
	Motor1Back(speed);
	Motor2Forward(speed);
	Motor3Forward(speed);
	Motor4Back(speed); 		
}
void Move_UpRight(uint16_t speed)
{
	Motor1Forward(speed);
	
	Motor4Forward(speed);		
}
void Move_UpLeft(int16_t speed)
{
	Motor2Forward(speed);
	
	Motor3Forward(speed);		
}
void Move_DownLeft(int16_t speed)
{
	Motor1Back(speed);
	
	Motor4Back(speed);		
}
void Move_DownRight(int16_t speed)
{
	Motor2Back(speed);
	
	Motor3Back(speed);		
}

 stm32hal库蓝牙,HAL库小车制作之路,stm32,单片机,嵌入式硬件

 Car_Move.h

#ifndef __car_move_h__
#define __car_move_h__

void Motor1Forward(int16_t speed);
void Motor2Forward(int16_t speed);
void Motor3Forward(int16_t speed);
void Motor4Forward(int16_t speed);

void Motor1Stop(void);
void Motor2Stop(void);
void Motor3Stop(void);
void Motor4Stop(void);

void Motor1Back(int16_t speed);
void Motor2Back(int16_t speed);
void Motor3Back(int16_t speed);
void Motor4Back(int16_t speed);

void Move_Forward(uint16_t speed);
void Move_Back(uint16_t speed);
void TurnLeft(uint16_t speed); //ÆÕͨÂÖ×Ó
void TurnRight(uint16_t speed); //ÆÕͨÂÖ×Ó
void Move_Stop(void);
/*Âó¿ËÄÉÄ·ÂÖ*/
void Move_Right(uint16_t speed);
void Move_Left(uint16_t speed);
void Move_UpRight(uint16_t speed);
void Move_UpLeft(int16_t speed);
void Move_DownLeft(int16_t speed);
void Move_DownRight(int16_t speed);


#endif

 bluetooth.c

#include "bluetooth.h"
#include "control.h"


uint8_t USART1_RX_BUF[USART1_REC_LEN];//接收缓冲,最大USART1_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)
    {
        if((USART1_RX_STA&0x8000)==0)//接收未完成
        {
            if(USART1_NewData==0x5A)//接收到了0x5A
            {
                 USART1_RX_STA|=0x8000;   //接收完成了,将USART1_RX_STA中的bit15置1
            }
            else
            {
                   USART1_RX_BUF[USART1_RX_STA&0X7FFF]=USART1_NewData; //将接收到的数据放入数组
                   USART1_RX_STA++;  //数据长度计数加1
                   if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收
            }
        }
        HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1); //因为每执行完一次中断回调函数会将接收功能关闭,所以最后要再次开启中断
    }
		if(USART1_RX_STA&0x8000)         //判断中断接受标志位(蓝牙模块使用USART1)    
		{
		 if((USART1_RX_STA&0x7FFF)==5 //判断接收数量	                    
				&& USART1_RX_BUF[0]==0xA5 	//判断接接收第一个数据是不是包头0xA5
				&& USART1_RX_BUF[4]==(USART1_RX_BUF[1]+USART1_RX_BUF[2]+USART1_RX_BUF[3])%0x100)	//判断接受校验码是不是原数据之和低8位
			{
				X=USART1_RX_BUF[1];     //接受并读取蓝牙发送过来的数据
				Y=USART1_RX_BUF[2];
				Z=USART1_RX_BUF[3];
			} 
		 USART1_RX_STA=0;		 //标志位清0,准备下一次接收
		}

}

bluetooth.h

#ifndef __BLUETOOTH_H__
#define __BLUETOOTH_H__

#include "main.h" //HAL库文件声明

extern UART_HandleTypeDef huart1;//声明USART2的HAL库结构体

#define USART1_REC_LEN  200//定义USART2最大接收字节数

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);//串口中断回调函数声明

#endif 

蓝牙部分代码参考自这篇文章蓝牙小车(基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图)

Control.c

#include "gpio.h"
#include "Car_Move.h"
#include "Control.h"
#include "bluetooth.h"

int X,Y,Z;

void Control(void)
{

	if(Y==1)
		{
			Move_Forward(3000);
		}
		else if(Y==2)
		{
			Move_Back(3000);
		}
		else if(Z==1)
		{
			TurnRight(3000);
		}
		else if(Z==2)
		{
			TurnLeft(3000);
		}			
		else if(X==1)
		{
			Move_Right(3000);
		}
		else if(X==2)
		{
			Move_Left(3000);
		}				
		else
		{
			Move_Stop();
		}
}

Control.h

#ifndef __CONTROL_H
#define __CONTROL_H

extern int X,Y,Z;

void Control(void);

#endif

以上就是主要的代码了,主要我还是新手,代码有很多要改进的地方,后期我会再慢慢修改完善代码。

三.手机蓝牙调试app使用方法

蓝牙小车(基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图)

还是这篇文章,文章后半部分详细地讲解了app的使用方法。

(本片文章主要用于记录我的代码和其他一些东西以提醒我自己)文章来源地址https://www.toymoban.com/news/detail-739711.html

到了这里,关于stm32蓝牙遥控小车(hal库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 5.39 综合案例2.0 - STM32蓝牙遥控小车1(手机APP遥控)

    APP遥控) 点 击 跳 转 点击跳转HaaS506官方最新案例 用STM32单片机做了一辆蓝牙控制的麦轮小车,分享一下小车的原理和制作过程。 控制部分分为手机APP,语音模块控制,Haas506开发板三种。 本文介绍手机APP的控制的方法以及小车的制作。 器件说明 器件 数量 说明 STM32F103C8T6单片

    2024年02月09日
    浏览(55)
  • 基于蓝牙技术使用stm32制造一个智能小车 (寻迹,避障,遥控)

    目录 1.制作智能小车的硬件名单: 3.引脚图 2.先让小车动起来  1.小车运动 2.代码 3.寻迹  1.工作原理 2.代码 4.超声波避障  1.工作原理 2.代码 5.蓝牙遥控  1.蓝牙工作原理 2.代码 6.oled屏幕 1.工作内容 7.led灯 8.蜂鸣器 9.蓝牙使用代码main  STM32C6T6核心板 1块 L298N电机驱动  1块 五

    2024年02月15日
    浏览(39)
  • 5.39 综合案例2.0 - STM32蓝牙遥控小车2(语音控制)

    点 击 跳 转 点击跳转HaaS506官方最新案例 用语音识别当stm32智能车的遥控器,还能这样玩 用STM32单片机做了一辆蓝牙控制的麦轮小车,分享一下小车的原理和制作过程。 控制部分分为手机APP,语音模块控制,Haas506开发板三种。 本文介绍语音模块控制的方法以及小车的制作。

    2024年02月16日
    浏览(47)
  • 5.39 综合案例2.0 - STM32蓝牙遥控小车4(体感控制)

    点 击 跳 转 点击跳转HaaS506官方最新案例 用STM32单片机做了一辆蓝牙控制的麦轮小车,分享一下小车的原理和制作过程。 控制部分分为手机APP,语音模块控制,Haas506开发板(遥感 + 体感)三种。 本文介绍Haas506(体感)控制的方法以及小车的制作。 器件说明 器件 数量 说明 STM32F

    2023年04月11日
    浏览(36)
  • STM32超级蓝牙小车——基于STM32F103C8T6的多功能蓝牙小车(PID循迹、跟踪、有源蜂鸣器播放音乐、蓝牙遥控、AD采集+DMA转运等超多元素小车)

    一、项目时间:2023.7.24~11.26 二、实现效果:通过蓝牙控制小车运动与模式转换                         模式一:循迹模式                         模式二:跟踪模式                         模式三:音乐模式                         模式四:控制运动模式 三、使

    2024年02月04日
    浏览(54)
  • STM32基于hal库的智能小车—红外寻迹

    材料: (1)stm32f407zgt6最小系统开发板 (2)l298n电机驱动模块1个 (3)四个电机 (4)循迹红外模块3个 一、组装 (1)L298N电机驱动模块与stm32开发板接线如下图: 说明:PWM接线把跳线帽扒开接外面引脚 CH1接ENA,CH2接ENB。 (2)寻迹红外接线: 二、主要程序 1、STM32CUBEMX配置如下:

    2024年02月01日
    浏览(45)
  • 基于STM32CUBEMX,HAL库蓝牙通信

    1.准备工作 蓝牙模块HC-05模块 安卓APP软件 HC-05蓝牙模块支持AT指令。要进入AT指令模式,需要先按住蓝牙模块上的按键,接通电源,当模块上的LED灯进入慢闪后再松开按键,此时已经进入AT指令模式,可以进行AT指令设置1。 常用的AT指令包括: AT+VERSION? 返回HC-05的软件版本号

    2024年02月08日
    浏览(74)
  • STM32超声波避障小车(舵机云台+超声波/stm32f103/HAL/Cube)

    一、小车1.0——基本蓝牙小车(仅蓝牙遥控小车运动方向,本篇) 二、小车2.0——蓝牙小车PLUS(可以蓝牙控制方向+蓝牙直接调节车速) 三、小车3.0——避障小车(超声波+舵机云台) 四、小车4.0——无线手柄方向感知操控小车(mpu6050+双蓝牙透传) 五、双轮自平衡小车(HAL库版

    2024年02月05日
    浏览(73)
  • STM32蓝牙小车制作全过程---刚入门的小白也能会

    首先我本人也是学stm32满打满算也才半个学期的小白,经过半学期的学习总感觉理论啥的虚了点,所以就打算搞辆蓝牙小车来练练手,这就有了现在的这篇文章,来分享一下制作小车时的一些问题和经验希望能帮助到更多的小白(。・ω・。),有说错的地方希望大家能指正哈。

    2023年04月08日
    浏览(42)
  • 嵌入式开发的学习与未来展望:借助STM32 HAL库开创创新之路

      引言: 嵌入式开发作为计算机科学领域的重要分支,为我们的日常生活和产业发展提供了无限的可能。STMicroelectronics的STM32系列芯片以其出色的性能和广泛的应用领域而备受关注。而STM32 HAL库作为嵌入式开发的高级库,为学习者提供了更高效、更简单的开发方式。本文将结

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包