HANBACKELECTRONICS CO., LTD.
조도 센서 제어
이번 장에서는 Zi b X에 장치되어 있는 센서들 중에서 조도이번 장에서는 ZigbeX에 장치되어 있는 센서들 중에서 조도센서에 대해 공부하고, TinyOS의 Oscilloscope 프로그램을 통해 측정된 조도값을 확인하는 방법에 대해 알아보도록 하겠다.
㈜ 한백전자
저자권 보호됨
㈜ 한백전자
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 예제 프로그램• 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