一、所需材料

面包板电源模块                              HC-05蓝牙模块                               stm32c6t6开发板

            ST-LINK V2下载器                          L298N迷你板                   小车底板材料

电脑(需要烧录代码到开发板中)       

杜邦线若干(没有的话也可以用普通电线代替,只是用来导电有接口,没有什么特殊性)

手机端Bluetooth Electronics app(去浏览器下载即可)

二、软件下载及环境搭建

本项目采用的是Keil_v5开发环境

具体环境搭建步骤可以参考其它博主的详细教程,此处不再赘述

需要注意的是该软件创建工程的时候比较麻烦,仔细一点

·测试是否搭建成功(点灯测试)

源代码如下:

#include "stm32f10x.h"
 

// 主函数
int main(void) {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	  GPIO_InitTypeDef GPIO_InitStructure;
	  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	  GPIO_Init(GPIOC,&GPIO_InitStructure);
	//GPIO_SetBits(GPIOC,GPIO_Pin_13);
	  GPIO_ResetBits(GPIOC,GPIO_Pin_13);
 
    while (1) {
        
    }
}

环境搭建成功的话,可以观察到开发板上的指示灯常亮

 

刚开始插上电脑的时候,由于stm32内原先有测试程序,所以会出现闪烁现象,烧录代码之后绿色指示灯常亮即环境搭建成功,可以进行后续步骤啦

如果测试未成功,建议检查接线以及是否缺少相关库文件

三、组装接线

可以参考作者在b站发布的详细教程

基于Keil_v5开发环境 stm32f103c6t6开发板 L298N电机驱动模块 HC-05蓝牙模块的双驱蓝牙小车教程(基础版)_哔哩哔哩_bilibili

完成图如下所示:

四、烧录代码

这里就直接给出源代码了:
 

#include "stm32f10x.h"

// 定义电机控制引脚
#define MOTOR1_FORWARD_PIN GPIO_Pin_0
#define MOTOR1_BACKWARD_PIN GPIO_Pin_1
#define MOTOR2_FORWARD_PIN GPIO_Pin_10
#define MOTOR2_BACKWARD_PIN GPIO_Pin_11

// 初始化串口
void USART_Config(void) {
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    // 打开串口和GPIOA的时钟
	
	
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);

    // 配置USART的TX引脚(PA9)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   // TX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置USART的RX引脚(PA10)
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;  // RX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置USART1参数
    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_Tx | USART_Mode_Rx;
    USART_Init(USART1, &USART_InitStructure);

    // 启动USART1
    USART_Cmd(USART1, ENABLE);
}

// 发送数据到蓝牙
void USART_SendDataDirect(uint16_t Data) {
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  // 等待数据寄存器为空
    USART_SendData(USART1, Data);  // 发送数据
}

// 电机控制函数
void Motor_Control(uint8_t command) {
    // 通过接收到的命令来控制电机
    if (command == 'F') {  // 前进
        GPIO_SetBits(GPIOB, MOTOR1_FORWARD_PIN);
        GPIO_ResetBits(GPIOB, MOTOR1_BACKWARD_PIN);
        GPIO_SetBits(GPIOB, MOTOR2_FORWARD_PIN);
        GPIO_ResetBits(GPIOB, MOTOR2_BACKWARD_PIN);
    }
    else if (command == 'B') {  // 后退
        GPIO_ResetBits(GPIOB, MOTOR1_FORWARD_PIN);
        GPIO_SetBits(GPIOB, MOTOR1_BACKWARD_PIN);
        GPIO_ResetBits(GPIOB, MOTOR2_FORWARD_PIN);
        GPIO_SetBits(GPIOB, MOTOR2_BACKWARD_PIN);
    }
    else if (command == 'L') {  // 左转
        GPIO_ResetBits(GPIOB, MOTOR1_FORWARD_PIN);
        GPIO_SetBits(GPIOB, MOTOR1_BACKWARD_PIN);
        GPIO_SetBits(GPIOB, MOTOR2_FORWARD_PIN);
        GPIO_ResetBits(GPIOB, MOTOR2_BACKWARD_PIN);
    }
    else if (command == 'R') {  // 右转
        GPIO_SetBits(GPIOB, MOTOR1_FORWARD_PIN);
        GPIO_ResetBits(GPIOB, MOTOR1_BACKWARD_PIN);
        GPIO_ResetBits(GPIOB, MOTOR2_FORWARD_PIN);
        GPIO_SetBits(GPIOB, MOTOR2_BACKWARD_PIN);
    }
    else {  // 停止
        GPIO_ResetBits(GPIOB, MOTOR1_FORWARD_PIN | MOTOR1_BACKWARD_PIN);
        GPIO_ResetBits(GPIOB, MOTOR2_FORWARD_PIN | MOTOR2_BACKWARD_PIN);
    }
}

// 主函数
int main(void) {
    // 配置电机控制引脚
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    GPIO_InitStructure.GPIO_Pin = MOTOR1_FORWARD_PIN | MOTOR1_BACKWARD_PIN |
                                  MOTOR2_FORWARD_PIN | MOTOR2_BACKWARD_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  // 设置为推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  // 配置引脚速度
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // 初始化串口
    USART_Config();

    while (1) {
        // 检查是否接收到数据
        if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) != RESET) {
            uint8_t command = USART_ReceiveData(USART1);  // 接收数据
            Motor_Control(command);  // 根据命令控制电机
        }
    }
}

我们在编写代码的时候,对于引脚的定义是可以修改的,具体可以参考stm32f103c6t6开发板的引脚定义

代码编写完成后先进行Build,图中红色圈圈处

然后进行下载

注意:下载器和sttm32的接线引脚一一对应即可,注意供电的选择不要接错线就OK

五、手机端Bluetooth Electronics app按键设置

找到添加这些按钮即可,注意每一个按钮要设置参数,前进为F,后退为B,左转为L,右转为 R,注意每个按钮松下即是S,这样按下即走,松开即停

六、连接蓝牙测试功能是否正常

这步需要手机端先找到蓝牙连接上,然后直接点run即可

完成后大概就是这个样子,可以正常跑起来啦,经测试功能正常,本项目到此完成!

制作不易,最后喜欢的话可以收藏+关注一波哦!后续还会更新升级避障版本的教程哦以及其它资料,有什么问题欢迎评论区交流~

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