사용자 삽입 이미지
카와이 히데미 저
정가 32,000원

한권 끝내기 시작-!!

좋은 시기에 시스템베이스(주)에서 개최하는 Mr.eddy 경진대회를 참가하게 되었다.

이전부터 임베디드 보드를 이용하여 홈네트워크를 개발할 예정을 잡고, 구상중이 었는데

임베디드 보드의 높은 가격과 생각보다 큰 크기에 고심하고 있던차에, 우연히 보게된 경진대회글을 보고, 이거다! >.< 라는 생각이 들어 Eddy를 기반으로 구상을 하게 되었다.

@.@ 처음 구상은 홈서버를 집안에 두고, 내부와 외부(인터넷을 통한)에서 집안의 환경의 감시하고 제어하는 구상이었다.

홈서버를 구축하기 위해선 많은 조건이 필요하다.

1. 작은 크기
  집안에 두는 것들은 최대한 작은것이 좋다. 집은 넓어야 한다는 우리나라 사람들에게 큰 제품은 절대 용납이 안된다.
2. 안정성     
  장시간 활용되어야 하는 서버이므로 단연, 안전성을 요구한다.
서버란 무엇인가. 내가 자고 있는 동안에도 열심히 달리며 실시간으로 나의 노크를 기다리고 있는 잠없는 아이이지않은가.
3. 적은 전력 소비량
 
집안에 설치되어 주된 제어를 하게 될 에디 서버이므로 잡아먹는 전력 또한 적게 들어야 한다. 계절성을 띄는 에어컨도 아니고 필요할때 켰다가 끌 수 있는 컴퓨터도 아니다.
1년 365일 24시간 내내 뛰어야 하는 서버는 적은 전력만 줘도 잘 달릴 수 있는 효율성이 요구된다.
4. 관리상의 용의성
 
Eddy 2.0은 위의 조건을 대부분 충족한다.(앗싸!!)

Eddy 2.0 CPU 의 간단한 사양은 다음과 같다.

사용자 삽입 이미지

ㅁArm9 기반의 180Mhz의 CPU
ㅁ4M의 플래쉬 메모리
ㅁ32M의 SRAM
ㅁ100M Ethernet 칩셋
ㅁ2개의 UART 포트
ㅁ16개의 범용 I/O(GPIO) 포트

사진을 봐서 알겠지만, Eddy 2.0의 CPU에는 단순히 CPU와 램과 플래쉬 메모리, 이더넷 칩셋말고는 아무것도 보이지 않는다.
그외의 포트를 사용하기 위해서는 Eddy 2.0 CPU를 장착해서 사용하는 기본적인 타겟보드를 이용하거나(여러개의 보드가 있으며, 자신의 구상에 맞는 보드를 사용하면된다.), 타겟보드를 직접 제작하여 나머지 포트를 연결해야한다.

2. Eddy 하드웨어

우리의 프로젝트에서 홈네트워크의 센서값을 얻기 위해서는 8bit 이상의 ADC를 사용해야하나, 기본적으로 제공되는 보드에는 4개의 GPIO 포트를 이용하지 못하기 때문에, 16개의 GPIO포트를 모두 사용하기 위해 타겟보드를 직접 작성하게 되었다.

다음과 같다.

사용자 삽입 이미지
하단의 Eddy 2.0 CPU를 일반적으로 사용하기 위한 기판에 연결하기 위해 시스템베이스에서는 변환 기판을 만들어 주었다.(무구한 감사드리옵니다~ㅠㅠ)

연결된 장비는 USB1.1, SD Card Slot, RJ49 Ehtetnet, Serial로 연결된 Zigbee Module등이 있으며 16개의 GPIO포트중 11개를 8bit ADC에 물려 8개는 데이터출력으로, 2개는 출력값 선택용으로, 1개는 Start로 이용했다. ADC에는 조도, 온도, 가스센서가 연결되어 있다.
나머지의 5개의 GPIO포트에는 도어락과 형광등, 환풍기에 연결하여 제어신호용 포트로 활용했으며, 가스 누출시 경보를 알리기 위해 알람에도 하나의 GPIO포트를 이용했다.



