개발 관련/HW 관련

Arduino와 Autoit의 간단한 자동화 테스트

by 소서리스25 2023. 5. 27.
반응형

Arduino와 Autoit의 간단한 자동화 테스트

 

지난번에 Autoit의 이미지서치를 이용한 포스팅, 그리고 Arduino를 이용한 서보모터 동작을 외부 명령어로 입력하여 작동하는 방법을 소개하였다.

 

이번에는 이 두 가지를 혼합한 물리적으로 키보드 버튼을 누르는 것을 소개하겠다.

그래봤자 아주 간단한 동작 자동화이다. 이미지 서치를 통해 해당 이미지가 있으면 서보모터를 돌리는 것이다. 

 

따라서 이번 코드에서는 

Arduino를 통한 서보모터 동작 코드로는 지난번과 동일하며,

Autoit으로는 2가지 방식이 있으며

한 가지는 웹카메라를 통한 이미지 서칭 기능,

다른 한 가지는 디스플레이의 이미지 서칭 기능을 이용한 것으로 이번에는 후자 쪽을 이용한 방법으로 진행한다. 

 

아시다시피 자동화는 일반적인 프로그램 클라이언트에 영향을 주지 않으면서 동작하도록 해야 한다. 왜냐면 영향을 주게 되면 불법프로그램으로 돌려지기 때문이며 이는 직접적인 위반사항에 해당한다고 볼 수 있다. 특히 게임 클라이언트 같은 것들... 그리고 어차피 그런 종류의 프로그램들은 키보드나 마우스 등이 막혀 있다. 그래서 물리적인 것을 시도하는 것이다.

따라서 지금 것은 이런 자동화를 만들 수도 있으니 재미로만 접근해야 한다.

 

먼저 전체 코드는 다음과 같다. 중간중간에 주석도 달아두었다.

지난번 2개의 포스팅에 있던 코드 내용을 합친 거라 보면 된다.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ImageSearch.au3>
#include <CommMG.au3>
 
HotKeySet("{ESC}""_Exit");
 
Global $_searchImg, $_x = 0, $_y = 0, $_mode;
Global $_comport, $sportSetError, $_baudrate, $inputState = False, $instr, $_tolerance, $_image;
Global $_searchState = False, $hTimer = 0, $_timetState = False;
 
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Image Search & Servo Motor"385200);
$Button1 = GUICtrlCreateButton("Start"3211214565);
$Button2 = GUICtrlCreateButton("Stop"21611214565);
$DebugText = GUICtrlCreateLabel("Debug Text : "321622020);
GUISetState(@SW_SHOW);
#EndRegion ### END Koda GUI section ###
 
_Ini_read();
_SerialCheck();
_Main();
 
 
Func _Main();
 
   While 1;
 
        ; 이벤트 처리
          $nMsg = GUIGetMsg();
 
        Switch $nMsg;
 
            Case $GUI_EVENT_CLOSE
                Exit
 
            Case $Button1
                $_searchState = True;
                $_timetState = True;
 
            Case $Button2
                $_searchState = False;
                $_timetState = False;
 
        EndSwitch
 
        if ($_searchState) Then _SearchImg();
 
        ; 타이머 작동
        if($_timetState) Then
 
            ; 13초 마다 실행됨
            if (TimerDiff($hTimer) > 13000Then
 
                if($inputState) then _CommSendString("go30,10");
 
                $_searchState = True;
                $hTimer = TimerInit(); 시간 지난 후 시간 초기화 한 다음 다시 실행하기
 
            EndIf
 
        EndIf
 
        sleep(5);
  Wend;
 
EndFunc;
 
 
 
Func _SearchImg()
 
    $_searchImg = _ImageSearchArea($_image, 16403601280720, $_x, $_y, $_tolerance);
 
    if($_searchImg = 1Then
 
        if($inputState) then _CommSendString("go30,10"); 이미지 찾은 후 동작
 
        $_searchState = False; 이미지 서치가 아래 수행중 때는 일시 정지함
 
        GUICtrlSetData($DebugText, "■ Debug Text : Find x : " &$_x&", y : "&$_y);
        GUICtrlSetColor(-10x0000ff); blue color
 
        $hTimer = TimerInit(); 이미시 서치 실행 후 시간 초기화 되고 반복문에서 13초 후 통신 전달함
 
    Else
         GUICtrlSetData($DebugText, "■ Debug Text : Not Find or Error");
        GUICtrlSetColor(-10xff0000); red color
    EndIf
 
EndFunc
 
 
 
Func _SerialCheck()
 
   If @error = 1 Then Exit;
 
   If _CommSetPort($_comport, $sportSetError, $_baudrate, 8010<> 1 Then
       MsgBox(0'에러', '접속에러-1 : '&$sportSetError&@CR&'* 통신 없이 시작합니다.', 30);
 
   ElseIf $sportSetError <> '' Then
       MsgBox(262144'에러', '접속에러-2 : '&$sportSetError&@CR&'* 통신 없이 시작합니다.', 30);
 
   Else
       $inputState = True;
       ConsoleWrite("Serial Connected..." & @CRLF);
 
   EndIf
 
EndFunc
 
 
 
Func _Ini_read()
   $_comport   = IniRead("Serialsetup.ini""setup""comport""Err");
   $_baudrate  = IniRead("Serialsetup.ini""setup""baudrate""Err");
   $_tolerance = IniRead("Serialsetup.ini""setup""tolerance""Err");
   $_image = IniRead("Serialsetup.ini""setup""image""Err");
EndFunc
 
 
 
Func _Exit();
    _Commcloseport();
    Exit;
EndFunc
cs

 

 

지난번 포스팅을 보았다면 ini 파일 읽는 것과 동작 수행은 보면 알 것이다.

간략하게 설명하면 등록된 이미지를 찾으면 물리적으로 서보모터를 이용하여 "A"키를 눌러주는 것이며 찾지 않더라도 13초마다 키보드의 "A"키를 눌러준다.

또한 찾는 범위가 넓어지면 그만큼 시간이 소요된다. 따라서 이미지 서치의 범위를 적절하게 조절해야 한다.

그리고 실행파일로 만들게 되면서 변경할 수 있는 값들 즉, 통신포트, 통신속도, 이미지 센싱 범위값, 이미지 비교파일 등을 외부 ini에서 변경할 수 있도록 해야 한다.

 

Arduino와의 동작이 비록 서보모터 1개를 이용하지만 개수를 늘리면 추가적인 키들을 더 누르는 것도 가능하다.

아래의 동영상 처럼 작동된다. 참으로 허접한 구조물이다..

간단한 키누름 동작

 

이번 테스트에서 찾을 이미지는 다음과 같다. 

게임 클라이언트에서 아래와 같은 이미지가 뜨면 동작하는 것이다. (느낌표이다.)

이미지 서치로 찾을 이미지

 

그리고 클라인트 상에서의 동작은 아래의 동영상과 같이 연동되어 동작한다. (양손으로 이걸 찍고 있으니까 제대로 동작한다)

제대로 동작한다

 

.... 휴일에 참 허튼짓 중이다.;;;

 

반응형

댓글