중급 예제

약간은 익숙하시거나 익숙해지셨나요? 그렇다면 조금더 깊이 다뤄볼까요?

아두이노 Leonardo x 푸시버튼-컨트롤하기

2014-07-31 05:56:32

개요

 

출처 : 레오나르도 - aruino.cc
Leonardo는 아두이노 보드의 일종으로 일반적으로 많이 쓰이는 Uno R3와는 달리
Micro B USB를 사용하여 SMD 형태의 ATMEGA32u4 마이크로 칩이 장착되어 있습니다.
가장 큰 특징은 컴퓨터에 연결하면 기본적으로 가상 CDC(연결 장치 클래스) 시리얼/COM포트 이외에,
마우스와 키보드 장치(HID)로 인식이 됩니다. 그래서 UNO에서 구현하기 어려운 마우스/키보드 에뮬레이션을 쉽게 구현 할 수 있습니다.


 

출처 : DIY 오락실 게임기 - freeio

예를 들면 PC로 고전 에뮬 게임을 구동하고 키입력을 스위치에 연동시켜 
추억의 미니 오락기기를 만들수 있습니다.

그럼, 푸시버튼 5개를 이용하여 마우스와 키보드를 컨트롤해보겠습니다.

 

미리보기 동영상

 

부품목록

본 학습에는 총 5종류의 부품이 필요합니다.
 

NO    

부품명                                                                          수량      상세설명
1 아두이노 레오나르도 R3 1 아두이노
2 푸시 버튼 5 입력버튼
3 10KΩ 저항 5 저항
4 브레드보드 1 브레드보드
5 점퍼 케이블 18 점퍼 케이블

 

 

  10kΩ 저항 브레드보드 레오나르도 점퍼케이블 푸시 버튼
P
A
R
T
S

X 5
 
X 1  X 1  X 18 X 5

 

 

회로도 Making

회로도

브레드보드 레이아웃


소프트웨어 Coding

 

/*도구 > 보드 > 레오나르도로 보드 설정이 되어있는지 확인합니다.*/
/*
출처 : www.arduino.cc
한글주석 : www.kocoafab.cc


  KeyboardAndMouseControl
 
다섯개의 푸시버튼을 이용하여 마우스를 컨트롤 합니다.
 
 Hardware:
 * 5개의 부시버튼을 각각  D2, D3, D4, D5, D6 핀에 붙입니다.
 
마우스의 움직임은 항상 상대적입니다. 이 스케치는 
네 개의 푸시 버튼을 마우스의 움직임을 설정하도록 사용합니다.
 
 주의:   Mouse.move() 커맨드를 사용할때,아두이노가 마우스의 움직임을 대신합니다.
커맨드를 사용하기전에 마우스의 제어를 확인하세요.
 
created 15 Mar 2012
 modified 27 Mar 2012
 by Tom Igoe
 
 this code is in the public domain
 
 */

// 다섯개의 버튼에 핀넘버를 설정합니다.
const int upButton = 2;     
const int downButton = 3;        
const int leftButton = 4;
const int rightButton = 5;
const int mouseButton = 6;

void setup() { // 각버튼의 초기내용을 설정합니다.:
  pinMode(upButton, INPUT);       
  pinMode(downButton, INPUT);       
  pinMode(leftButton, INPUT);       
  pinMode(rightButton, INPUT);       
  pinMode(mouseButton, INPUT);
  //시리얼 통신(9600)을 시작합니다.:
  Serial.begin(9600);
  //마우스와 키보드설정을 제어합니다.:
  Mouse.begin();
  Keyboard.begin();
}

