智能灭火小车

基于嵌入式Linux的智能灭火小车

一、项目背景

  如今,火灾在生活中是非常普遍的,它被称为三大自然灾害之一。消防人员时时刻刻冲到第一线,每一个人都冒着生命的危险,在这种背景之下,我们小组基于嵌入式Linux”的设计,做了一辆智能灭火小车,在一定的程度上实现了对安全安全防护的质的提高,也降低了消防人员的危险。

二、设计原理

1. 智能灭火小车的设计原理及思路

  通过Arduino UNORPI两大开源硬件搭建一个可以远程控制的平台,在这个地方不考虑成本为题。RPI作为连接物联网微型计算机,主要负责连接网络,Arduino作为主控芯片,控制小车行驶和检测火光;同样我们也根据不同的工作坏境分别编写了AndroidQT,两者的连接原理基本相同,主要是在树莓派上写一个socket服务器,AndroidQT分别写一个socket客户端,两边约定好相同的指令(例如本次在Android上是把“Forward”定义向前),客户端负责发送,树莓派负责接收命令,然后再向Arduino UNO下发相应的命令。流程如下:

三、树莓派微型计算机的搭建

  树莓派板载没有配置FLASH,所以支持SD卡启动,因此需要下载相应的镜像,并将其烧录在SD卡上,启动系统即可。利于方便开发,我们需要对树莓派进行远程操作,常用的远程控制主要有以下三种:

(1) 远程桌面:Windows自带的远程桌面控制,知道树莓派连接网络的IP,便可以对树莓派进行远程操作;

(2) VNCVNCLinux下最常用的远程桌面,它可以在WindowsUinx的主机上通过网络远程主机,不需要额外的显示器。同样需要知道IP和配置的密码;

(3) SSHSSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接。任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,可利用SSH来传输命令行界面和远程执行命令;

(4) 树莓派的默认账户和密码分别是:piraspberry

四、树莓派与Arduino串口通讯

1. drduino IDE的安装

     Arduino开发环境搭建比较简单,在Arduino官网下载相应的安装包,根据提示便可以完成安装。搭建的途中如果遇到无法运行,可以先搭建JAVA的开发环境,进行JDK变量配置。启动IDE,进入初始化界面,

2.串口驱动

     Arduino驱动程序在Arduino IDEdrivers文件夹下,也可以在官网下载;在MACOSLinux系统下,均是不要驱动程序的,你只需直接插上,即可使用。但在Windows系统中,你需要为Arduino安装驱动配置文件,才可正常驱动Arduino。找到下载IDE的安装包,进入drivers文件夹,找到驱动双击计算机会自动完成,双击是注意自己的操作系统是多少位的。提供的有32位和64位。驱动安装成功后,当串口连接电脑会显示串口设备,如下图:显示Arduino所连接的串口号。

 

3.安装Python

   本次的设计中,嵌入式Linux中主要的语言是Python语言,因此需要搭建Python语言环境,树莓派部分镜像中已经搭建好的,此处便可以忽略。安装步骤如下:

$ sudo apt-get update

$ sudo apt-get install python

4.安装PythonGPIO模块

  GPIO (General Purpose Input/Output) 的意思就是通用型输入输出,GPIO模块库是Python的第三方库,利用该库进行树莓派的引脚控制,在编程时,需要选择编号系统,对于Python GPIO,可以选择两种编号系统,分别是:BCMBOARD该项目选用BCM。编码格式为:GPIO.setmod(GPIO.BCM)GPIO.setmod(GPIO.BOARD)

GPIO库安装步骤:

$ Wget https://sourceforge.net/projects/raspberry-gpio-python/files/RPi.GPIO-0.6.2.tar.gz

$ tar xvzf RPi.GPIO-0.6.2.tar.gz  

$ cd RPi.GPIO-0.6.2  

$ sudo python setup.py install  

5.安装serial

$ sudo apt-get install python-serial

到此,树莓派与ArduinoUSB串口通信便完成,经过测试可以通信。测试部分如下:

(1) 先在IDE中编写通讯代码,上传代码到Arduino中,USB与树莓派连接。通讯代码:

 

