初识无线传感器网络 — Blink实验

 

 

一、实验目的

通过本实验的课程教学,主要是让用户了解以下内容:
      1.初识无线传感器网络基础节点
      2.了解TinyOS传感器网络操作系统编程方式
      3.了解TinyOS编程模式与NesC基本概念

二、知识介绍

1.GEN-0200B新型物联网传感器节点硬件介绍
    在下面实验教程中,我们使用GEN-0200B新型物联网传感器节点,如下图GEN-0200B、GEN-0200B外观。




图1-1GEN-0200B、GEN-0200B外观

无线传感器网络节点采用低功耗ZigBee无线射频芯片及16位RISC指令集MCU。该节点支持Tinyos操作系统,提供全套Tinyos源程序代码。模块可以通过动态地址方便组成传感器网络,可以实时传输采集的各种数据,模块各地址可以在每次USB下载中方便指定。整个传感模块采用低功耗设计,工作时只需要两节1.5V的5号干电池。

2.功能及参数

1.支持USB、干电池供电和太阳能(室外)供电;采用AA型电池供电时,可在室外连续工作3个月以上,通过软件适当管理,基本节点可以有效工作达一年以上;

2.CPU使用TI公司的MSP430F1611 ,射频模块为CC2420;

3.通讯半径:室内20-50m,户外75-125m;

4.通讯频段:2.4-2.4835GHZ,最大数据传输率:250Kbps;

5.存储器:内存:48K;RAM:10K;Flash:1M;

6.可见光传感器S1087,可检测光波波长范围 320nm~730nm;

7.湿度传感器SHT11检测湿度精度±3.0%RH,温度精度0.4℃;

8.USB接口具备数据连接、供电及在线编程的功能;

9.快速唤醒,时间<6uS;

10.工作电压:DC,1.8~3.6V,可以使用2节1.5V碱性电池供电;

11.待机功耗:0.6mW;

12.峰值功耗:65mW。

该节点即可以使用内置天线,亦可使用外置天线来提升通信距离;其调试接口有USB和JTAG这两种模式,扩展接口丰富,可外接十余种低功耗传感器。
      在这里我们需要了解无线信号发送模型,理想模型认为节点天线信号是以圆周辐射的,如下图。



图1-2 无线信号理想模型

    但是实际信号的发射收到天气因素(温度湿度等)、建筑反射等的影响,其实际模型如下图。



图1-3 无线信号实际模型

三、实验步骤   

点击开始实验进入实验操作界面
      1.上传实验代码
       点击下图图标上传代码,上传的代码支持压缩文件zip格式。



图1-4 实验代码上传


     2.编译实验代码
      点击图1-5箭头标识的按钮编译实验代码,编译结果如图1-6所示,编译对应我们TinyOS下的 make telosb 命令。



图1-5 编译实验代码
             


图1-6 代码编译结果


      3.申请SmartNode
       点击下一步进入Step2页面,此时界面没有节点,我们需要申请要用到的SmartNode,点击下图箭头所指申请按钮。



图1-7申请界面


      4.烧录代码
       选中0号节点(选中节点后,节点编号会变黑如下图所示),选择该实验代码Blink代码,点击烧录按钮,即可将代码烧录到0号节点,界面右方有操作提示信息。
       烧录对应我们TinyOS下的 make telosb install,0  bsl,/dev/ttyUSB0命令。



图1-8 节点操作界面



图1-9 操作提示信息


     5.实验结果显示
       观察0号节点的3个led灯,可看到它们以不同的周期闪烁。

四、实验分析

1.TinyOS编程模式分析
    TinyOS的编程方式采用nesc语言,这是一种类C语言,nesc语言有几个最重要概念:组件,接口,模块。如下图BlinkC程序组件图:



图1-10 BlinkC组件图

2.nesC程序基本概念:Component(组件)

  1. 每一个程序都是由若干组件(component)组成;
  2. 组件有两种类型,一种是模块(module),另一种是配置(configuration);
  3. 配置文件的作用是表明组件之间的关系。模块文件的作用是将程序的具体实现放在其中;
  4. 每个程序都需要一个顶层的配置文件,它的名字是用程序名字命名。

