【瑞萨RA MCU创意氛围赛】基于FSP库开发 --- Qt遥控小车

news2024/11/20 12:25:24

文章目录

  • 引言
  • 一、产品功能介绍
  • 二、硬件清单
  • 三、软件设计
    • 1. RASC
    • 2. Keil
    • 2. Qt
  • 四、视频展示


引言

很高兴能够加入“野火”这个大家庭中,且能有机会参加第一期的【瑞萨RA MCU创意氛围赛】,在此之前,我竟都没能了解瑞萨这个产品,是野火这个大家庭给予了我这个机会,让我又一次在新的领域不断探索前进,从申请到板子至今,近一个月的时间,在好奇心的不断驱使下,我对瑞萨RA系列这块认知领域上不断学习研究,终完成自己的第一个小项目 ---- “Qt遥控小车”,展示给大家参考学习,若有含糊错误的地方,欢迎大家批评指正,具体如下:

一、产品功能介绍

本产品启动方式为“电容按键”一键启动,用过触发电容按键初始化板载的ESP8266 WiFi模块,服务端为Qt Android开发后的app下载到安卓手机上,在打开服务器之后,WiFi模块即能成功连接并发出响应信号,同时在手机上实时显示小车状态(如直行、左转、右转、后退、左右轮相对速度等等),可在手机上远程控制小车转向及左右轮的速度值,若匀速安全行驶的情况下,板载的LED灯显示绿色表示正常行驶,若出现速度过快或左右轮相差极大板载的LED灯显示蓝色代表警示,如在超出一定速度值,将会强制停车防止意外事故的发生。

  • 产品图如下:
    在这里插入图片描述
  • 手机遥控界面如下:
    在这里插入图片描述

二、硬件清单

  1. 本次产品使用的是野火启明RA6M5开发板,主控芯片为R7FA6M5BH3CFC
    在这里插入图片描述
  2. 小车底盘是自己3D建模打印而成,且按照3轮车标准构建,每个螺孔都是M3的尺寸,中间几个大孔方便布线排版。
    在这里插入图片描述
  3. 电机和轮胎选用的是tt直流减速电机和麦克纳姆轮
    在这里插入图片描述
  4. 电机驱动模块,我选用的是L298N
    在这里插入图片描述
  5. 电池及电池槽,我选用的是18650锂电池及三节电池槽
    在这里插入图片描述
  6. LM2596S DC-DC稳压模块
    在这里插入图片描述

三、软件设计

本项目可分为RASC、Keil和Qt三个部分进行设计。

1. RASC

(1) PWM定时器设计,设计GPT 配置引脚,将指定通道的输出信号连接到相应引脚,再初始化GPT模块 。
在这里插入图片描述
(2) ESP8266 WiFi设计,选择通道和对应的引脚以及模式,配置串口通信。
在这里插入图片描述
(3) 电机驱动部分,在RASC里面配置四个引脚输出用作为电机驱动。
在这里插入图片描述

2. Keil

在Keil部分主要是对野火启明RA6M5这个开发板进行开发设计,本文采用FSP开发,简要步骤如下:
①在Keil上配置RASC工具,方便配置芯片和生成FSP库代码;
②打开官方提供的例程模板,在Keil中进入好的RASC工具配置芯片初始化,生成FSP代码;
③对生成后的初始化代码进行设计处理,开发自己所想产品;
④将编译生成的hex文件通过Renesas Flash Programmer烧入开发板中。

串口接收中断,在这里根据接收到服务器发过来的数据进行判断,各个信息做出相应动作。
在这里插入图片描述

2. Qt

