2009년 3월 30일 월요일

tinyos-1.x & tinyos-2.x env.scripts

> TinyOS-1.x < /opt/env.scripts/env.opt.tinyos-1.x

unset CLASSPATH

export TOSROOT=/opt/tinyos-1.x
export TOSDIR=$TOSROOT/tos
export CLASSPATH=$TOSROOT/tools/java
export MAKERULES=$TOSROOT/tools/make/Makerules

echo "--------------------------------"
echo "Currently, TinyOS-1.x env."
eche "--------------------------------"
echo "TOSROOT="$TOSROOT
echo "TOSDIR="$TOSDIR
echo "MAKERULES="$MAKERULES
echo "--------------------------------"

export JAVA_HOME=/opt/ibm/java2-i386-50
export JDKROOT=$JAVA_HOME
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.

export MSPGCCROOT=/opt/msp430
export PATH=$MSPGCCROOT/bin:$PATH


> TinyOS-2.x < /opt/env.scripts/env.opt.tinyos-2.x

unset CLASSPATH

export TOSROOT=/opt/tinyos-2.x
export TOSDIR=$TOSROOT/tos
export CLASSPATH=$TOSROOT/support/sdk/java/tinyos.jar:.
export MAKERULES=$TOSROOT/support/make/Makerules

echo "--------------------------------"
echo "Currently, TinyOS-2.x env."
echo "--------------------------------"
echo "TOSROOT="$TOSROOT
echo "TOSDIR="$TOSDIR
echo "MAKERULES="$MAKERULES
echo "--------------------------------"

export JAVA_HOME=/opt/ibm/java2-i386-50
export JDKROOT=$JAVA_HOME
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.

export MSPGCCROOT=/opt/msp430
export PATH=$MSPGCCROOT/bin:$PATH

command :
source /opt/env.scripts/env.opt.tinyos-1.x --> 1.x env.
source /opt/env.scripts/env.opt.tinyos-2.x --> 2.x env.

- tinyos korea -

Windows에서 Eclipse를 이용한 TinyOS 개발 환경 구축

1. TinyOS-1.x는 Eclipse 3.1.2 ver.에서 정상적으로 동작하므로 아래에서 다운로드 한다.
http://archive.eclipse.org/eclipse/downloads/drops/R-3.1.2-200601181600/index.php

2. 받은 파일의 압축을 적당히 원하는 곳에 풀면 끝.

3. TinyOS Plugin for Eclipse 설치를 위해 다음 사이트에서 TinyOS-UpdateSige1-1.zip 파일을 다운로드 받는다.
http://dcg.ethz.ch/~rschuler/OLD/installation.htm
다운로드가 완료되면 압축을 풀고 이클립스를 실행한다.

이클립스 실행 후
Help > Software Updates > Find and Insatall 선택
Search for new features to install 선택
New Local Site 클릭 후 다운로드 받은 TinyOS-UpdateSite1-1 파일 선택 후 확인
Update site가 등록되면 해당 Plugin 선택 후 Finish

4. 다운로드 받은 TinyOS-UpdateSite1-1 파일로 부터 검색 결과가 생성되면, Plugin 항목 중 suit 항목만 선택한다.
I accept the term in the license agreement 선택
Optional Features 창에서 TinyOS Wrapper Environment 1.0.5 항목만 선택
Plugin을 다운로드 받고, Install 을 통해 설치한다.

5. Eclipse restart
Window > Preference 선택
TinyOS 가 실제 설치된 경로 설정 후 확인

이로써 Eclipse를 이용한 TinyOS 개발환경이 구축된다.

2009년 3월 28일 토요일

TinyOS-1.x Installation on Linux(Fedora 10)

콘솔(터미널)을 열어 root 권한으로 진행...

1. IBM Java sdk, javacomm 다운로드 받는다.
http://www.ibm.com/developerworks/java/jdk/linux/download.html 에서 아래 두 개의 rpm파일을 다운로드 받는다.
다운로드 받기 위해서 등록은 필수 -.-
IBM Java를 사용하는 이유는 설치가 쉬워서?? SUN Java는 설치가 어렵다는데... -.-

ibm-java2-i386-sdk-5.0-9.0.i386.rpm
ibm-java2-i386-javacomm-5.0-9.0.i386.rpm

파일을 다운로드 받았으면 설치를 한다.

$>yum localinstall --nogpgcheck ibm-java2-i386-jre-5.0-9.0.i386.rpm
$>yum localinstall --nogpgcheck ibm-java2-i386-sdk-5.0-9.0.i386.rpm
$>yum localinstall --nogpgcheck ibm-java2-i386-javacomm-5.0-9.0.i386.rpm


