Skip to content

Latest commit

 

History

History
111 lines (83 loc) · 3.4 KB

File metadata and controls

111 lines (83 loc) · 3.4 KB

🖱️ DigiSpark ATtiny85 하이브리드 오토클릭커 프로젝트

본 프로젝트는 **DigiSpark(ATtiny85)**와 PS2 조이스틱을 결합하여, 하드웨어 수준에서 감지 불가능한 마우스 오토클릭커를 제작하는 가이드입니다.


1. 주요 특징

  • 물리적 분기 시스템: 부팅 시 조이스틱 버튼을 누르면 설정 모드, 그냥 꽂으면 마우스 모드로 동작하여 USB 리소스 충돌을 완벽히 방지합니다.
  • EEPROM 저장: PC 설정을 통해 입력된 클릭 속도를 비휘발성 메모리에 저장하여 전원을 껐다 켜도 유지합니다.
  • 안전한 회로 설계: P5(Reset) 핀의 전압 강하를 방지하는 저항 설계를 포함합니다.

2. 하드웨어 연결 (회로도)

조이스틱 핀 디지스파크 핀 연결 방법 역할
GND GND 직접 연결 접지
+5V 5V 직접 연결 전원 공급
VRx (X축) P2 (ADC1) 직접 연결 마우스 가로 이동
VRy (Y축) P5 (ADC0) 4.7kΩ 저항 거쳐 연결 마우스 세로 이동
- P5 - 5V 10kΩ 저항 연결 (Pull-up) 리셋 방지용 분배 회로
SW (버튼) P0 직접 연결 오토클릭 ON/OFF 및 모드 진입

3. 아두이노 소스 코드 (autoclick.ino)

#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를 찾을 수 없습니다. (버튼을 누른 채 삽입하세요)")