目录
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
本项目通过蓝牙模块和QT应用程序相结合,展示了一种基于蓝牙技术的无线控制方案。研究并实现该方案不仅有助于理解蓝牙通信和QT编程,还能为类似的智能控制项目提供参考,具有较高的学习和应用价值。
提示:以下是本篇文章正文内容,下面案例可供参考
一、系统设计
1.1 硬件设计
系统硬件部分包括蓝牙模块、单片机、减速电机和驱动模块。具体硬件连接如下:
- 蓝牙模块:使用HC-05蓝牙模块,与PC端QT应用程序进行无线通信。
- 单片机:采用STM51单片机作为核心控制器,负责接收蓝牙指令并控制电机驱动。
- 减速电机:四个轮子分别配备一个减速电机,提供小车的驱动力。
- 电机驱动模块:使用L298N电机驱动模块,控制电机的前进、后退、转向等动作。
1.2 软件设计
系统软件部分使用QT框架开发PC端控制程序,通过串口通信实现与蓝牙模块的数据传输。主要功能包括界面设计、串口配置、指令发送和数据接收。
二、系统实现
2.1 硬件实现
将四个电机分别连接到L298N电机驱动模块的输出端,L298N的输入端连接到STM51单片机的GPIO口。HC-05蓝牙模块的RXD和TXD引脚分别连接到STM51单片机的TXD和RXD引脚,实现串口通信。
2.2 软件实现
2.2.1 界面设计
使用QT Designer设计控制界面,包含前进、后退、左转、右转、停止、加速和减速按钮。
mainwindow.h
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QObject>
#include <QDebug>
#include <QBluetoothDeviceDiscoveryAgent>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
在主窗口构造函数中,初始化界面组件并设置槽函数。
2.2.2.串口配置
在主窗口类中创建QSerialPort对象,配置串口参数(如波特率、数据位、校验位、停止位等)。
因为用的是低功耗串口,需要在电脑这里看是COM几,如果打开失败就看一下串口写对没有
void MainWindow::PortConfigureInit(void)// 设置串口参数
{
serial = new QSerialPort;
serial->setPortName("COM7");//要打开串口的名字
if(serial->open(QIODevice::ReadWrite))//打开串口
{
qDebug("打开成功");
}
else
{
qDebug("打开失败");
}
serial->setBaudRate(QSerialPort::Baud115200);//设置波特率
serial->setDataBits(QSerialPort::Data8);//设置数据位
serial->setParity(QSerialPort::NoParity);//设置校验位
serial->setStopBits(QSerialPort::OneStop);//设置停止位
serial->setFlowControl(QSerialPort::NoFlowControl); //设置为无流控制
QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);
qDebug("OPEN");
}
3.2.3.信号与槽连接
将按钮的点击信号与相应的槽函数连接。
// 前进按钮槽函数
void MainWindow::on_pushButton_clicked()
{
sendCommand(1);
qDebug("前进");
}
// 左转按钮槽函数
void MainWindow::on_pushButton_2_pressed()
{
sendCommand(3);
qDebug("左转");
}
// 左转按钮槽函数
void MainWindow::on_pushButton_2_released()
{
sendCommand(0);
qDebug("停止");
}
// 右转按钮槽函数
void MainWindow::on_pushButton_3_pressed()
{
sendCommand(4);
qDebug("右转");
}
// 右转按钮槽函数
void MainWindow::on_pushButton_3_released()
{
sendCommand(0);
qDebug("停止");
}
// 后退按钮槽函数
void MainWindow::on_pushButton_4_pressed()
{
sendCommand(2);
qDebug("后退");
}
void MainWindow::on_pushButton_4_released()
{
sendCommand(0);
qDebug("停止");
}
// 打开串口按钮槽函数
void MainWindow::on_pushButton_5_clicked()
{
PortConfigureInit();
}
// 停止按钮槽函数
void MainWindow::on_pushButton_6_clicked()
{
sendCommand(0);
qDebug("停止");
}
// 加速按钮按下槽函数
void MainWindow::on_pushButton_7_pressed()
{
sendCommand(5);
qDebug("速度+10");
}
// 加速按钮松开槽函数
void MainWindow::on_pushButton_7_released()
{
//endCommand(0);
qDebug("加速完成");
}
// 减速按钮按下槽函数
void MainWindow::on_pushButton_8_pressed()
{
sendCommand(6);
qDebug("速度-10");
}
// 减速按钮松开槽函数
void MainWindow::on_pushButton_8_released()
{
//sendCommand(0);
qDebug("减速完成");
}
2.2.4 指令发送
在槽函数中生成控制指令并通过串口发送给小车。
// 发送指令函数
void MainWindow::sendCommand(unsigned char command)
{
serial->write(reinterpret_cast<const char*>(&command), 1);
}
2.2.5.数据接收与处理
实现串口数据接收函数,将接收到的数据转换为十六进制。
// 读取串口数据
void MainWindow::ReadData(void)
{
QByteArray info = serial->readAll();
QByteArray hexData = info.toHex(); // 转换为十六进制
}
2.2.6.Qt ui界面设计
使用Qt Designer设计控制界面,添加前进、后退、左转、右转、停止、加速和减速按钮。
2.3 硬件连接
将四个电机分别连接到L298N电机驱动模块的输出端,L298N的输入端连接到STM51单片机的GPIO口。HC-05蓝牙模块的RXD和TXD引脚分别连接到STM51单片机的TXD和RXD引脚,实现串口通信。
2.4 测试与调试
- 硬件测试:连接所有硬件模块,确保电机、蓝牙模块和单片机正常工作。
- 软件调试:运行Qt控制软件,测试各个按钮的功能,确保能够正确控制小车的前进、后退、左转、右转、停止和速度调节。
- 综合测试:通过PC端软件对小车进行综合测试,确保指令传输的实时性和控制的准确性。
三、总结
本设计旨在研究基于Qt的蓝牙遥控车的设计与实现,通过结合Qt和蓝牙通信技术,开发一款能够远程控制小车的系统。通过研究,可以深入理解Qt编程和蓝牙通信的原理和应用,为智能小车技术的进一步研究和应用打下坚实基础。
四、完整工程代码
xiao_che.pro
QT += core gui bluetooth
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = BluetoothSerial
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORMS += mainwindow.ui
# 添加蓝牙模块
QT += bluetooth
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtSerialPort/QSerialPort> // 包含串口类的头文件
#include <QtSerialPort/QSerialPortInfo>
#include <QApplication>// 包含应用程序类的头文件
#include <QPushButton>// 包含按钮类的头文件
#include <QtBluetooth> // 包含蓝牙套接字类的头文件
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_clicked(); // 前进按钮槽函数
void on_pushButton_2_pressed(); // 左转按钮槽函数
void on_pushButton_2_released(); // 左转按钮槽函数
void on_pushButton_3_pressed(); // 右转按钮槽函数
void on_pushButton_3_released(); // 右转按钮槽函数
void on_pushButton_4_pressed(); // 后退按钮槽函数
void on_pushButton_4_released(); // 后退按钮槽函数
void on_pushButton_5_clicked(); // 打开串口按钮槽函数
void on_pushButton_6_clicked(); // 停止按钮槽函数
void on_pushButton_7_pressed(); // 加速按钮按下槽函数
void on_pushButton_8_pressed(); // 减速按钮按下槽函数
private:
Ui::MainWindow *ui;
QSerialPort *serial;
void PortConfigureInit(void); // 串口配置初始化
void ReadData(void); // 读取串口数据
void sendCommand(unsigned char command); // 发送指令函数
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QObject>
#include <QDebug>
#include <QBluetoothDeviceDiscoveryAgent>
#include <QLowEnergyController>
#include <QLowEnergyService>
#include <QLowEnergyCharacteristic>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
// 析构函数
MainWindow::~MainWindow()
{
delete ui;
}
// 串口配置初始化
void MainWindow::PortConfigureInit(void)// 设置串口参数
{
serial = new QSerialPort;
serial->setPortName("COM7");//要打开串口的名字
if(serial->open(QIODevice::ReadWrite))//打开串口
{
qDebug("打开成功");
}
else
{
qDebug("打开失败");
}
serial->setBaudRate(QSerialPort::Baud115200);//设置波特率
serial->setDataBits(QSerialPort::Data8);//设置数据位
serial->setParity(QSerialPort::NoParity);//设置校验位
serial->setStopBits(QSerialPort::OneStop);//设置停止位
serial->setFlowControl(QSerialPort::NoFlowControl); //设置为无流控制
QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);
qDebug("OPEN");
}
// 读取串口数据
void MainWindow::ReadData(void)
{
QByteArray info = serial->readAll();
QByteArray hexData = info.toHex(); // 转换为十六进制
}
// 发送指令函数
void MainWindow::sendCommand(unsigned char command)
{
serial->write(reinterpret_cast<const char*>(&command), 1);
}
// 前进按钮槽函数
void MainWindow::on_pushButton_clicked()
{
sendCommand(1);
qDebug("前进");
}
// 左转按钮槽函数
void MainWindow::on_pushButton_2_pressed()
{
sendCommand(3);
qDebug("左转");
}
// 左转按钮槽函数
void MainWindow::on_pushButton_2_released()
{
sendCommand(0);
qDebug("停止");
}
// 右转按钮槽函数
void MainWindow::on_pushButton_3_pressed()
{
sendCommand(4);
qDebug("右转");
}
// 右转按钮槽函数
void MainWindow::on_pushButton_3_released()
{
sendCommand(0);
qDebug("停止");
}
// 后退按钮槽函数
void MainWindow::on_pushButton_4_pressed()
{
sendCommand(2);
qDebug("后退");
}
void MainWindow::on_pushButton_4_released()
{
sendCommand(0);
qDebug("停止");
}
// 打开串口按钮槽函数
void MainWindow::on_pushButton_5_clicked()
{
PortConfigureInit();
}
// 停止按钮槽函数
void MainWindow::on_pushButton_6_clicked()
{
sendCommand(0);
qDebug("停止");
}
// 加速按钮按下槽函数
void MainWindow::on_pushButton_7_pressed()
{
sendCommand(5);
qDebug("速度+10");
}
// 减速按钮按下槽函数
void MainWindow::on_pushButton_8_pressed()
{
sendCommand(6);
qDebug("速度-10");
}