설치가 끝나면 /opt/ibm/java2-i386-50에 설치된다.
vi /root/.bashrc 파일을 열어 아래와 같은 내용의 Java path 및 환경변수를 추가하고 저장한다.

#JAVA
export JAVA_HOME=/opt/ibm/java2-i386-50
export JDKROOT=$JAVA_HOME
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.:$CLASSPATH


2. TinyOS linux tools 를 다운로드 및 설치한다.
http://www.tinyos.net/dist-1.1.0/tools/linuxhttp://www.tinyos.net/dist-1.2.0/tools/linux 에서 아래 파일들을 다운로드 받는다.

avarice-2.0.20030825cvs-1.i386.rpm
avr-binutils-2.13.2.1-1.i386.rpm
avr-gcc-3.3tinyos-1.i386.rpm
avr-insight-pre6.0cvs.tinyos-1.3.i386.rpm(rpm -ivh --replacefiles 명령으로 설치)
avr-libc-20030512cvs-1.i386.rpm
make-3.80tinyos-1.i386.rpm (기존에 파일이 없다고 나오는 경우 yum install make로 설치)
graphviz-1.10-1.i386.rpm ( graphviz tool의 경우 compile error를 발생시키므로 yum install graphviz로 설치)
msp430tools-base-0.1-20050607.i386.rpm
msp430tools-binutils-2.16-20050607.i386.rpm
msp430tools-gcc-3.2.3-20050607.i386.rpm
msp430tools-gdb-6.0-20050609.i386.rpm (설치시 에러가 나므로 일단 패스 -.-.)
msp430tools-gdb-proxy-6.0-20050609.i386.rpm (마찬가지로 패스 -.-.)
msp430tools-libc-20050308cvs-20050608.i386.rpm
msp430tools-jtag-lib-20031101cvs-20050610.i386.rpm
msp430tools-python-tools-1.0-1.noarch.rpm
nesc-1.2.8a-1.i386.rpm
tinyos-tools-1.2.3-1.i386.rpm
tinyos-1.1.15Dec2005cvs-1.noarch.rpm

다음과 같이 설치한다.

$>yum install gcc-c++
$>yum install make
$>yum localinstall --nogpgcheck avarice-2.4-1.i386.rpm
$>yum localinstall --nogpgcheck avr-binutils-2.15tinyos-3.i386.rpm
$>yum localinstall --nogpgcheck avr-gcc-3.4.3-1.i386.rpm
$>yum localinstall --nogpgcheck avr-libc-1.2.3-1.i386.rpm
$>rpm -ivh --replacefiles avr-insight-6.3-1.i386.rpm
$>yum install graphviz
$>yum localinstall --nogpgcheck nesc-1.2.8a-1.i386.rpm
$>yum localinstall --nogpgcheck tinyos-tools-1.2.3-1.i386.rpm
$>yum localinstall --nogpgcheck msp430tools-base-0.1-20050607.i386.rpm
$>yum localinstall --nogpgcheck msp430tools-binutils-2.16-20050607.i386.rpm
$>yum localinstall --nogpgcheck msp430tools-gcc-3.2.3-20050607.i386.rpm
$>yum localinstall --nogpgcheck msp430tools-libc-20050308cvs-20050608.i386.rpm
$>yum localinstall --nogpgcheck msp430tools-jtag-lib-20031101cvs-20050610.i386.rpm
$>yum localinstall --nogpgcheck msp430tools-python-tools-1.0-1.noarch.rpm
$>yum localinstall --nogpgcheck tinyos-1.1.15Dec2005cvs-1.noarch.rpm

CVS repository로부터 TinyOS source를 다운로드 받아 복사해도 되지만 이 부분은 아직 해보지 않아서 검증되지 않았지만 다음과 같이 source를 받아오면 된다.
이 때, 반드시 해당 디렉토리로 이동 후 명령 실행해야 한다.(opt/tinyos-1.x의 경로에 설치할 경우, /opt 폴더에서 실행)

$>cvs -d:pserver:anonymous@tinyos.cvs.sourceforge.net:/cvsroot/tinyos login(passware를 물어보면 엔터를 친다.)
$>cvs -z3 -d:pserver:anonymous@tinyos.cvs.sourceforge.net:/cvsroot/tinyos co -r tos-1-1-14-candidate tinyos-1.x
또는, cvs -d:pserver:anonymous@tinyos.cvs.sourceforge.net:/cvsroot/tinyos co tinyos-1.x(설치시간은 대략 30분 남짓 걸린다.)

