Arduino单片机(五).基于OpenWrt模块的无线视频遥控小车设计

2023-05-16

1、功能介绍

本项目所设计的机器人需要实现的功能为:操作员在操作终端(手机或PC端)通过Wi-Fi连接到小车上Wi-Fi模块所在的网络中,向其发出相关操作指令,在Wi-Fi模块接收相关的数据指令并通过UNO R3单片机对这些数据进行解码,最后按照不同的指令信息利用单片机控制相应的外围电路从而实现遥控控制。与此同时,安装在机器人上的摄像头可以通过Wi-Fi网络将视频信息传递到相应操作终端,只要在同一个Wi-Fi网络下便可以在多个设备上直观地查看。实现了终端对底层电路的控制以及底层信息的回传,以便于操作员实时了解机器人周围的环境,并根据环境情况发出指令进而控制机器人执行特定的任务。

2、材料清单及硬件电路设计

硬件部分由车体部分,控制部分和无线部分等构成。车体部分由底板和4个直流减速电机组成,电机两两并联,相当于同时驱动一侧两个电机。车轮采用4个橡胶轮胎,体积小,质量轻,抓地性好。控制部分采用Arduino控制芯片,其上连接扩展板用于驱动四个电机运作。无线部分用OpenWrt路由器和高清摄像头组成。OpenWrt 是一个基于 Linux 的开源路由固件, 提供了一个完全可写的文件系统及软件包管理,对支持 OpenWrt 的路由器刷机后,其相当于一个Linux小系统。路 由 器 选 择OpenWrt 作为操作系统, 将 USB 摄像头采集的现场图片发给远端的 PC 控制终端,PC端显示相应的图像信息,并可接收上位机软件发送的控制信息后通过串口发送至单片机系统,并将上位机发出的命令通过串口转发给单片机控制系统,实现双向通信。硬件部分材料清单如下表中所示。

部件型号数量
底板亚克力透明车底盘板1
直流减速电机直条双轴减速马达4
车轮橡胶车轮4
摄像头浪景高清摄像头1
路由器64M大内存WiFi模块1
单片机Arduino UNO R31
扩展板电机驱动(L298N)1

使用Arduino UNO R3开发板的4、5号端口的输出功能控制小车的左侧两个电机;6、7号端口的输出功能控制小车的右侧电机。开发板的接收数据引脚(RX)连接WiFi无线传输模块的发送数据引脚(TX),同时它的发送数据引脚(TX)连接WiFi模块的接收数据引脚(RX)。WiFi模块用USB数据线连接高清摄像头。WiFi天线用于接收和发送与手机端软件相互通信。电路设计图如下图中所示,需要注意的是单片机端口和电机之间需要通过电机驱动模块来连接,在这里我们使用的是L298N驱动模块可驱动直流电机。
在这里插入图片描述

3、软件系统设计

3.1、终端软件部分

能够运行在Android手机上的APP,以及可运行在Windows系统的PC端上位机软件。通过手机端软件控制小车运动以及实时接收采集到的视频信息。以Android端软件为例,启动APP后,右下角的四个按钮可以控制小车前后左右运行,主界面用于查看小车采集到的图像视频信息;通过设置按钮可以设置小车IP地址,控制端口号,视频端口号等信息。

3.2、通信协议部分

上位机采用数据包格式传送指令,也可以采用单字符的形式发送,由于单字符通信方式干扰较大,因此采用数据包格式传送指令,包头用0XFF,包尾用0XFF,无校验位。上位机利用无线网卡通过Socket发送数据包到路由器,路由器通过解包机制把数据包解开,通过串口发送到单片机进而控制电路模块执行相关的操作。

3.3、电控软件部分

