DIY基于路由器控制的wifi视频小车

2018-12-18 11:09航天员科研训练中心
电子世界 2018年23期
关键词:服务器端路由器小车

航天员科研训练中心 杨 勇

介绍了基于路由器直接遥控的wifi视频小车的软硬件制作过程。小车以玩具坦克为车身,以GL-iNnet路由器作为无线收发模块,实现了路由器GPIO端口直接控制小车,并利用V4L2接口发送视频图像的功能。编制了Android程序,可实现Android手机接收视频,并对小车进行遥控。

引言:视频遥控车一直以来就是DIY的首选作品,因为制作视频小车需要软硬件多方面的技能,涉及电子学、网络、图形图像、软件编程等多方面知识,既有较强的娱乐性,又能锻炼和提高自身技能。手边恰好有一款GL-iNet路由器,这款路由器不但将串口引出,还将空余的5个GPIO留出,因此可玩性比较高。此外,正好手边有一辆儿子玩坏的玩具坦克,就有了以这些为基础做一辆视频遥控车的想法。

1.硬件部分

本次DIY的视频小车硬件部分包括:小车车身、路由器、电机驱动模块、视频转换器、摄像头、电源。硬件系统图如图1所示。

图1 硬件系统图

车身是利用坏玩具坦克车的带有履带的下半部,车身内是两只电机,可驱动后轮通过履带传动前进。电源由于给路由器供电并驱动小车电机,为直流5V电源,本次DIY制作是将小米移动电源临时作为小车的电源。电机驱动模块是L9110电机驱动模块,一只模块上有两只L9110芯片,可同时驱动2个直流电机正反转。

Wifi小车制作的核心部件是GL-iNet路由器,它是一款专门为OpenWrt而设计路由器,其MCU为Atheros AR9331,主频400MHz,板载64M内存和16M Flash。PCB板有一只USB接口,可连接U盘或USB摄像头,板子上预留了5个GPIO,1个电源接口(5V和3.3V各一个),且串口已经焊好。对路由器的改造包括焊接GPIO端子和电源端子。路由器改造部分见图2所示。本次DIY使用了5个预留GPIO中的四个,Pin21和Pin22控制左轮,Pin18和Pin19控制右轮。将5V电源接口从板子上引出,更方便后续接线。

摄像头开始使用的是一款支持MJPG格式的USB摄像头,但后来测试过程中发现在光线暗时,帧率较低,传输到手机上的视频有较明显的卡顿,因此最后更换成一只汽车倒车摄像头,该摄像头输出信号是模拟视频信号ITU-R BT.656标准的,为此又增加了一只UVC视频转换器,该转换器的主控芯片为MS2106,可以将CVBS模拟信号转换为USB2.0接口的数字信号,支持720×480、640×480和480×320三种分辨率,且支持M-JPEG图像格式输出。该芯片的视频处理框图如图3所示。

图2 路由器板子引线

图3 MS2106芯片视频处理框图

2.软件部分

软件部分主要分为路由器服务器端编程和手机端Android编程。服务器端和手机端的控制信号和视频信号均通过TCP进行传输。

2.1 编译OpenWrt

GL-iNet路由器安装的是chaos calmer(15.05)版本的OpenWrt操作系统,因为原厂路由器中的OpenWrt是原厂定制的,有许多额外的软件工具。为了提高系统稳定性和增加使用内存效率,所以从github上下载了原版的chaos calmer版的OpenWrt,重新编译后生成bin文件,通过网页端刷新固件。编译OpenWrt时注意的方面包括:

a.在编译前make menuconfig时,将Target System和Target Profile分别选Atheros AR7xxx/AR9xxx和GL.iNet 6408。为了使用USB摄像头需将Video Support内各选项选上;

b.第一次编译通过后,需更改package/base-files/files/lib/functions/uci-default.sh和package/base-files/files/bin/config_generate这2个文件,修改ip地址,以免和家里的无线路由器ip相同。修改package/kernel/mac80211/files/lib/wifi/mac80211.sh文件,将ssid改成自定义的无线网络名称,并改为默认开启wifi模式。修改后再次编译。

2.2 路由器端口设置

在OpenWrt端首先到设置GPIO的功能,把用到的Pin21、Pin22、Pin18和Pin19设置为输出模式,以Pin21为例,方法如下:

