智慧交通之智能红绿灯调控系统分析

本文探讨了人工智能在交通行业的广泛应用,包括智能公交、共享自行车、车联网、充电桩、智能红绿灯等。重点分析了智能红绿灯如何根据车流量、人流量及路况进行动态调控,以提高道路通行效率和安全性。此外,还介绍了未来可能结合车联网、自动驾驶等技术进一步提升交通管理的智能化水平。
摘要由CSDN通过智能技术生成

随着近年来人工智能技术的发展,很多行业在实际应用中都已经融入了人工智能的技术,从原来的“互联网+”逐渐转变成了现在的“AI+”。人工智能在各行业的应用普及也对普通民众产生了很大的影响,比如我们常用的刷脸应用、智能语音导航、智能客服等就是使用人工智能技术实现的。其实除了我们能够接触到的这些应用之外,人工智能技术在一些其他专业领域的应用也是非常广泛的,比如交通、医疗、国防、家居、制造业等各行业都已经对人工智能技术的应用非常成熟了。


01人工智能在交通领域的应用方向

人工智能技术在各行业的应用,首先要考虑的是看能否让原来的工作效益更高,这里所说的工作效益不单指经济效益,还包括安全效益、社会效益、国家效益等。下面我们就以人工智能技术在交通行业中的一个小的应用展开分析。

人工智能在交通领域的应用,可以大概分为以下几个方向:

01.智能公交车智能公交

通过RFID、传感等技术,实时了解公交车的位置,实现弯道及路线提醒等功能。同时能结合公交的运行特点,通过智能调度系统,对线路、车辆进行规划调度,实现智能排班。

02.共享自行车

共享自行车是通过配有GPS或NB-IoT模块的智能锁,将数据上传到共享服务平台,实现车辆精准定位、实时掌控车辆运行状态等。

03.车联网

利用先进的传感器、RFID以及摄像头等设备,采集车辆周围的环境以及车自身的信息,将数据传输至车载系统,实时监控车辆运行状态,包括油耗、车速等。

04.充电桩

运用传感器采集充电桩电量、状态监测以及充电桩位置等信息,将采集到的数据实时传输到云平台,通过APP与云平台进行连接,实现统一管理等功能。

05.智能红绿灯

通过安装在路口的雷达、AI摄像头装置等,实时监测路口的行车数量、车距以及车速,同时监测行人的数量以及外界天气状况,动态地调控交通灯的信号,提高路口车辆通行率,减少交通信号灯的空放时间,最终提高道路的承载力。

06.汽车电子标识

汽车电子标识,又叫电子车牌,通过RFID技术,自动地、非接触地完成车辆的识别与监控,将采集到的信息与交管系统连接,实现车辆的监管以及解决交通肇事、逃逸等问题。

07.智慧停车

在城市交通出行领域,由于停车资源有限,停车效率低下等问题,智慧停车应运而生。智慧停车以停车位资源为基础,通过安装地磁感应、摄像头等装置,实现车牌识别、车位的查找与预定以及使用APP自动支付等功能。

08.高速无感收费

通过摄像头识别车牌信息,将车牌绑定至微信或者支付宝,根据行驶的里程,自动通过微信或者支付宝收取费用,实现无感收费,提高通行效率、缩短车辆等候时间等。

09.车辆统计与识别

借助智能视频分析与识别技术,交通行业能统计车流量、车牌识别、车型检测等,利于交通行业实现公路交通的全方位监控、巡逻;便于疏通交通堵塞;利于交通事件的追查与溯源。

10.自动处理与车辆跟踪

基于智能视频识别技术与大数据计算能力,可以实现除车流量统计、车辆识别,还可以根据提取出的车辆信息结合GIS或卫星定位技术,用来进行车辆的跟踪。并在高速出入口设置自动收费系统,实现自动化、智能化的业务处理,便于车辆快速通行。


02人工智能实现红绿灯调控的分析

通过了解了以上智慧交通的应用方向,可以发现人工智能在交通领域的应用基本上已经触及到了方方面面。我们要分析的问题就是人工智能技术如何对红绿灯进行智能调控。

首先我们需要确定对红绿灯要调控到哪一种程度才算是我们的最终目标。比如让红绿灯可以根据车流量的大小来自动调整时长,也可以根据斑马线两端等待过马路的人数来调整,还可以根据综合路况来调整红绿灯的时长,所以我们首先要做的就是确定目标,我们暂且就以综合路况情况调整作为目标,那么我们就需要这个路段的实时图像,比如路段是否畅通、路段是否有故障车辆或者遗落物体挡路,或者路段出现塌陷等其他因素,还要统计该路段路过的车辆数量,以及斑马线两端等候的行人数量等。

