基于stm32蓝牙智能小车设计

基于stm32蓝牙智能小车设计前言:本文描述了一个由STM32微处理器、步进电机、蓝牙,L298N等模块构成的。该系统采用STM32微处理器为核心,在MDK环境下进行编程,通知控制L298N模块IN1~IN4引脚的高低电平进而控制电机的转动方向,使小车产生不同的转动模式。控制小车的转动模式通过蓝牙模块来实现,利用手机蓝牙助手和蓝牙模块相通,进而控制小车的各种运转模式。代码、蓝牙Androidapk地址:https://g…

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

Jetbrains全系列IDE稳定放心使用

前言:

本文描述了一个由STM32微处理器、步进电机、蓝牙,L298N等模块构成的。该系统采用STM32微处理器为核心,在MDK环境下进行编程,通知控制L298N模块IN1~IN4引脚的高低电平进而控制电机的转动方向,使小车产生不同的转动模式。控制小车的转动模式通过蓝牙模块来实现,利用手机蓝牙助手和蓝牙模块相通,进而控制小车的各种运转模式。 代码、蓝牙Android apk地址:https://github.com/daohewang/Bluetooth-intelligent-car
在这里插入图片描述

整体框架:

下面的图把核心连接部分都画出来了(其他部分按要求接就可以了,Vcc接电源,GND接地即可),图画的有点丑,希望大家不要介意呀(>-<)
在这里插入图片描述

硬件设计

使用微控制器为STM32F103RC,其芯片引脚如图所示
在这里插入图片描述

  1. 芯片上所连接的部分:
    PC10 -> IN1; PC11 -> IN2; PC12 -> IN3; PD2 -> IN4; 这里芯片上的GPIO口连接是随机的,可以根据自己的方便选择。不过这里要注意的是,IN1和IN2是控制左电机的,IN3和IN4是控制右电机。因为这里我用来驱动电机的是L298N。接线的话左电机接输出A端口,每个孔接一根线,如果要驱动两个左电机的话,也是一样接法,每个孔接一根电机线。右电机接输出B 。
    这里要注意的是驱动小车转动需要接外接电源,也就是图片上的12V供电部分。外接电源正极接到12v供电口上,负极接到供电GND上,还有要注意的一点就是还要将开发板上的地接到供电GND上,保证电源和开发板共地。
    如图所示:
    在这里插入图片描述

L298N逻辑电平表

在这里插入图片描述
2. JDY 30蓝牙模块
JDY-30 透传模块是基于蓝牙 2.1 协议标准,工作频段为 2.4GHZ 范围,具有信号强、数据传输快、性能稳定等特性。支持蓝牙 SPP 串口协议,内置 PCB 天线,支持 UART 接口,蓝牙 Class 2,数据传输比 BLE 蓝牙快、可达到几十 K 每秒以上的速率。如图3.2所示。
在这里插入图片描述
实物图:
在这里插入图片描述
引脚功能说明
1 、 UART-TX 串口输出,接开发板上的UART-Rx,电平为 TTL 电平
2 、 UART-RX 串口输入,接开发板上的UART-Tx,电平为 TTL 电平
3 、 VCC 3.3V 电源
4 、 GND 电源地

Android蓝牙助手已经包含到代码代码里了,直接下载即可。使用手机APP蓝牙连接JDY–30蓝牙模块。如图所示

在这里插入图片描述
这里的蓝牙助手使用方法要情调一下,可能有些同学不太会,点击右上角的连接按钮,先让手机连上蓝牙模块,一般连上了蓝牙模块上的灯都不会闪烁。以此判断有没有连接上。接着就是编辑键盘的小车的运动方式了,按照下面的来设置就可以了。这里的数字是我代码设置好的,可以按照自己的要求填写。
在这里插入图片描述

软件设计:

软件流程图:

首先对前进,后退,左转,右转,停止进行宏定义,单片机接收到蓝牙串口的相应指令,然后在if语句中进行比较,如果有相对应的,触发相对应的宏定义。流程图如图所示。在串口USART1中接收到的数据进行比较,暂停、前进、后退、左转、右转、原地左转,原地右转。启动字符为 “0”,“1”,“2”,“3”,“4”,“5”,“6”。

在这里插入图片描述

代码部分:

电机驱动代码

1.motor.h

#ifndef _MOTOR_H

#define _MOTOR_H

void MotorInit(void);

void Turnleft(void);

void Turnright(void);

void Turnback(void);

void Turnfront(void);

void Stop(void);

void Leftaround(void);

void Rightaround(void);

#endif 

2. motor.c

#include "STM32F10X.h"
#include "motor.h"