echo 21 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio21/direction

在程序中可用如下方法将GIPO设置为1或0(以Pin21为例):

system(“echo 1 > /sys/devices/virtual/gpio/gpio21/value”);

system(“echo 0 > /sys/devices/virtual/gpio/gpio21/value”);

2.3 服务器端程序设计

服务器端主程序为car_main.c,在主程序中fork两个子进程,分别是gpioserver和v4l2server。gpioserver打开6666端口号,监听手机客户端的连接,并根据接收的TCP消息字,向相关GPIO端口发送1或0,控制小车前进、后退和左右转向。v4l2server打开6688端口号,打开USB摄像头设备,当手机客户端的连接后,通过6688端口向手机端发送视频流。子进程间通过共享内存映射的方式实现进程间通信。程序流程图如图4所示。

图4 软件流程图

传统的摄像头信号采集和传输部分一般采用安装mjpg-streamer工具,利用web协议进行传输。本次DIY没有采用该方式,而是使用了V4L2(Video4Linux)的API接口,利用TCP协议传输。V4L2是Linux下关于视频采集相关的设备驱动框架,为驱动和应用程序提供了一套统一的接口规范。利用V4L2提供的API函数进行视频采集和传输,主要包括打开摄像头设备、设置摄像头视频输出模式、设置视频缓冲区队列、读取缓冲区队列并处理数据等。本程序视频输出的分辨率选取480×320,视频格式选取MJPEG,采集图像采用内存映射(mmap)方式。

因为程序需要反复调试,所以没有将程序制作成ipk的安装程序,而是利用OpenWrt提供的gcc4.8交叉编译链工具,直接将程序编译成可执行程序,然后服务器端通过wget将可执行程序下载到路由器。

将前文介绍的GPIO的设置语句编写为shell文件(名称setled),连同编译好的主程序可执行文件加入到OpenWrt的/etc/rc.local文件中,以确保路由器开机即执行该程序。

2.4 手机端Android编程

采用eclipse编写Android程序,程序共2个Activity界面:设置界面和主程序界面。设置界面中设置服务器端IP、控制端口号和视频传输端口号。主程序界面中有前进/后退的按钮,按钮事件用于向路由器端发送TCP数据。程序利用SurfaceView类和SurfaceHolder等接口在窗口绘制图像,在DataInputStream的自定义子类中进行Socket连接,并通过解析jpeg文件的SOI(Start of Image)标记0xFF和0xD8来获取一副图像的起始和大小,将数据流包装为一副图像并绘制到Canvas上显示。通过计算1秒钟内显示的图像数得出帧率,将帧率数据显示在手机屏幕右下角。

3.DIY小车测试

DIY小车外形如图5所示,手机Andriod运行程序界面如图6所示。

图5 小车外观

图6 Android程序界面

打开路由器,先手机连接路由器wifi热点,然后启动手机客户端Android程序。程序界面中左右两边的上下箭头分别控制左右两个轮子的前进和倒退,通过这4个按钮的不同的组合,可以实现前进、倒退、左转、右转等6种控制模式。实测图像传输帧率为30fps左右,视频流畅,无卡顿。

4.结论

DIY制作wifi小车利用路由器为控制和视频传输部件,没有制作复杂的电路板,倒车摄像头、视频转换器、电机驱动模块等可从淘宝购买,总价不超过80元。编写了路由器服务器端软件,实现了V4L2的API接口函数进行视频图像传输,利用视频转换器将模拟信号转换成数字信号,大大提高了图像传输帧率,使得wifi小车娱乐性更强。按照本文所描述的GPIO控制方法,可以制作其他的DIY制作,如远程控制家里电器等。Gl-iNet只有5个空余的GPIO,如果将路由器串口连接C51等单片机,将扩展GPIO接口,控制能力也会大大提高。

猜你喜欢
服务器端路由器小车
买千兆路由器看接口参数
维持生命
路由器每天都要关
大车拉小车
Linux环境下基于Socket的数据传输软件设计
自制小车来比赛
刘老师想开小车
两轮自平衡小车的设计与实现
无线路由器的保养方法
浅析异步通信层的架构在ASP.NET 程序中的应用