조도센서제어 - serverlink.koreatech.ac.kr/courses2/2008_1/uc/p05. oscilloscope... ·...

19
HANBACK ELECTRONICS CO., LTD. 조도 센서 제어 이번 장에서는 Zi b X장치되어 있는 센서들 중에서 조도 이번 장에서는 ZigbeX장치되어 있는 센서들 중에서 조도 센서에 대해 공부하고, TinyOS의 Oscilloscope 프로그램을 해 측정된 조도값을 확인하는 방법에 대해 알아보도록 하겠다. 한백전자 저자권 보호됨 한백전자

Upload: nguyencong

Post on 18-May-2019

215 views

Category:

Documents


0 download

TRANSCRIPT

HANBACKELECTRONICS CO., LTD.

조도 센서 제어

이번 장에서는 Zi b X에 장치되어 있는 센서들 중에서 조도이번 장에서는 ZigbeX에 장치되어 있는 센서들 중에서 조도센서에 대해 공부하고, TinyOS의 Oscilloscope 프로그램을 통해 측정된 조도값을 확인하는 방법에 대해 알아보도록 하겠다.

㈜ 한백전자

저자권 보호됨

㈜ 한백전자

HANBACKELECTRONICS CO., LTD.

ZigbeX의 조도센서

저자권 보호됨2008-06-042

HANBACKELECTRONICS CO., LTD.

ZigbeX의 조도 센서

조도 센서 CDS• 조도 센서 CDS – ZigbeX에 장치되어있는 조도 센서 CDS는 Atmega 128(ZigbeX의

8bit CPU)의 INT0과 ADC0 사이에 연결되어있다.8bit CPU)의 INT0과 ADC0 사이에 연결되어있다.

– 조도 센서인 CDS는 주변의 광량에 따라 자신의 저항이 변하게 된다.

– 결국, 출력포트인 ADC0에서는 변화된 전압의 양에 의해 광량을 감지할 수 있다지할 수 있다.

• 조도센서 제어 컴포넌트– TinyOS에서는 조도 센서를 제어하기 위해 Photo 컴포넌트라는 것을

저자권 보호됨2008-06-043

제공하고 있다.

HANBACKELECTRONICS CO., LTD.

Photo 컴포넌트

조도센서로 활성화된 ADCC 컴포넌트에서 제공하는 함수들• 조도센서로 활성화된 ADCC 컴포넌트에서 제공하는 함수들– photo 컴포넌트를 사용하는 상위 프로그램에서는 조도 데이터를 얻

기 위해 ADC.getData() 함수를 호출한 후, 그 값은 event 형태로 반기 위해 ADC.getData() 함수를 호출한 후, 그 값은 event 형태로 반

환되는 ADC.dataReady(uint16_t data) 함수를 통해 받게 된다.

ADCC 컴포넌트에서 제공하는 함수들

ADC.getData() - 앞에서 설정된 ADC 포트로부터 측정된값을 얻기 위해 호출된다

ADC의 값 얻기값을 얻기 위해 호출된다.

event ADC.dataReady(uint16_t data) - ADC가 측정한값을 event 형태로 반환한다.

저자권 보호됨2008-06-044

HANBACKELECTRONICS CO., LTD.

조도값 얻기

조도값 측정 예제• 조도값 측정 예제

// 상위 컴 넌// 상위 컴포넌트xxx_function(){

call ADC getData()

// 상위 컴포넌트event ADC.dataReady(uint16_t data){

//data -> 측정된 조도값call ADC.getData()…

}

//data > 측정된 조도값…

}

Photo 컴포넌트

저자권 보호됨2008-06-045

HANBACKELECTRONICS CO., LTD.

Oscilloscope 예제를 이용하여Oscilloscope 예제를 이용하여조도값 측정

저자권 보호됨2008-06-046

HANBACKELECTRONICS CO., LTD.

Oscilloscope 예제

Oscilloscope 예제 프로그램• Oscilloscope 예제 프로그램– Oscilloscope 예제는 125ms 마다 조도 센서로부터 측정값을 받은

후, 그 내용을 시리얼 케이블을 통해 PC로 전달하는 프로그램이다.후, 그 내용을 시리얼 케이블을 통해 PC로 전달하는 프로그램이다.

• Oscilloscope 예제 프로그램의 위치– c:₩Programfiles₩UCB₩cygwin₩opt₩tinyos‐1.x₩contrib₩zigbe

₩ O ill ₩ 폴더에 있는 O ill 와x₩ Osilloscope₩ 폴더에 있는 Oscilloscope.nc와OscilloscopeM.nc, OscopeMsg.h 파일을 참조.

저자권 보호됨2008-06-047

HANBACKELECTRONICS CO., LTD.

Oscilloscope.nc

Oscilloscope nc• Oscilloscope.nc – Osilloscope 예제에서 사용되는 컴포넌트들

• PC와의 시리얼 통신을 위한 UART Comm 컴포넌트PC와의 시리얼 통신을 위한 UART Comm 컴포넌트

• 조도 센서 값을 얻기 위한 DemoSensorC 컴포넌트

