중급 예제

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

아두이노 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

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

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