我们在项目开始之前,一般会建立一个思维导图,将这些情况逐一分析,看看是否还有遗漏的问题。然后再去思考,如何使用AI的方式来解决这些问题。

首先对于车流量和人流量的统计,可以使用目前工业界比较常用的检测模型来实现,比如像YOLO系列中的v5版本或者YOLOX,算是目前在工业界比较通用的模型了。

其次就是对实时路况监控的实现,这一块主要有三个问题构成,第一个问题是对路段本身的状况监控,比如路面塌陷、裂缝、表面损坏等;第二个问题是对路面上的障碍物的监控,比如行驶的车辆掉落的杂物,或者其他影响车辆正常行驶的杂物;第三个问题是对路段上的车辆是否正常行驶的监控,比如突然有车辆抛锚,这会影响到其他车辆的安全行驶。

路况监控中关于第一个问题,对路段本身状况的监控,可以通过路面缺陷检测算法模型进行实现,具体流程也非常简单,就是对路面的缺陷状态和正常状态的一个区分,使用比较好的分类模型都是可以实现的,比如轻量级模型Mobile Net系列、Shuffle Net系列,通用模型YOLO系列等,目的就是检测出路面缺陷部分,然后通过系统上报,同时提醒该路段的车辆驾驶人员,如果缺陷影响过大,那么势必会影响该路段的车辆行驶速度,可能会导交通拥堵,那么可能需要分配更多的绿灯时间。

路面缺陷一般大部分是长时间形成的,其实对于这种,我们的模型并不会积极地提示,当缺陷达到一定程度后,会被算法识别处理的,但是也不排除突发情况,比如大型车辆在路过某些路面时,可能会突然造成路面塌陷或其它损坏,这种情况就需要及时提醒后面的车辆,所以这也是我们的算法最需要解决的问题。

第二个问题,路面杂物的处理,在模型的选择上和路面缺陷检测可以一样,因为也需要对杂物进行检测识别,不同的是,路面缺陷基本可以通过常见的状态对其进行分门别类,比如路面表面破损、深坑、鼓起、塌陷、裂缝、分界线模糊等。而对路面杂物的监控就会有一定的难度,因为我们不清楚该路段可能会出现哪些杂物,因此我们只能先对有可能容易出现的杂物进行分类训练,然后在长期的使用过程中再对出现的其他不在原来训练类别中的物体进行训练,从而增大标签库来实现。和第一个问题一样,路面杂物如果影响到车辆正常行驶,就会有可能导致交通拥堵,从而需要分配更多的时间让车辆通过。

第三个问题,对于车辆是否正常行驶,可以根据车辆停留的时间来判断,但是如果单纯只通过车辆停留时间来判断,可能会把红灯时候等待的车辆、以及正常堵车的车辆也计算进去,所以这种情况下,我们先需要对不同的车辆区别对待,比如判断该路段的车辆是否都在行驶,如果该路段超过10%或者5%以上(这里设一个阈值,用来判断车辆抛锚的可能性)的车辆都是没有行驶的,说明要么是红灯等待时段,要么是前方路段堵车,否者我们可以判断为车辆抛锚,值得注意的是留给我们做判断的这个时间比较短,因为抛锚车辆停留超过一定时间,则有演变成堵车的可能,这个时候就需要交警来疏散车辆了。

所以我们做的这个智能红绿灯系统不仅仅是根据实时路况来智能的调控红绿灯,还需要把所发生的情况汇总到交通系统中,帮助管理人员做决策,是否需要交警或者其他维修人员带现场处理发生的问题。

至于如何判断车辆是否在行驶过程中,就比较简单了,可以使用图上坐标距离变化和时间段来确定。关于车辆抛锚的原因也有很多种,也有可能是车辆自身故障、或者驾驶者个人的行为、又或者是和其他车辆发生的事故,如果是车辆或驾驶者自身的问题,一般车辆抛锚就是这辆车,如果是追尾或者连环撞击导致,那么抛锚的车辆可能就会变多,也有可能是两辆、三辆,甚至有可能会出现十几辆、或几十辆车连环撞击的可能,判断这种情况的时候就需要考虑该路段属于市区、郊区、国道,还是高速了,一般来说,可行驶速度越高的路段,由于车辆事故造成的抛锚车辆也更多。所以这个阈值也是根据路段的不同而调整的。

