아두이노 나노 - 조이스틱 | Arduino Nano - Joystick

이 튜토리얼은 여러분이 아두이노 나노와 조이스틱을 사용하는 방법을 지도합니다. 구체적으로, 우리는 다음을 배울 것입니다:

Arduino Nano joystick

준비물

1×Arduino Nano Amazon
1×USB A to Mini-B USB cable 쿠팡 | Amazon
1×Joystick Amazon
1×Jumper Wires Amazon
1×(Optional) 9V Power Adapter for Arduino Nano Amazon
1×(Recommended) Screw Terminal Adapter for Arduino Nano 쿠팡 | Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

2축 조이스틱에 관하여

조이스틱을 게임 컨트롤러, 장난감 컨트롤러 또는 굴착기의 조종판과 같은 큰 기계에서 다양한 곳에서 접할 수 있었을 것입니다.

조이스틱은 서로 수직인 두 개의 포텐쇼미터와 푸시 버튼으로 구성되어 있습니다. 따라서, 다음과 같은 출력을 생성합니다:

  • 아두이노가 읽는 수평 위치(일명 X좌표)에 해당하는 0에서 1023까지의 아날로그 값
  • 아두이노가 읽는 수직 위치(일명 Y좌표)에 해당하는 0에서 1023까지의 아날로그 값
  • 푸시 버튼의 디지털 값(높음 또는 낮음)

따라서:

  • 두 개의 아날로그 값이 합쳐져 2차원 좌표를 생성할 수 있습니다.
  • 2차원 좌표계의 중심은 조이스틱의 휴식 위치입니다.
  • 조이스틱의 방향을 결정하기 위해, 다음 섹션에서 이 정보를 제시할 테스트 코드를 실행하세요.

일부 응용 프로그램은 세 가지 출력 모두를 사용할 수도 있고, 다른 응용 프로그램은 그중 일부만을 사용할 수도 있습니다.

조이스틱 핀배열

조이스틱에는 5개의 핀이 있습니다:

  • GND 핀: 이것은 GND(0V)에 연결되어야 합니다.
  • VCC 핀: 이것은 VCC(5V)에 연결되어야 합니다.
  • VRX 핀: 이것은 수평 위치(일명 X좌표)에 해당하는 아날로그 값을 출력합니다.
  • VRY 핀: 이것은 수직 위치(일명 Y좌표)에 해당하는 아날로그 값을 출력합니다.
  • SW 핀: 이것은 조이스틱 내부의 푸시버튼에서 나오는 출력입니다. 보통 열려있습니다. 이 핀에 풀업 저항이 사용된다면, SW 핀은 눌리지 않았을 때 고전압 상태가 되고, 눌렸을 때 저전압 상태가 됩니다.
joystick pinout

작동 원리

  • 조이스틱의 엄지 조작을 왼쪽이나 오른쪽으로 움직이면, VRX 핀의 전압이 0에서 5V까지 변화하며, 왼쪽이 0이고 오른쪽이 5V입니다. 이는 아두이노의 아날로그 핀에서 0에서 1023까지의 읽기 값으로 결과가 나타납니다.
  • 조이스틱의 엄지 조작을 위쪽이나 아래쪽으로 움직이면, VRY 핀의 전압이 0에서 5V까지 변화하며, 위쪽이 0이고 아래쪽이 5V입니다. 이는 아두이노의 아날로그 핀에서 0에서 1023까지의 읽기 값으로 결과가 나타납니다.
  • 조이스틱의 엄지 조작을 어느 방향으로든 움직이면, VRX와 VRY 핀의 전압이 각 축에 대한 위치의 투영에 비례하여 변경됩니다.
  • 조이스틱의 엄지 조작을 위에서 아래로 누르면, 조이스틱 내부의 푸시버튼이 닫힙니다. SW 핀에 풀업 저항을 사용하면, SW 핀에서의 출력이 5V에서 0V로 변경되어, 아두이노의 디지털 핀에서 읽기 값이 HIGH에서 LOW로 변경됩니다.

선연결

Arduino Nano Joystick wiring diagram

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

