중급 예제

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

아두이노 Leonardo x 조이스틱 모듈

2014-08-07 13:11:37

개요 & 부품목록

이 예제에서는 게임패드에서 많이 보았던 조이스틱 모듈의 활용법을 알아보고,
마우스 포인터를 컨트롤하는 예제를 학습 해 보겠습니다.

게임패드에 달려있는 이 조이스틱 모듈의 경우



모듈의 커버를 벗겨보면, 


이러한 형태의 내부를 볼수 있는데요,
X,Y축으로 회전할수 있는 막대부분과 푸시버튼이 내장되어 있습니다.
기존 4방향 키패드 보다 다양한 방향으로 컨트롤이 가능한 특징이 있습니다.


출처 : DIY LEGO RC CAR - instructables.com

이처럼 RC카의 역동적인 움직임을 제어할수 있는 컨트롤러를 만들수 있습니다.


그럼 본격적으로 조이스틱 모듈의 사용법을 실습을 통해 배워보겠습니다.

미리보기 동영상

 

부품 목록

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

NO 부품명 수량 상세설명
1 아두이노 레오나르도 1 레오나르도 보드
2 조이스틱 모듈  1 조이스틱 모듈
3 브레드보드 1 브레드보드
4 10㏀ 저항 1 저항
5 점퍼 케이블 7 점퍼 케이블
6 푸시버튼 1 푸시버튼

 

부품명 아두이노 레오나르도 10㏀ 저항 브레드보드 점퍼케이블 푸시 버튼 조이스틱 모듈
파트 x1 x1 x1 x7  x1 x1

 

 


 

 

 

 

 

로봇제어 및 모터제어에 사용되는 조이스틱으로 아날로그 출력 방식의

 

 

 

조이스틱으로 Arduino에 연결하여 쉽게 제어를 할 수 있는 제품으로
2축 조이스틱 (X,Y) 푸쉬버튼 기능이 내장되어 있습니다.

4개의 핀은 각각 Ground , VCC(전원+) , X축, Y축, 푸쉬버튼 으로 구성되어 있습니다.

하드웨어 Making

회로도

 

 

브레드보드 레이아웃

 

 


 

 

 

 

소프트웨어 Coding

아래의  코드를 아두이노에 업로드 합니다.

*도구 > 보드 > 레오나르도로 보드 설정이 되어 있는지 확인합니다.

 

/*
출처 : www.arduino.cc

  JoystickMouseControl
 
 아두이노 레오나르도 혹은 마이크로 와 조이스틱을 활용하여 마우스를 컨트롤 해보겠습니다.
 2번핀은 푸시버튼과 연결하여  마우스컨트롤의 기능을 켜고/끄는데 사용합니다,
 그리고 3번 핀은 조이스틱 모듈에 내장된 버튼과 연결하여 마우스 왼쪽클릭버튼의 기능을 사용합니다.
 
 
 
마우스의 움직임은 항상 상대적입니다. 이 스케치는 2개의 아날로그 입력을 사용하고 0 -1023의 수치값을 지니며
이를 마우스의 좌표값(-6,6)으로 변환합니다. 

이 스케치는 조이스틱의 입력값이 중간에 위치하면 휴식상태로 가정합니다.
하지만 이것은 임계치 안에서 변합니다.
 
 created 15 Sept 2011
 updated 28 Mar 2012
 by Tom Igoe
 
 this code is in the public domain
 
 */

// 스위치 버튼,마우스 왼쪽버튼, 그리고 마우스의 움직임,마지막으로 작동상태유무를 확일할수 있는 LED를 사용설정합니다.
const int switchPin = 2;      // 마우스컨트롤 기능을 켜고 끄는 버튼을 2번핀에 연결합니다.
const int mouseButton = 6;    // 마우스버튼 입력버튼을 6번핀에 연결합니다.
const int xAxis = A0;         // 조이스틱의 X축을 아날로그 0번핀에 연결합니다.  
const int yAxis = A1;         // 조이스틱의 Y축을 아날로그 1번핀에 연결합니다.
const int ledPin = 13;         // 마우스 컨트롤의 작동유무를 확인하기위한 LED를 13번 핀에 연결합니다. 

// 조이스틱의 현재상태를 읽어들입니다.
int range = 12;               // 마우스의 X축, Y축의 출력범위를 설정합니다.
int responseDelay = 5;        // 응답대기 시간을 설정합니다.(5ms동안 대기)
int threshold = range/4;      // 한계점을 설정합니다.
int center = range/2;         // 중간값을 설정합니다.

boolean mouseIsActive = false;    // 마우스를 제어할것인지에 대한 여부를 확인합니다.
int lastSwitchState = LOW;        // 이전 스위치 상태를 확인합니다.

void setup() {
  pinMode(switchPin, INPUT);       // 스위치핀을 입력으로 설정합니다.
  pinMode(ledPin, OUTPUT);         // LEDpin을 출력으로 설정합니다.  
 // 마우스컨트롤 명령을 준비합니다.:
  Mouse.begin();
}

void loop() {
  // 스위치의 상태를 읽어들입니다.:
  int switchState = digitalRead(switchPin);
  // 이것이 변하였거나, HIGH 일때, :
  if (switchState != lastSwitchState) {
    if (switchState == HIGH) {
      mouseIsActive = !mouseIsActive;
      //마우스컨트롤을 활성화하고, LED를 켭니다.:
      digitalWrite(ledPin, mouseIsActive);
    } 
  }
  // 스위치버튼의 현재상태를 저장합니다.:
  lastSwitchState = switchState;

  // 두개축의 상태를 읽습니다:
  int xReading = readAxis(A0);
  int yReading = readAxis(A1);

  // 만약 마우스컨트롤이 활성화 되어있고, 마우스가 움직이고 있을때:
  if (mouseIsActive) {
    Mouse.move(xReading, yReading, 0);
  }  

  // 마우스버튼이 눌렸는지 아니면 안눌렸는지를 읽어들입니다.:
  // 만약 마우스버튼이 눌렸다면, 마우스버튼을 눌렀는지 확인합니다.:
  if (digitalRead(mouseButton) == HIGH) {
    
    if (!Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.press(MOUSE_LEFT); 
    }
  } 
  // 만약 누르지 않았다면,현상태를 유지합니다.
  else {
    // if the mouse is pressed, release it:
    if (Mouse.isPressed(MOUSE_LEFT)) {
      Mouse.release(MOUSE_LEFT); 
    }
  }

  delay(responseDelay);
}

/*
 두축의 상태를 읽고 범위를 재설정합니다.
 */

int readAxis(int thisAxis) { 
  //아날로그 입력값을 읽습니다.:
  int reading = analogRead(thisAxis);

  // 아날로그 입력값을 출력값의 범위로 재설정합니다.:
  reading = map(reading, 0, 1023, 0, range);

  // 만약 범위를 초과하면
  // 휴식상태(입력이 없는 상태)를 확인합니다:
  int distance = reading - center;

  if (abs(distance) < threshold) {
    distance = 0;
  } 

  // 해당축의, 거리를 반환합니다.:
  return distance;
}

 

소프트웨어 & 하드웨어 설명

boolean mouseIsActive = false;    // 마우스를 제어할것인지에 대한 여부를 확인합니다.


boolean 변수를 이용하면  참 아니면 거짓을 의미하는 true 또는 false 두 값 가운데 하나를 담을 수 있습니다.

 

 

관련링크

아두이노 공식홈페이지 - 조이스틱 마우스 컨트롤 

kocoafabeditor

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

조이스틱, 아두이노, 레오나르도