void loop() {
  //마우스를 컨트롤하기 위해 시리얼 입력을 사용합니다.
  if (Serial.available() > 0) {
    char inChar = Serial.read();

    switch (inChar) {   
    case 'u':
      // 문자 'u'를 전송하면 마우스 포인터를 화면상의 0,-10 상대좌표만큼 이동합니다.
      Mouse.move(0, -10);
      break; 
    case 'd':
      // 문자 'd'를 전송하면 마우스 포인터를 화면상의 0,10 상대좌표만큼 이동합니다.
      Mouse.move(0, 10);
      break;
    case 'l':
     // 문자 'l'을 전송하면 마우스 포인터를 화면상의 -10,0 상대좌표만큼 이동합니다.
      Mouse.move(-10, 0);
      break;
    case 'r':
     // 문자 'r'을 전송하면 마우스 포인터를 화면상의 10,0 상대좌표만큼 이동합니다.   
      Mouse.move(10, 0);
      break;
    case 'm':
      // 문자 'm'을 전송하면 마우스 왼쪽클릭을 수행합니다.    
      Mouse.click(MOUSE_LEFT);
      break;
    }
  }

  // 키보드입력을 위해 푸시버튼을 설정합니다. :
  if (digitalRead(upButton) == HIGH) {
    Keyboard.write('u');
  // ENTER키를 1ms 만큼 눌렀다 떼기위한 명령어입니다.:
    Keyboard.write(KEY_RETURN);
    delay(1);
    Keyboard.releaseAll(); 
  }
  if (digitalRead(downButton) == HIGH) {
    Keyboard.write('d'); 
    Keyboard.write(KEY_RETURN);
    delay(1);
    Keyboard.releaseAll(); 
  }
  if (digitalRead(leftButton) == HIGH) {
    Keyboard.write('l'); 
    Keyboard.write(KEY_RETURN);
    delay(1);
    Keyboard.releaseAll(); 
  }
  if (digitalRead(rightButton) == HIGH) {
    Keyboard.write('r'); 
    Keyboard.write(KEY_RETURN);
    delay(1);
    Keyboard.releaseAll(); 
  }
  if (digitalRead(mouseButton) == HIGH) {
    Keyboard.write('m'); 
    Keyboard.write(KEY_RETURN);
    delay(1);
    Keyboard.releaseAll(); 
  }

}


스케치 업로드 후, 소프트웨어 우측 상단에 보이는 시리얼 모니터 아이콘을 클릭하여,
해당 창이 활성화 되어 있어야 정상적으로 작동합니다.



1.사전 설명

Mouse.begin() 과 Mouse.end() 함수

begin()함수는 마우스 라이브러리를 불러오고 사용할 준비를 시작합니다.
또한 end()함수는 불러온 마우스 라이브러리의 사용을 중지합니다.

Mouse.click()
click() 함수는 마우스의 클릭기능을 사용합니다.
기본적으로 마우스 왼쪽클릭은 MOUSE_LEFT , 오른쪽클릭은 MOUSE_RIGHT, 휠버튼 클릭은 MOUSE_MIDDLE 의 함수를 사용합니다.

Mouse.press() 와 Mouse.release()
press()함수는 release()함수가 사용되기 전까지 계속 누른 상태를 유지합니다.

Keyboard.begin() 과 Keyboard.end()
마우스 라이브러리와 동일하게 키보드 라이브러리를 불러오고 사용할 준비를 합니다. end()함수는 불러온 키보드 라이브러리의 사용을 중지합니다.

Keyboard.press()와 Keyboard.release()
키보드를 누르거나(press) 해제(release)되는 키값을 지정할 수 있습니다.

Keyboard.print()
print()함수는 매개 변수로, 컴퓨터에 키 입력을 전송할수 있습니다.

Keyboard.println()
println()함수는 print()함수와 기능은 동일하지만, 시리얼 모니터 상에서 엔터키를 누른것과 같이 줄 바꿈을 하며 전송하여 줍니다.

Keyboard.releaseAll()
releaseAll()함수는 release()함수처럼 눌려져 있는 키값을 해제하지만, 모든 키값을 해제합니다. 

Keyboard.write()
Write()함수는 인수로 정수(ASCII),문자,HEX,이진값등의 형태로 컴퓨터의 모든 키 입력을 보낼 수 있습니다.

2.스케치 설명
 
// 다섯개의 버튼에 핀넘버를 설정합니다.
const int upButton = 2;     
const int downButton = 3;        
const int leftButton = 4;
const int rightButton = 5;
const int mouseButton = 6;

아두이노 상단에 디지털핀 2번부터 6번까지 각각에 버튼핀의 용도에 맞게 설정하여 주었습니다
예를 들면 2번핀은 키보드 방향키 위쪽의 기능을 수행하는 푸시버튼과 연결하였습니다.
 
