티스토리 뷰

728x90

1. 개요

 게임을 포함한 많은 프로그램들은 화면 최상위에 존재하면 공개된 마우스, 키보드 API로 제어하실 수 없습니다. 그래서 조금 꼼수?를 부려 아두이노를 USB 장치로 인식시키고 Serial 통신을 통해 컴퓨터 마우스와 컴퓨터를 제어해 보도록 하겠습니다.


수행 목표는 게임 거상 내 특정 화면을 반복적으로 촬영하는 것입니다. 아래는 수행 영상입니다.


우측 도스창은 입력을 받으면 거상 화면을 찍는 프로그램이 실행 중에 있습니다.  해당 프로그램에 글자를 입력하면 스크린샷을 찍는데 거상 화면 내의 알파벳과 숫자를 CNN에 활용하기 위해 이와 같은 메크로를 만들게 되었습니다.


반복 행동에 대한 순서는 다음과 같습니다.



2. 사전 준비 - 아두이노 HID로 인식시키기

 시스템? 구조를 간단하게 한번 그려보았습니다.

우선 그림을 보면 어! 왜 Atmega칩이 2개나 들어가있지? 라는 궁금증을 가지실 겁니다. 저도 잘 몰랐는데 2개가 부착되어 있더라구요. 하나는 아두이누의 입출력 핀을 제어하는 MCU이고 하나는 업로드와 같이 USB와 관련된 일을 하는 MCU입니다.



 정품이 아닌 제품을 사용하시고 계신 분들 중 혹시나 SMD 호환버전을 가지고 계신다고 제가 하는 방법으로 HID장치로 인식시키지 못 할 것입니다. SMD 호환버전은 아래와 같이 생겼습니다. 한번 더 말씀드리지만 제가 수행했던 방법으로는 SMD 버전 아두이노는 컴퓨터에서 HID로 인식시키지 못합니다. 



atmega16u2을 장착한 아두이노를 컴퓨터에서 USB 장치(HID)로 인식시키는 방법은 http://luftaquila.tistory.com/26에 아주 잘 설명되어 있어 따로 작성하지 않겠습니다. 

추가로 USB 장치(HID)로 인식시키는 방법을 제공하고 있는 원작자의 말을 따르면 정품이 아닌 제품은 ISP set이 뒤집혀 있을 수 있다고 합니다. 저는 뒤집혀 있었습니다. 아무튼 주의하시면 될 것 같습니다.




3. Arduino Source Code

 우선 I/O MCU인 Atmega328p에 올리는 소스코드입니다. 아두이노 IDE 설정은 기존 아두이노에 업로드 하듯이 보드는 Arduino/Genuino Uno로 업로드 합니다. 당연히 아두이노 역시 핀을 이용해 Atmega328p 모드로 변경합니다.

 소스 코드를 보시면 따로 SoftSerial을 두지 않고 기존 Serial을 사용하면 되자 않을까라는 의문점을 가질 수 있는데 마우스 키보드를 제어하다 보니 한번씩 꼬이더라구요. 그래서 제어를 위한 SoftSerial를 따로 두었습니다.


다음은 USB MCU인 Atmega16u2에 올라갈 소스코드입니다. 아두이노 IDE의 보드를 HoodLoader2 16u2로 올립니다. 코드를 설명해드리기 전 주의하실 점부터 먼저 설명해드리겠습니다.

1. 아두이노에서 제공하고 있는 Mouse.move(char x, char y, char scroll)은 각 입력 파라메터로 1byte 데이터를 받습니다. sign형이기 때문에 -127 ~ 127 사이의 값을 넣으실 수 있습니다. 주의 하시기 바랍니다.

2. Mouse.move(1,0)을 사용시 1픽셀을 이동하는 것이 아닙니다. 이것 때문에 정말 많은 삽질을 하였습니다. 또한 입렵 값의 절대값이 작을 수록 동작을 안할 때가 있습니다. 

3. Mouse.click() 역시 프로그램 위젯마다 명령어 한번에 눌러지는 것이 있고 여러번 호출해야 한번 눌러지는 경우가 있습니다. 

4. 누군가 Serial 통신 속도를 빠르면 좋다고 말하는데 Mouse, Keyboard 함수 처리 속도가 있어서 115200보단 9600을 추천드립니다. 적정 속도를 찾으시면 더 좋구요.


위와 같은 조건 때문에 소스코드는 이쁘게? 코드를 구현했다가 안되서 무식하게 if으로 작성하였습니다.



4. Python Source Code

소스코드 파일(ScreenShootGersang.py)입니다.


소스 코드를 보시면 맨앞 따로 정의한 함수와 import한 라이브러리입니다.


 다음은 메인 함수입니다. 우선 아두이노에게 패킷을 보낼 포트에 연결합니다. 그리고 마우스 객체를 생성합니다.

마우스 객체는 따로 class를 저장하였고 소스 코드(mouse.py)를 다운받으시거나 따로 작성하셔도 됩니다.

코드의 설명은 여기로 가시면 됩니다.


 Window API를 이용하여 실행되어 있는 프로그램을 찾고 프로그램의 크기(고정값)으로 현재 위치를 찾습니다.


 미리 사전에 구해둔 버튼의 고정 거리를 이용해 버튼의 좌표를 구합니다.

 

앞서 한번 언급하였는데 특정 위젯(버튼)들은 아두이노 Mouse.Click()함수 한번으로 클릭이 잘 안됩니다. 

그래서 화면 전환이 생기면 변화했다라고 인지하도록 비교 화면을 찍습니다.

baseImg1은 일하기 버튼이 있는 화면을 저장하고 baseImg2는 나가기 버튼이 있는 화면을 저장하였습니다.


메크로의 핵심이 되는 for문입니다. mse함수가 의문이 드실텐데 두 사진을 입력 데이터로 받고 두 사진이 같을 수록 0에 가까운 숫자가 나옵니다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함