코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-08-07 13:11:37
이 예제에서는 게임패드에서 많이 보았던 조이스틱 모듈의 활용법을 알아보고,
마우스 포인터를 컨트롤하는 예제를 학습 해 보겠습니다.
게임패드에 달려있는 이 조이스틱 모듈의 경우
모듈의 커버를 벗겨보면,
이러한 형태의 내부를 볼수 있는데요,
X,Y축으로 회전할수 있는 막대부분과 푸시버튼이 내장되어 있습니다.
기존 4방향 키패드 보다 다양한 방향으로 컨트롤이 가능한 특징이 있습니다.
출처 : DIY LEGO RC CAR - instructables.com
이처럼 RC카의 역동적인 움직임을 제어할수 있는 컨트롤러를 만들수 있습니다.
그럼 본격적으로 조이스틱 모듈의 사용법을 실습을 통해 배워보겠습니다.
NO | 부품명 | 수량 | 상세설명 |
1 | 아두이노 레오나르도 | 1 | 레오나르도 보드 |
2 | 조이스틱 모듈 | 1 | 조이스틱 모듈 |
3 | 브레드보드 | 1 | 브레드보드 |
4 | 10㏀ 저항 | 1 | 저항 |
5 | 점퍼 케이블 | 7 | 점퍼 케이블 |
6 | 푸시버튼 | 1 | 푸시버튼 |
부품명 | 아두이노 레오나르도 | 10㏀ 저항 | 브레드보드 | 점퍼케이블 | 푸시 버튼 | 조이스틱 모듈 |
파트 | x1 | x1 | x1 | x7 | x1 | x1 |
아래의 코드를 아두이노에 업로드 합니다.
/*
출처 : 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
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!