조이스틱을 위한 프로그래밍 방법

조이스틱은 두 가지 구성요소로 이루어져 있습니다: 아날로그(X, Y축)와 디지털(푸시버튼)입니다.

아날로그 부분(X, Y 축)의 경우, analogRead() 함수를 사용하여 아날로그 입력 핀에서 값을 단순히 읽으십시오.

int value_X = analogRead(A6); int value_Y = analogRead(A7);

디지털 부품(푸시버튼)에 대해서는 버튼입니다. 가장 간단하고 편리한 사용 방법은 ezButton 라이브러리와 함께 사용하는 것입니다. 이 라이브러리는 버튼의 디바운스 지원뿐만 아니라 내부 풀업 저항도 제공합니다. 버튼에 대해 자세히 알아보려면 Arduino Nano - Button 튜토리얼을 확인할 수 있습니다. 이에 대한 코드는 이 튜토리얼의 다음 세션에서 제시될 것입니다.

아날로그 핀에서 값을 얻은 후, 그 값을 제어 가능한 값으로 변환해야 할 수도 있습니다. 다음 섹션에서는 이를 위한 예제 코드를 제공할 것입니다.

아두이노 나노 코드

이 섹션에서는 다음과 같이 아두이노 나노 예제 코드를 제공할 것입니다:

  • 예제 코드: 조이스틱에서 아날로그 값을 읽기
  • 예제 코드: 조이스틱에서 아날로그 값과 버튼 상태를 읽기
  • 예제 코드: 아날로그 값을 MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN 명령어로 변환하기
  • 예제 코드: 아날로그 값을 각도로 변환하여 두 개의 서보 모터를 제어하기 (예: 팬-틸트 카메라에서)

조이스틱에서 아날로그 값 읽기

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-joystick */ #define VRX_PIN A6 // 아두이노 나노 핀이 VRX 핀에 연결됨 #define VRY_PIN A7 // 아두이노 나노 핀이 VRY 핀에 연결됨 int value_X = 0; // X축의 값을 저장하기 위한 변수 int value_Y = 0; // Y축의 값을 저장하기 위한 변수 void setup() { Serial.begin(9600) ; } void loop() { // 아날로그 X와 Y 아날로그 값 읽기 value_X = analogRead(VRX_PIN); value_Y = analogRead(VRY_PIN); // 아두이노 IDE의 시리얼 모니터에 데이터 출력 Serial.print("x = "); Serial.print(value_X); Serial.print(", y = "); Serial.println(value_Y); delay(200); }

사용 방법

  • 코드를 복사하고 Arduino IDE에서 열어주세요.
  • 코드를 Arduino Nano로 전송하려면 Upload 버튼을 클릭하세요.
  • 조이스틱의 엄지를 최대한 밀고 시계 방향이나 반시계 방향으로 원을 그리며 회전시키세요.
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

조이스틱의 엄지를 돌리면서 시리얼 모니터를 주시하세요.

X 값이 0이면 현재 위치를 왼쪽으로 기록하거나 기억하고, 반대의 경우는 오른쪽으로 합니다.

Y 값이 0이면 현재 위치를 위로 기록하거나 기억하세요. 반대의 경우는 아래입니다.

아날로그 값을 읽고 조이스틱에서 버튼 상태를 읽습니다.

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-joystick */ #include <ezButton.h> #define VRX_PIN A6 // Arduino Nano 핀이 VRX 핀에 연결됨 #define VRY_PIN A7 // Arduino Nano 핀이 VRY 핀에 연결됨 #define SW_PIN 2 // Arduino Nano 핀이 SW 핀에 연결됨 ezButton button(SW_PIN); int value_X = 0; // X 축의 값을 저장하는 변수 int value_Y = 0; // Y 축의 값을 저장하는 변수 int bValue = 0; // 버튼의 값을 저장하는 변수 void setup() { Serial.begin(9600) ; button.setDebounceTime(50); // 디바운스 시간을 50 밀리초로 설정 } void loop() { button.loop(); // 반드시 loop() 함수를 먼저 호출해야 함 // 아날로그 X와 Y의 아날로그 값을 읽음 value_X = analogRead(VRX_PIN); value_Y = analogRead(VRY_PIN); // 버튼 값 읽기 bValue = button.getState(); if (button.isPressed()) { Serial.println("The button is pressed"); // 여기에 뭔가를 실행하세요 } if (button.isReleased()) { Serial.println("The button is released"); // 여기에 뭔가를 실행하세요 } // 아두이노 IDE의 시리얼 모니터에 데이터를 출력 Serial.print("x = "); Serial.print(value_X); Serial.print(", y = "); Serial.print(value_Y); Serial.print(" : button = "); Serial.println(bValue); }