만약 cvs 가 실행이 안 될 경우, cvs 설치한다.

$>yum install cvs
설치가 끝나면 vi /root/.bashrc 파일을 열어 아래와 같은 내용의 환경변수를 추가한다.

#MSPGCC
export MSPGCCROOT=/opt/msp430
export PATH=$MSPGCCROOT/bin:$PATH

#TinyOS
export TOSROOT=/opt/tinyos-1.x
export TOSDIR=$TOSROOT/tos
export CLASSPATH=$TOSROOT/tools/java:$CLASSPATH
export MAKERULES=$TOSROOT/tools/make/Makerules

3. 아래 내용중에 vi /root/.bashrc 파일을 열어 빠진 내용이 없는지 확인한다.

#Java
export JAVA_HOME=/opt/ibm/java2-i386-50
export JDKROOT=$JAVA_HOME
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.

#MSPGCC
export MSPGCCROOT=/opt/msp430
export PATH=$MSPGCCROOT/bin:$PATH

#TinyOS
export TOSROOT=/opt/tinyos-1.x
export TOSDIR=$TOSROOT/tos
export CLASSPATH=$TOSROOT/tools/java:$CLASSPATH
export MAKERULES=$TOSROOT/tools/make/Makerules


이로써 fedora 10 환경에서 TinyOS를 사용할 수 있게 된다.
시스템을 재부팅을 하고, 마지막으로 테스트를 한다.

Blink 디렉토리로 이동~~

$>cd /opt/tinyos-1.x/apps/Blink
$>make install telosb
...
...
...
rm -f build/telosb/main.exe.out build/telosb/main.ihex.out

성공이다... :-)

*TIP
java tools 가 실행되지 않을 경우...
/opt/tinyos-1.x/tools/java 로 이동하여 컴파일...
$>make
해당 툴의 class 파일이 생성되면 사용가능하게 된다.

USB serial Comm. 을 위해 다음과 같이 수정한다.
$>vi /opt/ibm/java2-i386-50/jre/lib/javax.comm.properties의 내용 중

/dev/ttyS=PORT_SERIAL >> /dev/ttyUSB=PORT_SERIAL 로 변경 후 적용하면 끝.

2009년 3월 22일 일요일

GPIO

Telosb에서 GPIO를 사용하는 방법

포트를 일반핀으로 사용하려면 MSP430GeneralIOC 컴포넌트를 이용하면 된다. (TinyOS-1.x 버전)

1. configuration 파일에서 MSP430GeneralIOC 컴포넌트를 추가한다.
components Main, TestM, SingleTimer, LedsC, MSP430GeneralIOC;

2. Test.nc를 TestM.nc와 와이어링을 시킨다.
MSP430 GPIO 중 포트 6의 0번 핀을 module 에서 Port0으로 사용함.
TestM.Port0 -> MSP430GeneralIOC.Port60;
MSP430 GPIO 중 포트 6의 1번 핀을 xxxM에서 Port1으로 사용함.
TestM.Port1 -> MSP430GeneralIOC.Port61;

3. TestM.nc에서는 사용 인터페이스로 등록시킨다.
uses interface MSP430GeneralIO as Port0; //MSP430 GPIO를 Port0으로 사용함.
uses interface MSP430GeneralIO as Port1; //MSP430 GPIO를 Port1으로 사용함.

4. TestM.nc의 StdControl.init() 함수안에서 포트를 초기화 시킨다.
call Port0.setLow(); //포트0의 초기값 Low.
call Port0.makeOutput(); //포트0을 출력으로 사용함.
call Port0.selectIOFunc(); //포트0을 I/O 기능으로 사용함.
call Port1.setHigh(); //포트1의 초기값 High
call Port1.makeInput(); //포트1을 입력으로 사용함.
call Port1.selectIOFunc(); //포트1을 I/O 기능으로 사용함.

5. 정해진 루틴에서 사용하는 방법
이 방법은 msp430hardware.h(/opt/tinyos-1.x/tos/platform/msp430) 에 정의된 매크로를 이용하는 것으로 먼저 해당 핀(6.0, 6.1)을 GPIO로 정의(/opt/tinyos-1.x/tos/platform/telos/hardware.h)해야 한다.
TOSH_ASSIGN_PIN(GIO0, 6, 0);
TOSH_ASSIGN_PIN(GIO1, 6, 1);
TOSH_MAKE_GIO0_OUTPUT(); //포트 0을 출력으로 사용.
TOSH_MAKE_GIO0_INPUT(); //포트 0을 입력으로 사용.
TOSH_SET_GIO0_PIN(); //포트0을 High로 출력함.
TOSH_CLR_GIO0_PIN(); //포트0을 Low로 출력함.