사용자 삽입 이미지


프로젝트를 진행하다가 실내에서 사용될 인터페이스의 필요성을 느껴, LCD가 내장된 보드(pxa270, hybus)를 이용하여 사용자 인터페이스를 추가했다.

이 보드는 이더넷으로 Eddy와 통신을 하며, 제어 TCP 패킷으로 Eddy의 프로세서가 GPIO를 제어하여 작동하며, Eddy에서는 센서값을 TCP 패킷으로 보드에 전달하여 표출한다.

제어가능한 집안물건은 3가지를 선정했으며, 도어락과 백열등, 환풍기(120MM팬)을 장착했으며, 백열등과 환풍기는 릴레이를 GPIO포트로 제어하여 작동시킨다.

3. Eddy 소프트웨어
우리 프로젝트에서 개발한 Eddy 소프트웨어는 총 4개의 프로그램을 제작하였다.
3개의 프로세서를 기동시키는 프로그램과
Serial에 연결된 Zigbee를 통해 Senser Module에서 센서값을 받아 전송해주는 프로그램과 USB에 연결된 Webcam을 통해 사진을 찍어 웹서버로 전송해주는 프로그램과
외부로부터 TCP제어 신호를 받아 GPIO신호를 제어하는 프로그램을 제작하였다.


Eddy V2.0 CPU를 기반으로 소프트웨어를 제작시 가장 큰 장점이라면 GUI기반의 통합된 IDE(LemonIDE)를 제공한다는 점이다.
이는 vi같은 커맨드기반의 개발툴에 익숙하지 않은 사용자에게는 반길만한점이다.
LemonIDE의 기본 사항은 다음과 같다.

사용자 삽입 이미지

ㅁEclipse 기반의 IDE (통합 개발 환경)
ㅁGUI 기반 소스코드 편집 인터페이스
ㅁ타겟 시스템 내부 어플리케이션 원격 실행
ㅁ원격 디버거
ㅁ원격 모니터링을 통한 타겟 시스템 상태 분석
ㅁ프로젝트 관리 기능
ㅁ크로스 컴파일 환경 연동
ㅁMakefile 자동생성
ㅁWindows / Linux 호스트 시스템에서 작동

Lemonide는 cygwin을 통하여 Windows에서도 완벽히 개발환경을 제공한다.
굳이 개발을 위한 VMware같은 가상머신을 이용해 Fedora나 Ubunto같은 Linux배포판을 이용해 개발환경을 구축하지 않아도 된다.
그렇다고 Linux 배포판에서 Lemonide가 동작하지 않는다는것은 아니다.

Eclipse기반으로 제작된 Lemonide는 Eddy에 맞게 구성된 원격 디버거가 내장되어 있다.
이는 다소 불편한 디버깅을 단순히 클릭한번에 해결해주는 멋진 도구이다.

그외에도 모니터링 도구가 내장되어 있으며, Eclipse의 장점을 그대로 이어받은 멋진 개발툴이다.


실제 개발에서도 Lemonide로 인해 개발시간의 단축을 꾀할수 있었고,
기본으로 제공되는 오픈소스 프로그램 및 Eddy API를 통해, 쉽게 제어 할수 있다.

단적인 예로, Linux 프로그래밍에서 TCP 서버 소켓을 생성하기 위해서는 다음과 같이 작성한다.

int serv_sock, clnt_sock;
struct sockaddr_in serv_addr;

sock = socket(PF_INET, SOCK_STREAM, 0);
memset(&serv_addr, 0, szieof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr=inet_addr(IP);
serv_addr.sin_port=htons(atoi(PORT);

bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr));
listen(serv_sock, 5);

clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);


