2009년 4월 24일 금요일

Arduino에 카드리더기 연결 (Use magnetic card reader with Arduino)

Arduino에 Magtek의 magnetic strip reader를 연결하여 보았다.


현재 가지고 있는 리더기는 TTL 인터페이스를 가지고 있는 single track reader이다. 5핀 커넥터를 가지고 있고 Vcc, GND, Card present, Clock(Strobe), Data 신호를 제공해 준다.


신호 타이밍은 아래와 같다.


Arduino의 D2, D3, D5를 각각 리더기의 Data, Clock, Card present에 연결해 주면 된다.

코드는 다음과 같다.


View source code

카드를 리더기에 긁어주면 아래와 같이 카드의 데이터가 시리얼포트로 출력된다.

문제점은 위의 코드로는 디코딩 루틴이 카드를 정방향인 경우에만 동작하고 반대 방향으로 긁어주는 경우에는 데이터를 정상적으로 디코딩 해 주지 못한다. 역방향인 경우도 정상적으로 디코딩이 가능하도록 코드를 수정 할 예정이다.

2009년 4월 23일 목요일

PD2437을 Arduino에서 사용하기 (Connect PD2437 (5x7 character 4-digit display) to Arduino)

동네의 부품샵을 구경하다 우연히 구하게 된 부품이다. 저렴한 가격($1.99)때문에 메뉴얼 여부에 관계 없이 일단 구입하여 버렸다. 물론 '구글신'을 믿고 있었기 때문이지만...


부품 명칭은 PD2437로 OSRAM에서 나온 4-character 5x7 dot matrix alphanumeric programmable display with built-in CMOS control functions 이다. DIL 패키지 안에 5x7 매트릭스가 4개 들어있고 디스플레이 컨트롤러를 내장하고 있다.

이 부품을 사용하기 위해 구글의 도움으로 유저메뉴얼과 어플리케이션 노트를 찾아내었다.


일반적인 메모리같이 8-bit bidirectional data bus를 사용해서 마이크로컨트롤러와 데이터를 교환하고 ASCII 코드를 입력받아 그에 해당하는 문자를 표시하게 되어 있었다.

Arduino에 연결하려고 하는데 8-bit data bus를 모두 digital i/o에 연결해 버리면 arduino에 다른 주변기기를 붙일 수 없을거 같아 74LS164(8-Bit Parallel-Out Serial-In Shift Registers)를 같이 사용하기로 하였다.

이를 토대로 구성한 회로는 다음과 같다.


Arduino의 D2-D9까지를 사용하였다.

실제 기판에 만들기 전에 먼저 브레드보드에서 프로토타입으로 확인을 해 보았다.


큰 문제 없이 원하는 글자를 표시해 주었다. 테스트에 사용한 코드는 다음과 같다.

View source code


PD2437은 매우 쉽게 여러개를 cascading이 가능하기 때문에 현재 총 10개의 PD2437을 연결하여 20x2 LED display를 만들어 볼까 생각중이다. LCD에 비해 직접 발광을 하기 때문에 시야각 문제도 없고 시중에서 구할 수 있는 20x2 LCD보다 크기도 크기 때문에 야간에도 글자를 정확하게 확인할 수 있기 때문에 signboard로 적합할 거 같다.

2009년 4월 18일 토요일

Arduino 설치 및 프로그램 실행 (Installing and setup Arduino)

http://arduino.cc 에서 arduino 소프트웨어를 다운받을 수 있다. Mac OS X, Linux, Windows를 모두 다 지원한다.

또한 OS용 디바이스 드라이버도 이 사이트에서 다운받을 수 있다.

다운받은 압축파일을 풀어주면 프로그램을 가지고 있는 폴더가 생긴다. 별도 설치 할 필요가 없이 그 폴더에서 arduino 프로그램을 바로 실행해주면 된다.

프로그램을 실행하면 다음과 같은 창이 열리게 된다..

먼저 arduino 보드에 맞게 환경설정을 해 주어야 한다. Tools 메뉴로 가 보면 아래와 같은 서브메뉴가 나온다.

먼저 통신에 사용할 시리얼 포트를 지정해 준다. Arduino보드를 USB 케이블에 연결하고 디바이스 드라이버가 제대로 설치되어 있으면 아래와 같이 포트가 보이게 된다. 아래 화면은 맥의 경우이고 윈도우 인 경우 COMx 란 이름으로 보이게 된다. 보드를 연결했는데도 포트가 보이지 않는다면 디바이스 드라이버를 다시 설치하고 프로그램을 실행하면 보일 것이다.

그 다음은 보드를 설정해 준다. Arduino도 여러 종류가 있어서 그에 해당하는 보드를 선택해주면 된다.


여기서는 아래의 보드를 사용할 것이기 때문에 Arduino Diecimila를 선택해주면 된다.


설정이 끝났으면 예제 프로그램을 실행시켜 보겠다. 아래 화면에서처럼 File -> Sketchbook -> Example -> Digital -> Blink 를 선택해 준다.

그러면 Blink 예제 파일이 열리고 내용을 볼 수 있게 된다. 여기서 맨 왼쪽의 플레이버튼을 누르면 프로그램이 컴파일 된다.

컴파일이 정상적으로 끝나면 화면 아래쪽에 다음과 같은 메세지가 나온다.

하지만 컴파일이 끝났어도 아직 프로그램이 arduino 보드로 옮겨진건 아니다. 프로그램을 arduino 보드로 전송하려면 오른쪽 두번째 버튼을 눌러준다.