기타>> MSP430GeneralIOC는파일을 열어보면 사용할 수 있는 함수를 확인할 수 있다.

async command void setHigh(); //포트의 출력을 High
async command void setLow(); //포트의 출력을 Low
async command void toggle(); //포트의 출력을 Toggle
async command uint8_t getRow(); //포트의 입력값을 읽어들임
async command bool get(); //포트의 입력을 bool 형태로 읽어들임
async command void makeInput(); //포트를 입력으로 사용
async command void makeOutput(); //포트를 출력으로 사용
async command void selectModuleFunc(); //포트를 특수기능핀으로 사용
async command void selectIOFunc(); //포트를 입출력 기능핀으로 사용

참고로 모든 I/O Pin은 두 자리로 등록되어 있으므로 Port10은 1의 0번핀, Port66은 6의 6번핀으로 인식된다.

I/O 동작을 확인하는 방법은 LED가 연결된 포트를 LED 함수를 사용하지 않고 포트 함수만 가지고 테스트 해보면 이해가 쉽다.

2009년 3월 20일 금요일

CVS update

login
cvs -d:pserver:anonymous@tinyos.cvs.sf.net:/cvsroot/tinyos login
엔터로 로그인

download
cvs -z3 -d:pserver:anonymous@tinyos.cvs.sf.net:/cvsroot/tinyos co tinyos-1.x
cvs -z3 -d:pserver:anonymous@tinyos.cvs.sf.net:/cvsroot/tinyos co tinyos-2.x
cvs -z3 -d:pserver:anonymous@tinyos.cvs.sf.net:/cvsroot/tinyos co tinyos-2.x-contrib

쉘이 위치한 현재 디렉토리에 업데이트 된 내용이 다운로드 됨을 유의한다.

TinyOS-1.x 에서 Group ID와 RF Channel 설정

Group ID
$>opt/tinyos-1.x/tools/make 폴더내의 Makedefaults 파일을 수정.
DEFAULT_LOCAL_GROUP=0x4c

RF Channel
$>/opt/tinyos-1.x/tos/lib/CC2420/CC2420Const.h 에서
#ifndef CC2420_DEF_RFPOWER
#define CC2420_DEF_RFPOWER 0x1F
#endif

또는, Makelocal 파일을 새로 생성해서 그룹 ID와 RF 채널을 써 넣는 방식과 최상위 어플리케이션의 Makefile 내에 정의해서 사용하는 방식도 있다.

DEFAULT_LOCAL_GROUP=0x4c
PFLAGS += -DCC2420_DEF_CHANNEL=25

위와 같은 식으로 작성하여 저장하면 앞으로 컴파일 및 빌드 할 때 위의 내용이 적용된다.

RFC 1662 Document

http://www.ietf.org/rfc/rfc1662.txt

TinyOS 때려잡기...

1. NesC의 Component 개념
2. 컴포넌트가 제공하는 인터페이스. (provides)
3. 컴포넌트가 사용하는 인터페이스. (uses)
4. 1에서 구현해야 하는 인터페이스의 command. (calling)
5. 2에서 구현해야 하는 인터페이스의 event. (signalling)
6. configuration에서 *.*의 구별. (component.interface)
7. module에서 *.*의 구별. (interface.command or event)

위와 같은 내용을 충분히 이해하고 있어야 한다.
TinyOS 의 경우 이벤트 및 시간 단위로 코드를 보고 분석해야 한다.
즉, 다양한 event 함수가 어떤 시간에 어떤 순간에 발생하는지를 염두해 두고 확인해야 한다.

Ubuntu + TinyOS = XUbunTOS

- 설치가이드
http://sing.stanford.edu/klueska/installing_xubuntos_vm.html

- 설명
http://www.wsnblog.com/2007/09/11/xubuntos-20-released/

- 소개
http://toilers.mines.edu/Public/XubunTOS

2009년 3월 18일 수요일

컴파일 된 이미지 파일에서 Group ID, RF Channel, RF Power 확인하기.

telos rev.B 계열의 경우에 해당된다.

1. Group ID 확인
$>grep AM_GROUP /build/telosb/app.c









 
2. RF Channel 확인
$>grep CC2420_CHANNEL /build/telosb/app.c





 
3. RF Power 확인
$>grep CC2420_RFPOWER /build/telosb/app.c



 

tortoisecvs 를 이용한 TinyOS 최신 버전 받기.