在此部分主要运用的是套接字和信号与槽机制进行数据的处理与收发,在UI界面中创建不同按钮并各自命名代表不同功能(如前进、后退、左右转向等),并添加几个label和Text用于显示小车连接状态和行驶与速度值情况。
①套接字通信示例代码如下:

    tcpserver=nullptr;
    tcpsocket=nullptr;
    //创建监听套接字
    tcpserver=new QTcpServer(this);//指定父对象 回收空间

    //bind+listen
    tcpserver->listen(QHostAddress::Any,8080);//绑定当前网卡所有的ip 绑定端口 也就是设置服务器地址和端口号

    //服务器建立连接
    connect(tcpserver,&QTcpServer::newConnection,[=](){
    //取出连接好的套接字
    tcpsocket=tcpserver->nextPendingConnection();

    //获得通信套接字的控制信息
    QString ip=tcpsocket->peerAddress().toString();//获取连接的 ip地址
    quint16 port=tcpsocket->peerPort();//获取连接的 端口号
    QString temp=QString("[%1:%2] 客服端连接成功").arg(ip).arg(port);
    //显示连接成功
    ui->textEditRead->setText(temp);

②遥控按钮设计示例代码如下:

void server::on_forward_clicked()
{
    if(tcpsocket==nullptr)  return ;
    QString str="F";
    ui->state->clear();
    ui->state->setText("Forward ing...");
    ui->Lspeed->setText(QString::number(target1));
    ui->Rspeed->setText(QString::number(target2));
    tcpsocket->write(str.toUtf8().data());
}


void server::on_back_clicked()
{
    if(tcpsocket==nullptr)  return ;
    QString str="B";
    ui->state->clear();
    ui->state->setText("Back ing...");
    ui->Lspeed->setText(QString::number(target1));
    ui->Rspeed->setText(QString::number(target2));
    tcpsocket->write(str.toUtf8().data());
}


void server::on_turn_left_clicked()
{
    if(tcpsocket==nullptr)  return ;
    QString str="L";
    ui->state->setText("Left ing...");
    ui->Lspeed->setText(QString::number(target1));
    ui->Rspeed->setText(QString::number(target2));
    tcpsocket->write(str.toUtf8().data());
}


void server::on_turn_right_clicked()
{
    if(tcpsocket==nullptr)  return ;
    QString str="R";
    ui->state->setText("Right ing...");
    ui->Lspeed->setText(QString::number(target1));
    ui->Rspeed->setText(QString::number(target2));
    tcpsocket->write(str.toUtf8().data());
}


void server::on_stop_clicked()
{
    if(tcpsocket==nullptr)  return ;
    QString str="S";
    ui->state->setText("Stop ing...");
    target1=0;
    target2=0;
    ui->Lspeed->setText(QString::number(target1));
    ui->Rspeed->setText(QString::number(target2));
    tcpsocket->write(str.toUtf8().data());
}


void server::on_speed_up_clicked()   //L+
{
    if(tcpsocket==nullptr)  return ;
    QString str="A";
    target1+=2;
    ui->Lspeed->setText(QString::number(target1));
    tcpsocket->write(str.toUtf8().data());
}


void server::on_speed_down_clicked()  //R+
{
    if(tcpsocket==nullptr)  return ;
    QString str="C";
    target2+=2;
    ui->Rspeed->setText(QString::number(target2));
    tcpsocket->write(str.toUtf8().data());
}


void server::on_L_down_clicked()
{
    if(tcpsocket==nullptr)  return ;
    QString str="a";
    target1-=2;
    ui->Lspeed->setText(QString::number(target1));
    tcpsocket->write(str.toUtf8().data());
}


void server::on_R_down_clicked()
{
    if(tcpsocket==nullptr)  return ;
    QString str="c";
    target2-=2;
    ui->Rspeed->setText(QString::number(target2));
    tcpsocket->write(str.toUtf8().data());
}


四、视频展示

基于瑞萨RA FSP库开发 --- Qt遥控小车

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

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

相关文章

如何计算一个实例占用多少内存?

我们都知道CPU和内存是程序最为重要的两类指标,那么有多少人真正想过这个问题:一个类型(值类型或者引用类型)的实例在内存中究竟占多少字节?我们很多人都回答不上来。其实C#提供了一些用于计算大小的操作符和API&#…

【026】C++的内联函数、函数重载、函数的默认参数与占位参数

C的内联函数、函数重载、函数的默认参数与占位参数 引言一、内联函数1.1、声明内联函数1.2、宏函数和内联函数的区别1.3、内联函数的注意事项 二、函数重载2.1、函数重载的概述2.2、函数重载的条件2.3、函数重载的底层实现原理 三、函数的默认参数四、占位参数五、extern "…

STM32单片机TFT显示AD9833 DDS信号发生器语音播报正弦波方波三角波

实践制作DIY- GC0146---TFT显示AD9833 DDS信号发生器 基于STM32单片机设计---TFT显示AD9833 DDS信号发生器 二、功能介绍: 硬件组成:STM32F103C系列最小系统板 1.8寸TFT彩屏AD9833信号模块4*4矩阵键盘DY-SV17F语音播报模块 1.通过4*4键盘来设定频率值和…

ExpertLLaMA:超越Vicuna,通过角色扮演增强指令,显著提升回答质量

本文向大家介绍我们刚刚开源的对话模型及相应的训练数据。 首先是 git Repo 和 paper 链接,欢迎大家给我们⭐star⭐ 论文标题: ExpertPrompting: Instructing Large Language Models to be Distinguished Experts 论文链接: https://arxiv.or…

.Net7矢量化的性能优化

前言 矢量化是性能优化的重要技术,也是寄托硬件层面的优化技术。本篇来看下。文章来源:微软官方博客 概括 一:矢量化支持的问题: 矢量化的System.Runtime.Intrinsics.X86.Sse2.MoveMask 函数和矢量化的Vector128.Create().Extract…

get 、post请求 后台@RequestParam、@RequestBody 接收的方法集合

post、get请求 参数:数组、JSON对象、JSON字符串、地址栏 RequestParam、RequestBody 后端接收 //定义json对象,同时包含数组 var _queryData { jflb:"婚姻家庭纠纷",zlay:"xxxxx",ysCode:["0123","4567"]}…

机柜PDU与普通插座的区别,以及如何选择品牌专业PDU产品详解

PDU(Power Distribution Unit),是将来自UPS的输出电流分配到各个IT设备的末端配电设备,是连接供电等基础设施与IT系统、关联机房内所有设备正常运转的关键设备。作为机房用电安全的重要保障,PDU设备的稳定与安全直接关…

FPGA驱动FT601实现USB3.0相机HDMI视频采集 提供工程源码和QT上位机源码

目录 1、前言2、FT601芯片解读和时序分析FT601功能和硬件电路FT601读时序解读FT601写时序解读 3、我这儿的 FT601 USB3.0通信方案4、详细设计方案5、vivado工程详解6、上板调试验证7、福利:工程代码的获取 1、前言 目前USB3.0的实现方案很多,但就简单好…

我们来谈谈udp

"却还有那些洗礼,那几句问候,那份温柔~" 一、 常用的Linux命令 (1) netstat查看网络状态 netstat是一个用来查看网络状态的重要工具,可以携带很多选项。 n 拒绝显示别名,能显示数字的全部转化成数字. l 仅列出有在 Listen…

【unity之IMGUI】所以你还想在百度上搜IMGUI的底层原理是什么吗?

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

安装python详细步骤(超详细,保姆级,一步一图)

❄️作者介绍:奇妙的大歪❄️ 🎀个人名言:但行前路,不负韶华!🎀 🐽个人简介:云计算网络运维专业人员🐽 前言 作为一个实用学习的主义的学习者,最关心的问题一…

光亚展 | 移远通信Matter解决方案,照亮智能家居产业未来

6月9-12日,第二十八届广州国际照明展览会(光亚展)在中国进出口商品交易会展馆举行。本次展会以“光未来”为主题,整个照明、灯饰产业链的上下游企业、品牌在此汇聚,共同探讨照明行业未来的发展方向。 作为照明行业智能…

智见|黄铁军:未来的大模型生态中将会只有少数赢家

2023智源大会可谓群星璀璨。中外200余位人工智能顶级专家参会,人工智能领域最关键的人物、机构悉数亮相。 全面、专业、前沿,会场上大咖们观点激荡、多元碰撞,会场下观众们兴奋异常、座无虚席。 会上,北京智源人工智能研究院院长黄…

英语知识点-填空-考试酷

第一章 英语知识填空题 一、语法 1.词法:介词将关系建立在人/物A与人/物B,可能会形成修饰限制关系,有定语成分;介词将关系建立在事A与物B,可能有事A动作发生时环境因素,有状语成分;写作中经常用…

【Vue.js】1711- 深入浅出 Vue3 自定义指令

Vue.js[1] 提供了丰富的指令来简化开发者的工作。除了内置指令外,Vue.js 还支持自定义指令,开发者可以根据自己的需求扩展 Vue.js 的指令库。Vue.js 3.x 相较于 Vue.js 2.x 在自定义指令方面进行了一些改进,本文将介绍 Vue.js 3.x 中自定义指…

HLS 设计数字时钟

绪论 该项目的目标是展示 HLS 在设计数字系统方面的能力。为此,本文展示如何在 HLS 中描述数字时钟。如果有兴趣学习 HLS 编码技术,请参阅: ❝ https://highlevel-synthesis.com/ ❞ ❝ https://www.udemy.com/course/hls-combinational-circ…

2023 年的 5G 和网络安全风险

5G 网络的推出出奇地缓慢。作为一个概念,它于 2016 年推出,但直到 2019 年才在全球范围内推出。 四年后,在大多数国家地区,拥有 5G 设备的人数仍然很少。 不确定采用缓慢背后的原因是负担能力、缺乏必要性还是关于它的严重错误…

【redis】redis集群

这里是redis系列文章之《redis集群》,上一篇文章链接:【redis基础】哨兵_努力努力再努力mlx的博客-CSDN博客 目录 概念 作用 集群算法-分片-槽位slot 槽位与分配的概念及两者的优势 官网介绍分析 槽位 分片 两者的优势 slot槽位映射的三种解决方…

linux eventfd事件通知 比信号量更好用

专栏内容:linux下并发编程个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 目录 前言 概述 原理简介 使用场景 接口说明 头文件 参数说明 代码演示 默认参数 …

1740_使用Python+ImageMagick实现图像的批量压缩

全部学习汇总: GreyZhang/python_basic: My learning notes about python. (github.com) 前些年使用Linux的时候为了能够方便地往网络上上传照片,使用shell ImageMagick的组合进行照片的批量压缩一直觉得比较方便。不过,那时候即使这么简单的…