然后就是如何根据上面这些问题做一个完善的解决方案,然后反馈给系统,系统根据反馈回来的结果进行合理的调控红绿灯,而不是一成不变的红绿灯时长。

如果我们直接融入上面这些问题来做一个解决方案,也不是不可以,但是对于没有项目开发经验的人员来说,有一点点复杂,那么我们可以和产品迭代思维一样,使用逐步加码的方式来完成解决方案,首先我们可以先排除复杂路况下特殊情况发生的可能,做一个简单的只是根据车流量和人流量而智能调控红绿灯的系统方案,然后再逐步加入特殊状况,比如在原来的只是根据车流量和人流量统计而方案中加入车辆抛锚后,我们的方案需要做什么样的更改,然后这样逐步就完成了整体的方案。这个时候我们一般就需要对各种情况问题进行优先级排序,比如车辆突然抛锚,一般属于交通突发事件,这种优先级是比较高的,因为处理不当可能会造成交通拥堵、甚至事故的发生,所以需要其他情况为此让步,故而先处理这个问题。

那么我们就根据车流量和人流量来先做一个简单的方案分析,有兴趣想更深入研究的同学和其他学习者可以添加我们的公众号:深度人工智能,后期会更新更多的方案细节。首先,我们可以思考一下红绿灯的位置都在路段的哪个方向。

一般在市区或者郊区,红绿灯大部分都在十字路口、丁字路口的偏多,还有其他闹区出入口、各种转弯、交叉等路口,而我们这里要分析的主要是以常见的人流较为密集的区域的十字路口为主,因为十字路口的情况包括了丁字路口和普通的红绿灯路口的情况,我们假设城市的东部为产业园区,城市中大部分人都在城市的东部工作,而城市的西部是人们的生活区,大部分人都住在这里,而城市的南北方向,基本没有划分的很明显,也就是工作和生活都互有交叉,那么这种城市格局在上下班高峰期很容易出现东西向车辆比南北向车辆更多的情况,画在地图上也就是某段十字路口的横向车道的车辆要比纵向车道的车辆更多。

正常情况下,红绿灯系统对无论东西向车道还是南北向车道的时长都是一样的,比如都是60秒,而由于城市格局的特殊性,导致十字路口东西向的车辆经常出现交通拥堵的现象,而南北向的车辆不到60秒的时间就已经行驶完毕,所以可以将早晚高峰期时段东西向车道的绿灯时长调整为80秒,红灯时长则缩短为40秒,也就是为了让东西向的车辆走的更多一些,从而缓解这个时段的东西向车辆的拥堵情况,而城市的南北向由于产业区与生活区分布更加均匀,没有东西向那么集中,所以没有像东西向那样明显的早晚班高峰期,来往的车辆也较少一些,所以缩短为40秒的绿灯时长,而红灯调整为80秒的时长。

通过上面的案例分析,我们发现这完全是一个人工的调控结果,根本没有使用AI算法去实现。之所以先分析人工调控的案例,有两个原因,第一个原因是因为某些特定的情况下,是可以使用人工固定调控红绿灯的,就如上面的案例,第二个原因就是使用AI调控红绿灯的过程是和人工智能调控过程是一样的,也是让大家明白整个实现过程。

只不过使用AI系统调控红绿灯是根据各个路段的实时车辆数量来实时调控的,也就是AI系统可以随时根据安装到十字路口的带有算法的摄像头来统计横竖两个路段的车辆数量的,然后再根据统计到的两个方向路段的车辆数来分配两个路口方向红绿的时长,具体每个路段的车辆阈值设定和分配的时长是多少,这个要根据交通管理人员的建议而定。总之遵循一个原则,和人工调控一样,就是该方向路段和另一方向路段的车辆数量统计比较,哪个车辆更多,那么哪个路段就获得更多的绿灯分配时长。

而在闹市区,有时候还需要综合行人的情况来调控红绿灯的时长,否则只根据车辆来调控,可能会导致大量的人群聚集在路口,甚至由于行人等待过长,导致有些行人强行闯红灯的现象发生,进而引发交通事故。可以发现加入的因素越多,对红绿灯的调控要求就越高。这里面不仅仅包括了冰冷的交通规则,还需要考虑人文因素,尤其是对于人们穿越马路的习惯的了解,毕竟算法的目的就是服务于人们的生活,而最好的方式就是达到一个让大家都能够接受的平衡点,而不是偏向于某一方而引发新的矛盾。

