프린터포트 제어를 통한 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

ARM, Thumb Instruction

2005/12/19 20:42 뚝딱뚝딱
ARM7TDMI Processor 관련 스펙을 보면 ARM과 Thumb라는 말이 자주 등장하여 좀 더 알아보았다. 스펙에 나와 있는 문구를 보면
* Two instruction sets
- ARM high-performance 32-bit instruction set
- Thumb code density 16-bit instruction set

의미를 보면 ARM은 고성능 32-bit 처리 명령어이고 Thumb는 코드집적 16-bit 명령어다.

32-bit 연산은 8,16 bit보다 한번에 처리 할 수 있는 양이 커서 보다 빠른 성능을 낼 수 있지만 32-bit 단위로 메모리를 구성하다보니 공간을 많이 차지하게 된다. 또한 8, 16-bit 단위의 계산들은 32-bit로 변환 후 연산을 하고 다시 bit를 줄이기 때문에 비효율적이게 된다.
ARM7TDMI는 Thumb와 ARM을 모두 포함하여 적절히 사용하게하여 빠른 성능과 효율적인 자원관리라는 두가지 장점을 모두 가져 갔다.

'ARM7TDMI'에서 'T'는 Thumb를 나타낸다.

2005/12/19 20:42 2005/12/19 20:42

AT91SAM7XX Processor

2005/12/08 22:37 뚝딱뚝딱
Processor로는 AT91SAM7XX를 선택했다.
ARM은 실제 사용률도 높으며 자료도 많이 있는데 아직 다뤄 보지를 못했다. 그래서 요번을 기회 삼아 이미 보유한 ARM책과 트레이닝 보드를 활용하여 ARM을 배워보기로 했다. Processor는 ARM7 기반의 소형 Processor를 타겟으로 타온 Atmel에 SAM시리즈를 사용하기로 했다.

AT91SAM시리즈의 Processor는 상당히 많은 Interface 기능들이 들어있고, 시리즈 별로 종류도 많아 활동도가 높다. 그리고 패키지도 64pin TQFP타입으로 작고 DeviceMart에서 Processor의 MiniBoard와 각 종 주변기기들이 장착된 Evalution Board가 나와있으며 네이버 AT91SAM7SXX카페가 있어 실제 보드 제작자분이 계시며 여러 사용자들과의 의견 교환이 활성화 되어 있어 접근하기 쉽다.

AT91SAMXX
- ARM7TDMI ARM Tumb Processor를 기반
- 32, 64, 128, 256KBytes의 Flash Rom과 8, 16, 32, 64KBytes의 SRAM을 내장
- 내부 FLASH ROM은 최대 30MHz, SRAM은 55MHz까지 가능
- Real-time Timer
- Debug UART와 2개의 흐름제어 UART
- USB 2.0 Client
- SPI, TWI(I2C), PWM


사용자 삽입 이미지
DeviceMart에서판매하는 MiniBoard는 손가락 두개정도의 크기이며, USB 포트를 통해서 전원을 입력 받고 Program을 구울수 있어 작업하기가 상당히 편리하다.
당분간은 스펙을 보며 MiniBoard를 쪼물쪼물 만져봐야겠다.
uC/OS가 포팅이 가능하다고 하니, 포팅의 즐거움 또한..므흣;;
<사진출처 : DeviceMart>



2005/12/08 22:37 2005/12/08 22:37

SSR 선정과 회로구성

2005/12/02 21:14 뚝딱뚝딱
SSR(Solid State Relay)를 사용하기로 결정했으니 이제 부품 회사와 제품명을 고르고 회로를 구성해야 하지만, 많은 제품의 종류로 인하여 어느 특정 부품을 찾기가 어렵다. 우연히 회사에 남은(?) SSR이 있길래 스펙을 살펴보니 딱 적당했다.(물론 공짜이므로 추가점수;;)

신화옵트론 SAP-2105D

<사진출처는 신화옵트론 제품소개란>

more..


신화옵트론 사이트에 가보면 SSR관련 동작원리와 회로설계의 기술자료들이 많이 있으며, 그 중 출력 회로 설계를 보면 각 종 출력기기마다 부하를 기술한 부분이 있다. 내가 사용하려는 것과 비슷한 것을 찾아보니 램프제어란 것이 있어 참고하기로 했다. 유의사항을 보면 램프 투입 전류가 정격 전류의 약 10~15배라고 나와있는데, 앞에서 언급한 1.5배와 엄청난 차이지만 어떤게 정확한지는 좀 더 살펴 봐야겠다.


사용자 삽입 이미지


