【Qt】超声波扫描雷达上位机

该文介绍了一个使用STM32微控制器,结合超声波传感器HC-SR04和舵机SG90构建的扫描雷达项目。STM32控制舵机旋转并测量距离,通过串口将数据发送到基于Qt的上位机,上位机实时显示扫描角度和障碍物距离,具有图形化界面和余晖效果。遇到的问题包括舵机角度数据偶尔跳动导致上位机崩溃。

前言

超声波传感器HC-SR04,在单片机练手项目中很常见,比如说避障小车这种项目。舵机SG90,也是在当初学习51单片机的时候,用到过的外设。
在这个项目中,我使用了野火的stm32指南者开发板,搭配超声波传感器和舵机这两种外设,通过串口,向基于Qt的扫描雷达上位机发送角度和距离的数据。
上位机利用了Qt的画图功能,实时显示当前舵机的角度和障碍物的距离。

1硬件连接

在这里插入图片描述选择野火的指南者开发板作,这块板子把很多IO都就外接出来了,用来做项目很方便。
舵机信号线连接PA4。
超声波传感器Trig连接PB6,Echo连接PB7。

2单片机程序

单片机程序主要实现的功能:
1舵机半圆形的来回旋转,带着上面的超声波传感器旋转。
2超声波传感器探测距离。
3通过串口把角度和距离的数据发送到电脑上。

int main(void)
{
   
   	
	int i;
	int angle = 0;
	
	SysTick_Configure();
	
	Uart1_Configuration();
	Led_Configuration();
	printf("111111111");
	TIM4_Init(2000,9);		//蜂鸣器,初始化定时器4,预分频9,计数频率8M
	TIM_Cmd(TIM4, DISABLE);
	
	TIM3_Count_Configuration();
	HCSR04_Configuration();
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
	
	TIM2_PWM_Configuration();	  //舵机
	
	TIM_SetCompare2(TIM2, 500);  //回到初始位?
	Delay_us(1000000);  //等待舵机复位



		while(1)
		{
   
   
			for(i = 500; i<= 2300; i += 2)
			{
   
   
				TIM_SetCompare1(TIM2, i);
				Delay_us(5000);
				angle = (i - 500) / 10;
				printf("%c%d %d\n", '+',angle, CalculateDistance());//角度和距离
				//Uart1_SendString(string);
				//USART_SendData(USART1, '\n');
			}
			for(i = 2300; i>= 500; i -= 2)
			{
   
   
				TIM_SetCompare1(TIM2, i);
				Delay_us(5000);
				angle = (i - 500) / 10;
				printf("%c%d %d\n", '-',angle, CalculateDistance());
			}
		}
}

这是main函数内容,主要就是旋转舵机,然后通过重定义的串口printf,把角度和数据发送出去。

其实单片机的硬件和软件不是最重要的,他主要的作用就是发送串口数据了,也可以用模拟的数据来代替,并不一定要真实的。

3上位机设计

在这里插入图片描述

这是最终要实现的效果图。
1 一个扇面的形状,表示超声波传感器扫过的角度。
2 20-50cm的距离能够探测,探测到是物品时红色,没有是绿色。
3 扫描线是随着舵机的转动而随着转动的
4 带有余晖效果,也就是过去扫描的角度的内容,能滞留一段时间显示在软件上。

4上位机软件

这是widger.c中的内容,主要代码都放在这里。

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QtMath>
#include <QTimer>
#include <QDebug>

int flag=0;

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
   
   
    ui->setupUi(this);
    resize(1600,900);
    setStyleSheet("background-color:balck");//黑色背景
//    QTimer *time1=new QTimer(this);
//    time1->start(20);
//    connect(time1,&QTimer::timeout,this,&Widget::timer_timeout);
    serial=new QSerialPort(this);

    QString PortString;//创建容器

    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())//foreach关键字,遍历列表,放到info中
    {
   
   
        PortString=info.portName();//将可用串口的名字放到字符串容器中

        qDebug()<<PortString;
    }

    serial->setPortName(PortString);
    serial->setBaudRate(9600);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);//没有检验
    serial->setStopBits(QSerialPort::OneStop);

    serial
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值