对于Arduino端的电控程序部分是本项目中最为核心的部分,其流程框图如下所示。整体的程序可分为解码和编码、运动控制以及串口数据收发三个模块,其中串口数据收发模块用于接收WiFi模块发送到单片机上的数据,以及向WiFi模块发送数据(数据由它转发到其它的终端设备);解码部分用于对单片机接受到的数据表进行解析转换成易于识别的字符形式,编码部分将单片机需要发送到终端设备的信息打包成与通信协议相应的格式;运动控制模块是描述小车的行为模式有前进、后退、左转、右转以及停止五种状态,通过使用单片机IO端口高低电平的输出配合电机的正反转便可以实现这些功能。
在这里插入图片描述

4、核心代码

4.1、主循环

void loop()
{
  
  getSerialLine();
  if (commandAvailable) {
    processCommand(strReceived);
    strReceived = "";
    commandAvailable = false;
  }
}

4.2、读取串口数据

void getSerialLine()
{
  //使用\r字符作为两条命令间隔符,拼接收到的字符
  while (serialIn != '\r')
  {
    if (!(Serial.available() > 0))//缓冲器无数据装入
    {
      return;
    }
    serialIn = Serial.read();//读取串口
    if (serialIn != '\r') {
      if (serialIn != '\n'){
        char a = char(serialIn);
        strReceived += a;
      }
    }
  }
}

4.3、指令处理

void processCommand(String input)
{
	String command = getValue(input, ' ', 0);
	int val;
	if (command == "MD_Qian")
	{
		qian();
	}
	else if (command == "MD_Hou")
	{
		hou();
	}
	else if (command == "MD_Zuo")
	{
		zuo();
	}
	else if (command == "MD_You")
	{
		you();
	}
	else if (command == "MD_Ting")
	{
		ting();
	}
	else if (command == "MD_SD")
	{
		val = getValue(input, ' ', 1).toInt();
		leftspeed = val;
		val = getValue(input, ' ', 2).toInt();
		rightspeed = val;
	}
	//是否收到的是已经定义的命令,如果不是则不回送状态,免得浪费带
}
String getValue(String data, char separator, int index)//data(strReceived),' ',0
{
  int found = 0;
  int strIndex[] = { 0, -1 };
  int maxIndex = data.length() - 1;
  for (int i = 0; i <= maxIndex && found <= index; i++){
    if (data.charAt(i) == separator || i == maxIndex){//data.charAt(int val)返回val位置的char值
      found++;
      strIndex[0] = strIndex[1] + 1;
      strIndex[1] = (i == maxIndex) ? i + 1 : i;
    }
  }
  return found>index ? data.substring(strIndex[0], strIndex[1]) : "";//data.substring(int a,int b),返回a到b位置的字符串
}

4.4、速度及运动状态控制

void qian(void)
{
  EN1Status = LOW;
  EN2Status = HIGH;
  EN3Status = LOW;
  EN4Status = HIGH;
  SetEN();
}
void hou(void)
{
  EN1Status = HIGH;
  EN2Status = LOW;
  EN3Status = HIGH;
  EN4Status = LOW;
  SetEN();
}
void you(void)
{
  EN1Status = LOW;
  EN2Status = HIGH;
  EN3Status = HIGH;
  EN4Status = LOW;
  SetEN();
}
void zuo(void)
{
  EN1Status = HIGH;
  EN2Status = LOW;
  EN3Status = LOW;
  EN4Status = HIGH;
  SetEN();
}
void ting(void)
{
  leftspeed = 0;
  rightspeed = 0;
  EN1Status = LOW;
  EN2Status = LOW;
  EN3Status = LOW;
  EN4Status = LOW;
  SetEN();
}
//设置两侧速度
void SetEN(){
  analogWrite(EA, leftspeed);
  analogWrite(EB, rightspeed);
  digitalWrite(EN1, EN1Status);
  digitalWrite(EN2, EN2Status);
  digitalWrite(EN3, EN3Status);
  digitalWrite(EN4, EN4Status);
}

5、实物作品展示

