随着无线网络与电子技术的发展和普及,各类专业设备甚至民用产品之间的数据传输已经不满足于简单的点对点形式,对组网的需求日益突出。为了应对这一需求,自组织网络技术应运而生。
自组织网络的突出特点是,没有传统的中心控制节点来协调组网过程,分布的节点之间的组织主要靠“临时性的自治”实现。实现无线自组织网络的基础之一是网络互同步技术。该技术通过网络节点之间时间基准的相互交换和相互控制,实现节点之间的相互同步。
由于无线节点硬件成本偏高,相关软件使用也较为复杂,在进行相关技术的研究和学习时,大多通过计算机软件仿真。这种纯粹软件仿真实验的形式更适用于已有一定的实践经验和算法基础的人员,对于其进行更专业的算法学习和研究有较大帮助。但由于缺乏具体的实物,初学者难以建立起直观的感性认识。
为此,本设计首先选择低成本的单片机作为核心,利用简单的光电信号替代WiFi、蓝牙等无线通信形式,最大程度地降低了硬件制作成本。其次,剔除了复杂的通信协议栈,仅关注于自组织网络中互同步技术的核心算法实现,最大程度地简化了学习的难度。所设计的节点组成的学习平台不仅简单直观,而且可以根据需要验证各类不同算法,网络规模也可灵活调整,不受节点数量增加的限制。
1 节点硬件设计
综合考虑成本、供电和算法更新等方面,选择ATtiny13A-10pu作为仿真节点的核心。该芯片是一款低功耗的8位微处理器,可以工作在0~4 MHz@1.8~5.5 V状态,用一粒普通的CR2032纽扣电池就可以为其提供3 V供电,内部有1 KB Flash RAM,64字节RAM和64字节EEPROM,空间虽然不大,但做基本算法验证已经够用。除此之外它还有4路10位ADC可作为光电信号检测之用。在光电检测元件方面采用的是常见的光敏电阻5516,当然也可以选择性能更稳定、一致性更好的环保光敏电阻。
除了上面所述的单片机、光敏电阻以外,节点还需要有一个发光二极管用于显示各节点间的同步状态。当初始亮灭不一致的节点经过一段时间后,以相同时间点、频率进行闪烁,这时表示网络同步成功。对发光二极管只要求电压电流适当即可,设计中选择的是1.7 V、2 mA的低电流发光二极管,低电流更有利于延长节点电池的工作时长。
整个电路力求简洁,因而没有设计复位电路。另外,由于片内振荡器已经进行了9.6 MHz的标定,经8分频后可以实现1.2 MHz的系统时钟,已经可以满足本设计的需要,所有也无需外接晶振。电路原理图如图1所示。
需要注意的是,图中电阻R1、R2阻值的具体选择和电源电压、发光二极管及光敏电阻的参数有关。电阻R1的作用主要是限流,其阻值可参考公式R1=(Up-U1)/I1选择,其中Up为供电电压,U1为发光二极管压降,I1为发光二极管的电流。电阻R2的阻值主要受到光敏电阻R3工作效果的影响,选定的原则主要由保证光敏电阻在日光下可以对光线变化作出反应的灵敏程度来决定,在最初确定时可以用电位计来替换固定电阻R2,通过试验,1 kΩ阻值的电阻已经可以保证节点正常工作。
另外,如果不采用节点间相互分离的独立电路设计,而采用多个节点固定在同一块底板上的布线,也可以不采用独立的纽扣电池供电方式,统一为所有的节点提供5 V电源供电。
2 算法设计与实现
2.1 互同步算法原理
为了更好地对算法进行解释,首先简单介绍自组织网络的生物原型。在自然界中有很多自组织的生物系统,在这些系统中,个体一般不具备高智商,对信息的获取和处理能力也十分有限,尽管如此,整个系统却可以在群体行为上呈现出令人吃惊的统一性和协同性。比如鱼群、鸟群等生物群体在集体活动时,虽然没有一个中心指挥,系统整体状态仍然可以依赖构成系统的个体间的相互作用,形成一个有机整体。
在这里只研究这一行为实现的基础,互同步的相关算法。算法的实现非常类似于萤火虫同步闪烁,本设计最终呈现的效果也是模拟一个有众多“萤火虫”(节点)的网络同步。
开始的时候,众多独立节点发光二极管的闪烁是随机的。但是,随着时间的推移,它们能够慢慢地与最近的邻居同步,随着时间的推移,最后所有的节点都同步闪烁。
本设计采用了一种最简单的算法来实现这一过程。首先假设所有节点的闪烁频率是相同的,这就类似于同一种群的萤火虫具有相同的闪烁频率一样,它们最初呈现的不同步其实只是各自闪烁的时间点不一样。这样在简化算法实现的同时,并不失其普遍意义。
算法中设定了一个变量,闪烁能力(Power),用于表示节点闪烁的能力,这个值随着时间会慢慢增加,当其增加到一个临界阈值(Pth)时,节点的发光二极管开始闪烁,随之这种能力开始逐渐“消耗”,即闪烁能力减小。闪烁能力的变化过程默认对于所有的节点都是一样的,也就是说所有节点闪烁的固有频率是一样的。
通过光敏电阻,每个节点都可以感受到邻近节点的存在,这个过程是通过单片机的ADC实现的。这些节点都依据相同的原则进行同步。如果某个节点发现它比邻近节点闪烁得晚,那么下次它将稍稍提前闪烁,经过节点间的相互作用,所有的节点最终会在同一时刻按照相同的频率闪烁。这个方法虽然简单,但却十分有效,基于它的进一步研究已经在Ad Hoc网络的互同步中得到应用。相关算法如图2所示。
[page]
图中阈值(Pth)表示节点闪烁的阈值,当闪烁能力(Power)达到这个值时节点开始闪烁。T为节点闪烁的周期。从图2可以看出,初始时刻两个节点虽有共同的闪烁周期,但两节点开始闪烁的时刻不同,下方节点闪烁能力要更晚到达阈值,即闪烁的开始时刻要晚于上方节点。而当上方节点开始闪烁的时刻,通过光敏电阻,下方节点侦测到了这一变化,并将自己下一次的发光时刻提前,发光周期缩短为新的周期(T1)当然仅通过一次提前并不能做到两者同步,但是经过n次调整,两者的闪烁时刻逐次逼近,而且下方节点新的周期(Tn)也恢复为原周期(T),两者最终达到了同时刻同周期的互同步。该算法并不受节点规模的影响,因此网络规模可以灵活扩展。2.2 程序设计实现
从上面论述可知算法实现并不复杂,下面只对关键代码做简要描述,流程图如图3所示。
节点上电复位以后,程序的初始化部分对节点硬件进行相应的初始化,主要是对模/数转换(ADC)进行设置,选择对应的转换通道并使能,设置发光二极管为关闪烁状态。
需要注意的是,由于系统采用光敏电阻作为传感器件,因此节点之间的相互感应不可避免地会受到外界光照的干扰,也就是说即使在邻近节点不闪烁时,闪烁能力(Power)的初值也不会为0。为此,本程序选择外界的背景光作为基础门限值(threshold),这个值可以通过模/数转换(ADC)多次采样再做平均获得。相关代码实现如下:
代码中对4次采样值进行了平均,考虑到干扰的问题,对平均值再加80进行调整。
随后,程序进入主循环,在主循环中主要完成三件工作。
首先是闪烁能力(Power)值的递增。如前面算法描述,当它逐渐增加达到闪烁阈值(FLASH_POWER)时,二极管将开始有节奏地闪烁。为了保证快速和精准,闪烁能力值的递增并不是均匀的,而是分段区别进行的。闪烁能力值比较小时,以较大的增量累积(如Power+=16),随
着其逐渐接近阈值,增量减小,比如当Power>6000后,以1为递增幅度进行(如Power+=1)。
在计算了节点闪烁的能力后,程序进入第二个阶段,主要工作是修正闪烁能力值。考虑到外界干扰,节点可能会受到突然的外界强光照射影响,当光照很强时,节点将无法正确感知邻近节点的变化,为此还需要做相应异常处理。相关代码如下:
该段程序中首先进行采样,获得当前的光照(light)值,如果其大于预设的环境光照常量(ENV_LIGHT),则认为外界光照太强,此时节点之间已经无法进行有效地相互感应,出现异常。这里将节点延时一段时间进入休眠状态,隔一段时间再做检测。考虑到选用的单片机,环境光照常量设为总量程的一半较为合适。如果外界光照对节点的光感应处在正常范围,则再判断当前的光照(light)是否大于前面计算的基础门限值(threshold)。当其值大于此基础值时,表明邻近有节点在闪烁,且该节点晚于邻近节点的闪烁,因此需要对闪烁能力进行快速调整(如Power+=200)。这个增量远远大于常规的闪烁能力积累,执行效果就是将节点下一次开始闪烁时刻大大提前了。
最后的工作就比较简单了,通过判断闪烁能力是否大于闪烁阈值(FLASH_POWER),当大于时设置发光二极管为开闪烁,当小于时设置为关闪烁。
程序主体是一个死循环,根据需要还可添加电源管理、中断处理等其他功能模块。文中主要仅论述了两个节点间的互同步实现,但文中所述算法可以不加修改就适用于节点数更多的网络。这正体现了自组织网络的特点:其中功能有限的节点利用局部信息就可达到整个网络的高度协调一致。
结语
本文详细阐述了一种利用单片机进行自组织网络互同步算法学习的方法,网络同步的效果良好。设计的节点具有简单直观、网络规模扩展灵活的特点,是一个对自组织网络的很好的实体模拟,对于掌握无线传感网或多智能体等需要进行同步的自组织组网技术有一定的借鉴意义。
上一篇:单片机反汇编是什么? 什么是反汇编?
下一篇:怎样用门电路扩展单片机 I/O 接口?
推荐阅读最新更新时间:2024-03-16 13:27