以上只是针对图像视觉方向而进行的分析,如果在车辆上装上传感器和相应的信息收集系统,那么所有车辆的行驶状态都会汇聚到一个总的交通调度系统上,也将是车联网的开端了。到了这个阶段,那么对于红绿灯调控这种小的应用基本上都不是什么难题了,更多的是关注人车协同的安全驾驶方向了。当然在未来当无人驾驶能够普及的话,那么现在所讨论的很多问题都将不再是问题,因为到那个时候,所走的路线和路况通过车联网系统都已经被预设好了,所以根本不会出现这些问题。

关注我们,了解最实用的干货知识!

嵌入式红绿灯控制系统(模拟) 一、摘要: 交通信号灯用于道路平面交叉路口,通过对车辆、行人发出行进或停止的指令,使人与人、车与车之间尽可能减少相互干扰,从而提高路口的通行能力,保障路口畅通和安全。本文介绍了一种城市十字路口交通信号灯控制系统。该系统采用了以8051为内核的单片机芯片AT89s51作为核心控制器,以嵌入式操作系统RTX51为软件开发平台,通过控制城市十字路口的交通信号灯来指挥交通。该系统具有制作简单、成本低、功能实用等特点。 关键词:单片机 嵌入式操作系统 交通信号灯控制 二、 引言: 随着经济发展,汽车保有量急剧增加,城市道路日渐拥挤,交通拥塞已成为一个城市管理的难题。十字路口的红绿灯指挥着行人和车辆的安全通过,实现红绿灯自动指挥是城市管理自动化的重要课题: [1];围绕这一课题,多年来有众多设计方案来实现这一功能,随着数字技术、软件编程的发展和进步,实现这一功能的新的设计方案更是层出不穷。就目前而言,在这一方面,比较普遍使用而又技术先进的主要是以CPLD为核心的实现方案和以MCU为核心的实现方案。 [2]但是将两者与嵌入式操作系统RTX51微控器软件相结合构成完整的交通信号灯控制系统的设计方案还比较少。本人与导师近年来一直从事这方面的研究,通过努力,我们已将本设计方案优化、完善并应用于实际,且效果较好。现本文将着力介绍基于MCU和嵌入式操作系统RTX51微控器软件相结合的这一交通信号灯控制系统。 三、 设计原理: 1、LED 灯具的应用及优点 LED 照明灯具在近期得到飞跃的发展,LED 作为绿色环保的清洁光源得到广泛的认可。LED 光源使用寿命长、节能省电、应用简单方便、使用成本低,因而在LED 手电筒、LED 矿灯及便携照明;在建筑照明、装饰照明、标识牌照明;在汽车的仪表板背光、前后雾灯、第三刹车灯、方向灯、尾灯;以及在家庭照明都会得到海量的应用,欧司朗光学半导体公司2008 年调查统计,全球每年家庭照明灯座出货量约为500 亿个。LED 光源的技术日趋成熟,每瓦发光流明迅速增长,促使其逐年递减降价。以1W LED 光源为例,2008 年春的价格已是2006 年春的价格三分之一,2009 年春将降至2006 年的四分之一。 LED 绿色灯具的海量市场和持续稳定数年增长需求将是集成电路行业继VCD、DVD、手机、MP3 之后的消费电子市场的超级海啸!LED 灯具的高节能、长寿命、利环保的优越性能获得普遍的公认。 LED 高节能:节能能源无污染即为环保。直流驱动,超低功耗(单管0.03瓦-1 瓦)电光功率转换接近100%,相同照明效果比传统光源节能80%以上。 LED 长寿命:LED 光源被称为长寿灯。固体冷光源,环氧树脂封装,灯体内也没有松动的部分,不存在灯丝发光易烧、热沉积、光衰快等缺点,使用寿命可达5 万到10 万小时,比传统光源寿命长10 倍以上。 LED 利环保:LED 是一种绿色光源,环保效益更佳。光谱中没有紫外线和红外线,热量低和无频闪,无辐射,而且废弃物可回收,没有污染不含汞元素,冷光源,可以安全触摸,属于典型的绿色照明光源。 照明用LED 光源的VF 电压都很低,一般VF =2.75-3.8V,IF 在15-1400mA;因此LED 驱动IC 的输出电压是VF X N 或VF X 1, IF 恒流在15-1400mA。LED灯具使用的LED 光源有小功率(IF=15-20mA)和大功率(IF>200mA))二种,小功率LED 多用来做LED 日光灯、装饰灯、格栅灯;大功率LED 用来做家庭照明灯、射灯、水底灯、洗墙灯、路灯、隧道灯、汽车工作灯等。功率LED 光源是低电压、大电流驱动的器件,其发光的强度由流过LED 的电流大小决定,电流过强会引起LED 光的衰减,电流过弱会影响LED 的发光强度,因此,LED的驱动需要提供恒流电源,以保证大功率LED 使用的安全性,同时达到理想的发光强度。在LED 照明领域,要体现出节能和长寿命的特点,选择好LED 驱动IC 至关重要,没有好的驱动IC 的匹配,LED 照明的优势无法体现。 (1)LED 工作的主要参数是VF、IF,其它相关的是颜色/色温/波长/亮度/发光角度/效率/功耗等。LED 是一个P-N 结二极管,只有施加足够的正向电压才能传导电流。VF 正向电压是为LED 发光建立一个正常的工作状态,IF 正向电流是促使LED 发光,发光亮度与流过的电流成正比例。LED VF 标称电压:3.4V± 0.2V 。 (2)LED IF 工作电流按应用需要选用,各档不能混用。LED 灯用各档LED 电流:大功率照明用LED 其封装从成品来看是单颗芯片的,其实是用N 颗LED管芯封装在一个单位里的。它们的排列组合是串并联,它们是N 个串联,再N个并联,然后由二点联接电源。选用时要特别注意它的VF 和IF。 2、 LED 灯具驱动原理: LED 灯具驱动需要先将高压的交流电变换成低压的交流电(AC/AC),然后、将低压的交流电经桥式整流变换成低压的直流电(AC/DC),再通过高效率的DC/DC 开关稳压器降压和变换成恒流源,输出恒定的电流驱动LED 光源。 LED光源是按灯具的设计要求由小功率或大功率LED 多串多并而组成。每串的IF 电流是按所选用的LED 光源IF 要求设计,总的正向电压△VF 是N 颗LED 的总和。LED 灯具选用36V 以下的交流电源可以考虑非隔离供电,如选用220V 和100V 的交流电源应考虑隔离供电。 (3)、目前 MR11、MR16 射灯、水底灯、洗墙灯、路灯、隧道灯、汽车工作灯等LED 灯具大多选用散热较好的自带铜基或铝基板的1W、3W 大功率LED 光源,使用AC/DC12-36V 电源,因而需要使用DC/DC 的降压(Buck)+ 恒流给LED提供VF 和IF。LED 灯具大多使用低压电源,因此在这类灯具的电路设计上,LED的串联个数在1-9 颗,尤以1-3 颗为常见。串联的总△VF 应低于电源Vin。如三颗LED 串联,△VF=3.4V X 3=10.2V。在Vin>12V,能正常工作。MR11、MR16射灯常见的是1W X 3 串联或3W X 1;水底灯常见的是1W X 3 串联2-3 并,三个一组;洗墙灯常见的是1W X 7-9 串联;路灯常见的是1W X 9 串联3 并,4--6个一组;、汽车工作灯常见的是1W X 3-6 串联3 并。当然LED 的串并联的方案是多种多样的,串联个数与其工作电压(Vin)有关,这里就DC12-36V 工作电压而言。目前1W 的LED 光源散热较好,因此选用较多。 LED 灯具对低压驱动芯片的要求: 1)驱动芯片的标称输入电压范围应当满足DC5-40V,以覆盖应用面的需要,耐压如能大于40V 更好;AC 12V 或24 V 输入时简单的桥式整流器输出电压会随电网电压波动,特别是电压偏高时输出直流电压也会偏高,驱动IC 如不能适应宽电压范围,往往在电网电压升高时会被击穿,LED 光源也因此被烧毁。 2)驱动芯片的标称输出电流要求大于1.2-1.5A,作为照明用的LED 光源,1W功率的LED 光源其标称工作电流为350mA,3W 功率的LED 光源其标称工作电流为700mA,功率大的需要更大的电流,因此LED 照明灯具选用的驱动IC 必需有足够的电流输出,设计产品时必需使驱动IC 工作在满负输出的70-90%的最佳工作区域。使用满负输出电流的驱动IC 在灯具狭小空间散热不畅,容易疲劳和早期失效。 3)驱动芯片的输出电流必需长久恒定,LED 光源才能稳定发光,亮度不会闪烁;同一批驱动芯片在同等条件下使用,其输出电流大小要尽可能一致,也就是离散性要小,这样在大批量自动化生产线上生产才能有效和有序;对于输出电流有一定离散性的驱动芯片必选在出厂或投入生产线前分档,调整PCB 板上电流设定电阻(Rs)的阻值大小,使之生产的LED 灯具恒流驱动板对同类LED 光源的发光亮度一致,保持最终产品的一致性。 4)驱动芯片的封装应有利于驱动芯片管芯的快速散热,如将管芯(Die)直接绑定在铜板上,并有一Pin 直接延伸到封装外,便于直接焊接在PCB 板的铜箔上迅速导热如在一个类似4X4mm 的硅片管芯上,要长时间通过300-1000mA 的电流,必然有功耗,必然会发热,芯片本身的物理散热结构也是至关重要的。 5) 驱动芯片本身的抗 EMI、噪音、耐高压的能力也关系到整个LED 灯具产品能否顺利通过CE、UL 等认证,因此驱动芯片本身在设计伊始就要选用优秀的Die塑封铜板 6) 驱动芯片自身功耗要求小于 0.5W,开关工作频率要求大于120Hz,以免工频干扰而产生可见闪烁是一颗可应用于多种LED 灯具驱动的芯片,如路灯、水底灯、洗墙灯、泛光灯、隧道灯、汽车工作灯等。简单实用低成本LED 灯具方案。可将3- 9 颗1W LED 串联,其ΔVF=3.4 V X N, IF=350mA 。当 Vin=12VDC时,3 颗LED 串联, ΔVF=10.2V,工作效率较佳。并可3 串并联应用,ΔIF=3 X350mA=105LED 结合Bipolar高压和BCD高压制程工艺的XL4001、XL4002、XL4101、XL4102产品,输入电压可以做到5V-40V,具有恒流,恒压功能,内置过压、过流、短路、过温保护。针对LED驱动、MR16驱动(1W/3W LED 最高到10颗串联)的市场应用,外围电路简单、性能稳定。持续恒流源输出,最大电流可以做到3A。52kHz 的固定开关频率 .输入/输出电压变化时,负载电流变化范围在± 1%之内. 串接多个LED 时,效率可以达到80%~95%.过温保护(120摄氏度) HVBCD的工艺的高压,大电流,恒流LED升压驱动IC有XL6003、XL6005、XL5002。可以支持16串1W/3W LED串联使用。 XL6003是一颗突破传统电路拓扑结构,结合HVBCD工艺,大电流,高压DC/DC升压恒流LED驱动IC, (1)它具有较宽的直流3.6V到36V输入电压范围(低压可以兼顾锂电供电) (2)最高升压可到42V,可驱动串联12颗1W LED(同比其它品牌多驱动4~5颗LED) XL6003最高可以12个LED灯串联,市场其它最高输出只能够8个LED灯串联。 (3)大电流1050mA持续电流输出,可驱动1W LED12串3并或3W LED12串 (4)EN脚可实现PWM调光,且自带软启动功能 (5)低至0.2V参考电压,可以有效提高系统效率 (6)输出42V过压保护功能 .内置过热保护功能 优势:宽电压输入,大电流输出,外围电路简单。XL6003应用简单,普通DC/DC升压拓扑结构,效率高达92%,适用于基于LED的汽车、路灯、 太阳能灯及LED背光驱动的应用. 3、 LED的驱动程序: #ifndef __KERNEL__ # define __KERNEL__ #endif #ifndef MODULE # define MODULE #endif #include #include #include #include #include /* printk() */ #include /* kmalloc() */ #include /* everything... */ #include /* error codes */ #include /* size_t */ #include #include /* O_ACCMODE */ #include /* COPY_TO_USER */ #include /* cli(), *_flags */ #include #define DEVICE_NAME "demo" #define led_MAJOR 212 #define led_MINOR 0 static int MAX_BUF_LEN=1024; static char drv_buf[1024]; static int WRI_LENGTH=0; static char combuf[2]; char base = 0x70; char off = 0x07; /************************************************** / static ssize_t led_write(struct file *filp,const char *buffer, size_t count, loff_t *ppos) { copy_from_user(drv_buf , buffer, count); combuf[0]=drv_buf[0]; combuf[1]=drv_buf[1]; WRI_LENGTH = count; printk("user write data to driver\n"); IIC_WriteSerial(base, off, combuf, 2); return count; } /******************************************/ static ssize_t led_read(struct file *filp, char *buffer, size_t count, loff_t *ppos) { return count; } /*****************************************/ static int led_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { printk("ioctl runing\n"); switch(cmd){ case 1:printk("runing command 1 \n");break; case 2:printk("runing command 2 \n");break; default: printk("error cmd number\n");break; } return 0; } /******************************************/ static int led_open(struct inode *inode, struct file *file) { sprintf(drv_buf,"device open sucess!\n"); printk("device open sucess!\n"); return 0; } /******************************************/ static int led_release(struct inode *inode, struct file *filp) { MOD_DEC_USE_COUNT; printk("device release\n"); return 0; } /******************************************/ static struct file_operations demo_fops = { owner: THIS_MODULE, write: led_write, read: led_read, ioctl: led_ioctl, open: led_open, release: led_release, }; /******************************************/ #ifdef CONFIG_DEVFS_FS static devfs_handle_t devfs_demo_dir, devfs_demoraw; #endif /********************************************/ static int __init led_init(void) { int result; SET_MODULE_OWNER(&demo_fops); result = register_chrdev(led_MAJOR, "demo", &demo_fops); if (result < 0) return result; printk(DEVICE_NAME " initialized\n"); return 0; } /***********************************************/ static void __exit led_exit(void) { unregister_chrdev(led_MAJOR, "demo"); //kfree(demo_devices); printk(DEVICE_NAME " unloaded\n"); } /*****************************************/ module_init(led_init); module_exit(led_exit); ////////////////////////////////////////////////////////////////////////////// 下面是程序说明,不是代码部分: 重要的数据结构 struct file数据结构 定义位于include/fs.h struct file结构与驱动相关的成员 mode_t f_mode 标识文件的读写权限 loff_t f_pos 当前读写位置 unsigned int_f_flag 文件标志,主要进行阻塞/非阻塞型操作时检查 struct file_operation * f_op 文件操作的结构指针 void * private_data 驱动程序一般将它指向已经分配的数据 struct dentry* f_dentry 文件对应的目录项结构 设备驱动程序接口( struct file_operations), 标记化方法: static struct file_operations demo_fops = { owner: THIS_MODULE, write: demo_write, read: demo_read, ioctl: demo_ioctl, open: demo_open, release: demo_release, }; 设备驱动程序接口( struct file_operations ) 通常所说的设备驱动程序接口是指struct file_operations{ },它的定义位于include/linux/fs.h中。 在嵌入式系统的开发中,通常只要实现如下几个接口函数就能完成系统所需要的功能 init 加载驱动程序(insmod)时,内核自动调用 read 从设备中读取数据 write 向字符设备中写数据 ioctl 控制设备,实现除读写操作以外的其他控制命令 open 打开设备并进行初始化 release 关闭设备并释放资源 exit 卸载驱动程序(rmmod)时,内核自动调用 驱动程序注册过程(动态分配主设备号) insmod module_name ;加载驱动程序,运行init函数(register_chrdev(dev_Major, “module_name”, * fs )) 查看/proc/devices mknod /dev/module_name c/b 主设备号 次设备号 rmmod module_name ;卸载驱动,运行 exit函数(unregister_chrdev(dev_Major, “module_name”, * fs )) 3、交通灯的设计原理: 一般来说,十字路口处的两条相交叉的道路是有主次之分的,其中车流量较大的称为主干道;而车流量相对较小的称为次干道。有主、次干道交叉口的城市道路,四个方向都设有红、绿、黄三色信号灯。红灯亮表示禁止通行;绿灯亮表示可以通行;在绿灯亮转变为红灯亮之前,先要求黄灯亮几秒,以便让交叉口停车线以外的车辆停止通行,而交叉口停车线以内的车辆快速通过交叉口,并且主干道红灯亮的时间等于次干道绿灯亮时间和黄灯亮时间之和。同理,次干道红灯亮时间等于主干道绿灯亮时间与黄灯亮时间之和。完成以上系统设计方法有多种。用MCU实现该系统设计,相对而言是最简单的,因MCU最适宜于对物理对象的控制,通过控制器编程,很容易达到设计要求且成本较低、易于操作。 四、 交通信号灯控制电路的硬件设计: 首先,要设计一个信号灯控制电路方案,实现对红、黄、绿三色信号灯的控制,用发光二极管模拟十字路口的红、黄、绿三色信号灯。某城市道路十字路口交通信号灯控制方案如表1: 表1: 表1交通信号灯控制方案 : 路口街道 主干道 次干道 信号灯 R Y G r y G 主红支绿30s 1 0 0 0 0 1 主红支黄5s 1 0 0 0 1 0 主绿支红40s 0 0 1 1 0 0 主黄支红5s 0 1 0 1 0 0 由表1可知,主干道车辆通行时间是30s,次干道为20s,红绿灯转换之间黄灯亮5s,控制三色灯的信号为开关信号,约定逻辑0表示灯灭,逻辑1表示灯亮。设计控制电路图如图1所示。 由图可知,这是一个非常简单的微控制器最小系统,其中的AT89S51具有高效的8051内核,8KB FLASH EEPROM,256字节的RAM,符合本系统实际应用的要求。其中,发光二极管实际为若干发光二极管组成的阵列,每个发光二极管只是一个像素点,能显示红、黄、绿三种颜色,这是因为每个发光二极管封装内包含两个发光二极管。仅当Red亮时,灯显红色,仅当Green亮时,灯显绿色,当两者同时点亮时,由混色原理可知,灯显黄色。 五、 交通信号灯控制电路的软件设计: 根据城市道路十字路口交通信号灯控制方案,结合硬件电路,可以得出十字路口交通信号灯的状态变换关系如图2由上图可知,信号灯的状态共有4个,每个状态停留的时间是不同的,软件要完成的任务就是按照状态关系控制主干道和次干道红、黄、绿三色信号灯变化。这是一个典型的按照时间原则控制系统在4个状态之间循环。基于嵌入式操作系统RTX51的微控制器软件很容易实现这种要求。该软件可以实现实时和多任务控制,并可以利用操作系统函数os_wait(K_IVL,ticks)来实现精确定时,通过MCU的I/O端口实现对信号灯的控制[4]。根据以上分析,可以把软件要完成的功能分成两部分: 任务0:系统初始化。将6个信号灯全部熄灭,然后启动任务1。 任务1:按照设计方案控制信号灯状态。当是同处于某种状态时,条用系统操作函数os_wait(K_IVL,ticks)实现经确定时,使这一状态保留特定的时间后转到下一状态。4种状态都完成后再回转到状态1,并无限循环下去。使用keil V7.0软件[5],采用C51高级语言编程,用户应用程序如下: #include #include sbit main_red=p0^0 sbit main_yellow=p0^1 sbit main_green=p0^2 sbit branch_red=p0^5 sbit branch_yellow=p0^6 sbitbranch_green=p0^7 /************************************/ /任务0 系统初始化,将六个灯全部熄灭,然后启动任务1 /************************************/ Void int(void)_task0 { main_red=1; main_yellow=1; main_green=1; branch_red=1; branch_yellow=1; branch_green=1; os_create_task(1); os_delete_task(0); ************************************/ 任务1 按时间原则控制信号灯 /************************************/ void ledcontrol(void)_task1 While(1) main_red=0; main_yellow=1; main_green=1; branch_red=1; branch_yellow=1; branch_green=0; so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); main_red=0; main_yellow=1; main_green=1; branch_red=1; branch_yellow=0; branch_green=1; so_wait2(k_ivl,250); so_wait2(k_ivl,250); main_red=1; main_yellow=1; main_green=0; branch_red=0; branch_yellow=1; branch_green=1; so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); so_wait2(k_ivl,250); main_red=1; main_yellow=0; main_green=1; branch_red=0; branch_yellow=1; branch_green=1; 六、总结 : 本文详尽介绍了交通信号灯MCU控制系统的设计思路、硬件及软件的构成。硬件电路为一个MCU最小系统,设计十分简单,而且MCU仅仅使用了很少的IO口,留下了很多没用到的IO口资源,这保证了系统功能扩展时有足够的硬件资源。软件部分由于采用了越来越受广大电子设计工作者青睐的实时嵌入式操作系统软件,并且使用C语言编程,使整个系统软件部分同硬件部分一样简捷。交通信号灯控制系统实际运行结果表明,实时操作系统能保证对外界信息进行足够迅速的处理。 七、 本系统的创新之处: 传统的微控制器应用大多采用结构化编程思想,对单任务控制能达到编程简单、思路清晰、开发周期短的要求。但面对多任务、实时性要求高、相对复杂的系统,采取传统的结构化编程方法,所编写的用户程序可能非常复杂,这无疑给设计人员带来了较大的困难;嵌入式实时操作系既能够保证对外界的信息以足够快的速度进行处理,又能并行地运行多个任务,具有实时性和并行性的特点。嵌入式实时操作系统的使用降低了软件编程的复杂程度、编写的程序有较好的可读性和可移植性、提高了开发效率,而且系统维护和功能扩展非常方便。 八、参考文献: [1]尹宏宾,徐建闽.道路交通控制技术.广州:华南理工大学出版社.2000. [2]刘智勇.智能交通控制理论及其应用.北京:科学出版社.2003. [3]何立民.单片机高级教程[M].北京:北京航空航天大学出版社.2000. [4]晨风.嵌入式实时多任务软件开发基础[M].北京:清华大学出版社.2004. [5]彭秀华.Keil V7.0单片机高级语言编程.北京:电子工业出版社.2005 [6]网络
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值