윈도우에 Cygwin 버전 TinyOS를 설치한 경우 tortoiseCVS를 이용하여 최신 버전을 다운로드 받을 수 있다.
여기서 잠깐!
CVS란 Concurrent Versions System으로 소스의 버전 관리 tool이다.

Windows용 CVS Client Tool 은 아래에서 다운로드 받을 수 있다.

http://www.tortoisecvs.org/

한글도 지원된다.

TinyOS를 위한 CVS 설정.

1. 마우스 오른쪽 버튼을 눌러 CVS 체크아웃을 누르면 설정창이 뜬다.
- CVSROOT : :pserver:anonymous@cvs.sf.net:/cvsroot/tinyos
- 모듈 : tinyos-1.x
(목록 가져오기 명령의 실행이 잘 안 되므로, 될 때까지 한다. -.-)

잘 안 될 경우 여기를 참고하자.
http://cvs.sourceforge.net/viewcvs.py/tinyos

확인을 눌러 체크아웃(소스를 가져오는 행위)한다.

2. 주의사항
- CVS 체크아웃을 실행하는 위치에 따라 체크아웃된 파일들이 생성된다.

2009년 3월 17일 화요일

Timer 이해하기

Timer.start() 에서는 최소 1ms까지 밖에 설정이 되질 않는다.
좀 더 세밀한 Timer를 원한다면 tos/system/TimerM.nc 파일과 tos/interface/ClockC.nc 파일을 참조하여 변경하면 된다.

TimerM.nc
command result_t StdControl.init() {
mState=0;
setIntervalFlag = 0;
queue_head = queue_tail = -1;
queue_size = 0;
mScale = 3;
mInterval = maxTimerInterval;
return call Clock.setRate(mInterval, mScale) ;
}

위의 Clock.setRate()부분이 원래 nesC에서는 mScale=3 이기 때문에 개발자가 Timer.Start의 두번째 인자값인 interval을 양수의 최소값인 1을 넣으면 1/1024(tos/interface/ClockC.nc를 참고)초에 한번 Timer가 발생한다.
따라서 mScale=1 로 설정하면 1/32768초에 한번 Timer를 발생시킬 수 있다.

2009년 3월 15일 일요일

MSP430 MCU의 내부 전압 측정

MSP430 MCU 기반의 Telosb 계열의 모트를 사용하는 경우
opt\tinyos-1.x\tos\platform\msp430\InternalVoltageC 컴포넌트를 사용하여 내부 전압을 측정할 수 있다.

다음을 참고하면...
http://mail.millennium.berkeley.edu/pipermail/tinyos-help/2006-November/020959.html

수식은 다음과 같다.
InternelVoltage = ADC reading / 4095 * 1.5 * 2

MSP430에는 내부적으로 생성하는 1.5v 및 2.5v REFVOLT가 있다.
ADC의 V+에 대한 레퍼런스로는 Vcc, 1.5v, 2.5v, external reference가 있는데 그 중 1.5v 및 2.5v는 내부적으로 생성하는 정전압 레퍼런스에 해당한다.
이 정전압 레퍼런스는 선택적으로 사용이 가능하다.
또한, 위 수식에서 2를 곱해주는 이유는 내부적으로 저항을 사용하여 분배하므로 다시 역변환 과정(ADC값을 전압으로 바꿔줄 때) 이 필요하므로 2를 곱하는 것이다.

만약 새 배터리를 사용하여 측정하게 되면 0xFF0F 라는 값이 나오는데 little endian 형식으로 16진수 값이 출력되기 때문에 실제값은 0x0FFF 이다. 이를 십진수로 바꾸면 4095 라는 값이 나온다.
4095라는 값이 출력되는 이유는 12bit ADC를 사용하므로 표현 가능한 범위가 0~4095까지인 것이다.
이를 수식에 대입해보면...

4095/4095*1.5*2=3

즉, 내부전압은 3V 가 된다.

[TIP 1]
DemoSensorC 컴포넌트를 사용하여 내부전압을 사용하려 한다면

configuration DemoSensorC {
provides interface ADC;
provides interface StdControl;
}
implementation{
components InternalVoltageC as DemoSensor; //InternalTempC as DemoSensor;
StdControl = DemoSensor;
ADC = DemoSensor;
}

위와 같이 modify 한 후, 최상위 어플리케이션에서 가져다 쓰면 된다.

[TIP 2]
최상위 어플리케이션에서 InternalVoltageC 컴포넌트를 바로 쓰면 된다.
** InternalVoltageC 컴포넌트는 3v 까지만 측정이 가능하도록 구현되어 있다.