프린터포트 제어를 통한 7-Segment 제어

2008/06/25 13:02 뚝딱뚝딱

1. 프로젝트 설명

  '운영체제 이론과 실습'이란 학교 강의 중 팀 프로젝트로 Linux의 Device Driver를 제작하여 프린터 포트를 통해 7-Segment 제어와 스위치 입력을 받는 과제를 수행하게 되었다.

1) Kernel 2.6.24 버젼에서 구현할 것-

2) 7-Segment에  'P' -> 'L' -> 'A' -> 'Y'란 글자가 연속적으로 흐르게 할 것.

3) Minor 1, 2로 나눠 글자의 흐름 속도를 다르게 할 것.

4) 수동 접촉 방식 스위치로 채터링 기능을 구현하고, 원클릭, 더블클릭을 구분할 것.


  프린터 포트 제어를 위한 Device Driver는 자료가 많아 쉽게 구현 할 수 있을 줄 알았는데, 여러가지 문제점으로 인해 시간이 상당히 오래 걸렸으며, 리눅스 버젼에 따른 차이점을 파악하지 못해 고생했다. 결국 날짜 기한을 맞추지 못해 평가 점수가 많이 깍였다. 다만,  문제점을 추적하며 Device Driver에 대한 이해와 리눅스 환경에 대해 이해를 단기간에 많이 해서 결과적으로는 값진 프로젝트였다.


2. 구현 동영상 및 사진


 

사용자 삽입 이미지
DSC-T30 | Program | 1/40sec | F3.5 | ISO-250
사용자 삽입 이미지
DSC-T30 | Program | 1/13sec | F3.5 | ISO-320


3. 개발 환경

  • VMWare Workstation 5.0, 6.0
  • Linux Fedora 7
  • OrCad Capture 10.3

4. 회로도

 

사용자 삽입 이미지



5. 소스






6. 실행 방법

VMware에서는 동작하지 않기 때문에(아래에서 설명) Linux가 설치된 PC에서 실행한다.

1) parport 드라이버 내리기

   root> rmmod parport_pc

   root> rmmod parport

-> 부팅 후 이미 Linux Printer Port가 올라가 있기 때문에 인터럽트가 충돌된다. 따라서 Printer Port 드라이버를 내려야 한다.

2) segment 드라이버 파일 생성

  root> mknod /dev/segment c 240 1

  root> mknod /dev/segment c 240 2

->  Segment 드라이버의 Minor 1, 2를 Dev폴더에 파일 생성

3) segment 드라이버 올리기

  root> insmod segment.ko

-> Segment 드라이버를 올린다.

4) segment_app 어플리케이션 실행

  root> ./segment_app



7. 구현 시 문제점 및 해결 방안

1) VMware 5.0에서 Fedora 9 설치 후 VMWare-Tools 인스톨 오류

  VMware 5.0을 사용하고 있었고,  Shared Folder 사용을 위해 WMWare-Tools를 사용하려고 인스톨을 하려 했는데, 계속해서 커널 버젼이 맞지 않는다는 오류로 설치가 실패했다.

What is the location of the directory of C header files that match your running
kernel? [/usr/src/linux/include]

  이와 같은 오류가 발생하여 인터넷을 검색하면서 이것저것 방법을 시도했지만 모두 실패했었다. 그 후 다른 이유로 VMware Version을 5.0에서 6.0으로 버젼을 올리게 되었는데, 혹시나 하는 마음에 VMware-tools를 인스톨 해봤는데 아무 문제 없이 설치가 되었다.

아래는 시도해 보지 않았지만, 왠지 성공할 듯하여 링크를 남긴다.

http://blog.daum.net/itbankgo-4/1306448