CPU의 Relay Port를 통해 형광등을 제어하는 회로를 구성했다.
(아직 구동을 안해봤으니 어디까지나 설계단계이고 틀린 곳이 있을 수도 있다.)
NPN TR은 CPU의 Port 전류가 낮을 것을 대비해 전류증폭용으로 사용했고, Varistor와 Fuse는 과전압(Surge), 과전류에 대비해 보호용으로 사용된다. 이렇게 보면 회로는 간단한데 Varistor, Fuse는 평소에 잘 안쓰던 부품이라 막상 사용하려 하니 특성과 용량을 정하는 것이 어렵다.

2005/12/02 21:14 2005/12/02 21:14

220V 형광등 전원 스위치 제어하기

2005/11/29 14:46 뚝딱뚝딱
어항의 형광등 9와트짜리 두개가 부착 되어 있다. 전원은 220V을 사용하므로 형광등 하나당 흐르는 전류를 계산해 보면,
전력(W) = 전압(V) * 전류(A)
A = 9W / 220V
A := 0.041W/V

한 개당 약 41mA를 사용한다고 나오지만, 초기 형광등을 작동 시키기 위해서는 순간 높은 전압을 양쪽에 걸어줘야 하는 데 그 전력이 평소보다 약 1.5배정도 높다고 한다. 따라서 13.5W로 계산을 다시 해 보면,
A = 13.5W / 220V
A := 0.061W/V

즉, 형광등 한 개당 61mA정도 필요하다고 볼 수 있다.

전원 스위치 제어하기 위해서는 CPU Digital Port 출력 3~5V 신호를 통해 AC 220V 100mA를 키고 끄는 것을 할 수 있으면 된다. 100mA정도는 없을 것 같아 0.5A로 하였다.
INPUT : Digital Signal 3~5V
OUTPUT : AC 220V / 0.5A


AC교류를 직류신호로 ON/OFF제어를 하려면 기계식 RelaySSR(solid state relay)를 사용한다고 한다. 두가지를 비교해 보면
기계식 Relay는 전류를 흘리면 자석이 되는 성질을 이용하여 기계식으로 접점이 닫혔다가 열였다가 한다. 기계식이기 때문에 고속은 힘들며 전류를 많이 소비한다고 한다. 그 대신 가격이 저렴하다.

SSR은 기계식 Relay를 포토커플러와 유사한 전자식으로 바꿔 속도가 빠르며 소음이 없고, 반영구적이라는 장점을 가지고 있다. 또한 ZERO CROSS SSR기능이 있어 갑작스런 전류가 흐르는 것을 막아준다고 한다. 단 가격이 기계식 Relay에 비해 비싸다.

비교한 결과 SSR 두개를 사용하여 제어를 하는 편이 좋은 것 같다.
2005/11/29 14:46 2005/11/29 14:46
  1. 하윤  2006/11/21 11:35     댓글주소  수정/삭제  댓글쓰기
    옳소..나도 어항 맨들어죠

첫 프로젝트! "형광등 제어기"

2005/11/25 00:25 뚝딱뚝딱
내 방에는 물고기 10마리정도와 새우, 다슬기를 키우고 있는 어항이 하나 있는데 그 위에는 토클스위치로 키고 끄고 할 수 있는 형광등이 각각 두개 달려 있다.
예전 물고기 관련 사이트를 보다가 시간을 설정하면 형광등이 시간에 맞춰 켜지고 꺼지는 제어기를 직접 제작하여 올려 놓은 글들을 읽게 되었는데, 그 순간 나도 만들어 봐야지!!

..하고 생각 했던 게...벌써 6개월이 다 되어 간다.
그 동안 이런저런 일들이 많이 있어서 신경을 못썼지만..

그러다 최근 갑자기 하고 싶은 욕망이 생겨 마음을 먹고 하나하나 구상하기 시작했다.
우선 내가 넣고 싶은 기능들을 정리하고 하나하나 기능을 검토한 뒤 설계를 하려니 생각보다 만만치 않은 일이라는 것을 느꼈다.
우선 기능과 구성요소들을 먼저 살펴 보았다.

기능
1. 220V 전원을 스위치 할 수 있는 기능
2. 리모콘(IR)을 사용하여 스위치 ON/OFF와 기능 설정
3. VFD를 사용하여 현재 상태 표시와 메뉴 표시


구성요소
1. CPU
2. Relay
3. IR Receiver
4. VFD
5. Power
6. OrCAD, PCB Artwork
7. Case


이제 하나씩 자세히 검토해 나가야 겠다.
2005/11/25 00:25 2005/11/25 00:25
menu openmenu close