void MotorInit(void)
{
	
	//初始化和使能单片机上的GPIO端口,保证可以正常给端口高低电平
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	GPIO_SetBits(GPIOC, GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_6);
//	MOTOR_APB_PERIPH_FUNG(MOTOr_APB_PORT , ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD , ENABLE);
	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2;
	GPIO_Init(GPIOD, &GPIO_InitStructure);
	GPIO_SetBits(GPIOD, GPIO_Pin_2);
}


//停止模式
void Stop(void)
{
	GPIO_ResetBits(GPIOC,GPIO_Pin_10);
	GPIO_ResetBits(GPIOC,GPIO_Pin_11);
	GPIO_ResetBits(GPIOC,GPIO_Pin_12);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}


//左转模式 -> 左电机正转,右电机反转
void Turnleft(void)
{
	GPIO_SetBits(GPIOC,GPIO_Pin_10); 
	GPIO_ResetBits(GPIOC,GPIO_Pin_11);
	GPIO_ResetBits(GPIOC,GPIO_Pin_12);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
	GPIO_SetBits(GPIOC,GPIO_Pin_6);
}

//右转模式 -> 左电机反转,右电机正转
void Turnright(void)
{
	GPIO_ResetBits(GPIOC,GPIO_Pin_10);
	GPIO_SetBits(GPIOC,GPIO_Pin_11);
	GPIO_SetBits(GPIOC,GPIO_Pin_12);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	GPIO_SetBits(GPIOC,GPIO_Pin_6);
}

//后退模式 -> 左电机反转,右电机反转
void Turnback(void)
{
	
	GPIO_ResetBits(GPIOC,GPIO_Pin_10);
	GPIO_SetBits(GPIOC,GPIO_Pin_11);
	GPIO_ResetBits(GPIOC,GPIO_Pin_12);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
	GPIO_SetBits(GPIOC,GPIO_Pin_8);
	
}

//前进模式 -> 左电机正转,右电机正转
void Turnfront(void)
{
	GPIO_SetBits(GPIOC,GPIO_Pin_10);
	GPIO_ResetBits(GPIOC,GPIO_Pin_11);
	GPIO_SetBits(GPIOC,GPIO_Pin_12); 
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	GPIO_SetBits(GPIOC,GPIO_Pin_7);
}

//以左电机为中心原地左转
void Leftaround(void)
{
	GPIO_SetBits(GPIOC,GPIO_Pin_10);
	GPIO_ResetBits(GPIOC,GPIO_Pin_11);
	GPIO_SetBits(GPIOC,GPIO_Pin_12);
	GPIO_SetBits(GPIOD,GPIO_Pin_2);
	
}

//以右电机为中心原地右转
void Rightaround(void)
{
	GPIO_SetBits(GPIOC,GPIO_Pin_10);
	GPIO_SetBits(GPIOC,GPIO_Pin_11);
	GPIO_SetBits(GPIOC,GPIO_Pin_12);
	GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	
}


3. main函数

#include "MOTOR.h"
#include "stm32f10x.h"         //官方库
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_it.h"
#include <stdio.h>


/*

#ifdef->endif的内容部分和PUTCHAR_PROTOTYPE{}的内容属于C语言的语法规则引入,
所以头部必须引入#include<stdio.h>,这样子的话C语言的语法就可以完美引用

*/


#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


//中断服务函数  
u8 i;
u8 flag;  //定义一个标志位
void USART1_IRQHandler(void)  
  
{  
     if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)      //检查指定的 USART1 中断发生与否
      { 
			USART_ClearITPendingBit(USART1, USART_IT_RXNE);   //清除 USART1 的中断待处理位
			GPIO_ResetBits(GPIOC,GPIO_Pin_6);                 //设置LED灯作为中断发生与否的指示灯
			i=  USART_ReceiveData(USART1);                    //返回 USART1 最近接收到的数据
		//if语句的内容部分可以保证蓝牙接收到的flag数据是正确的,如果不加的话会导致接收不到正确的数据
		  if(i=='0')
				{                 
					 flag=0;
				}
				
			if(i=='1')
				{
					 flag=1;
				}
				
			if(i=='2')
			   {
					 flag=2;
				}
			   
			if(i=='3')
			   {
								 
					flag=3;
			   }
			   
			if(i=='4')
			  {
					flag=4;
			  }
			  
			if(i=='5')
			  {
					flag=5;
			  }
			  
			if(i=='6')
			 {
					flag=6;
			 }

		  }
		  
//		  USART_ClearITPendingBit(USART1, USART_IT_RXNE);
      }
	  
	  