하지만 SystemBase에서 제공되는 Eddy API를 이용하면 다음과 같이 된다.

int serv_sock, clnt_sock;
serv_sock = SB_ListenTcp(PORT, 8, 8);
clnt_sock = SB_AcceptTcp(serv_sock, 1);
 ->(왜 이렇게 함수로 만들 생각을 진작에 못했을까.-ㅁ-a)

이외에도 여러가지의 유용한 API(shared_memory, Serial, GPIO등)를 제공함으로써, Eddy 소프트웨어개발은 한층 쉬워진다.


4. Eddy의 장점과 단점

장점
저렴한 가격 : ARM 9이 내장된 CPU가 단품으로 6만원밖에 하지 않고, 개발보드인 DK보드를 포함한 가격이 30만원 내외인것으로 알고 있다.
LemonIDE : UI를 이용한 IDE 개발 툴 지원은 개발자들에게 반길만한 일이다.
충실한 메뉴얼 제공 : 우리가 학생으로싸 단기간 내에 프로젝트를 완성한 이유는 PDF로 제공되는 충실한 메뉴얼 및 회로도로 인한 개발기간이 많이 줄었기 때문이다.
API의 지원 : 개발에 필요한 API 제공은 개발 시간을 단축 시켜준다. 실제적으로 하드웨어 제작 이후 소프트웨어 제작에는 채 2주가 걸리지 않았다.

단점
부족한 IO포트 : 개발을 하면서 외부 장치를 많이 연결하고 싶었지만 부족한 IO포트(16개의 GPIO)포트로는 한계를 많이 느꼈다.

5. 프로젝트를 마치며
경진 프로그래머의 후기>>
에디와 함께 한 이번 프로젝트의 의미는 나에게도 크다.
작년 이맘 쯤 동아리에 들어온지 얼마 되지 않은 내가 본 선배들의 작품이
이 에디를 이용한 스마트 터치 시스템이었다.
아무것도 모르는 철없는 후배 눈에 프로젝트 때문에 밤을 새고 다음 날 지쳐 잠든 모습들은 참 신기하고 존경스러웠다. 힘들어보이기도 했지만 저렇게까지 할 수 있구나 라는 생각을 그때 하면서 내자신에게도 좀 엄하게 대한듯하다.
pxa270보드를 다루면서 예전에 마무리 못했던 작품을 떠올리며 스트레스가 남달리 쌓여갔었다. 이전에 못했었는데 지금은 할 수 있을까.
또 새로운 버전의 qt를 사용하면서 정보가 많이 없는데 잘될까 하는 불안감 때문에 몇달간 몇년의 나이를 먹어버린듯하다 ^^;;
그래도 밤을 새서 울고픈 마음 참아가며 마무리한 그 기분은... 정말 .. 정말 셀수없는 기쁨이었다. 바로 지쳐 쓰러지긴 했지만;;
내가 이번 프로젝트로 배운 것은 내가 목표로 둔 것에 대한 끝없는 도전이자 포기란 없다 였다. 만일 내가 그 새벽, 포기해버리고 잠들었더라면...
하기 싫다고 밖에 뛰쳐나가버렸더라면...
한 단계 더 성장할 수 없었을 것이다.
팀원들에게 고맙고 작품에 대해 좋은 평을 해주신 시스템 베이스 분들에게도 감사를 표한다. 그 평가 하나하나가 팀원들에게 힘이 되고 조언이 된 것 같다.

다음 프로젝트를 기약하며...

AIS 빠샤!!ㅋㅋㅋㅋ
모듈 *.ko 파일을 보드에 옮겨넣고
hybus shell>lnsmod *.ko
로 올리면 된다.
ㅎㅎ; 이런식 ;; ㅋㅋ
돌아다니는 calibrate 를 qt4 버전으로 변경해서 포팅했더니
마우스 이벤트 인식을 못하드라
따로 놀고 ~~

