본 프로젝트는 **DigiSpark(ATtiny85)**와 PS2 조이스틱을 결합하여, 하드웨어 수준에서 감지 불가능한 마우스 오토클릭커를 제작하는 가이드입니다.
- 물리적 분기 시스템: 부팅 시 조이스틱 버튼을 누르면
설정 모드, 그냥 꽂으면마우스 모드로 동작하여 USB 리소스 충돌을 완벽히 방지합니다. - EEPROM 저장: PC 설정을 통해 입력된 클릭 속도를 비휘발성 메모리에 저장하여 전원을 껐다 켜도 유지합니다.
- 안전한 회로 설계: P5(Reset) 핀의 전압 강하를 방지하는 저항 설계를 포함합니다.
| 조이스틱 핀 | 디지스파크 핀 | 연결 방법 | 역할 |
|---|---|---|---|
| GND | GND | 직접 연결 | 접지 |
| +5V | 5V | 직접 연결 | 전원 공급 |
| VRx (X축) | P2 (ADC1) | 직접 연결 | 마우스 가로 이동 |
| VRy (Y축) | P5 (ADC0) | 4.7kΩ 저항 거쳐 연결 | 마우스 세로 이동 |
| - | P5 - 5V | 10kΩ 저항 연결 (Pull-up) | 리셋 방지용 분배 회로 |
| SW (버튼) | P0 | 직접 연결 | 오토클릭 ON/OFF 및 모드 진입 |
#include <DigiUSB.h>
#include <DigiMouse.h>
#include <EEPROM.h>
const int swPin = 0; // 조이스틱 SW 버튼 (P0)
const int xPin = 1; // VRx (P2, Analog 1)
const int yPin = 0; // VRy (P5, Analog 0)
int clickDelay;
bool isConfigMode = false;
void setup() {
pinMode(swPin, INPUT_PULLUP);
pinMode(1, OUTPUT); // 상태 LED (P1)
// 부팅 즉시 버튼 눌림 확인 (눌려 있으면 설정 모드)
if (digitalRead(swPin) == LOW) {
isConfigMode = true;
DigiUSB.begin();
} else {
isConfigMode = false;
clickDelay = EEPROM.read(0);
if (clickDelay == 255) clickDelay = 100; // 초기값 100ms
DigiMouse.begin();
}
}
void loop() {
if (isConfigMode) {
// [설정 모드] LED 빠르게 깜빡임
digitalWrite(1, (millis() / 100) % 2);
DigiUSB.refresh();
if (DigiUSB.available() > 0) {
int incoming = DigiUSB.read();
if (incoming > 0) {
EEPROM.update(0, incoming);
digitalWrite(1, HIGH); // 저장 완료 신호
delay(1000);
}
}
} else {
// [마우스 모드]
int xRaw = analogRead(xPin);
int yRaw = analogRead(yPin);
// 저항 분배를 고려한 Y축 중심점 보정 (약 680)
int xMove = (xRaw - 512) / 30;
int yMove = (yRaw - 680) / 30;
if (abs(xMove) > 2 || abs(yMove) > 2) {
DigiMouse.move(xMove, yMove, 0);
}
// 오토클릭 실행 로직 (버튼 토글 등 추가 가능)
DigiMouse.setButtons(D_MOUSE_LEFT);
DigiMouse.delay(30);
DigiMouse.setButtons(0);
DigiMouse.delay(clickDelay);
}
}
import usb.core
import usb.util
# DigiSpark VID/PID
dev = usb.core.find(idVendor=0x16c0, idProduct=0x05df)
if dev:
val = int(input("새 클릭 간격(ms)을 입력하세요: "))
# Control Transfer를 통해 1바이트 전송
dev.ctrl_transfer(0x40, 0x01, val, 0, None)
print(f"전송 완료: {val}ms 가 저장되었습니다. 장치를 재연결하세요.")
else:
print("설정 모드인 DigiSpark를 찾을 수 없습니다. (버튼을 누른 채 삽입하세요)")