void setup() { // 각버튼의 초기내용을 설정합니다.:
  pinMode(upButton, INPUT);       
  pinMode(downButton, INPUT);       
  pinMode(leftButton, INPUT);       
  pinMode(rightButton, INPUT);       
  pinMode(mouseButton, INPUT);

핀모드 설정을 통하여 각각의 이름을 부여한 버튼과 핀에대해 입력으로 사용하겠다라는 설정을 합니다.
 
//시리얼 통신(9600)을 시작합니다.:
  Serial.begin(9600);
  //마우스와 키보드설정을 제어합니다.:
  Mouse.begin();
  Keyboard.begin()
 
시리얼 통신을 통해 입력받은 푸시버튼의 핀번호로부터 부여된 문자를 전송하기 위해 시리얼 통신을 준비하고 ,
마우스와 키보드의 라이브러리를 불러오는 begin()함수를 사용하였습니다.
 
//마우스를 컨트롤하기 위해 시리얼 입력을 사용합니다.
  if (Serial.available() > 0) {
    char inChar = Serial.read();

만약 시리얼통신을 통해 입력값(문자열 전송)이 있을때 그 값을 읽어 들입니다.
 
 switch (inChar) {   
    case 'u':
      // 문자 'u'를 전송하면 마우스 포인터를 화면상의 0,-10 상대좌표만큼 이동합니다.
      Mouse.move(0, -10);
      break; 
    case 'd':
      // 문자 'd'를 전송하면 마우스 포인터를 화면상의 0,10 상대좌표만큼 이동합니다.
      Mouse.move(0, 10);
      break;
    case 'l':
     // 문자 'l'을 전송하면 마우스 포인터를 화면상의 -10,0 상대좌표만큼 이동합니다.
      Mouse.move(-10, 0);
      break;
    case 'r':
     // 문자 'r'을 전송하면 마우스 포인터를 화면상의 10,0 상대좌표만큼 이동합니다.   
      Mouse.move(10, 0);
      break;
    case 'm':
      // 문자 'm'을 전송하면 마우스 왼쪽클릭을 수행합니다.    
      Mouse.click(MOUSE_LEFT);
      break;
 
Switch Case는 변수의 값에 따라 다양한 방향으로 이끌어 줍니다.
긴 if 문 리스트를 대치하여 코드의 길이를 줄일수 있습니다.

break 의 경우 아래에 있는 코드를 수행하게 합니다.
또한 각 섹션을 분리하기 위해서도 사용됩니다.
 
 // 키보드입력을 위해 푸시버튼을 설정합니다. :
  if (digitalRead(upButton) == HIGH) {
    Keyboard.write('u');
  // ENTER키를 1ms 만큼 눌렀다 떼기위한 명령어입니다.:
    Keyboard.write(KEY_RETURN);
    delay(1);
    Keyboard.releaseAll(); 
  }
  

만약에 upButton 으로 설정된 2번 핀의 푸시버튼이 눌렸을때(HIGH일때) 키보드 라이브러리를 통해 'u'라는 문자를 입력하고 엔터키를 입력하고 키입력을 해제합니다.



 

 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

푸시버튼, 아두이노, 레오나르도

hihyo 2014-08-01 15:26:18

감사합니다.

수박쨈 2014-08-01 16:46:32

좋아요 ^_^)b

박진서 2018-06-07 02:20:51

브레드보드 레이아웃을 따라서 하다가 레오나르도가 계속 키보드를 입력하는 상태가 되어서 다른 코드를 업로드 하지 못하고 있는데 아두이노를 초기화할 방법이 있나요>?

브레드 2018-11-10 08:32:23

이미 해결 하셨을지도 모르겠는데 아무 코드에나 아무거나 쓴 char만들어놓고 거기다가 커서 올려 놓은 다음 업로드하면 됩니다.

브레드 2018-11-10 08:33:35

저도 똑같은 상황에 걸려서 ㅠㅠㅠㅠ

AAryul 2020-11-27 23:31:09

무한으로 입력이 되는데 어떡해아죠?

AAryul 2020-11-27 23:43:34

키보드가 계속 입력되는데 혹시 보드가 고장난 건가요?