2) VMware를 통한 프린터 포트 제어 시 인터럽트 충돌

  Device Driver를 제작하여 VMware에서 실행한 결과 프린터포트의 포트입출력은 정상적으로 수행이 되었다. 이제 인터럽트만 하면 되는데, 인터럽트를 'request_irq'명령어로 등록하려고 하면 이미 다른 곳에서 사용하고 있다는 메시지가 발생했다. 이미 드라이버가 올려져 있는 'parport'라는 드라이버에서 인터럽트를 사용해서 발생하는 문제였는데, rmmod를 통해 드라이버를 내리면 가능할 듯하였다. 그래서 'rmmod parport_pc', 'rmmod parport'를 통해 내렸더니 인터럽트 충돌메세지는 발생하지 않고 정상적으로 등록이 되었으나, 기본적인 포트의 입출력이 되지 않는 문제가 발생했다. 

  그래서 PC에 VMware가 아닌 Linux를 설치하고 테스트해 본 결과 정상적으로 동작하였다. 물론 'parport'는 내리고 수행하였다. 아마 VMware에서는 가상의 프린터 포트를 제어하기 위해 'parport'라는 드라이버를 사용하는 듯했다. 결국 VMware를 버리고 PC에서 작업을 해야만 했다.


3) 커널 2.6.23에서 DEvice Driver 개발 시 수정해야 할 사항

  드라이버는 유영창씨께서 쓰신 'IT EXPERT 리눅스 디바이스 드라이버'의 2.6 코드를 참고로 작성하였다. 컴파일 시 몇가지 문제가 발생하는 데, 문제는 책에서 예문으로 설명한 코드들이 커널 2.6.24와 여러 차이점이 있다는 것이다. 같은 2.6대라서 별 차이 없겠지 하던 생각이 잘못되었었다. 또한 컴파일 시 인자 형태가 다르다는 Warning을 무시했었던게 문제였다.

  - SA_INTERRUPT 옵션이 없어졌다.

request_irq(PRN_IRQ, segment_interrupt, 0, DEV_NAME, NULL)

- WORKQUE 관련 인자들 및 사용법이 바뀌었다.

// WorkQueue
DECLARE_WAIT_QUEUE_HEAD( waitqueue_read );
DECLARE_DELAYED_WORK( work_delayed_queue, call_segmentfunc );

..

schedule_delayed_work( &work_delayed_queue, 200 );

4) 더블 클릭 구현의 어려움

  더블 클릭은 Driver에서 일정 시간 시연 후 클릭이 더 발생했는 지를 검사하여 Application에 알려줘야 되는데, 타이머 안에서 workqueue를 제어하려다 보니까 리눅스가 계속 다운되는 증상이 발생하였다. 아마 정해진 영역안에서 수행해야 하는 것을 외부에서 참조해서 발생한 것 같다. 이 문제는 결국 시간 제약으로 인해 해결 하지 못했다.


8. 참고 자료


  여담) 텍스트큐브의 위지윅 에디터에서는 Undo 기능이 되지 않아, 다른 방안을 모색 중 Windows Live Writer를 통해 포스팅을 하게 되었다. 워드에서 작업하는 것과 같이 상당히 편리하며 오프라인으로 작업을 하기 때문에 속도와 안정성이 보장되는 것이 좋다. 단, 단순히 색을 바꾸거나 글자 크기, 정렬을 바꾸는 기능이  없는 것이 불편하다.

2008/06/25 13:02 2008/06/25 13:02

Lumi's Escape! <영상처리를 이용한 사람 구출 게임>

2008/03/21 05:00 키보드예술
멤버십에서 진행한 미니 프로젝트인 "Lumi's Escape"의 결과물이다.

진행했던 사항들과 후기는 링크 참조. "4주간의 미니 프로젝트를 마치고.."


아래 동영상은 개발이 완료된 후 시연하는 모습을 담았다.




게임을 진행하는 모습





사용자 삽입 이미지
Canon DIGITAL IXUS 65 | 1/40sec | F2.8

앵글 차체
청계천에서 간단한 도면을 주고 앵글을 잘라 들고와서 조립하였다.
전면에는 아크릴을 주문 제작하였으며 강한 빛을 막고,
스크린에 상이 맺히도록 기름종이 비슷한 것을 붙였다.


사용자 삽입 이미지
Canon DIGITAL IXUS 65 | 1/40sec | F3.2

뒤에서 본 모습

빔프로젝트로 영상을 출력하고, 그 위에 올려진 캠 카메라로 영상을 받는다.



사용자 삽입 이미지
E5200 | Program | 0ssec | F2.8 | 35mm equiv 38mm | ISO-64