• 주기적인 알람과 동작여부의 체크를 위한 TimerC와 LedsC 컴포넌트

configuration Oscilloscope { } implementation{ {

components Main, OscilloscopeM, TimerC, LedsC, DemoSensorC as Sensor, UARTComm as Comm;

Main.StdControl ‐> OscilloscopeM; Main.StdControl ‐> TimerC; OscilloscopeM.Timer ‐> TimerC.Timer[unique("Timer")]; OscilloscopeM.Leds ‐> LedsC; OscilloscopeM.ADC ‐> Sensor;

저자권 보호됨2008-06-048

…}

HANBACKELECTRONICS CO., LTD.

시리얼 통신 컴포넌트

UARTComm 컴포넌트• UARTComm 컴포넌트– UARTComm 컴포넌트는 PC와의 시리얼 통신을 위해 만들어진 컴포

넌트이다.넌트이다.

– ReceiveMsg 인터페이스와 SendMsg 인터페이스를 통해 다음과 같은 함수를 제공한다.

UARTComm 컴포넌트에서 제공하는 함수들

ReceiveMsgevent TOS_MsgPtr receive(TOS_MsgPtr m) - 시리얼 케이블

을 통해 PC로부터 어떠한 메시지를 받았을 경우 Event 형태로 호출되는 함수로, TOS Msg 형태의 포인터를 반환한다.출되는 함수로, TOS_Msg 형태의 포인터를 반환한다.

SendMsg

send(...) - 센서 노드에서 PC로 TOS_Msg 형태의 파일을 보내기위해 호출되는 함수이다.

sendDone( ) - send( ) 함 수 를 통 해 메 시 지 가 모 두

저자권 보호됨2008-06-049

sendDone(...) - send(...) 함 수 를 통 해 메 시 지 가 모 두전송되었을 때 Event 형태로 호출되는 함수이다.

HANBACKELECTRONICS CO., LTD.

OscilloscopeM.nc

OscilloscopeM nc 파일 (1)• OscilloscopeM.nc 파일 (1)

includes OscopeMsg;module OscilloscopeM

OscilloscopeM.nc 에서는 먼저 include 명령어를통해 Oscilloscope h에 있는 내용을 참조한 후module OscilloscopeM

{ provides interface StdControl; uses {

// 사용할 여러 인터페이스 선언

통해 Oscilloscope.h에 있는 내용을 참조한 후, module 안에 StdControl 인터페이스를 provide로선언한다. 그리고 OscilloscopeM 내에서 사용할인터페이스들을 use안에 기술한다.

… // 사용할 여러 인터페이스 선언}

} implementation {implementation에서는 위에서 선언된 인터페이스를

… // 사용할 여러 변수들 선언

command result t StdControl init() {

implementation에서는 위에서 선언된 인터페이스를이용하여 실제 프로그램을 기술한다.

Main 컴포넌트에 의해 제일 먼저 실행되는command result_t StdControl.init() { …// 변수 및 컴포넌트 초기화return SUCCESS;

}

Main 컴포넌트에 의해 제일 먼저 실행되는StdControl.init() 함수에서 LED, SensorControl, CommControl 컴포넌트들 및 여러 변수들을 모두초기화 한다.

저자권 보호됨2008-06-0410

}

HANBACKELECTRONICS CO., LTD.

OscilloscopeM.nc

OscilloscopeM nc 파일 (2)• OscilloscopeM.nc 파일 (2)

command result t StdControl start()command result_t StdControl.start() {

call SensorControl.start(); call Timer.start(TIMER_REPEAT, 125);call CommControl start();

StdControl.start()에서는 SensorControl, CommControl를 시작하고 Timer를 125ms마다 한번씩signal을 발생시키도록 Timer.start(TIMER_REPEAT, 125) 함수를 호출한다.

call CommControl.start(); return SUCCESS;

}

command result t StdControl stop() {StdControl.stop()에서는 SensorControl, Comm

command result_t StdControl.stop() { …return SUCCESS;

}

pControl을 정지하게 하고 Timer도 정지시킨다.

event result_t Timer.fired() { return call ADC.getData();

}

Timer 컴포넌트에 의해 125ms마다 signal이 발생하여 Timer.fired()가 호출되어지고, 그 함수 내부에는ADC.getData() 함수를 호출하여 ADC[0]에 있는조도 측정값을 요청한다.

저자권 보호됨2008-06-0411

HANBACKELECTRONICS CO., LTD.

OscilloscopeM.nc

OscilloscopeM nc 파일 (3)• OscilloscopeM.nc 파일 (3)

async event result_t ADC.dataReady (uint16_t data) {{

struct OscopeMsg *pack; atomic { pack = (struct OscopeMsg *) msg[currentMsg].data; pack >data[packetReadingNumber++] = data;

조도값의 측정이 끝나면 result_t ADC.dataReady(uint16_t data) 함수가 event 형태로

pack‐>data[packetReadingNumber++] = data; readingNumber++; dbg(DBG_USR1, "data_event₩n"); if (packetReadingNumber == BUFFER_SIZE) {

post dataTask();

OscilloscopeM 파일 내에서 호출된다.

이 함수 내에서는 받은 조도 측정값을 시리얼통신을 통해 PC에 전달하기위해 Oscope

post dataTask();}

} if (data > 0x0300) call Leds redOn();

Msg.h에 정의된 패킷포맷 형식으로 데이터를 변환시킨다. 그 후, task로 된 dataTask() 함수를 호출하여 ADC.dataReady (uint16_t data) 함수로부터 받은 측정값을 DataMsg.

call Leds.redOn(); else call Leds.redOff();

return SUCCESS;

send() 함수를 통해 시리얼로 PC에게

전송한다.

저자권 보호됨2008-06-0412

return SUCCESS; }

HANBACKELECTRONICS CO., LTD.

OscilloscopeM.nc

OscilloscopeM nc 파일 (4)• OscilloscopeM.nc 파일 (4)task void dataTask() {

struct OscopeMsg *pack; atomic { pack = (struct OscopeMsg *)msg[currentMsg].data; packetReadingNumber = 0; pack‐>lastSampleNumber = readingNumber;

dataTask() 함수에서는 ADC.dataReady (data) 함수에서 설정한 msg변수를DataMsg.send (…) 함수를 사용하여

} pack‐>channel = 1; pack‐>sourceMoteID = TOS_LOCAL_ADDRESS; if (call DataMsg.send(TOS_UART_ADDR,

시리얼 통신을 통해 PC로 전달한다.

sizeof(struct OscopeMsg), &msg[currentMsg])) {

atomic { currentMsg ^= 0x1; } call Leds.yellowToggle();

} } event result_t DataMsg.sendDone

(TOS_MsgPtr sent, result_t success) { PC로의 전송이 끝나면, DataMsg.send

저자권 보호됨2008-06-0413

return SUCCESS; }

Done 함수가 event 형식으로 호출된다.

HANBACKELECTRONICS CO., LTD.

Oscilloscope 예제 실습

준비물:준비물:

host PC, 모트 1개, ISP프로그램 툴, 프린터 케이블

저자권 보호됨2008-06-0414

HANBACKELECTRONICS CO., LTD.

Oscilloscope 예제 실습 방법 1

• 먼저 cygwin을 시작한다 다음과 같이 입력하여 예제 폴더로• 먼저 cygwin을 시작한다. 다음과 같이 입력하여 예제 폴더로

이동한다.

cd /opt/tinyos‐1.x/contrib/zigbex cd Oscilloscope

• 이제 make zigbex를 입력하여 컴파일을 한다.

저자권 보호됨2008-06-0415

HANBACKELECTRONICS CO., LTD.

Oscilloscope 예제 실습 방법 2

ISP 프로그래머를 이용하여 ZigbeX에 다운로드하기• ISP 프로그래머를 이용하여 ZigbeX에 다운로드하기– 컴파일한 후, build/zigbex라는 폴더가 만들어지고 그 안에

main.hex 라는 파일이 생성된다.main.hex 라는 파일이 생성된다.

– PonyProg 프로그램을 실행한 후 main.hex 파일을 연다.

– main.hex의 파일의 경로는 다음과 같다.

• c:₩Programfiles₩UCB₩cygwin₩opt₩tinyos‐1.x₩contrib₩zigbex₩Oscilloscope₩ build₩ zigbex

저자권 보호됨2008-06-0416

HANBACKELECTRONICS CO., LTD.

Oscilloscope 예제 실습 방법 3

main.hex를 읽은 결과 프로그램하기 위한 풀다운메뉴의 사용법

저자권 보호됨2008-06-0417

메뉴의 사용법

HANBACKELECTRONICS CO., LTD.

자바 어플리케이션 실행

자바 어플리케이션• 자바 어플리케이션– 시리얼 케이블을 통해 Zigbex 노드로부터 전송된 데이터를 확인하

기위해서 오실로스코프 자바 어플리케이션을 실행시킨다.기위해서 오실로스코프 자바 어플리케이션을 실행시킨다.

– 자바 어플리케이션을 시작하기에 앞서, 모트에 연결된 프린트 케이블을 분리시킨 후, 다시 시리얼 케이블과 시리얼 젠더를 이용하여 PC와 연결한다와 연결한다.

– cygwin에서 /opt/tinyos‐1.x/tools/java로 이동한다.

– 명령어는 아래와 같다.명령어는 아래와 같다.

export MOTECOM=serial@COM1:57600export MOTECOM=serial@COM1:57600 cd /opt/tinyos‐1.x/tools/java java net.tinyos.oscope.oscilloscope

저자권 보호됨2008-06-0418

HANBACKELECTRONICS CO., LTD.

Oscilloscope 예제 결과

결과• 결과– 자바 어플리케이션을 통해 아래와 같이 데이터가 시리얼로 전달되는

것을 확인할 수 있고 빛의 양에 따라 데이터를 나타내는 선이 변화되것을 확인할 수 있고 빛의 양에 따라 데이터를 나타내는 선이 변화되는 것을 볼 수 있다.(그래프가 잘 보이지 않으면 scrolling을 체크)

저자권 보호됨2008-06-0419