(一)实验目的
a)学习nesC编程语言
b)学习如何使用Timer和LED组件
c)学习如何进行程序的编译和下载
(二)实验设备
a)一个节点:标准的MICA2、MICAz、IRIS或者与之相兼容的版本。
b)一台网关和一条串口线或者USB转串口设备。
c)一台安装有MoteWorks开发环境的Windows PC。
(三)实验介绍
在本实验中,需要创建一个应用程序,该程序使用节点上Atmega128L处理器中的计时器进行计时。该计时器以每秒一次的频率触发节点上红色LED灯的明暗变化。
(四)实验步骤
a)启动MoteWorks开发环境中的PN2编辑软件。
启动PN2后,看到如下图的结构:
其中:
apps是Moteworks自带的示例程序。
make是针对不同平台的编译规则文件。
tools是编译、下载等用到的一些工具。
tos是TinyOS1.x的源码,Crossbow在源码中加入了xmesh网络协议和支持Crossbow产品的一些组件。
b) 在C:\Crossbow\cygwin\opt\MoteWorks\apps文件夹下(默认Moteworks安装在C盘),建立自己的文件夹,比如experiments,再在下面建立本次实验的文件夹,比如test1。在PN2的apps上可以看到新建的文件夹experiments/test1。看不到时,可以右击apps文件夹,选择刷新即可。
注:也可以把随设备一起实验程序文件夹experiments直接拷贝到C:\Crossbow\cygwin\opt\MoteWorks\apps下,省去下面建立文件的过程。
c)创建Makefile文件。
创建一个应用程序首先需要为它建立一个Makefile文件,通常地Makefile文件按以下的规范建立:
include Makefile.component
include $(TOSROOT)/apps/MakeXbowlocal
include $(MAKERULES)
点击“File”>“Save”进行保存。
d)创建Makefile.component文件
这个文件描述了应用程序的顶层组件:MyApp和实验中将使用的传感器板。指定传感器板的命令告诉编译器将要使用的预先编译好的nesC组件,该组件用于应用程序访问传感器设备。每一个传感器板都有自己的一套预编译的nesC组件。
Makefile.component文件通常以以下规范建立:
COMPONENT=MyApp
SENSORBOARD=mts310
点击”File”>“Save”进行保存。
e)创建配置文件
应用程序的配置文件命名为“MyApp.nc”。StdControl接口是应用程序中的最基本的接口,它为TinyOS应用程序的初始化、运行和终止提供了最基本的功能。
在PN2中按照以下代码创建应用程序的配置文件:
/**
* This configuration shows how to use the Timer and LED components
**/
configuration MyApp {
}
implementation {
components Main, MyAppM, TimerC, LedsC;
Main.StdControl -> TimerC.StdControl;
Main.StdControl -> MyAppM.StdControl;
MyAppM.Timer -> TimerC.Timer[unique("Timer")];
MyAppM.Leds -> LedsC.Leds;
}
在配置文件的最后两行中,TimerC和LedsC组件和应用程序的模块连接了起来,于是应用程序的模块可以控制Timer和LED设备通过调用TimerC和LedsC组件中的函数。
当完成程序编辑后,点击“File”>“Save”进行保存。
f)创建模块文件
应用程序的模块文件命名为“MyAppM.nc”。模块文件通常包含了程序的实体代码。在这里用户需要编写代码启动Timer和触发红色LED灯的明暗。
在PN2中键入以下参考代码:
/**
* This module shows how to use the Timer and LED components
**/
module MyAppM {
provides {
interface StdControl;
}
uses {
interface Timer;
interface Leds;
}
}
implementation {
/**
* Initialize the components.
*
* @return Always returns <code>SUCCESS</code>
**/
command result_t StdControl.init() {
call Leds.init();
return SUCCESS;
}
/**
* Start things up. This just sets the rate for the clock
* component.
*
* @return Always returns <code>SUCCESS</code>
**/
command result_t StdControl.start() {
// Start a repeating timer that fires every 1000ms
return call Timer.start(TIMER_REPEAT, 1000);
}
/**
* Halt execution of the application.
* This just disables the clock component.
*
* @return Always returns <code>SUCCESS</code>
**/
command result_t StdControl.stop() {
return call Timer.stop();
}
/**
* Toggle the red LED in response to the <code>Timer.fired</code>
* event.
*
* @return Always returns <code>SUCCESS</code>
**/
event result_t Timer.fired()
{
call Leds.redToggle();
return SUCCESS;
}
}
当完成程序编辑后,点击“File”>“Save”进行保存。
g)编辑完成后,进行程序的编译和部署。程序的编辑和部署通常在PN2中进行,首先选择“Tools”>“make micaz”(或者makemica2、iris,依节点型号而定)进行编译。
注:选择编译时,如果当前打开的文件是本次的程序文件,则编译本程序,如果打开的是,比如说第二个实验的程序文件,则编译第二个实验的程序,下载程序时也是一样的道理。如果打开的不是程序文件,则不会出现编译选项。
然后在“Output”栏中可以看到编译的结果,正确编译后如下图所示:
在编译完成后,若在“Output”栏中没有错误的信息,则可以进行程序的下载。
注:应用程序文件夹下的build文件夹是在执行编译命令后生成的,里面按平台建立子文件夹,存放编译过程中生成中间文件和可以下载到节点里的最终文件。
h) 连接好网关的电源,串口线一端连接PC机的串口,一端连接网关的串口0(靠近以太网口的那个)。如果PC机不带串口,则可以使用USB转串口的设备。连接如下图:
鼠标键盘通过USBhub连接到网关。串口连接在以太网口附件的串口接口。
安装USB转串口的设备驱动后(驱动由硬件设备提供者提供),它会虚拟出一个串口,右键“我的电脑”->“管理”->“设备管理器”->端口(COM&LPT),可以查看串口号。如下图:
记住这个串口号。
k) 将网关stargate2的51Pin附近的拨键开关中的7,8按下,需要下载程序的节点连接到stargate2的51pin接口上,如果节点带电池,要先把电源开关关掉,再连接网关51Pin,因为网关51Pin也会给节点供电,同时供电会造成短路,损害设备。网关连线可以参考下图(使用USB转串口设备时):
l) 打开网关的电源,在网关stargate2的液晶屏幕上,会显示linux操作系统的界面,点击桌面上的“Terminal”图标。弹出控制台窗口,输入命令“cd /usr/xbow/mote”,接着执行“./mib520”,当出现“Device /dev/ttySAC0 has beenopened.”时,表示stargate2上的程序可以开始接收程序数据了。
m)回到PC机上的PN2软件,选择“Tools”>“shell”,当对话框出现后,在框中输入”make micaz reinstall,<m> mib520,com<n>”
micaz为节点类型,其他的如iris,mica2等。
m为用户指定给节点的id,是个2字节的数,0到65535。但是0是保留给基站节点用的,即下载Base程序、连接在网关上的节点。不同的节点要使用不同的id,像IP地址一样,相同了会冲突。记住自己分配给不同节点的不同id,接收数据时用来区分是哪个节点发过来的数据。
n为串口号,使用串口线时(非USB转串口设备),COM口设置为COM1;当使用USB转串口设备时,USB转串口的设备会虚拟出COM口,比如COM口号为3,则使用com3,在框中输入”makemicaz reinstall,1 mib520,com3”。点击确定。
注:如果PN2的控制台提示“Can not connect to Mote correctly. Please check your Mote.”
一要检查节点和网关的连接,节点是否插紧,51Pin附近的拨键开关中的7,8是否按下,串口号设置是否正确,即”make micaz reinstall,<m>mib520,com<n>”中的n是否为连接网关和PC机的串口号。
注意命令中的空格和逗号的使用,不要增减,不要替换。按照命令去输入。下面是初学者遇见的错误输入:
make iris 12,reinstall mib520,com3
顺序不对
make iris reinstall ,12 mib520,com3
“,12”前多个空格
make reinstall,12 mib520,com2
忘记指定平台,端口指定错误
make iris reinstal,12 mib520,com3
单词拼写错误
如果上面的命令执行错误,想中断执行时,可以使用PN2中Tools->stop Tools。如果还下不进去,查看PC机上任务管理器中进程项中有没有uisp.exe这个进程,有的话,把它结束掉。
二是要检查网关上运行的mib520程序是否已经结束,已经结束则重新打开。(30秒内没有通讯,mib20程序会自动退出,打印”Device /dev/ttySAC0 hasbeen closed.”,如果有通讯就重新计时),所以在打开mib520软件之前,最好把该做的都做好,比如在PN2里写好下载程序的命令,当mib520程序启动后,点下“确定”即可。
三是要需要检查串口设置,这个一般出厂时配好,如果上面的解决方法没有生效在试试这个方法。stargate2启动时,通过串口输出一些信息,可以通过超级终端等串口数据接收工具接收,在网关启动的3秒中内,快速按下任意键进入uboot,选择3(7.0寸屏幕)。接着按下e(退出),输入printenv,回车,打印环境信息。
如果看到有这个设置“bootargs=noinitrd console=ttySAC0ubi.mtd=1 root=ubi0:rootfs rootfstype=ubifs init=/linuxrc video=fb:AT070TN83ppp=none”修改一下,使用命令“setenvbootargs noinitrdconsole=null ubi.mtd=1 root=ubi0:rootfsrootfstype=ubifs init=/linuxrc video=fb:AT070TN83 ppp=none”, 回车之后,使用命令“saveenv”,保存参数,接着输入“reboot”重新启动。重新下载程序。
部署的结果在“Output”栏中同样可见,如下图所示:
当在“Output”栏中显示“Uploading:flash”字样,并且没有任何错误提示时,则表示部署完成。可以看到节点上的红色LED灯每秒进行明暗的变化。
2524