从上图可以发现,BlinkC这个组件是由MainC,TimeMilliC,LedsC组件组成。

3.nesC程序基本概念:Interface

  1. 每个component都提供以及使用 interface;
  2. Component提供的interface说明了该组件为使用者提供的功能;
  3. Component使用的interface说明了该组件需要用到的由其他组件提供的功能。

接口常使用的关键词是command和event。

    从上图中,箭头的名字表示组件与组件之间访问使用的接口。下面我们结合程序来看下组件、接口、模块的概念。
    Blink目录下面包含Makefile、BlinkAppC.nc、BlinkC.nc三个文件。
BlinkAppC.nc

 
源码
configuration BlinkAppC //表示这是一个名为BlinkAppC的配置  
{  
}  
implementation  
{ //组件申明   
    components MainC, BlinkC, LedsC;  
    components new TimerMilliC() as Timer0;  
    components new TimerMilliC() as Timer1;  
    components new TimerMilliC() as Timer2;  
    //组件间使用关系定义   
    BlinkC -> MainC.Boot;   
    BlinkC.Timer0 -> Timer0;   
    BlinkC.Timer1 -> Timer1;  
    BlinkC.Timer2 -> Timer2;  
    BlinkC.Leds -> LedsC;  
}  

    在implementation关键字后面的括号内是配置的具体实现。components关键字后面表明了这个配置文件所引用的组件,在这里分别是Main、BlinkC、LedsC以及三个TimerMilliC组件。最后五行表明了各组件间的provider和user的关系。A->B表示了一种关系,其中A为使用方(user),而B为提供方(provider)。命令(command)就是接口提供方已经实现的函数。事件(event)就是需要接口使用方实现的函数。

BlinkC.nc

源码
module BlinkC @safe()  //声明了使用到的接口名称,具体语法可以详细查看Nesc语法。  
{  
    uses interface Timer<TMilli> as Timer0;  
    uses interface Timer<TMilli> as Timer1;  
    uses interface Timer<TMilli> as Timer2;   
    uses interface Leds;  
    uses interface Boot;  
}  
  
implementation  
{  
    event void Boot.booted()  
    {  
        call Timer0.startPeriodic( 250 ); //每250ms触发一次event void Timer0.fired()  
        call Timer1.startPeriodic( 500 );  
        call Timer2.startPeriodic( 1000 );  
    }  
      
    event void Timer0.fired()  
    {  
        dbg("BlinkC", "Timer 0 fired @ %s.\n", sim_time_string());  
        call Leds.led0Toggle(); //使Led状态反转  
    }  
      
    event void Timer1.fired()  
    {  
        dbg("BlinkC","Timer 1 fired @ %s \n", sim_time_string());  
        call Leds.led1Toggle();  
    }  
      
    event void Timer2.fired()  
    {  
        dbg("BlinkC", "Timer 2 fired @ %s.\n", sim_time_string());  
        call Leds.led2Toggle();  
    }  
}  

注意这里面定义的接口我们可以从BlinkC组件图里面看到,箭头上的接口名称就是在这个区域定义的。
第一行内容表明这是一个名为BlinkC的module,而后括号的内容表明了该module使用的接口(interface)。[注意这个module没有提供接口(provide)]
由于使用方必须实现接口中的event函数。因此我们可以看到该文件中的implement中包含了初始化Boot.booted,以及三个timer计时的event函数的具体实现。在每个timer的触发event函数内容中写明了其需要触发的内容。详见示例程序。

 在模块文件的具体实现里面涉及到了TinyOS执行模型,该模块使用了MainC组件的boot接口,以事件的响应的方式作为节点上电后的响应事件。在这里涉及到了接口中常见的用法:命令(command)和事件(event)。在BlinkC模块具体实现中,从节点上电开发,触发Boot接口事件,在该事件中,调用了TimerMilliC组件的Timer接口。

posted @ 2022-09-15 15:45  枫让  阅读(649)  评论(0编辑  收藏  举报