마커 블록의 전면도
LCD와 RF Module을 장착하였다.



사용자 삽입 이미지
E5200 | Program | 0ssec | F2.8 | 35mm equiv 38mm | ISO-64

마커 블록의 후면도
TMS320F2808 CPU를 사용하였다.



사용자 삽입 이미지
E5200 | Program | 0ssec | F2.8 | 35mm equiv 38mm | ISO-64

실제 마커 블록의 모습


사용자 삽입 이미지

2D 물리엔진

주인공 중심 좌표의 움직임을 표현하기 위해 만든 툴
중력, 힘, 마찰력, 관성 등 간단한 물리 법칙을 적용하였다.





사용자 삽입 이미지
E5200 | Program | 1/4sec | F2.8 | 35mm equiv 38mm | ISO-188

개발 시의 모습
우리는 세미나실에서 거의 개발을 했는데,
영상처리를 위해 빛을 막기 때문에 이렇게 어두운 곳에서만 계속 작업을 했다.



사용자 삽입 이미지
E5200 | Program | 0ssec | F2.8 | 35mm equiv 38mm | ISO-64

우리가 쓰던 화이트보드!
남은 할일부터 낙서, 그림, 컨셉등 잼있게 사용하였다.
2008/03/21 05:00 2008/03/21 05:00
  1. 유훈  2008/03/22 11:34     댓글주소  수정/삭제  댓글쓰기
    동영상속 욕설 난무 ㅋ 동영상으로 보니까 디게 멋있네요 ^^
    • Yarmini  2008/03/23 00:16     댓글주소  수정/삭제
      헉. 그래? 소리는 안듣고 동영상 올린건데..
      조만간 수정해야겠다^^
  2. 오군  2008/03/23 14:53     댓글주소  수정/삭제  댓글쓰기
    퍼가고 싶어열...호호호호 뿌듯뿌듯.ㅋㄷㅋㄷ
    • Yarmini  2008/03/23 23:00     댓글주소  수정/삭제
      쿠쿠. 형석이 게임이 잘 발휘했지~!

      우리 작품 남겼으면 좋았을텐데..
  3. 방양  2008/03/24 00:53     댓글주소  수정/삭제  댓글쓰기
    이거 보니 기분 좋네요- 뿌듯하고- 근데.... 마지막 보드의 압박이;;;;;; ㅋㅋㅋㅋㅋ

4주간의 미니 프로젝트를 마치고..

2008/03/10 05:10 키보드예술

 2월 초부터 3월 초까지 삼성 멤버십에서 미니 프로젝트를 진행하였다. 이번 18기 신입 기수끼리 각자 팀을 정하고 프로젝트의 아이디어 구상부터 실제 완성까지 구현하는 것이다.


팀 구성

 먼저 게임 프로그래밍을 했던 형석군이랑 같이 하기로 했고, 한 사람을 더 찾아야 했다. 마침 사람들이 서로 팀을 짜기 위해 인력시장(?)을 방불케 하던 찰나, 영상처리를 담당한 빵양이 합류하게 되었다.

- 하드웨어
형석군 - 게임 프로그래밍
빵양 - 영상처리

 PL 선정 시에는 미니 프로젝트인 만큼 경험도 쌓을 겸 다른 사람이 하는 것도 좋다고 권유했지만, 결국 가장 나이가 많은 내가 맡게 되었다.


주제 선정

 팀을 구성하자 마자 서로의 담당을 살펴본 결과 우리의 프로젝트 주제는 윤곽이 들어났다.

 하드웨어를 이용하여 영상처리를 통한 게임!

 첫번째로 정한 주제는 '그림자 영상을 이용한 결투 게임'이었다. 사람의 그림자를 카메라로 입력 받아 팔의 패턴을 분석하여 스크린에 비친 캐릭터가 기술을 사용하여 상대방을 공격하는 게임이다.
 거의 진행 될 뻔 했으나, 기술 상의 어려움과 짧은 기간으로 인해 잠시 뒤로 놓고, 다른 주제를 검토해 보기로 했다.

 주제를 검토하던 중 우리는 하나의 동영상을 보자마자 '이거 하고 싶다!!'라고 외치게 되었다. 그것은 바로 스크린에 블록을 접촉시키면 게임 속 캐릭터가 그 블록 위에 서 있는 것으로 목표 지점까지 이동 시키는 게임이다. 단순하면서도 매력적인 게임이었다.

 우리는 좀 더 스케일을 확장 시키기 위해 각 종 기능과 요소를 추가하여 시안을 계획 했다. 그리고 모두에게 프로젝트의 시작을 알리는 개발 계획 발표를 했다.

 프로젝트 제목은 'Lumi's Escape'으로 정했다.