(2) 树莓派端:

 在树莓派终端运行程序,树莓派向Arduino发送一个字符‘s’Arduino向树莓派回复字符串“hello raspberryI am Arduino”

、程序功能的实现

1. 小车行驶控制

      L298N模块可以直接驱动两路直流电机,控制电机需要使用该模块的三个端口:使能端、方向端IN1和IN2,使能端高电平是电机才能转动,IN1IN2一高一低控制方向的正转和反转。采用数字针脚控制小车的正反转,采用PWM针脚控制使能端。DigitalWarite()函数是Arduino自带的函数,可以在Arduino相应的针脚写入高电平或低电平灭火小车行驶部分代码:

 

2. 舵机和抽水电机的控制

    舵机为可旋转180度的9G舵机,三线制,可以直接驱动,无需驱动电路。抽水电机的最大电流为100毫安,工作电流为80毫安,Arduino引脚电流为40毫安,不能直接驱动,采用三极管放大电流驱动。舵机的旋转位置由定义的pos控制,90度为舵机的正中位置,抽水电机低电平关闭,高电平打开

驱动程序如下:

#include <Servo.h>    // 声明调用Servo.h

Servo myservo;        // 创建一个舵机对象

myservo.attach(3);    //控制舵机的引脚

int pos = 90;         //舵机初始化位置

int shui = 9;         //抽水机控制引脚

3. 火光实时检测

  该部分使用火焰传感器实现,检测到火光是,数据的模拟值会急速变小,可以根据这一特性确定是否周边有火光。当检测到火光是,抽水机的针脚自动改为高电平,到达灭火的功能。部分程序设计如下:

num=(analogRead(A0));//串口发送模拟电压值

  if(num<100)

{

    digitalWrite(shui, HIGH);

}

4. arduino接收串口数据:

