物联网智能交通管理设备的制作

电子说

1.3w人已加入

描述

步骤1:简要概述-运行原理

交通有刺激我们最好的人的能力。如果可以通过英特尔Edison进行更改,该怎么办?该项目本质上是一种保存在汽车中的设备,可与存储交通信号定时的在线服务器进行通信,并提示驾驶员加快或减速,以便在绿色时获取每个信号。该Instructable仍在开发中,因为需要进行一些工作才能与当前基础架构完全集成,但是,这是该概念及其对未来的承诺的有力证明。

通过定时信号和GPS位置之间的仔细协调来实现此目的。信号的位置和定时信息将下载到此设备上,然后使用其GPS位置来确定车辆驶向哪个信号以及保持速度,以便在绿色时捕获该信号。 LED将亮起,以告知驾驶员加速,减速或保持当前速度。该程序是用JavaScript编写的,尽管它也很容易适应其他语言。存储信息的数据库在Google App Engine上运行,并运行Python脚本来处理数据请求。如果将这种设备安装在道路上的每辆车上,我们可以期望看到更高的燃油经济性,更少的污染和总体上更少的交通。

步骤2:所需零件

首先,免责声明:此设备仅用于实验目的;如果您决定在路上使用,我将不承担任何责任。

零件列表:

具有Arduino Breakout的英特尔Edison

