蓝牙遥控小车基础篇

news2024/11/23 12:10:17

 

开发环境:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门——函数重载

C入门——函数重载与缺省 先说说什么是缺省 大家生活中都知道什么关于缺省这个词的例子吗&#xff1f; 肯定是一头雾水&#xff0c;没事我举一个例子&#xff0c;给大家解释一下。 假如小菜是一个舔狗&#xff0c;他天天跟女神买早餐、嘘寒问暖。可是女神还是天天不为所动&am…

基于LabVIEW单片机的抢答器的设计

实训题目&#xff1a;基于LabVIEW单片机的抢答器的设计 1 系统设计 1.1 设计要求 1.1.1 设计任务 设计一个基于LABVIEW的6人抢答器&#xff0c;实现抢答器的基本功能。 1.1.2 性能指标要求 需要自己设计电路并焊接电路板。基本要求&#xff1a;有一个主持人控制开关和…

【华为机试真题详解】投篮大赛【2022 Q4 | 100分】

文章目录 前言题目描述示例 1题目解析参考代码前言 《华为机试真题详解 Python实现》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优)…

WeOps上新啦 | WeOpsV3.13网络设备监控全新改造,支持拓展不同品牌型号

本次WeOpsV3.13版本更新主题总结为&#xff1a; 优化网络设备监控&#xff0c;支持拓展不同品牌和型号的设备监控新增3D立体应用全景大屏&#xff0c;全方位展示应用和监控情况新增事件订阅&#xff0c;支持资产的到期提醒监控告警/IT服务台等模块持续更新&#xff0c;简化操作…

基于Android的太原市景点推荐系统的设计与实现

毕业设计 基于Android的太原市景点 推荐系统的设计与实现 1&#xff0e;课题意义及目标 随着人们生活水平的提高&#xff0c;外出旅游已经成了人们放松休闲的主要活动之一。现在移动端设备已是人们必备&#xff0c;最重要的是携带方便&#xff0c;基于Android的太原市景点推…

数图互通公用房基础数据管理与维护

公用房情况信息化&#xff0c;包括公用房位置、面积参数等&#xff0c;可便捷维护&#xff0c;并提供查询统计&#xff1b;实现二级单位对分配公用房的管理&#xff0c;可便捷维护&#xff0c;并提供查询统计&#xff1b;实现公用房使用人&#xff0c;对使用公用房的管理&#…

C++ Reference: Standard C++ Library reference: Containers: list: list: clear

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/clear/ 公有成员函数 <list> std::list::clear C98 void clear(); C11 void clear() noexcept;清除内容 从list容器中删除所有元素&#xff08;已销毁&#xff09;&#xff0c;并将容器的size保留为…

设计模式-外观模式

前言 在聊外观模式之前&#xff0c;我们先来聊聊体检过程。一般体检过程就是我们根据网上预定得日期空腹去体检中心。根据预定得项目&#xff0c;有一般检查、内科、外科、眼科、彩超、心电图、血常规、尿常规等等项目。 而我们往往第一次去是不知道这些房间是在哪里的&#…

XenServer7.6安装教程

XenServer7.6安装安装步骤其他XenServer 7.0 系统 yum 出错解决办法XenServer其他部署问题安装步骤 进入系统启动界面 > 按回车&#xff0c;等待加载&#xff1a; 1、键盘布局选择 > 选择us&#xff1a; 2、欢迎界面 > 选择ok&#xff1a; 3、用户协议 > 选…

【大数据入门核心技术-Flume】(三)使用Flume采集数据到HDFS

目录 一、准备工作 1、Hadoop环境安装 2、Flume安装部署 二、采集数据到HDFS 1、配置任务文件 2、启动传输 3、查看是否同步成功 三、常见问题 1、运行flume-ng agent时报错com.google.common.base.Preconditions.checkArgument 2、ERR: File name has been re-used w…

tomcat配置https

tomcat配置前提需要开放需要配置端口&#xff0c;尤其是云服务器需要单独去提供商控制面板放行好再进行配置HTTPS&#xff0c;常见配置的端口&#xff1a;443、8443&#xff0c;另外配置过程如果项目正常运行&#xff0c;建议备份一份配置文件。 tomcat配置https步骤 一、我们…

EEMD(集合经验模态分解)

1. EEMD(集合经验模态分解)的概念 EEMD(Ensemble Empirical Mode Decomposition)是最常见的一种EMD改进方法。他的优势主要是解决EMD方法中的模态混叠现象。 说到模态混叠,顾名思义就是不同模态的信号混叠在一起,一般有两种情况:一是不同特征尺度的信号在一个IMF分量中…

更多自有品牌创新好物,尽在2023深圳国际自有品牌展暨新消品展

受整体环境的影响&#xff0c;以及内容购物、兴趣电商、O2O、团长等新消费方式崛起&#xff0c;传统商场、大卖场等实体零售市场发展呈下滑趋势。让零售行业可以重拾信心&#xff0c;迫切需要寻找新的业绩突破形式。这些年自有品牌&#xff0c;被越来越多的国内零售商所关注&am…

BL101助力于采集光伏电流电压

能源危机在世界范围内愈演愈烈&#xff0c; 俄乌冲突后&#xff0c;美国加大对俄罗斯能源的制裁力度&#xff0c;禁止从俄罗斯进口能源&#xff0c;也想办法让其欧洲盟友对俄罗斯进行抵制。导致油价高企&#xff0c;天然气价格也是一路飙升。各国都在发展新能源&#xff0c;风电…

【工具】JS脚本|网页任意视频倍速播放(包括MOOC、本地视频、其他的视频)

只要浏览器播放视频时用的是<video>&#xff0c;而且当前页面只有这一个视频&#xff0c;就可以用这个脚本。 刚好也是世界杯 CSDN 博客的活动了&#xff0c;虽然对活动没什么兴趣但是还是写一句和活动相关的话吧——世界杯为什么要看直播呢&#xff01;不如一起来倍速观…

ssm+Vue计算机毕业设计校园洗衣机预约系统(程序+LW文档)

ssmVue计算机毕业设计校园洗衣机预约系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

Linux内存查看通用方法(二): kernel空间

接上文&#xff1a; Linux内存查看通用方法&#xff08;一&#xff09;&#xff1a; user空间_红桃Jk的博客-CSDN博客_linux内存查看在嵌入式linux上&#xff0c;统计内存情况的一般方法https://blog.csdn.net/qq_34597963/article/details/126023451?spm1001.2014.3001.5501…

用 CSS 从零写一个时间轴效果

时间轴效果介绍 在前端开发中&#xff0c;我们会遇到一些场景特别适合用时间轴来展示&#xff0c;例如下面按照日期时间来记录发生的事件&#xff1a; 还可以做成下面这种比较流行的左右对称卡片风格的时间轴&#xff1a; 如果再稍加装饰&#xff0c;还能有更加高大上的效果&a…

跨域的部分理解

1、跨域的原理 跨域&#xff0c;是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的。 同源策略&#xff0c;是浏览器对 JavaScript 实施的安全限制&#xff0c;只要协议、域名、端口有任何一个不同&#xff0c;都被当作是不同的域。 跨域原理&#xff0c;即是通…

量子计算(十四):超导量子芯片

文章目录 超导量子芯片 超导量子芯片 超导量子计算是基于超导电路的量子计算方案&#xff0c;其核心器件是超导约瑟夫森结。超导量子电路在设计、制备和测量等方面&#xff0c;与现有的集成电路技术具有较高的兼容性&#xff0c;对量子比特的能级与耦合可以实现非常灵活的设计…