개발 진행

 개발 회의 때 나온 방안은 스프링노트를 활용하여 정리하였는데, 이것을 통해 서로간의 의견들을 바로 정리 할 수 있어 좋았던 것 같다. 또한 할일 목록이나 일정들을 체크하는 데 유용했다. 다만 후반부로 갈 수록 정리를 하지 않은 점이 아쉬웠다.

 개발은 중반까지 각자 담당한 부분을 독립적으로 진행하기로 했다. 하지만 멤버십 내에서 각 종 교육 및 행사가 많아 실제적로는 개발을 거의 진행하지 못했다. 일정이 조금씩 밀리기 시작했다. 처음에는 느긋한 마음을 갖고 시작하였으나, 완료 일정에 가까워 짐에 따라 서로 집중하는 시간이 늘어났다.

  나는 집중력의 효율을 위해 '아침이 되기 전에는 잠을 잔다'라는 생각을 갖고 생활했는 데, 나를 제외한 팀원들은 아침이 넘어서까지 잠을 안자고 코딩하곤 했다. 그래서 주위 사람들에서 PL은 일이 적어 푸욱 잔다는 소문이 돌기도 했다ㅠ 사실 일의 양은 적긴 했어도, 억울 했다.ㅠ
 변명은 넘어가고^^ 사실 내가 감탄한 부분은 우리 팀원들은 목표한 양을 채우거나 문제를 해결 할 때까지는 상당히 놀라운 집중력을 보인 다는 것이다. 요즘 들어 어느 것 하나에 집중을 오래 하지 못하는 내가 본받아야 할 부분이었다. 또한 피곤한 몸을 이끌고 집에 도착해서까지 코딩하여 완성물을 보여 줄때는 감격을 금치 못했다.

 '프로젝트 진행 시 가장 중요한 것은 의사 소통이다.'

 3명의 다른 분야 사람이 모였기 때문에 자신의 담당 분야을 제외한 다른 분야는 깊은 지식이 부족하다. 우리는 종종 회의를 하곤 했는 데, 첫 회의 때 서로 합의 한 내용이 두번째 회의 때는 엇갈리는 경우가 종종 발생했다. 여기서 문제는 서로간에 의견을 교환하고 합의점을 찾아도 실제적으로는 자신이 알고 있는 지식에 맞추게 된다는 것이다. 애메모호하거나 불확실 한 것은 서로간에 의견이 일치하더라도 실제론 정반대가 될 수도 있다.
 PL인 나는 이러한 경우가 발생 할 수 있는 것을 미리 체크하여 보다 심도 깊게 논의하여 확실한 결정을 내렸어야 했다. 이쯤 정하면 서로가 각자 잘하겠지.. 하는 생각에 종종 넘겼는데, 결국 시간을 투자하여 회의를 한 가치를 떨어뜨린 셈이다. 이 부분을 반성하자.

 언쟁

 회의를 하다 보면 언쟁이 가끔 발생한다. 서로의 의견을 교환하다보니 충분히 발생할 수 있는 것이다. 서로 더 좋은 프로젝트를 만들고자 하는 목표만은 같기 때문이다. 언쟁이 발생하면 기본적으로 상대방의 목소리를 진지하게 받아들이기 어렵다. 악화 될 경우 감정적인 면까지 상하게 되는데, 여기까지 되지 전에 침착한 대처가 필요하다.
 우리 팀에서는 둘이 언쟁을 할 경우 한명은 약간 먼 발치에서 지켜보며 상황을 정리한다. 그리고 논쟁이 어느 정도 선이 넘었을 경우 중재를 하기 시작한다. 그리고 논쟁을 정리하기 시작하면서 본래의 목표와 어긋난 부분들을 제거한다. 그러면 의견들은 유익한 부분과 불필요한 부분으로 나뉘어 결론을 맺을 수 있다.
 이러한 역할 또한 PL이 했어야 되는데, 부끄럽다ㅠ 추가적으로 이러한 상황이 안될 경우 '10분 휴식'이라는 것을 사용해 보는 것도 좋을 듯 하다.



