文章目录
- 引言
- 一、产品功能介绍
- 二、硬件清单
- 三、软件设计
- 1. RASC
- 2. Keil
- 2. Qt
- 四、视频展示
引言
很高兴能够加入“野火”这个大家庭中,且能有机会参加第一期的【瑞萨RA MCU创意氛围赛】,在此之前,我竟都没能了解瑞萨这个产品,是野火这个大家庭给予了我这个机会,让我又一次在新的领域不断探索前进,从申请到板子至今,近一个月的时间,在好奇心的不断驱使下,我对瑞萨RA系列这块认知领域上不断学习研究,终完成自己的第一个小项目 ---- “Qt遥控小车”,展示给大家参考学习,若有含糊错误的地方,欢迎大家批评指正,具体如下:
一、产品功能介绍
本产品启动方式为“电容按键”一键启动,用过触发电容按键初始化板载的ESP8266 WiFi模块,服务端为Qt Android开发后的app下载到安卓手机上,在打开服务器之后,WiFi模块即能成功连接并发出响应信号,同时在手机上实时显示小车状态(如直行、左转、右转、后退、左右轮相对速度等等),可在手机上远程控制小车转向及左右轮的速度值,若匀速安全行驶的情况下,板载的LED灯显示绿色表示正常行驶,若出现速度过快或左右轮相差极大板载的LED灯显示蓝色代表警示,如在超出一定速度值,将会强制停车防止意外事故的发生。
- 产品图如下:
- 手机遥控界面如下:
二、硬件清单
- 本次产品使用的是野火启明RA6M5开发板,主控芯片为R7FA6M5BH3CFC
- 小车底盘是自己3D建模打印而成,且按照3轮车标准构建,每个螺孔都是M3的尺寸,中间几个大孔方便布线排版。
- 电机和轮胎选用的是tt直流减速电机和麦克纳姆轮
- 电机驱动模块,我选用的是L298N
- 电池及电池槽,我选用的是18650锂电池及三节电池槽
- 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遥控小车