不仅是这个基于OpenWrt模块的无线视频遥控的小车,图片中包含了本科时实验室里学长学姐、学弟学妹以及同学们的共同成果。现在想起来这一些东西都做的很简单,但在当时初学单片机时就点亮一颗LED灯都很兴奋。在学习嵌入式的这条路上,走走停停,似乎是凭借着爱好坚持了下来。最近也没有怎么做过单片机相关的项目了,所以想把这些东西写出来算是为我的大学生活做个总结吧!
在这里插入图片描述

6、写在最后

这是最后一节关于Arduino系列单片机应用的文章了,其实能够使用Arduino做的东西还有很多,也包含大量的有技术含量的项目。Open source带来了一次软件技术发展的高峰,在这一种开发方式中,任何人都能够得到源代码,在其基础上进行学习从而开发新的功能。在硬件方面上也是这样,开源硬件是与自由与开放原始码软件相同方式设计的计算机和电子硬件,Arduino正是开源硬件发展历程中的里程碑。类似的开源硬件还有Beagle、Raspberry PI(树莓派)等。本科时刚接触Arduino时,第一印象感觉它特别简单,不管是从软件程序的编写还是外部电路的扩展方面来讲。与便捷灵活、学习简单这些特点相对应的就是它的运行频率太低,在完成一些比较大一点的项目就会很吃力(相对于同类产品的性价比,如STM32)。当我利用Arduino平台做出了一些东西时,不得不说开源硬件的发展方便了硬件产品的很多开发步骤,也能够很快地实现自己的创意。关于Arduino单片机的学习资料如有需要可以私信我,最后希望开源硬件会发展的越来越好!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arduino单片机(五).基于OpenWrt模块的无线视频遥控小车设计 的相关文章