그래서 일단은 x-window를 죽여놓구 (.sh 파일에 가서 X로 시작하는 것을 #주석처리 해줬더니
안뜨게 됐다. x-window를 띄우면 단독으로 실행되는 qt와 충돌을 일으켜서 터치 할때 이미지가 깨지게 된다.) 왜 안될까 왜 안될까 정말 마니 고민하다 나온 결론,

터치 드라이버를 export 해줘야 하는데
.sh 파일에 해줬는데 안먹히고 ...
echo $QWS_MOUSE_PROTO
했더니 아무것도 뜨지 않는 것이었다 ㅠ.ㅠ
그래서 실행될 폴더에서 export 다시 해줬다
export QWS_MOUSE_PROTO=linuxtp(이거는 지원하는 터치 스크린 라이브러리마다 다를 수 있다.)

그리고 실행하니까 , 허거덕 돼버렸다!!!!
자동실행을 위해서 .sh 파일에 명령을 모두 적어주고
reboot 하니까 오호라 ~ 떠버리네
근데 마우스 이벤트가 됐다가 안됐다가
boot하면 안됐다가 reboot하면 됐다가
알고보니 지 맘대로였다 ;; ㅎㅎㅎ;;
왜 그런지 좀 더 조사해봐야할듯 싶다

무튼, QTOPIA4 라이브러리 사용해서 컴파일하면 큰 문제 없이 calibrate 가 생성된다.
calibrate.h 에서 필요한 헤더
#include <qmouse_qws.h>
는 그대로 둔다. qtopia4에서는 /qt-arm(qt폴더)/src/gui/embedded/에 들어가 있다.
#include <QWidget>
#include <QPixmap>
#include <QMouseEvent>

이것만 있으면 되고
클래스 선언된 곳에 Calibrate(QWidget* parent=0, Qt::WindowFlags=0);
으로 바꿔준다. qt3 버전에는 인자값이 세개 일 것인데 중간 값 없애주고 끝에 WFlags 를 저렇게 바꿔준다.


그리고 calibrate.cpp 에서는
#include <QApplication>
#include <QtGui>
#include <qwindowsystem.qws.h>
#include <QScreen>
#include <stdlib.h>
#include "calibrate.h"

수정할 곳은 생성자에서 인자 값을 바꿔주고
생성자에서
Calibrate::Calibrate() : QWidget(=>여기 있는 값 중에 W어쩌구 | W저쩌구 | 이런 옵션들이 있다.) {
}

저런 옵션은 안찾아봤는데 widget 창 설정을 바꿔주는 것이므로 사용할 사람들만 찾아서 쓰자
마찬가지로 Qt::어쩌구로 바뀌었다. doc.trolltech.com 에서 클래스 찾아보면 나올 것이다.

QRect desk = qApp->desktop()->geometry();
라고 되어 있는 부분을
QRect desk = qApp->desktop()->screenGeometry()로 바꿔준다.
그리고 setBackgroundColor() 이 함수는 존재 하지 않는다.
난 그냥 안 썼다.

QABS 함수는 qAbs 로 바꾼다.
그리고 QBrush() 라는 함수에서 컬러는 Qt::red 이런식으로 줘야 한다.



main.cpp

#include <QApplication>

중간에 set 어쩌구 하는 것은 빼라 존재 하지 않는다.


이 정도로 수정했다.

그리고 위에 적은거 처럼 맞는 드라이버 명(나의 경우는 linuxtp)를 꼭 export 해줘서
보드에서 드라이버를 읽을 수 있게 해주어야 한다.
http://forum.falinux.com/zbxe/?document_srl=413614&mid=devenv
http://forum.falinux.com/zbxe/?document_srl=428103&mid=devenv

전에 qt3.3.x 버전으로 사용하다가
QT4 가 내부적으로 지원되는 것이 많다길래 써보았다

사실 잘 조사해보지 않고 사용해서 아직까진 모르겠지만
이제부터 조사해서 차근히 내 정보를 만들 생각이다.