개발 완료

 일주일 전부터 프로젝트는 급속히 진행 되었다. 하나하나 살이 붙여지고 문제점을 잡아가며 완성도 있는 모습을 볼 수 있었다. 결국 우리는 예상했던 모든 기능들을 구현하였고, 전체적인 완성도 역시 기대에 만족했다. 마지막까지 최선을 다했기에 가능했던 것이라 생각한다.

 긍정적인 사고와 여유
 
 (팀원들이 못느꼈을 수도 있겠지만)나는 이번 프로젝트를 맡게 되면서 팀원들이 항상 긍정적인 사고를 할 수 있도록 노력하고 행동했다. 우리 프로젝트는 당연히 완성도가 높게 나올 것이며, 문제가 발생할 경우에도 큰 문제 없이 잡을 수 있을 거라는 모습을 비춰왔다. 이러한 사고를 밑바탕으로 함으로써 (약간이라 할지라도) 여유로운 마음이 생길 것이라고 믿었기 때문이다. 작은 여유는 자신의 개발 뿐만 아니라 팀 내 분위기를 좌우 할 수 있다.

 발표

 완료과제 발표 때 피곤함 떄문인지 말을 버벅거리며 프로젝트를 100% 소개 하지 못했다. 참으로 아쉽고 팀원에게 미안한 마음이든다. 우리가 열심히 노력하여 완성한 것을 대중(+평가단)에게 못 보여 준셈이니 말이다. 우리 프로젝트가 다른 프로젝트에 비해 뛰어난 점을 부각 시켰어야 했다. 그래서 부족했던 부분이나 추가했어야 하는 부분을 나열해 보았다.

1. 시작 발표 때 말한 기능들이 모두 완료된 점
2. 기능을 추가하였던 게임 요소들에 대한 설명
3. 시연 시에 대중이 주목해서 봐야 할 점
4. 개발 시 힘들었던 부분을 극복한 점
5. 보다 강한 자신감(+언어력)


마치고

 짧은 기간이었지만 프로젝트를 마치고, 많은 것을 배우고 반성할 수 있었다. 접하지 못했던 분야를 가까이서 지켜볼 수 있어 폭 넓은 지식을 쌓을 수 있었으며, 갇힌 사고 방식을 많이 넓힐 수 있었다.

 또한 프로젝트를 마치고 크게 반성한 점은 나는 계획한 일정이 바로 앞에 부딪혀야지만 비로소 작업을 시작했던 점이 부끄러웠다. 다른 팀은 개발 일정 혹은 앞당겨 수행하여 남들보다 더 여유가 있었으며, 완성도를 많이 높일 수 있었다. 나도 충분히 가능했지만 게으른 마음에 못이룬 일인듯 하다. 이 게으름이 프로젝트 뿐만 아니라 내 앞날을 크게 손해보게 만드리라하며 반성한다.

 가장 고마운 부분은 당연히 형석군과 빵양이다.^ㅡ^ 함께한 시간이 즐겁고, 서로 열중 할 수 있었던 것에 감사한다. 이러한 마음 때문에 완성한 작품을 어떻게든 보존하고 싶은 생각이 드는 것 아닐까..

2008/03/10 05:10 2008/03/10 05:10
  1. 방양  2008/03/12 12:03     댓글주소  수정/삭제  댓글쓰기
    와와- 정리해논거 보니까 웬지 뿌듯해요!!! 동영상 촬영한거는 편집할거에요? 편집하고 저좀 -_-ㅋㅋㅋ
  2. 미친병아리  2008/03/16 23:09     댓글주소  수정/삭제  댓글쓰기
    와우~ 좋은 경험 하셨네요.. 실전에서 많은 도움이 될 것 입니다..
menu openmenu close