int main(void)
{
	
	//利用中断进行蓝牙的收发
	
	  GPIO_InitTypeDef GPIO_InitStructure;
	  USART_InitTypeDef USART_InitStructure;
      NVIC_InitTypeDef NVIC_InitStructure;

	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能USART1,GPIOA时钟
// 	USART_DeInit(USART1);  //复位串口1
//  USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9
   
    //USART1_RX	  PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //初始化PA10     
	
	 
    /* USARTx configured as follow:
       - BaudRate = 9600 baud  波特率
       - Word Length = 8 Bits  数据长度
       - One Stop Bit          停止位
       - No parity             校验方式
       - Hardware flow control disabled (RTS and CTS signals) 硬件控制流
       - Receive and transmit enabled                         使能发送和接收
    */
		USART_InitStructure.USART_BaudRate = 9600;
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;
		USART_InitStructure.USART_StopBits = USART_StopBits_1;
		USART_InitStructure.USART_Parity = USART_Parity_No;
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
		USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

		USART_Init(USART1, &USART_InitStructure);
		USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断

    //Usart1 NVIC 配置
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	  NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
      USART_Cmd(USART1, ENABLE);                    //使能串口 
	  MotorInit();
	  
	  
	  //蓝牙数据接收判断函数
	  while(1)
	  {
		
		  switch(flag)
              {
					case 0:  Stop();         break  ;
					case 1:  Turnleft();     break  ;
					case 2:  Turnright();    break  ;
					case 3:  Turnback();     break  ;
					case 4:  Turnfront();    break  ;
					case 5:  Leftaround();   break  ;
					case 6:  Rightaround();  break  ;
                    default: Stop();         break  ;                                                                                                
	          }		  
	  }
	  
}

PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
 USART_SendData(USART1, (uint8_t) ch);

  /* 循环等待直到发送结束*/
  while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
  {}

  return ch;
}

以上就是蓝牙智能小车的全部部分了,完整代码可以到我的GitHub上进行下载,下载地址:https://github.com/daohewang/Bluetooth-intelligent-car如果还有问题的话,欢迎下方留言咨询。

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

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

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

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

(0)
blank

相关推荐

  • Redis 修改默认端口号 修改配置文件 redis.windows.conf[通俗易懂]

    Redis 修改默认端口号 修改配置文件 redis.windows.conf[通俗易懂]简单说明一下Redis修改端口号的方法,本文用的是修改redis.windows.conf文件的方式,主要代码已经用橙色标记以便于各位伙伴直接复制使用。1.首先找到redis.windows.conf文件的位置,然后右键选择工具打开,如下图:2.打开之后可以直接Ctrl+F快捷键搜索port63或者port6379前提是你之前没有修改过端口号,或者直接下…

  • sigaction函数解析

    sigaction函数解析sigaction函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作)。他是POSIX的信号接口,而signal()是标准C的信号接口(如果程序必须在非POSIX系统上运行,那么就应该使用这个接口)给信号signum设置新的信号处理函数act,同时保留该信号原有的信号处理函数oldactint sigaction(int signo,

  • MySQL数据库:存储引擎

    MySQL数据库:存储引擎

  • [Elasticsearch]如何通过python操作ES数据库 pythonElasticsearch入门

    [Elasticsearch]如何通过python操作ES数据库 pythonElasticsearch入门[Elasticsearch]如何通过python操作ES数据库pythonElasticsearchElasticsearch基本介绍Elasticsearch入门安装与启动python操作ES数据库连接ES数据库无用户名密码状态有密码创建索引(ES中的索引即数据库)插入数据单条数据多条数据查询数据查询结果返回参数各字段含义最直接的查询方法用body指定条件模糊查询term精确查询multi_match,多字段查询prefix,前缀查询wildcard,通配符查询regexp,正则匹配bool,多条

  • 最新VMware 安装Windows10——图文操作,超详细~~~「建议收藏」

    最新VMware 安装Windows10——图文操作,超详细~~~「建议收藏」VMware安装win10系统之前一直卡在找不到映像文件和开机需要登陆密码之个步骤,后续又卡在了设置,干脆自己梳理了下具体步骤,防止再次踩坑~

  • Lambda plus: 云上大数据解决方案

    Lambda plus: 云上大数据解决方案本文会简述大数据分析场景需要解决的技术挑战,讨论目前主流大数据架构模式及其发展。最后我们将介绍如何结合云上存储、计算组件,实现更优的通用大数据架构模式,以及该模式可以涵盖的典型数据处理场景。大数据处理的挑战现在已经有越来越多的行业和技术领域需求大数据分析系统,例如金融行业需要使用大数据系统结合VaR(valueatrisk)或者机器学习方案进行信贷风控,零售、餐饮行业需要大数据系统…

发表回复

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

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