그러면 arduino 보드의 TX, RX LED가 빠르게 번쩍이면서 프로그램이 전송되는걸 볼 수 있다. 전송이 끝나면 컴파일의 경우와 마찬가지로 메시지 창에 업로드가 끝났다는 메시지가 표시된다.

프로그램이 전송되고 나면 arduino 보드는 자동으로 reset이 되면서 프로그램이 바로 실행된다. 이 예제 프로그램은 보드에 있는 LED를 깜빡이게 하는 것이기 때문에 아래의 LED가 1초 간격으로 반짝이는걸 확인할 수 있을 것이다.

또한 arduino에는 시리얼 터미널 기능도 가지고 있다. 위의 예제에서는 시리얼 포트를 사용하지 않았지만 프로그램에 따라서는 시리얼 포트를 통해 데이터를 주고받을 수 있다. 맨 오른쪽의 아이콘을 눌러주면 아래쪽 메시지 윈도우가 시리얼 터미널 역활을 하게 된다.

검은 부분에 수신한 데이터가 표시되고 송신할 데이터는 입력창에 넣어주면 된다. 또한 통신속도도 임의로 변경할 수 있다. 물론 arduino보드의 시리얼 포트 설정속도와 동일하게 맞춰줘야만 한다.

2009년 4월 4일 토요일

파일시스템 비교 넷북에 적합한 파일시스템 선택 (File system comparison and choose the right one for netbook)

친구의 부탁으로 넷북을 구입하여 포맷을 한 다음 윈도우 XP를 클린인스톨을 하게 되었다.


처음에 SSD를 포맷을 할 때 별 생각없이 파일 시스템을 NTFS로 선택하였다. 설치에 별다른 문제는 없었지만 설치하는데 엄청난 시간이 걸렸고 특히 sp2를 설치했기 때문에 sp3로 업데이트 할 때 역시 거의 1시간 이상 걸렸다.

어플리케이션 역시 일단 실행이 되면 동작속도는 괜찮았지만 윈도우의 반응속도나 초기 로딩속도가 엄청나게 오래 걸렸다. 물론 인텔 아톰 프로세서가 고성능은 아니어도 램도 2G, SSD 32G로 확장된 시스템이 무슨 셀러론 500MHz 프로세서에 램 512M 보다 눈에 띄게 느리게 움직이는 것이었다.

구글신의 도움을 받아 원인을 찾아 본 결과 범인(?)은 NTFS 파일시스템이었다.

아래 표가 FAT과 NTFS 파일시스템을 비교해 놓은 것이다.



위의 표에서 볼 수 있는것처럼 대용량의 하드를 사용하는 멀티유저 시스템인 경우 security, recoverability, fault tolerance가 중요하기 때문에 NTFS가 훨씬 유용하지만 주로 개인용 서브로 사용하고 사용되는 SSD도 32G이하인 경우가 많은 넷북에서는 NTFS를 사용하는게 별다른 이득이 없다.

또한 NTFS 파티션의 경우 모든 파일과 폴더에 대해 last access timestamp를 저장하고 있다. 이 timestamp는 파일이나 폴더가 억세스 (쓰기 뿐 아니고 읽기도 포함)될 때 마다 업데이트 된다. 즉 폴더를 브라우징 하거나 파일 내용을 보기만 해도 계속 timestamp가 업데이트 되어야만 한다. 특히 대량의 파일을 가지고 있는 폴더를 브라우징하면  log file이 쌓여서 OS가 이 로그를 하드디스크에 다 기록할 때 까지 윈도우가 느려지거나 반응이 없어질 수 있다.

고속 하드에서라면 큰 문제가 되지 않지만 넷북에 주로 사용되는 저속의 MLC SSD에서는 이게 엄청난 문제를 일으킬 수 있다.

특히 MLC SSD의 경우 한번에 writing하는 블럭 크기가 작으면 아래 그래프에서 볼 수 있는것처럼 기록속도가 매우 느려진다. Timestamp 로그는 사이즈가 작아서 가장 writing 속도가 느리다. 폴더를 한번만 열어봐도 그 폴더 안에 들어있는 모든 파일에 대해 가장 느린 operation을 해 줘야 하니 윈도우의 동작 속도가 엄청나게 느려지게 된다.

물론 FAT32에도 timestamp를 관리하지만 파일을 만들거나 내용을 수정하는 경우만 timestamp를 업데이트하고 읽기만 하는 경우는 timestamp를 업데이트 하지 않기 때문에 MLC 타입의 SSD를 사용하는 넷북의 경우 FAT32를 사용하는게 NTFS보다 훨씬 빠르게 동작한다.

넷북의 SSD를 FAT32로 포맷하고 윈도우를 다시 설치한 결과 NTFS를 설치한 경우보다 체감상으로 배 이상 빠르게 동작하는걸 확인할 수 있었다.

* NTFS를 사용하는 경우에도 last access timestamp 기능을 꺼 줄 수 있다. 이 경우는 테스트 해 보지 않았지만 이 기능을 꺼 주면 FAT32와 비슷한 속도로 동작할 수 있을것으로 생각된다. 이 기능을 꺼 주려면 레지스트리를 다음과 같이 수정해주면 된다.

Hive: HKEY_LOCAL_MACHINE

Key: SYSTEM\CurrentControlSet\Control\FileSystem

Name: NtfsDisableLastAccessUpdate

Type: REG_DWORD

Value: 1