if(Serial.available()){     //即能接收到串口传来的信息

String ans = Serial.readString();

5. 树莓派接收数据和获取IP

  这里采用网络编程中的Socket套接字,绑定端口和IP到达通信。通信协议采用TCP协议。Python语言实现,具体如下:

 

 

6. 系统IP地址

、电路设计部分

1. 稳压电路

稳压电路是保证智能小车可靠运行的基础。该系统中电源负责控制中心和外围设备提供能源并未车轮电机提供动力。供电质量的高低直接影响整个系统的稳定性。交流转直流的电源适配器显然不适合用于轮式智能小车。考虑到系统中点击驱动电源为12.6V,其电源可以通过电压变换得到,设计选用一节输出电压12.6V,容量为2000mAh的可充电锂电池作为系统供电电源。外围器件所需5V电源可通过LM2596S稳压芯片(DC-DC直流可调降压电源模块稳压板3A 12/2412/5/3.3V)得到,因为外围元器件少,LM2596S稳压芯片,使用方便,可靠性高,价格便宜。

2. 树莓派

它像是一台运行Linux 系统的台式计算机或者便携式计算机那样,利用Raspberry Pi 可以做很多事情。当然,也难免有一点点不同。普通的计算机主板都是依靠硬盘来存储数据,但是Raspberry Pi 来说使用SD 卡作为硬盘,你也可以外接USB 硬盘利用Raspberry Pi 可以编辑Office 文档、浏览网页、玩游戏即使玩需要强大的图形加速器支持的游戏也没有问题,如刺激战场。

Raspberry Pi 的低价意味着其用途更加广泛,将其打造成卓越的多媒体中心也是一个不错的选择。

树莓派

3. 电机驱动模块

(1) 应用范围

L298N是一种高电压,大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电压高,峰值工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率为25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作,可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,也可以驱动两台直流。

(2) 产品参数

漠块名称  H桥电机驱动模块

主控芯片  L298N

逻辑电压  5V

逻辑电流  0-36mA

存储温度  -20摄氏度至+135摄氏度

工作模式  H桥驱动(双路)

驱动电压  5V-35V

驱动电流  2A(MAX单桥)

峰值功率  25W

模块尺寸  44* 44mm

4. 传感器的选择

(1) 原理

火焰传感器;由各种燃烧生成物、中间物、高温气体、碳氢物质以及无机物质为主体的高温固体微粒构成的。火焰的热辐射具有离散光谱的气体辐射和连续光谱的固体辐射。不同燃烧物的火焰辐射强度、波长分布有所差异,但总体来说,其对应火焰温度的近红外波长域及紫外光域具有很大的辐射强度,根据这种特性可制成火焰传感器。

(2) 功能

火焰传感器是机器人专门用来搜寻火源的传感器,当然火焰传感器也可以用来检测光线的亮度。火焰传感器利用红外线对对火焰非常敏感的特点,使用特制的红外线接受管来检测火焰,然后把火焰的亮度转化为高低变化的电平信号,输入到中央处理器中,中央处理器根据信号的变化做出相应的程序处理

5. ARDUINO模块

(1) 功能与特点

可以快速使用ArduinoAdobe Flash, processing, Max/MSP, Pure Data, SuperCollider等软件结合,作出互动作品。 Arduino可以使用现有的 电子元件例如开关或者传感器或者其他控制器件、 LED、步进马达或其他输出装置。

特点跨平台、简单清晰、开放性、发展迅速。

6. 舵机和测速码盘

(1) 舵机特点稳定性、耐用性、扭矩大、速度快、高精度、用途广泛。

(2) 测速码盘

采用槽型对射光电传感器,它由一个红外发光二极管和一个NPN光电三极管组成,槽宽度为5.9mm,只要非透明物体通过槽型即可触发输出TTL低电平。采用施密特触发器去抖动脉冲,非常稳定,可用于小车测转速,测距离等等应用,两端带M3螺丝安装孔。

(3) 产品参数

工作电压:3.3V-5V

输出形式:数字开关量OUT输出(01

7. PCB电路制作

(1) PCB作用

电子设备采用印制板后,由于同类印制板的一致性,从而避免了人工接线的差错,并可实现电子元器件自动插装或贴装、自动焊锡、自动检测,保证了电子设备的质量,提高了劳动生产率、降低了成本,并便于维修。

(2) KiCad

KiCad是一种免费、开源的EDA设计工具,它能够创建电路原理图并进行PCB布局布线,它具有一个集成化的开发环境,在其之下KiCad包含了如下非常精致、独立的软件工具。

(3) KiCad设计的PCB板图

3D PCB查看功能基于VRML模型,可以导出板模型以进行CAD集成。KiCad对板子的大小没有限制,很容易支持到32铜层的电路板,到最多14层技术层和最多4层附加层。它能够产生用于生产制造PCB板的所有必要文件:用于光绘的Gerber文件、钻孔文件、元器件定位文件等等。

8. 原理图的制作流程

 

(1) 新建工程

一个项目一般不止一个文件,需要创建工程统一管理这些文件。依此点击文件>new project>new projec创建新工程。

2)绘制原理图

首先在kicad上将相应的元器件摆放好合理的位置,画出芯片的各个引脚,连接好相应的IO接口,把剩余的没有用到的接口封闭,检查原理图没有问题。原理图如下图:

 

3)匹配封装 

 

在原理图编辑器中,点击上图从右至左第三个按钮运行匹配封装匹配工具cvpcb,封装匹配好后回到原理图编辑器,点击上图中有“NET”字样的按钮生成网表文件(*.net

4PCB布局和连线

a.读取网络列表;

b.放置原件封装;

c.连线(有过孔的步骤);

d.确定PCB板的大小;

e.覆铜。

5)导入网表和绘制PCB

运行pcb编辑器;在主界面双击kicad_pcb或点击pcb编辑器也可运行pcb编辑器。在pcb编辑器中,点击“NET”字样的按钮导入网表文件,开始;到此就能得到pcb图了。

6)生成Gerber文件和钻孔文件。

七、QT部分

1. TCP/IP通信过程

(1) 建立连接阶段

调用socket(),分配文件描述符;

调用connect(),向服务器发送建立连接请求。

(2) 数据交互阶段

调用write(),将请求发送给服务器;

调用read(),阻塞等待服务器应答。

(3) 关闭连接

当没有数据发送的时候,调用close()关闭连接套接字,即关闭连接,向服务器发送FIN数据报。

2. QT实现过程

(1) QT系统的信号与槽机制介绍