사용 방법

  • Arduino IDE의 왼쪽 바에 있는 Libraries 아이콘을 클릭하세요.
  • “ezButton”을 검색하고 ArduinoGetStarted.com에서 버튼 라이브러리를 찾으세요.
  • 그런 다음, ezButton 라이브러리를 설치하려면 Install 버튼을 클릭하세요.
Arduino Nano button library
  • 아두이노 IDE로 코드를 복사하고 열어주세요.
  • Upload 버튼을 클릭해서 아두이노 나노로 보내세요.
  • 조이스틱의 엄지를 왼쪽, 오른쪽, 위, 아래 방향으로 움직여 보세요.
  • 조이스틱의 엄지를 위에서 눌러보세요.
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

아날로그 값을 왼쪽/오른쪽/위/아래 이동 명령으로 변환합니다

/* * 이 Arduino Nano 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano/arduino-nano-joystick */ #define VRX_PIN A6 // VRX 핀에 연결된 아두이노 나노 핀 #define VRY_PIN A7 // VRY 핀에 연결된 아두이노 나노 핀 #define LEFT_THRESHOLD 400 #define RIGHT_THRESHOLD 800 #define UP_THRESHOLD 400 #define DOWN_THRESHOLD 800 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 int value_X = 0 ; // X 축의 값을 저장하는 변수 int value_Y = 0 ; // Y 축의 값을 저장하는 변수 int command = COMMAND_NO; void setup() { Serial.begin(9600) ; } void loop() { // 아날로그 X와 Y 값을 읽음 value_X = analogRead(VRX_PIN); value_Y = analogRead(VRY_PIN); // 아날로그 값을 명령으로 변환 // 명령을 초기화 command = COMMAND_NO; // 좌/우 명령을 확인 if (value_X < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (value_X > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // 상/하 명령을 확인 if (value_Y < UP_THRESHOLD) command = command | COMMAND_UP; else if (value_Y > DOWN_THRESHOLD) command = command | COMMAND_DOWN; // 주의: 한 시점에는 명령이 없거나 한 개 혹은 두 개의 명령이 있을 수 있음 // 명령을 시리얼로 출력하고 명령 처리 if (command & COMMAND_LEFT) { Serial.println("COMMAND LEFT"); // 할 일: 여기에 작업 추가 } if (command & COMMAND_RIGHT) { Serial.println("COMMAND RIGHT"); // 할 일: 여기에 작업 추가 } if (command & COMMAND_UP) { Serial.println("COMMAND UP"); // 할 일: 여기에 작업 추가 } if (command & COMMAND_DOWN) { Serial.println("COMMAND DOWN"); // 할 일: 여기에 작업 추가 } }

사용 방법

  • 아두이노 IDE로 코드를 복사하여 엽니다.
  • IDE에서 Upload 버튼을 클릭하여 코드를 아두이노 나노로 전송합니다.
  • 엄지로 조이스틱을 아무 방향으로 움직입니다.
  • 시리얼 모니터에서 결과를 확인합니다.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ NOTE THAT:

어떤 주어진 순간에는, 명령이 없거나 한 가지 명령, 또는 두 가지 명령(예: 상하와 좌우 동시에)이 있을 수 있습니다.

아날로그 값을 각도로 변환하여 두 개의 서보 모터를 제어합니다

튜토리얼에서 자세한 내용을 확인할 수 있습니다. 제목은 Arduino Nano - 조이스틱으로 서보 모터 제어하기입니다.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!