http://symlink.dk/electro/c64key/http://www.obdev.at/products/avrusb/index.html너무 취미없이 사는 것 같아서 억지로 만들어낸 취미가 AVR 갖고 놀기였습니다.
딱히 AVR로 만들 게 멀까 생각하다 키보드 취미랑 연결하면 좋을 것 같아서 키보드 컨트롤러나 만들기로 했습니다.
그런데 조금 찾아보니 이미 쓸만한 소스가 공개되어 있더군요.
오늘은 기존 프로젝트들 소개를 해보겠습니다.
제가 AVR을 시작한지 고작 몇 주 되지 않은데다 여기서 AVR에 대해 자세히 설명하는 것은
의미가 없기 때문에 자세한 설명은 생략하겠습니다.

일단 저는 USB를 좋아하기 때문에 USB 키보드 컨트롤러를 만들기로 했습니다.
AVR로 USB를 사용하기 위해서는 USB를 내장한 AVR을 사용하거나,
AVR과 USB 컨트롤러를 사용하거나,
AVR로 USB를 emulation하는 3가지 정도의 방법이 있습니다.
이 중 마지막은 AVR-USB project라는 홈페이지가 있어서 관련 소스를 얻을 수 있습니다.
Link1: http://www.obdev.at/products/avrusb/index.html
오른쪽의 Community Projects에 가보시면 여러 project를 볼 수 있습니다.
키보드 관련 project들도 있는 데 그 중 C64 Keyboard 홈페이지를 참고하시면 됩니다.
Link2: http://symlink.dk/electro/c64key/
64키 기준으로 짜여진 소스로 ghost key 방지도 안 되어 있어서 약간의 수정이 필요합니다.
(별로 어렵진 않아서 대략 20여줄 정도 추가하면 ghost key 방지가 가능합니다)
회로도는
mega16.JPG
이렇구요.
대략 필요한 소자를 설명하면
AVR Atmega 시리즈 칩 (키보드용 Atmega16, 키패드용은 Atmega8)
12MHz 크리스탈
세라믹 Cap 22pF
전해 Cap 10uF
저항 10K 1개, 4.7K 1개, 2.2K 1개
저항 82옴 2개
3.6V 제너다이오드 2개
기타 LED와 LED에 붙일 저항 등이면 될 것 같습니다.
Atmega가 대략 3000원 이내고 그 외 소자는 다 몇원에서 비싸야 300원입니다.
전부 넉넉잡고 4천원 안쪽으로 제작 가능합니다.
아무것도 없이 시작한 저는 납땜기구부터 빵판까지 전부 20만원 가까운 지출이 있긴 했습니다.
http://www.kbdmania.net/board/view.php?id=photo&no=6497
물론 저렴하게 가면 3만원 이내로도 충분히 가능한 조합이긴 합니다.

결과물부터 보시면
sSG100622.jpg
sSG100623.jpg
모눈하나가 2cm입니다. 마제에 넣을 생각으로 PCB를 재단했습니다.
좌측 흰 소켓이 USB 케이블 연결용이고 하단 검은색 소켓은 AVR을 프로그래밍할 때 필요한 ISP소켓입니다.
일단 약간의 테스트로 동작 가능성을 확인한 정도구요.
실제 키보드 삽입은 제가 별 필요성이 없어 일단 미뤄둔 상태입니다.
지금은 3700 개조쪽으로 방향을 틀고 진행 중인데, 좀처럼 시간이 나질 않네요.
빵판에 만들어 놓은 것 딸래미가 몇번을 다 뽑았는지도 모릅니다.
제가 해 본 바로는 c프로그래밍을 조금만 하실 수 있으면 별로 어려운 부분은 없는 것 같습니다.

좀더 결과물이 제대로 나오면 글을 쓸까 했는데, 제가 점점 더 바빠져서 일단은 간단한 소개 정도만 하겠습니다.
혹시 PS2용으로 관심이 있으신 분은 아래 링크를 참조하시면 좋습니다.
Link3: http://www.jbrain.com/brain/c=key/


추가======================
ghost관련 부분을 물어보시는 분이 계셔서 내용을 추가합니다.
알고리즘은 아래 덧글 참고하시구요.

uchar ghostbuf, ghost, colc

/* by formarx, Check Ghost */
  if (debounce==1) { /* Debounce counter expired */
    ghostbuf=0xFF;
    ghost=0;
    for (row=0;row<NUMROWS;++row) { /* Process all rows for key-codes */
      data=bitbuf[row]|ghostbuf;
      
      if (data!=0xFF) { /* Anything on this row? - optimization */
        colc = 0;
        for (col=0,mask=1;col<8;++col,mask<<=1) {
          if (!(data&mask)) colc++;
        }
        if (colc!=1) { // Ghost
          ghost = 1;
          break;
        }
      }
      ghostbuf&=bitbuf[row];
    }
  }
  if (debounce==1 && ghost==0) { /* Debounce counter expired */

첨부는 C64의 m8key 폴더의 main.c를 고친 것입니다.