위의 두 링크는 포럼 사이트에서 자주 보게 되는 이름,
qt를 하는 사람이라면 한번쯤은 봤을 이름,
장길석 님의 글이다.

qt4를 사용하고 후기를 글로 남겨줘서
따라하기 식으로 배워보았다

글 그대로 따라하면 설치에는 큰 어려움이 없다

UI를 만들 때 QT4(x11)를 사용해서 작성했는데
qt-x11에서 옵션을 달리줘서 컴파일 하면 임베디드 용이 될 줄 알았건만
qtopia 를 써야 옵션이 지원된다.

플랫폼 중에 arm 이라는 걸 쓰니까 configure가 안되길래
--help를 봤더니 ;;
ㅎㅎ 지원을 안해준다네 쿨럭,

그래서 결국 헤매다 못해 큐토피아 설치해서 그대로 가져와 gcc만 arm으로 바꿔줬더니만
잘 ~~ 되드라 -_- ;;
야 ~~ 허무하게 스리 ~~

어쨌든 석세스 ㅋㅋㅋ ㅋㅋㅋ

성공한 뒤 깨달았다

진짜 설치하기도 쉽고

컴파일하기도 쉽다는...

머 그렇다는 ... ㅋㅋㅋㅋ

센서 정보를 받는 스레드에서 바로 정보를 가져오는 것이 아니라 파일로 생성
QTimer를 사용하여 화면에 띄우게 된다.
1-모듈 번호에 따른 센서이미지 띄우기
2-센서 정보 띄우기(BasedInterfacePage)
3-센서가 현재 활성화된 모듈만&하드웨어 On/Off 제어(ModifyPage)

콤보박스에 모듈번호
문, 환풍기, 형광등, 창문, 가스밸브 라디오 박스로 ON/OFF 여부
전송 버튼 클릭시 이 모든 정보가 구조체로 되어 하나의 중간자 클래스를 거쳐
CommEddyThread 클래스에 존재하는 sendMsgToEddy??()함수를 실행.

Combobox -> currentText()
RadioButton -> 선택된 것의 텍스트


QTimer *timer;

timer=new QTimer;
connect(timer, SIGNAL(timeout), this, SLOT(slotFunction()));

timer->Start(int time);

페도라 8의 커널 버전은 2.6.23

pwc 발견한 버전은 pwc 10.0.12 였는데

요놈이 글쎄 커널 버전 2.6.22 이상이 되면 에러가 난다-_-

그래서 사이트 아래에는 이런 설명이 있다 -


패치해야돼요~ = . =
요렇게 ~ (링크)

그래서 열심히 패치하는 법 따라 열심히 하고 있는 찐쓰 ㅠ.ㅠ

오늘도 새벽같이 삽질과 함께 하루를 시작하는 구나 ㅋㅋ

사이트 주소는

http://www.lavrsen.dk/twiki/bin/view/PWC

전략 패턴과 비슷한 개념인데 거기서 조금 더 생각한 패턴이다.
객체를 생성하는 코드를 한 객체 또는 메소드에 집어넣으면 코드에서 중복되는 내용을 ㅈ ㅔ거할 수 있고
나중에 관리할 때도 한 군데에만 신경을 쓰면 된다.
클라이언트 입자에서는 객체 인스턴스를 만들 때 구상 클래스가 아닌 인터페이스만 필요로 하게 된다. 이렇게 하면 구현이 아닌 인터페이스 바탕으로 프로그래밍을 할 수 있게 되고 유연성과 확장성이 뛰어나진다.

진짜 객체의 인스턴스를 만들 때는 여전히 구상 클래스를 사용해야 하는데 이것은 어쩔 수 없는 것이다.
하지만 이것을 이해하고 생성코드를 한 곳에 모아노고 체계적인 관리를 할 수 있는 설계를 한다면 관리하기 편리해진다. 객체 생성 코드를 아무곳에나 두면 결과를 얻기가 힘들어진다.

