DIY 아두이노 USB 트랙패드 – 낡은 노트북 패드를 최신 입력 장치로 변환
부품 및 소모품
- Arduino Micro (또는 Pro Micro, Leonardo) – HID(휴먼 인터페이스 디바이스) 지원 필수
- 고장 난 노트북에서 적출한 트랙패드 (PS/2 인터페이스 타입)
- 와이어, 납땜 도구, 핫글루
앱 및 온라인 서비스
프로젝트 개요
라즈베리 파이 신제품이 나올 때마다 노트북을 만들고 싶지만, 독립형 USB 트랙패드를 구하기 어렵습니다. 이 프로젝트에서는 고장 난 노트북에서 트랙패드를 적출해 Arduino Pro Micro로 USB 마우스로 변환합니다.
1단계: 부품 준비
Arduino Micro/Pro Micro/Leonardo만 HID 기능을 지원하므로 반드시 이 보드 중 하나를 사용해야 합니다. 트랙패드는 PS/2 인터페이스(데이터, 클럭 핀 보유) 타입이어야 합니다. 최신 노트북의 USB 인터페이스 트랙패드는 핀아웃만 알면 바로 USB 연결 가능하지만, 본 프로젝트는 일반적인 PS/2 타깃입니다.
2단계: 작동 원리
구형 노트북 트랙패드는 대부분 PS/2 인터페이스(데이터 T10, 클럭 T11, 전원 T20, 그라운드 대형 금속면)로 통신합니다. 아두이노가 PS/2 데이터를 읽어 USB 마우스 명령으로 변환해 컴퓨터에 전송합니다.
3단계: 배선
트랙패드 기판의 솔더 패드 4개(T10, T11, T20, 그라운드)에 와이어를 납땜합니다. 주의: 패드는 매우 약하므로 살짝만 눌려도 떨어집니다. 납땜 후 반드시 핫글루로 보강하세요.
| 트랙패드 패드 | 아두이노 핀 |
| T10 (데이터) | 핀 10 |
| T11 (클럭) | 핀 9 |
| T20 (전원) | 5V |
| 그라운드 (대형 금속면) | GND |
4단계: 라이브러리 설치
Arduino IDE에 다음 두 라이브러리 설치 필요:
- Mouse Library – USB 마우스 명령 전송
- PS/2 Library – 트랙패드 PS/2 데이터 읽기
라이브러리 폴더에 압축 해제 후 IDE 재시작.
5단계: 코드 업로드
보드 매니저에서 Arduino Micro 또는 Leonardo 선택 필수. 다른 보드 선택 시 컴파일 오류 발생.
#include
#include
#define PS2_DATA 10
#define PS2_CLK 9
byte mstat1, mstat2, mxy, mx, my, mz;
int msval[2];
int repeatCnt;
PS2 moose(PS2_CLK, PS2_DATA);
void setup() {
Mouse.begin();
// PS/2 마우스 초기화 시퀀스 (리모트 모드, 해상도, 샘플레이트 설정 등)
moose.write(0xff); moose.read(); moose.read(); moose.read();
moose.write(0xf0); moose.read(); delayMicroseconds(100);
moose.write(0xe8); moose.read(); moose.write(0x03); moose.read();
moose.write(0xe8); moose.read(); moose.write(0x00); moose.read();
moose.write(0xe8); moose.read(); moose.write(0x01); moose.read();
moose.write(0xe8); moose.read(); moose.write(0x00); moose.read();
moose.write(0xf3); moose.read(); moose.write(0x14); moose.read();
Serial.begin(9600);
}
void ms_read() {
moose.write(0xeb); moose.read();
mstat1 = moose.read();
mxy = moose.read();
mz = moose.read();
mstat2 = moose.read();
mx = moose.read();
my = moose.read();
// 부호 비트 확장 및 12비트 값 조합
msval[0] = (((mstat2 & 0x10) << 8) | ((mxy & 0x0F) << 8) | mx);
msval[1] = (((mstat2 & 0x20) << 7) | ((mxy & 0xF0) << 4) | my);
msval[2] = int(mz); // 스크롤/줌 데이터
}
void loop() {
ms_read();
// 노이즈 필터링: 같은 방향 3회 이상 지속 시에만 이동
if (msval[0] > 0 && msval[2] > 10) repeatCnt++;
else repeatCnt = 0;
if (repeatCnt > 2) {
// 원시 값을 마우스 이동 범위(-1023~1023)로 매핑 후 스케일 다운
msval[0] = map(msval[0], 580, 5164, -1023, 1023);
msval[1] = map(msval[1], 1120, 5967, 1023, -1023);
Mouse.move(msval[0]/200, msval[1]/200);
}
}
6단계: 완성 및 트러블슈팅
업로드 후 아두이노가 재부팅하며 USB 마우스로 인식됩니다. OS에 관계없이 즉시 작동.
- 작동 안 할 때: 트랙패드 뒷면 부품 번호 검색 → 'pinout' 키워드로 데이터/클럭/전원 핀 확인
- PS/2-USB 변환기 구매 대안 존재하지만 데이터 왜곡 우려, 아두이노면 속도/더블탭/스크롤 등 완전 커스터마이징 가능
궁금한 점은 댓글로 남겨주세요.