信号与槽机制是QT的一个中心特征并且也是QT与其它工具包的最不相同的部分。在图形用户界面编程中,我们经常希望一个窗口部件的。一个变化被通知给另一个窗口部件。更一般地,我们希望任何一类的对象可以和其它对象进行通讯。较老的工具包使用一种被称作回调的通讯方式来实现同一目的。回调是指一个函数的指针,所以如果你希望一个处理函数通知你的事件,你可以把另一个函数(回调)的指针传递给处理函数。处理函数在适当的时候调用回调有缺点。首先他们不是类型安全的。我们从来都不能确定处理函数使用了正确的参数来调用回调。因此容易造成进程崩溃。

(2) QT界面设计

 本文主要用到UI界面里面的Push Button(按钮)、Line Edit(线性标签)、Text Line Edit(文本标签)、Label(标签)。每个Push Button分别用来控制小车和喷水,地址和端口标签是服务器的地址和端口,最终的设计界面如图所示:

 

3. QT通信过程

QT通信过程是利用TCP/IP通信的工作流程来实现的,通过Socket连接到服务器,具体步骤如下:

使用QT的网络套接字需要在.pro文件中加入一句:QT += network,还需要加一个头文件#include<QTcpSocket>,定义一个私有的QTcpSocket *socket;

(1) 创建QTcpSocket套接字对象:

socket = new QTcpSocket();

(2) 使用这个对象连接服务器:

ui->lineEdit_IP->setText("127.0.0.12"); ui->lineEdit_Port->setText("8888");

(3) 通过信号与槽,使用write函数向服务器发送数据控制小车和喷水的指令:

void Widget::on_pushButton_qj_clicked()

{

    socket->write("DirForward");//控制小车前进

}

void Widget::on_pushButton_zz_clicked()

{

    socket->write("DirLeft");//控制小车左转

}

void Widget::on_pushButton_yz_clicked()

{

    socket->write("DirRight");//控制小车右转

}

void Widget::on_pushButton_ht_clicked()

{

    socket->write("DirBack");//控制小车后退

}

void Widget::on_pushButton_tz_clicked()

{

    socket->write("DirStop");//控制小车停止

}

void Widget::on_pushButton_djz_clicked()

{

    socket->write("SGLeft");//控制喷水左转

}

void Widget::on_pushButton_djy_clicked()

{

    socket->write("SGRight");//控制喷水右转

}

void Widget::on_pushButton_sg_clicked()

{

    socket->write("WarteOff");//控制喷关

}

void Widget::on_pushButton_sk_clicked()

{

    socket->write("WarteOn");//控制喷水开

}

(4) Socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据:

QObject::connect(socket,&QTcpSocket::readyRead,this,&MainWindow::socket_Read_Data);

void MainWindow::socket_Read_Data()

{

    QByteArray buffer;

    //读取缓冲区数据

    buffer = socket->readAll();

}

(5) 断开与服务器的连接close()和disconnectFromHost()

socket->disconnectFromHost();

4. QT键盘事件

QT键盘事件也是通过信号与槽机制实现,通过获得键盘的焦点,并在头文件里面申明键盘#include <QKeyEvent>,在信号与槽里面实现键盘功能:

void Widget::keyPressEvent(QKeyEvent *ev){

    if(ev->key() == Qt::Key_Home)//HOME键控制小车前进

        {

           on_pushButton_qj_clicked();

           return;

        }

    else if(ev->key() == Qt::Key_End) //END键控制小车后退

    {

        on_pushButton_ht_clicked();

        return;

}

else if(ev->key() == Qt::Key_Delete) //Delete键控制小车左转

    {

        on_pushButton_zz_clicked();

        return;

    }

    else if(ev->key() == Qt::Key_PageDown) // PageDown键控制小车右转

    {

        on_pushButton_yz_clicked();

        return;

    }

    else if(ev->key() == Qt::Key_PageUp) // PageUp键控制小车停止

    {

        on_pushButton_tz_clicked();

        return;

    }

    else if(ev->key() == Qt::Key_Q) // Q键控制喷水左转

    {

        on_pushButton_djz_clicked();

        return;

    }

    else if(ev->key() == Qt::Key_W) // W键控制喷水开

    {

        on_pushButton_sk_clicked();

        return;

    }

    else if(ev->key() == Qt::Key_E) // E键控制喷水右转

    {

        on_pushButton_djy_clicked();

        return;

    }

    else if(ev->key() == Qt::Key_S) // S键控制喷水关

    {

        on_pushButton_sg_clicked();

        return;

    }

5. 成功和服务器建立连接的QT客户端

打开服务器和客户端建立连接,保证客户端的IP和端口和服务器的一致,点击连接就会成功的和服务器连接,如图所示是客户端通过键盘发送控制小车和喷水机的指令截图。

 

八、Android部分

1. 界面结构

(1) 连接服务器界面是两个线性布局“LinearLayout”、两个“TextView”、两个“EditText”和一个“button”,分别用于输入IP地址界面、输入端口号界面和跳转控制小车运动的界面。

 

(2) 连接服务器后,会跳转到小车的控制界面;在这里面也是由一个线性布局“LinearLayout”,在这里面嵌套了两个相对布局“RelativeLayout”,每一个相对布局里面五个“button”,分别定义为向前、向后、向左、向右、close;开水、关水、舵机左、舵机右、shutdown”

 

2.编写过程

(1) java中,主要编写了“MainActivityStartActivityTcpCommandserviceUDPFrameRecService”

  

(2) MainActivity中主要对各种事件进行定义。

    public void initButtons()

    {

        Button buttonDirFor=(Button)findViewById(R.id.buttonDirForward);

        buttonDirFor.setOnTouchListener(new ButtonListener("DirStop","DirForward"));

        Button buttonDirBack=(Button)findViewById(R.id.buttonDirBack);

        buttonDirBack.setOnTouchListener(new ButtonListener("DirStop","DirBack"));

        Button buttonDirLeft=(Button)findViewById(R.id.buttonDirLeft);

        buttonDirLeft.setOnTouchListener(new ButtonListener("DirStop","DirLeft"));

        Button buttonDirRight=(Button)findViewById(R.id.buttonDirRight);

        buttonDirRight.setOnTouchListener(new ButtonListener("DirStop","DirRight"));

        Button buttonCamUp=(Button)findViewById(R.id.buttonWaterOn);

        buttonCamUp.setOnTouchListener(new ButtonListener("CamStop","WaterOn"));

        Button buttonCamDown=(Button)findViewById(R.id.buttonWaterOff);

        buttonCamDown.setOnTouchListener(new ButtonListener("CamStop","WaterOff"));

        Button buttonCamLeft=(Button)findViewById(R.id.buttonSGLeft);

        buttonCamLeft.setOnTouchListener(new ButtonListener("CamStop","SGLeft"));

        Button buttonCamRight=(Button)findViewById(R.id.buttonSGRight);

        buttonCamRight.setOnTouchListener(new ButtonListener("CamStop","SGRight"));

        Button buttonClose=(Button)findViewById(R.id.buttonClose);

        buttonClose.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                sendCommandBinder.closeOrShutdown("Close");

//通知小车此客户端将关闭连接

            }

        });

        Button buttonShutdown=(Button)findViewById(R.id.buttonShutdown);

        buttonShutdown.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                sendCommandBinder.closeOrShutdown("Shutdown");

//通知小车自动停车

            }

        });

    }

(3) 通知TcpcommandService发送 开启和关闭命令。

public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()){

                case MotionEvent.ACTION_UP:

                    //通知TcpCommandService发送开启命令

                    sendCommandBinder.sendCommand(buttonUpCommand);

                    break;

                case MotionEvent.ACTION_DOWN:

                    //通知TcpCommandService发送关闭命令

      sendCommandBinder.sendCommand(buttonDownCommand);                

                 break;

                default:

                    break;

            }

            return false;

        }

    }

(4) IP地址和端口号,主要是靠手动输入,而并不能自动获取;这一部分主要在StartActivity.java中,它具有记忆功能,能够保存IP地址和端口号,而后将最后一个IP地址和端口值显示出来,这样就可以免得每次都要输入IP地址和端口号。

buttonEnter.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                host=textViewIP.getText().toString();

port=Integer.parseInt(textViewPort.getText().toString());

Intent startMainActivityIntent=new Intent(StartActivity.this,MainActivity.class);

                startMainActivityIntent.putExtra("tcpHost",host);

                startMainActivityIntent.putExtra("tcpPort",port);

                startActivity(startMainActivityIntent);

                //保存ip和端口值

                setInfoFromSharedPreference();

                finish();

protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_start);

        //获取最后一个IP和端口值,并显示出来

(5) tcpcommandservice.java是用来做与服务器通信的,我们可以借助它向服务器发送控制命令,在由服务器发送相应的命令给小车,从而达到APP控制小车的目的;下面就是初始化套件制,并发送相关消息。

protected void initCommandSocket(){

        new Thread(new Runnable() {

            @Override

            public void run() {

                try{

                    commandSocket=new Socket();

                  sendMessageToActivity(MainActivity.TOAST_TEXT,"try to connect tcp server");

                    commandSocket.connect(new InetSocketAddress(host,port),6000);

                    sendMessageToActivity(MainActivity.TOAST_TEXT,"connect successfully");

                }catch (IOException e){

                    sendMessageToActivity(MainActivity.TOAST_TEXT,"connect tcp server failed");

                    commandSocket=null;

                    e.printStackTrace();

                }

            }

        }).start();

3.运行结果

 九、外壳的设计

1. freeCAD软件

FreeCAD是一个3D效果图制作软件,该软件基于OpenCASCADE的开源CAD/CAE工具,能通用基于特征的参数化三维建模的CADMCADCAXCAEPLM。它可以用在机械工程和产品设计中,也可以用在工程中。它运行于windows以及linux系统环境下,FreeCAD是一种通用的3D建模。

2. 智能灭火小车模型设计

(1) 模块组成

智能灭火小车模型由树莓派、arduino板、小车底板、电路板、稳压模块、L298N电机驱动模块、舵机、直流电机、万向轮、车轮、12V电池、水箱组成。

(2) 模块构建

通过KiCad软件绘制电路板模块并且导出为wrl文件。

电路板 

(3) 通过FreeCAD软件分别绘制小车底板、12V电池、水箱模块。(如所示


4. 在网上分别下载万向轮、车轮树莓派、arduino板、稳压模块、L298N电机驱动模块、舵机、直流电机3D模型分别如下图所示并且存为step文件。

  

3.模块拼接

根据智能灭火小车的硬件实物图的大致位置对各个模块进行拼接,得出智能灭火小车模型。

4. freeCAD绘制三维步骤

(1) 打开开源软件freeCAD新建一个工程

(2) 打开Part design工作台创建实体

(3) 创建草图(选择xy基准平面)

(4) 对草图进行设计

(5) 完成三维模型

5. 外壳草图的绘制

根据设计的智能灭火小车模型和部分模块需要留在外壳外进行综合布局,从而在xy平面上可初步绘制出盒子草图,并标明盒子大小。

 

 

6. 盒子设计

草图完成后,设置高为25mm的立方体。然后对盒子和车轮口进行设计,最后形成盒子的三维模型。

 

7. 盖子设计

根据盒子、舵机模块、L298N电机驱动模块进行盖子的设计,最后形成盖子的三维模型。

 

8. 合并工程

前两步完成了外壳的盒子和盖子设计,最后就把这两个工程进行合并,这两个工程是否能合并还需要工作台(assembly)来检测。通过新建工程,将这两个工程添加在新建工程里面,就完成了整个外壳的设计。

 

9. 智能灭火小车整体模型

将小车模型和小车外壳进行合并,最终得到智能灭火小车的整体模型。

 

、总结

   经过一个学期的努力学习终于把智能灭火小车做出来了,我们5个队员分工合作,3D外壳的制作,服务器,QT客户端和安卓客户端,分别用来控制小车、舵机以及抽水,。本次作品利用QTAndroid制作的客户端连接树莓派上搭建服务器,QT客户端可以通过键盘来控制小车、舵机、抽水机,Android客户端则利用手机控制小车、舵机、抽水机。

在刚开始时,我们查了许多资料,都没有找到完成项目的方法,感觉没有什么希望的。但在我们坚持不懈的努力之下,终于黄天不负有心人,这次项目在我们小组的合作之下,实现了相应的功能,最终算是完成了,也希望是老师想要的答卷。

猜你喜欢

转载自www.cnblogs.com/JcwArticles/p/11612577.html