任何NMEA-基于GPS的GPS(我正在使用Parallax#28506)

3G加密狗(我正在使用Huawei E303

一些LED通知驾驶员

步骤3:装配

如果还没有,则需要使用Intel XDK来设置您的主板。设置非常简单,并且数百本教程正围绕着如何做的方式在网络上巡回演出。我建议您看一下以下内容与设置有关的链接,因为它包括从硬件到IDE设置所需的所有知识:

https://software.intel.com/zh-cn/get-started-edison-windows

组装电路板的硬件非常简单,GPS必须使用电路板上标有的5V引脚供电,接地也同样重要,原始NMEA数据必须馈入UART。接收点rt,位于最靠近Edison的Arduino屏蔽接头针上(参见图片)。 3G加密狗将插入侧面的USB-A端口;我决定使用USB扩展,因为加密狗的宽度太大,无法插入电源插头。确保USB模式选择器开关处于如图所示的位置(朝向大USB端口)。

第4步:编程

该程序将是一个不断发展的项目。如果您想访问更新的版本,建议在以下链接中从GitHub存储库中分叉代码:

https://github.com/TheInventorMan/IntelligentTraff 。..

不过,为方便起见,我粘贴了以下代码,尽管这仅适用于将保留在车辆中的本地设备。服务器文件都位于存储库中。

对于感兴趣的人,以下是该程序使用的算法的基本概述:

GPS接收位置,速度,航向和时间

设备通过3G加密狗向服务器请求数据

服务器以数据流进行响应,类似于NMEA语句(但是,一种简单的协议)

将数据流解析并排列成二维数组,其中包含信号的位置,时序,偏移量等。

使用此信息,设备可以确定

确定绿灯窗口,并根据当前速度对其进行测量

设备会提示驾驶员加快,降低速度或保持速度以赶上信号的绿色窗口。

将来,它可能会扩展为包括非定时信号(在道路下方带有感应线圈的信号),以及信号的“安全缓冲区”。车辆*裸露时约3秒ly *使其超越信号。这样,驾驶员将永远不会跑出任何黄灯(危险)。

import mraa;

import Math;

//端口初始化

var GPS = mraa.Uart(0 ); var 3G = mraa.Usb(0);//暂时无法使用,将在其位置实现USB主机端口驱动程序var gain = mraa.gpio(2); var maintenance = mraa.gpio(3); var reduction = mraa.gpio(4); GPS.setBaudRate(9600);

//常量

var earthRadius = 6371000;//以米为单位的地球半径var degToRad = 0.01745329251;//每度弧度var radToDeg = 57.2957795131;//以度为单位的弧度

函数getLocation(){//使用$ GPGGA消息确定当前位置var GPSLocation = [0,0,0,0]; while(1){if(GPS.dataAvailable()){var buffer = GPS.readStr(512);如果(buffer.find(“ GPGGA”)!= -1){var rawNmea = buffer.substring(buffer.search(“ GPGGA”),buffer.search(“ n”)); var nmeaList = rawNmea.strip()。split(“,”); var time = nmeaList [1]; var latraw = nmeaList [2]; var latdir = nmeaList [3]; var lonraw = nmeaList [4]; var londir = nmeaList [5]; var lat =(latraw.substring(0,2))+(latraw.substring(2))/60; var lon =(lonraw.substring(0,3))+(lonraw.substring(3,0))/60; if(londir ==“ W”){lon = lon * -1; } if(latdir ==“ S”){lat = lat * -1; } var alt = nmeaList [9]; GPSLocation = [lat,lon,alt,time];返回GPSLocation; }}}}函数getVelocity(){//使用$ GPVTG消息来确定速度和方向var GPSVel = [0,0]; while(1){if(GPS.dataAvailable()){var buffer = GPS.readStr(512);如果(buffer.find(“ GPVTG”)!= -1){var nmeaData = buffer.substring(buffer.search(“ GPVTG”),buffer.search(“ n”)); var nmeaList = nmeaData.strip()。split(“,”); var hdg = nmeaList [1]; var rawVel = nmeaList [7]; var vel = rawVel/3.6; GPSVel = [hdg,vel];返回GPSVel; }}}}

function getLights(){var Lights = [7] [10];//交通信号灯时序数组,10个最近的信号灯,每个7个参数。纬度,经度,NTime,Etime,TimeOffset,Heading,Distance//requestData(); if(3G.dataAvailable()){var buffer = 3G.readStr(512);如果(buffer.find(“ $$”)!= -1){lightData = buffer.substring(buffer.search(“ $$”),buffer.search(“ n”));//灯光信息规范遵循GPS方案,其中“ $$”表示句子的开头。 lightList = nmeaData.strip()。split(“,”);对于(i = 0; i

函数computeDistance(Latdeg1,Londeg1,Latdeg2,Londeg2){var Lat1 = Latdeg1 * degToRad; var Lat2 = Latdeg2 * degToRad; var Lon1 = Londeg1 * degToRad; var Lon2 = Londeg2 * degToRad;变距= 2 * earthRadius * Math.asin(sqrt((Math.sin(Lat2-Lat1/2))^ 2 +(Math.cos(Lat1)* Math.cos(Lat2)*(Math。 sin(Lon2-Lon1/2))^ 2))));//使用Haversine公式计算大圆距}

函数computeHeading(Latdeg1,Londeg1,Latdeg2,Londeg2){var Lat1 = Latdeg1 * degToRad; var Lat2 = Latdeg2 * degToRad; var Lon1 = Londeg1 * degToRad; var Lon2 = Londeg2 * degToRad; var y = Math.sin(Lon2-Lon1)* Math.cos(Lat2); var x = Math.cos(Lat1) )* Math.sin(Lat2)-Math.sin(Lat1)* Math.cos(Lat2)* Math.cos(Lon2-Lon1); var heading = Math.atan2(y,x).toDegrees();返回标题;}

//主序列while(1){var temp [4]; var currLat; var currLon; var currHdg; var currSpd; var Lights; var time; var Dir; var currSignal; var t1 ,t2; temp = getLocation(); currLat = temp [0]; currLon = t EMP [1];时间= temp [3]; temp = getVelocity(); currHdg = temp [0]; currSpd = temp [1];灯= getLights(); for(i = 0; i 180){Lights [5] [i] = 180-computeHeading(currLat,currLon,Lights [0] [i],Lights [1] [i]); } else {Lights [5] [i] = computeHeading(currLat,currLon,Lights [0] [i],Lights [1] [i]); } Lights [6] [i] = computeDistance(currLat,currLon,Lights [0] [i],Lights [1] [i]); if(Lights [6] [i] 315 || 135 Lights [6] [currSignal]){\提高速度提高。write(1); maintain.write(0); decrease.write(0); } else if(t1 == Lights [6] [currSignal]){\保持速度增加。write(0); maintain.write(1); decrease.write(0); } else {\降低速度提高.write(0); maintain.write(0); decrease.write(1); }

}
       责任编辑:wv

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分