随机推荐

  • C++中的future和promise使用方法

    future和promise C 43 43 11中std future提供了一种访问异步操作结果的机制 异步操作不能马上就获取操作结果 xff0c 只能在未来某个时候获取 xff0c 但可以以同步等待的方式来获取结果 xff0c 可以通过
  • select、poll、epoll简介

    select poll epoll都是IO多路复用机制 xff0c 都可实现同时监听多个I O事件的状态 xff0c 多路复用就是通过一种机制监视多个描述符 xff0c 一旦某个描述符读或者写就绪就能通知代码进行读写操作 本质他们都是同步I
  • 【无标题】

    pro git学习笔记 持续更新ing 感觉一直对git的了解不够深入 xff0c 每次都是用到什么功能现去找 xff0c 但这样每次查询都耗费时间并且可能出错 xff0c 索性将git系统性地学习一遍 xff0c 下面是记录的学习笔记 一
  • C++中的std::string_view和std::span

    string view是C 43 43 17标准引入 xff0c std span是C 43 43 20引入 xff0c 两个特性都比较类似 1 std string view string view是字符串的视图 xff0c 由于传统的s
  • 《Word中同一标点符号在不同位置空白间距不一致应怎样调》

    在写文档时出现类似于下图这种情况 xff0c 段落格式设置一模一样 xff0c 同样是中文标点符号 xff0c 没有空格 xff0c 都是半角 xff0c 但就是标点的空白间距不同 设置方法 xff1a 段落 中文版式 选项 版式 字符间距
  • 【技巧】十大深度学习技巧和经验总结

    作者简介 xff1a 在读博士 xff0c 伪程序媛 xff0c 人工智能领域学习者 xff0c 深耕机器学习 xff0c 交叉学科实践者 xff0c 周更前沿文章解读 xff0c 提供科研小工具 xff0c 分享科研经验 xff0c 欢迎
  • VS中报错IntelliSense: argument of type "void *" is incompatible with parameter of type "const char *"

    在用VS编写C 43 43 程序的时候 xff0c 遇到这样的问题IntelliSense argument of type void is incompatible with parameter of type const char xf
  • VS控制台程序被暂停,回车继续运行

    最近用vs调试程序时 用控制台定时1s打印一次信息 xff0c 调试过程发现偶尔出现控制台停止打印 不管是否开启多线程 xff0c 都会出现该问题 xff0c 而且也怀疑可能是sleep xff08 xff09 延时阻塞导致的问题 后来多次
  • VS如何设置显示代码行数

    设置VS显示代码行数 可以方便调试代码 xff0c 工具 选项 文本编辑器 C C 43 常规 行号勾选上 参考了https jingyan baidu com album af9f5a2d2e193543140a4533 html pic
  • 程序员自我介绍

    转自https www cnblogs com univeryinli p 5838781 html 一个常规的面试 xff0c 寒暄之后面试官提出的第一个问题几乎千篇一律 xff1a 请您简单地做一下自我介绍 有些被面试者都会问 xff1
  • win10磁盘占用率过高解决办法

    最近总觉得系统用起来很卡 xff0c 一看任务管理器发现win10磁盘占用率接近100 xff0c 而且在任务管理器中也关不掉 xff0c 然后百度了一下 xff0c 发现可能是家庭组导致 xff0c 结果还真是 xff0c 下面给出解决方
  • 2020届华为C++软件开发实习面试经验

    前几天去华为实习面试 xff08 虽然笔试0AC xff0c 还是收到面试通知 xff09 xff0c 现在记录一下面试心得 xff0c 后面继续好好准备 实习面试分技术面和综合面 xff1a 1 感觉技术面试重视基础 xff0c 问c 4
  • 自己编写的字符串分割函数mysplit()

    利用strtok 函数封装成的字符串分割函数mysplit sourceStr为源字符串 splitSymbol为分隔符号 strArray为分割后的字符串 xff0c 以vector形式返回 include lt iostream gt
  • OVS Bond lacp源码分析

    近期项目中要使用Ovs bond接口 xff0c Ovs Bond 只有三种模式 xff1a balance tcp xff0c balance slb xff0c active backup 这三种模式的工作方式如下 xff1a 1 ac
  • VNC

    VNC Virtual Network Computing 是 虚拟网络 计算机的缩写 VNC 是一款优秀的 远程控制工具软件 xff0c 由著名的 AT amp T 的欧洲研究实验室开发的 VNC 是在基于 UNIX 和 Linux 操作
  • ubuntu 安装图形界面 tasksel不成功

    1 执行tasksel相关的安装命令一直报错 xff0c 经过改源等操作都不行 sudo tasksel install ubuntu desktop 2 参考下面的博客Ubuntu安装图形界面 xff08 桌面 xff09 yangxin
  • 【ChatGPT】比尔·盖茨最新分享:ChatGPT的发展,不止于此

    作者简介 xff1a 在读博士 xff0c 伪程序媛 xff0c 人工智能领域学习者 xff0c 深耕机器学习 xff0c 交叉学科实践者 xff0c 周更前沿文章解读 xff0c 提供科研小工具 xff0c 分享科研经验 xff0c 欢迎
  • 51单片机(十).避障与循迹小车

    实验简介 使用STC89C53单片机作为主控制器芯片实现了带全向轮的两轮驱动避障以及循线小车 xff0c 感知模块为超声波和红外传感器 本实验分为3个独立的部分 xff1a 1 利用超声波实现小车的避障功能 xff1b 2 利用红外传感器实
  • 一点小小的感悟

    从2017年发表了第一篇CSDN文章 xff0c 到现在已经过去了快五年的时间 五年前的我是一名学生 xff0c 五年后的今天我依旧是一名学生 xff0c 区别是从一名大二学生成为了现在的研二学生 这一路走来 xff0c 经历了很多很多事情
  • Arduino单片机(五).基于OpenWrt模块的无线视频遥控小车设计

    1 功能介绍 本项目所设计的机器人需要实现的功能为 xff1a 操作员在操作终端 xff08 手机或PC端 xff09 通过Wi Fi连接到小车上Wi Fi模块所在的网络中 xff0c 向其发出相关操作指令 xff0c 在Wi Fi模块接收