이전 포스트에서 QR 코드에 대해 설명했었는데 그에 대해 좀 더 이야기 해 보려고 한다.
아직까지 일본에서 정도로 광범위하게 사용되는건 아니어도 다른 나라에서도 QR코드가 조금씩 사용이 늘어나고 있는거 같다.
먼저 QR코드를 생성하는 방법은 여러가지가 있는데 그 중 쉽게 할 수 있는 방법중 하나는 구글 chart를 사용하는 것이다.
구글 챠트에서 QR 코드를 만들때 필요한 파라미터는 다음과 같다. cht=qr
chs=<size>
chl=<text to encode>
choe=<output encoding>
<size>는 '가로픽셀x세로픽셀'로 지정해준다.
<text to encode>는 QR코드에 집어넣고 싶은 내용으로 UTF-8으로 URL-encoded 되어 있어야만 한다. 즉 'Hello World'를 표시하고 싶으면 'Hello%20World'를 넣어줘야 한다.
<output
encoding>은 출력을 어떻게 인코딩 할 것인가를 결정한다. 이 항목이 없는 경우 디폴트 값은 'UTF-8'이다. 현재
여기에 들어갈 수 있는 값은 UTF-8, SHIFT_JIS, ISO-8859-1 밖에 없다.
파라미터는 URL 'http://chart.apis.google.com/chart?' 뒤에 넣어주고 각 파라미터 사이에는 '&'로 연결해준다.
둘 중 어느것을 이용해도 아래와 같은 QR코드가 생성된다. 참고로 아래 QR코드도 바로 위의 <img> 태그를 이 페이지의 html에 집어넣어 구글에서 다이내믹하게 만들어 낸 결과이다.
일본의 카메라가 달린 휴대폰은 거의 다 QR코드를 읽을 수 있지만 아직 국내 휴대폰중에 QR코드를 읽을 수 있는 제품은 없는걸로 알고 있다.
단 삼성의 해외판매용 심비안 모델인 경우는 설치할 수 있는 무료 QR코드 리더가 있다.
아이폰의 경우 여러가지 무료 QR코드 리더 소프트웨어가 나와 있는데 아이폰 카메라가 마크로 촬영은 포커스가 잘 맞지 않아 인식률이 별로 좋지 않다. 몇가지 테스트 해 본 결과 NeoReader가 다른 소프트웨어에 비해 월등하게 인식률이 높았다.
(단 다른 소프트웨어도 Griffin Clarifi 같은 제품을 이용해 마크로 렌즈를 사용하면 인식률을 크게 높일 수 있다.)
--
맥 사용자라면 Micono의 QRCodingen, DecodingQR?을 이용하면 직접 QR코드를 만들고 읽을 수 있다. 단 메뉴가 일본어인것이 단점이지만 맥용 소프트웨어 답게 메뉴의 위치가 일정하기 때문에 약간의 한자실력과 통밥을 이용하면 사용하는데 큰 문제는 없다.
일명 Poorman's version으로 구현해 본 아뒤노를 위한 마이크로SD(Transflash) 인터페이스이다.
마이크로SD 소켓을 구입하기도 힘들고 구한다 해도 SMD 타입의 좁은 피치를 가지고 있기 때문에 PCB를 만들지 않으면 신호선을 연결하기가 힘들다.
그래서 찾아낸 방법이 마이크로SD를 구입할 때 같이 껴 주는 MicroSD to SD adapter를 소켓 대용으로 이용하는 것이다.
SD의 경우 9개의 핀이 있지만 SPI모드로 동작하는 경우는 7개 핀만 사용한다. 각 핀의 배치는 다음과 같다. 이 7개의 동박면에 직접 신호선을 땜질하는 것이다.
여기서 주의할 점은 SD는 3.3V 디바이스라는 점이다. Vdd뿐 아니고 다른 핀들도 3.3V레벨의 신호를
사용해야 한다.
MicroSD(Transflash)의 핀 배치는 다음과 같다.
Arduino호환보드중에 전원으로 3.3V를 사용하는 경우는 각 핀을 Arduino SPI에 직접 연결시켜 주면 된다. 하지만 대부분의 Arduino 보드들은 5V를 사용하기 때문에 신호 레벨을 바꿔 줘야만 한다.
위
의 회로를 사용해서 Arduino와 연결해주면 된다. 단 위의 회로에서 왼쪽에 uSD to SD adapter는 라이브러리를
따로 그리기 귀찮아서 그냥 MicroSD 소켓을 사용해 버려서 핀 번호가 좀 다르다. 위의 사진을 보고 같은 이름의 핀을
연결시켜 주면 된다. ^^;;;
회로 부분만 만능기판에 만들어 본 것이다.
최종적으로 MicroSD adapter의 핀에 납땜질을 해서 신호선을 뽑아내어 만능기판 회로에 연결하고 아답터를 접착제나 실리콘을 사용하여 기판의 아래쪽에 붙여주면 된다.
이
렇게 구성하여 arduino에 연결하면 MicroSD를 FAT16으로 포맷하여 파일시스템으로 사용할 수 있게 된다.
MicroSD가격이 많이 저렴해 졌기 때문에 아주 적은 비용으로 대용량의 파일시스템을 추가할 수 있기 때문에 장시간의 데이터
로그가 필요한 경우에 매우 유용하게 사용할 수 있다.
우리가 현재 인터넷에서 일상적으로 사용하고 있는 이메일은 인류 역사상 매우 오랜 기간동안 사용되어 왔던 우편제도를 거의 그대로 모방하여 만들어 졌다.
우리가 편지를 보낼 때를 생각해 보면 편지지에 내용을 적고 편지봉투에 집어넣은 다음 봉투에 발신자 주소와 수신자 주소를 적는다. 그리고 우표를 붙인 다음 우체통에 집어넣으면 보내는 사람의 할 일은 더 이상 없어진다. 나머지 역할인 편지를 수신자에게까지 전달해 주는건 우체국에서 하는 일이고 언제 우체통에서 편지를 수거해 가는가, 어떤 방법으로 어느 경로를 거쳐 우리동네 우체국에서 수신자가 사는 동네의 우체국까지 편지를 옮길 것인가, 수신자네 동네 우체국에서 언제 어떻게 수신자 집으로 편지를 가져다 줄 것인가는 전적으로 우체국이 결정하는 것이지 편지를 보낸 사람이 결정할 수 있는게 아니다. 또한 수신자 집에 편지가 배달되었다고 해도 언제 그 사람이 편지를 읽는지, 아니 편지를 읽었는지 조차 알 수 있는 방법이 없다.
위에 과정이 이메일에도 거의 동일하게 적용된다.
이메일을 작성하는 경우 본문에 원하는 내용을 적고 메일 헤더에 발신자 이메일 주소, 수신자 이메일 주소를 넣어주고 이메일을 발송한다. 여기까지가 이메일을 보내는 사람이 해야 할 일이다. 나머지 역할인 이메일을 수신자 이메일 계정으로 전달해 주는건 인터넷(정확하게 말하자면 인터넷에 있는 메일서버들)이 알아서 하게 된다. 어느 메일서버를 거쳐 언제 이메일을 전달할 것인가는 전적으로 메일서버들이 결정하는거지 이메일을 보낸 사람이 결정할 수 있는게 아니다. 또한 편지와 마찮가지로 이메일이 수신자 메일함에 전달되었다 해도 그걸 읽었는지 여부나 언제 읽었는지는 알 수 있는 방법이 없다.
물론 편지에도 예전부터 본문이나 PS에 '읽었으면 읽었다고 알려달라'고 부탁을 할 수도 있지만 그건 편지를 받은 사람이 그 부탁에 응해주는 경우에만 의미가 있는 것이다. 이메일 표준에도 이와 유사하게 RFC3798등에서 메일 헤더에 메일을 읽었다는 receipt를 보내달라고 요구하는 필드가 추가되기도 했다. 하지만 이 역시 수신자가 receipt를 보낼건지 확인을 해 줘야만 receipt가 보내지는 문제도 있고 모든 이메일 클라이언트가 이 확장필드를 인식하지 못하기 때문에 널리 쓰여지지는 못했다.
그렇다면 '어 내가 쓰는 이메일에는 수신확인 기능이 있는데 이건 뭐냐?'는 사람들이 있을 것이다. 쉽게 이야기하자면 그건 특정 메일 서비스 내에서만 동작하는 일종의 편법을 이용한 방법이다. 하지만 그런 방법들은 표준화가 된 것도 아니고 편법을 이용하는 것이기 때문에 송신자, 수신자 모두 같은 이메일 서비스(예를 들어 둘 다 한메일 또는 네이버메일 등등)를 이용하는 경우에만 "가능할 수도 있는" 방법일 뿐이다. 동작원리는 이메일은 위에서 말했듯이 일단 보내고 나면 송신자는 그 이메일에 대한 통제력(내용수정, 삭제 등등)을 완전히 잊어버리게 된다. 그래서 이메일을 보낼 때 메일서비스가 이메일의 본문 내용 안에 사람들에게는 보이지 않게 조그마한 이미지 주소를 임의로 넣어 보낸다. 그 이미지 파일 주소는 해당 메일 서비스 서버의 주소이다. 그렇기 때문에 수신자가 메일을 읽을 때 눈에는 보이지 않지만 숨어있는 이미지를 화면에 표시하기 위해 메일서비스 서버를 억세스 하게 된다. 그 파일이 억세스 되면 메일을 읽은 것으로 간주하고 그 시간을 메일을 읽은 시간이라고 알려주게 된다.
위쪽 그림이 정상적 이메일인 경우이다. 송신자의 메일 서버가 수신자의 메일서버로 메일을 전달하면 수신자가 메일을 읽을 때 그냥 수신자의 메일서버에서 메일을 읽을 뿐 송신자 서버에 아무 통보가 없다. 그에 비해 아래쪽의 편법을 사용하면 메일 내에 <img> 태그가 들어있고 그 태그가 송신자 메일서버에 있는 이미지 파일을 가르키고 있기 때문에 메일을 보여줄 때 그 파일을 요구하게 된다. 송신자 메일서버는 그 파일이 요구된 시간을 기록하고 그걸 수신자가 메일을 읽은 시간이라고 알려주게 된다.
그런데 최근에는 대부분의 이메일 서비스나 이메일 클라이언트들은 메일 본문에 들어있는 이미지 파일들을 기본적으로 보이지 않게 되어있는 경우가 많다. 이렇게 되어 있으면 메일을 읽더라도 그 안에 안보이게 숨어있는 이미지를 억세스 하지 않기 때문에 심지어 송신자/수신자가 같은 메일 서비스를 사용하더라도 수신자가 웹으로 억세스하지 않고 POP3/IMAP을 통해 이메일 클라이언트를 사용하면 메일을 읽었더라도 수신확인에는 읽지 않았다고 나오게 된다.
결론적으로 이메일 수신확인 서비스라는건 정확하지도 않은 편법일 뿐임으로 너무 믿지 말라는 것이다. 수신확인을 했는데 혹시 언제 읽었다고 나오면 그건 일단 읽었다고 생각해도 큰 무리는 없지만 아직 읽지 않았다고 나오는건 진짜 안 읽은건지 편법이 먹히지 않아 읽었는데 안 읽은걸로 나오는건지 확인할 방법은 전혀 없다는 것이다. 요점은 국내 웹메일들의 수신확인 서비스라는걸 너무 믿지 말라는 것이다.
아래의 사진에 있는 WIZNet의 WIZ810MJ을 사용해서 Arduino를 이더넷에 연결시켜 보았다.
이 모듈에 사용된 WIZNet의 이더넷 컨트롤러 Arduino Ethernet libaray에서 기본 지원하기 때문에 매우 손쉽게 사용할 수 있다. 한국에서는 제조사의 온라인샵인 http://www.ewiznet.co.kr/ 에서 22,866원(그냥 23000원으로 하지 끝에가 866원은 뭔지 모르겠다.)에 구입할 수 있다.
다만 단점은 3.3V전원을 사용한다는 것과 커넥터가 일반적으로 사용하는 2.54mm 피치가 아니고 2mm를 사용하기 때문에 PCB를 뜨지 않으면 일반적으로 구할 수 있는 만능기판에 들어가지가 않는다는 것이다.
이 모듈은 MCU data interface와 SPI인터페이스를 지원해 준다.
SPI인터페이스를 사용하는 경우는 저 핀들중에 아주 일부만 사용하면 되기 때문에 매우 편리하다.
아래의 그림이 핀 배치도인데 저 중에 빨간색으로 표시된 신호만 사용하면 된다. 특히 그 중에 SPI_EN은 SPI 모드를 사용할것이기 때문에 Vcc에 연결해 버리면 되고 리셋만 제외하면 나머지 필요한 신호를 모두 한쪽의 커넥터(JP1)에서 얻을 수 있다. 리셋은 전원이 인가될 때 자동리셋이 되기 때문에 없어도 되긴 하지만 혹시 몰라 조그마한 푸쉬버튼을 연결해 모듈에 접착시켜 버렸다.
그 덕에 집에 가지고 있던 2mm 피치의 14핀 커넥터를 사용해 JP1의 앞쪽만 연결해서 별도의 추가 비용 없이 손쉽게 연결할 수 있었다.
Arduino
WIZ810MJ
D13
SCLK (7)
D12
MISO (12)
D11
MOSI (9)
D10
SCS (10)
매우 손쉽게 인터넷을 사용할 수 있는데 단점은 DHCP를 기본적으로 지원하지 않기 때문에 IP address를 수동으로 지정해 줘야 하는 것이다.
일단 arduino의 samples중에 ethernet에 속해있는 아무거나 선택해서 다운로드 하고 컴퓨터에서 ping을 날려 보았다.
일단 ip address만 할당되고 나면 arduino에 어떤 프로그램이 실행되는가 관계 없이 모듈이 ping에 대한 응답을 해 준다.
예제중에 WebServer를 실행하고 컴퓨터의 웹 브라우져에서 접속한 화면이다. 이 예제는 arduino의 아날로그 입력을 브라우져에서 볼 수 있게 해 준다.
모듈은 기본적으로 3.3V에서 동작하게 되어 있지만 5V I/O tolerant 하다. 그래서 이번에는 전원도 5V를 넣고 실험을 해 봤는데 별 문제는 없었지만 모듈이 조금 많이 뜨거워 진 것 같아서 3.3V 레귤레이터를 사용해 줘야겠다.
윗줄에 4개, 아랫줄에 4개, 총 8개의 PD2437을 사용하여 16x2 디스플레이를 설계하였다. 기본적인 부분은 이전 회로와 차이가 없지만 신호의 팬아웃(fan-out)을 고려하여 74LS245 버퍼를 사용해 주었고 8개의 PD2437중 하나를 선택하기 위해 3-to-8 decoder인 74LS138을 사용하였다.
물론 저렴한 LCD방식의 디스플레이 모듈도 있지만 그에 비해 글자 크기도 크고 백라이트 없이 자체발광을 하기 때문에 어두운 곳에서도 훨씬 더 확실하게 눈에 띈다. 약 2~3미터 정도 거리에서도 표시 된 내용을 쉽게 확인할 수 있다.
Arduino의 PD2~PD12까지 연결을 해 주면 된다. 시리얼 포트를 통해 표시될 문자를 전송하면 되도록 소프트웨어를 작성하였다. 입력받은 문자를 바로 출력하게 되어 있고 '\'를 escape sequence로 사용한다.
최근에는 대부분의 주변기기가 USB 인터페이스를 이용해서 다양한 종류의 USB 장치가 컴퓨터에 연결되는 경우가 많다. 그런데 항상 아답터를 꼽아놓으면 사용하지 않는 경우에도 전력을 소모하게 되고 그렇다고 매번 사용할 때 마다 플러그를 뽑는것도 귀찮다.
그래서 컴퓨터의 USB포트에서 나오는 전원을 일종의 스위치로 이용해서 컴퓨터가 켜지면 자동으로 USB 장치의 전원을 켜 주고 컴퓨터가 꺼지면 USB 장치의 전원도 같이 꺼지는 회로를 생각해 보았다.
바로이전의 포스트에서 만든110/220V 전원 스위칭 모듈(이것 역시 저렴한 비용으로 간단하게 만들 수 있다.)을 사용하면 별도의 추가 회로 없이 USB 케이블에 커넥터만 만들어 주는 것만으로 쉽게 해결된다. 물론 아무 소프트웨어도 필요없고 단순히 USB 포트의 5V 전원만 사용하기 때문에 (너무나 당연한것이지만) OS의 종류나 컴퓨터 기종에 아무 상관없이 모든 경우에 사용할 수 있다. :)
110/220V 전원 스위칭 모듈을 만들었다면 케이블 제작에 필요한 부품은 다음과 같다.
- USB type A male connector
- USB type A female connector
- 2 pin connector
USB 커넥터의 핀 순서를 먼저 정확하게 확인해준다.
Male connector의 핀 순서이다.
Female connector의 핀 순서이다.
케이블은 D+, D- 신호는 그냥 pass-through하고 Vcc와 GND만 전원 스위치 모듈의 입력으로 넣어주면 된다.
이렇게 만든 케이블의 오른쪽 커넥터는 컴퓨터에, 왼쪽 커넥터에 USB장비 케이블을 연결하고 2 pin 커넥터를 전원 스위치 모듈의 입력에 연결해 주면 된다. 그리고 해당 USB장비의 아답터를 전원 스위치 모듈에 꼽아주면 된다.
위의 그림처럼 연결되어 있는 것을 아래와 같이 연결해주면 된다.
그리고 어짜피 컴퓨터 전원을 사용하는 장비는 이 커넥터가 필요없고 외부아답터를 사용하는 장비는 USB포트에서 많은 전류를 끌어쓰지 않기 때문에 전원 스위치 모듈의 opto-coupler가 약간의 전류를 먹는 정도는 문제가 되지 않는다.
* 컴퓨터의 BIOS 셋팅에서 컴퓨터 전원이 꺼져도 USB포트로 전류를 흐르게 할 수 있는 옵션이 있는데 이 옵션이 선택되어 있으면 이 회로는 동작을 하지 않는다. 즉, 컴퓨터가 꺼져도 USB장비의 전원은 꺼지지 않게 된다.
Arduino에서 110/220V 전원을 제어하려면 고전압을 스위칭 해 줄 수 있는 회로가 필요하다. Relay나 SSR(Solid State Relay)를 사용하는 방법도 있지만 아래 회로에서는 Traic을 사용하였다.
고압 전원부를 arduino쪽과 전기적으로 분리하기 위해 opto-coupler인 MOC3021을 사용한다. 전원을 스위칭하기 위해서는 bi-directional triode thyristor인 BT136을 사용한다. 다만 부품샵에는 BT136이 없어 같은 rating의 Motorola MAC218을 사용하였다. 그리고 발열이 있기 때문에 충분한 크기의 방열판을 붙여줘야 한다.
아이튠에서 sync를 하면 아이폰의 데이터가 백업되면서 이 정보 역시 맥에 저장되게 된다. calllog2ical.rb 스크립트는 이 백업된 내용에서 통화 목록을 읽어 그 내용을 iCal에 개별 이벤트로 집어넣어 준다.
먼저 http://code.google.com/p/iphonelogd/ 에서 프로그램을 다운받는다. 맥에서만 동작하고 현재 버전은 calllog2ical.0.10.pkg 이다.
다운받은 패키지를 실행하면 인스톨러가 실행되어 프로그램이 설치되게 된다. 설치되는 위치는 /usr/local/bin 이다.
설치가 완료되면 먼저 아이폰을 맥에 연결하고 아이튠에서 아이폰을 sync하도록 한다.
싱크가 끝나면 터미널 창을 열고 쉘 프롬프트에서 다음의 명령어를 실행해주면 된다.
% calllog2ical.rb
그러면 백업된 파일에서 통화목록 db를 읽어 각 통화를 위의 화면과 같이 iCal에 이벤트로 넣어준다. 전화번호가 Address Book에 등록되어 있으면 자동으로 이름으로 변환해서 보여주고, 등록되어 있지 않은 번호인 경우 unidentified 로 표시되지만 그래도 url필드에 전화번호는 기록된다.
* 이 스크립트는 디폴트로 'Call Log' 캘린더에 통화목록을 넣어준다. 스크립트를 실행하기 전에 iCal에 'Call Log' 캘린더가 만들어 져 있어야만 한다. 만일 없으면 실행 중 에러를 발생하고 멈춘다.
* 다른 이름의 캘린더를 사용하려면 calllog2ical.rb 뒤에 캘린더 이름을 넣어주면 된다.
현재 가지고 있는 리더기는 TTL 인터페이스를 가지고 있는 single track reader이다. 5핀 커넥터를 가지고 있고 Vcc, GND, Card present, Clock(Strobe), Data 신호를 제공해 준다.
신호 타이밍은 아래와 같다.
Arduino의 D2, D3, D5를 각각 리더기의 Data, Clock, Card present에 연결해 주면 된다.
코드는 다음과 같다.
/*
* Magnetic Stripe Reader
* by Stephan King http://www.kingsdesign.com
*
* Reads a magnetic stripe.
*
*/
int cld1Pin = 5; // Card status pin
int rdtPin = 2; // Data pin
int reading = 0; // Reading status
volatile int buffer[400]; // Buffer for data
volatile int i = 0; // Buffer counter
volatile int bit = 0; // global bita
char cardData[40]; // holds card info
int charCount = 0; // counter for info
int DEBUG = 0;
void setup() {
Serial.begin(38400);
// The interrupts are key to reliable
// reading of the clock and data feed
attachInterrupt(0, changeBit, CHANGE);
attachInterrupt(1, writeBit, FALLING);
}
void loop(){
// Active when card present
while(digitalRead(cld1Pin) == LOW){
reading = 1;
}
// Active when read is complete
// Reset the buffer
if(reading == 1) {
if (DEBUG == 1) {
printBuffer();
}
decode();
reading = 0;
i = 0;
int l;
for (l = 0; l < 40; l = l + 1) {
cardData[l] = '\n';
}
charCount = 0;
}
}
// Flips the global bit
void changeBit(){
if (bit == 0) {
bit = 1;
} else {
bit = 0;
}
}
// Writes the bit to the buffer
void writeBit(){
buffer[i] = bit;
i++;
}
// prints the buffer
void printBuffer(){
int j;
for (j = 0; j < 200; j = j + 1) {
Serial.println(buffer[j]);
}
}
int getStartSentinal(){
int j;
int queue[5];
int sentinal = 0;
Serial.print("Stripe_Data:");
for (k = 0; k < charCount; k = k + 1) {
Serial.print(cardData[k]);
}
Serial.println("");
}
void printMyByte(int thisByte[]) {
int i;
for (i = 0; i < 5; i = i + 1) {
if (DEBUG == 1) {
Serial.print(thisByte[i]);
}
}
if (DEBUG == 1) {
Serial.print("\t");
Serial.print(decodeByte(thisByte));
Serial.println("");
}
동네의 부품샵을 구경하다 우연히 구하게 된 부품이다. 저렴한 가격($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)를 같이 사용하기로 하였다.
- Control Word
b7 : clear
0 standard operation
1 clear entire display
b6 : lamp test
0 standard operation
1 display all dots at 50% brightness
b5 : blink
0 blink attribute disabled
1 blink entire display
b4 : attribute enable
0 disable above attributes
1 enable above attributes
b3,b2: attributes
00 display cursor instead of character
01 blink character
10 display blinking cursor instead of character
11 alternate character with cursor
b1,b0: brightness
00 0% (black)
01 25%
10 50%
11 100%
-----------------------------------------------------
how to load information into the display
SET BRIGHTNESS
1. set brightness level of the entire display to your preference, (000) <- 0x02 (50%)
LOAD FOUR CHARACTERS
2. load "S" in the left hand digit, (111) <- 'S'
3. load "T" in the next digit, (110) <- 'T'
4. load "O" in the next digit, (101) <- 'O'
5. load "P" in the right hand digit, (100) <- 'P'
BLINK A SINGLE CHARACTER
6. into the digit, second from the right, load the hex code 0xcf, which is the code for an 'O' with the d7 bit added as a control bit, (101) <- 0xcf
7. load enabled blinking character into the control word register. the display should show "STOP" with a flashing "O", (000) <- 0x17
ADD ANOTHER BLINKING CHARACTER
8. into the left hand digit, load the he code 0xd3 which gives an 'S' with d7 bit added as a control bit, (111) <- 0xd3
ALTERNATE CHARACTER/CURSOR ENABLE
9. load enable alternate character/cursor into the control word register. the display now should show "STOP" with the 'O' and the 'S' alternating between the letter and cursor. (000) <- 1f
INITIATE FOUR CHARACTER BLINKING
10. load enable display blinking. the display now should show the entire word "STOP" blinking, (000) <- 0x23
*/
// Connected to LS164
int DATA = 2; // LS164 Din (pin 1&2)
int CLK = 3; // LS164 Clk (pin 8)
// Connected to PD2437
int A0 = 6; // Address 0 (pin 7)
int A1 = 5; // Address 1 (pin 8)
int A2 = 4; // Address 2 (pin 9)
int WR = 7; // Write (pin 11)
int CE = 8; // Chip Enable (NEG, pin 6)
int RST = 9; // Reset (NEG, pin 4)
void setup() // run once, when the sketch starts
{
Serial.begin(38400);
// pins for LS164
pinMode(DATA, OUTPUT); // sets the digital pin as output
pinMode(CLK, OUTPUT); // sets the digital pin as output
void loop() // run over and over again
{
putChar(0, 0x83);
delay(100);
putChar(7,'S');
delay(100);
putChar(6,'T');
delay(100);
putChar(5,'O');
delay(100);
putChar(4,'P');
delay(100);
PD2437은 매우 쉽게 여러개를 cascading이 가능하기 때문에 현재 총 10개의 PD2437을 연결하여 20x2 LED display를 만들어 볼까 생각중이다. LCD에 비해 직접 발광을 하기 때문에 시야각 문제도 없고 시중에서 구할 수 있는 20x2 LCD보다 크기도 크기 때문에 야간에도 글자를 정확하게 확인할 수 있기 때문에 signboard로 적합할 거 같다.
댓글을 달아 주세요