서브 클래스를 사용하고 최대한 new를 사용하지 않는다.
new를 사용하는 것이 구상 클래스를 호출하는 것이 된다.

객체 의존성>>
객체 인스턴스를 직접 만들면 구상 클래스에 의존해야 한다.
구상클래스에 의존하지 말고 추상화된 것에 의존하도록 한다.

인스턴스가 한개만 만들어지기 때문에 겹치는 부분이 없게 만들 수 있다.
만일 인스턴스가 두개 이상 만들어질 수 있다면
동시에 두 인스턴스의 내용이 바뀔 때 큰 혼란이 올 수 있다.
그래서 단 하나의 인스턴스가 만들어지면 다른 곳에서 호출 시 현재 실행 중인 인스턴스가 종료되고 다시 불려가는 것이다. ..
만일 중요한 순간에 종료되고 다른 곳에서 불려가서 정보가 바뀌면
까딱하다간 에러는 안나고 엄청난 결과를 초래할 수 있다.
우리가 프로세스를 사용할 때 쓰는 IPC와 비슷한 의미를 가지는거 같다 내가보기엔-ㅁ-

Linux User's Guide Contents Page
Linux Directory Structure
Note: Files are grouped according to purpose. Ex: commands, data files, documentation.

Parts of a Unix directory tree. See the FSSTND standard (Filesystem standard)

/ Root
|---root The home directory for the root user
|---home Contains the user's home directories
| |----ftp Users include many services as listed here
| |----httpd
| |----samba
| |----user1
| |----user2
|---bin Commands needed during bootup that might be needed by normal users
|---sbin Like bin but commands are not intended for normal users. Commands run by LINUX.
|---proc This filesystem is not on a disk. Exists in the kernels imagination (virtual). This directory
| | Holds information about kernel parameters and system configuration.
| |----1 A directory with info about process number 1. Each process
| has a directory below proc.
|---usr Contains all commands, libraries, man pages, games and static files for normal
| | operation.
| |----bin Almost all user commands. some commands are in /bin or /usr/local/bin.
| |----sbin System admin commands not needed on the root filesystem. e.g., most server
| | programs.
| |----include Header files for the C programming language. Should be below /user/lib for
| | consistency.
| |----lib Unchanging data files for programs and subsystems
| |----local The place for locally installed software and other files.
| |----man Manual pages
| |----info Info documents
| |----doc Documentation for various packages
| |----tmp
| |----X11R6 The X windows system files. There is a directory similar to usr below this
| | directory.
| |----X386 Like X11R6 but for X11 release 5
|---boot Files used by the bootstrap loader, LILO. Kernel images are often kept here.
|---lib Shared libraries needed by the programs on the root filesystem
| |----modules Loadable kernel modules, especially those needed to boot the system after
| disasters.
|---dev Device files for devices such as disk drives, serial ports, etc.
|---etc Configuration files specific to the machine.
| |----skel When a home directory is created it is initialized with files from this directory
| |----sysconfig Files that configure the linux system for networking, keyboard, time, and more.
|---var Contains files that change for mail, news, printers log files, man pages, temp files
| |----file
| |----lib Files that change while the system is running normally
| |----local Variable data for programs installed in /usr/local.
| |----lock Lock files. Used by a program to indicate it is using a particular device or file
| |----log Log files from programs such as login and syslog which logs all logins,
| | logouts, and other system messages.
| |----run Files that contain information about the system that is valid until the system is
| | next booted
| |----spool Directories for mail, printer spools, news and other spooled work.
| |----tmp Temporary files that are large or need to exist for longer than they should in
| | /tmp.
| |----catman A cache for man pages that are formatted on demand
|---mnt Mount points for temporary mounts by the system administrator.
|---tmp Temporary files. Programs running after bootup should use /var/tmp.

+ Recent posts