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

이 튜토리얼에서 우리는 조이스틱을 아두이노 나노 ESP32와 함께 사용하는 방법을 배울 것입니다. 구체적으로, 우리는 다음을 배울 것입니다:

Joystick Pinout

준비물

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

조이스틱 센서에 관하여

당신은 아마도 조이스틱을 게임 컨트롤러, 장난감 조종기 또는 심지어 큰 실제 기계인 굴착기 조종기와 같은 곳에서 본 적이 있을 것입니다.

조이스틱은 서로 직각으로 배치된 두 개의 포텐쇼미터와 하나의 푸시 버튼으로 구성됩니다. 따라서, 이는 다음과 같은 출력을 제공합니다:

  • 수평 위치(엑스 좌표라고 함)에 해당하는 아날로그 값(0에서 4095까지)
  • 수직 위치(와이 좌표라고 함)에 해당하는 아날로그 값(0에서 4095까지)
  • 푸시버튼의 디지털 값(높음 또는 낮음)

두 개의 아날로그 값의 조합은 조이스틱이 휴식 위치에 있을 때 중심이 되는 값과 함께 2-D 좌표를 생성할 수 있습니다. 좌표의 실제 방향은 다음 부분에서 테스트 코드를 실행할 때 쉽게 식별할 수 있습니다.

일부 애플리케이션은 세 가지 출력 모두를 사용할 수도 있고, 일부 애플리케이션은 세 가지 출력 중 일부를 사용할 수도 있습니다.

핀배열

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

  • GND 핀: GND(0V)에 연결해야 합니다.
  • VCC 핀: VCC(3.3V)에 연결해야 합니다.
  • VRX 핀: 수평 위치(일명 X-좌표)에 해당하는 아날로그 값을 출력합니다.
  • VRY 핀: 수직 위치(일명 Y-좌표)에 해당하는 아날로그 값을 출력합니다.
  • SW 핀: 조이스틱 내부의 푸시버튼에서 나오는 출력입니다. 일반적으로 개방되어 있습니다. 이 핀에 풀업 저항을 사용하면, SW 핀은 눌리지 않았을 때 HIGH이고, 눌렀을 때는 LOW가 됩니다.
Joystick Pinout

작동 원리

조이스틱의 엄지 부분을 왼쪽/오른쪽으로 밀 때, VRX 핀의 전압이 변합니다. 전압 범위는 0에서 3.3V까지입니다(왼쪽에서 0, 오른쪽에서 3.3V). 전압 값은 엄지의 위치에 비례합니다 ⇒ ESP32의 아날로그 핀에서의 읽기 값은 0에서 4095까지입니다.

조이스틱의 엄지 부분을 위/아래로 밀 때, VRY 핀의 전압이 변합니다. 전압 범위는 0에서 3.3V까지입니다(위에서 0, 아래에서 3.3V). 전압 값은 엄지의 위치에 비례합니다 ⇒ ESP32의 아날로그 핀에서의 읽기 값은 0에서 4095까지입니다.

조이스틱의 엄지 부분을 어떤 방향으로 밀 때, VRX 및 VRY 핀의 전압은 각 축에 대한 위치의 투영에 비례하여 변합니다.

조이스틱의 엄지 부분을 위에서 아래로 밀 때, 조이스틱 내부의 푸시버튼이 닫힙니다. 만약 SW 핀에 풀업 저항을 사용한다면, SW 핀에서의 출력은 3.3V에서 0V로 변경됩니다 ⇒ ESP32의 디지털 핀에서의 읽기 값은 HIGH에서 LOW로 변경됩니다.

선연결

Arduino Nano ESP32 Joystick Wiring Diagram

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

조이스틱 프로그래밍 방법

조이스틱에는 두 부분이 있습니다: 아날로그(X, Y 축)와 디지털(푸시버튼)

아날로그 파트(X, Y 축)의 경우, analogRead() 함수를 사용하여 아날로그 입력 핀에서 값을 읽기만 하면 됩니다.

int valueX = analogRead(A0); // A0에서 읽은 아날로그 값을 valueX에 저장 int valueY = analogRead(A1); // A1에서 읽은 아날로그 값을 valueY에 저장

디지털 부분(푸시버튼)의 경우: 버튼입니다. 가장 단순하고 편리한 방법은 ezButton 라이브러리를 사용하는 것입니다. 이 라이브러리는 버튼의 디바운스를 지원하며 내부 풀업 저항을 활성화 할 수 있습니다. 버튼에 대한 자세한 내용은 아두이노 나노 ESP32 - 버튼 튜토리얼에서 확인할 수 있습니다. 코드는 이 튜토리얼의 다음 세션에서 제시될 것입니다.

아날로그 핀에서 값을 읽은 후, 우리는 그것들을 어떤 제어 가능한 값들로 변환해야 할 필요가 있을 수 있습니다. 다음 파트에서는 이를 위한 예제 코드를 제공할 것입니다.

아두이노 나노 ESP32 코드

이 섹션에서는 다음과 같은 Arduino Nano ESP32 예제 코드를 제공할 것입니다:

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

조이스틱에서 아날로그 값을 읽습니다.

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

사용 방법

Arduino Nano ESP32를 시작하려면 다음 단계를 따르세요:

  • Arduino Nano ESP32가 처음이라면, Arduino IDE에서 Arduino Nano ESP32 환경 설정하는 방법에 대한 튜토리얼을 참조하세요. Arduino Nano ESP32 설정 방법 튜토리얼.
  • 제공된 다이어그램에 따라 구성 요소들을 연결하세요.
  • USB 케이블을 사용하여 컴퓨터에 Arduino Nano ESP32 보드를 연결하세요.
  • 컴퓨터에서 Arduino IDE를 실행하세요.
  • Arduino Nano ESP32 보드와 해당하는 COM 포트를 선택하세요.
  • 위의 코드를 복사하여 Arduino IDE에서 열어보세요.
  • Arduino IDE에서 Upload 버튼을 클릭하여 Arduino Nano ESP32에 코드를 업로드하세요.
  • 조이스틱의 손잡이를 최대한 멀리 밀고, 그 다음에는 시계 방향이나 반시계 방향으로 회전하세요.
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

조이스틱을 돌리는 동안 시리얼 모니터를 계속 관찰하세요.

  • X 값이 0이면 현재 위치를 왼쪽으로 표시하거나 기억하세요 ⇒ 반대 방향은 오른쪽입니다.
  • Y 값이 0이면 현재 위치를 위로 표시하거나 기억하세요 ⇒ 반대 방향은 아래입니다.

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

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

사용 방법

  • Arduino IDE의 왼쪽 탐색 바에서 Library Manager 아이콘을 클릭하여 라이브러리 관리자를 엽니다.
  • “ezButton”을 검색한 다음, ArduinoGetStarted.com에 의한 버튼 라이브러리를 찾습니다.
  • EzButton 라이브러리를 설치하려면 Install 버튼을 클릭합니다.
Arduino Nano ESP32 button library
  • 위의 코드를 복사하여 Arduino IDE로 엽니다
  • Arduino Nano ESP32에 코드를 업로드하기 위해 Arduino IDE에서 Upload 버튼을 클릭합니다
  • 조이스틱의 엄지를 왼쪽/오른쪽/위/아래로 밀어넣습니다
  • 조이스틱의 엄지를 위에서 아래로 밀어넣습니다
  • 시리얼 모니터에서 결과를 확인하세요.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

아날로그 값을 이동 좌/우/상/하 명령으로 변환합니다

/* * 이 Arduino Nano ESP32 코드는 newbiely.kr 에서 개발되었습니다 * 이 Arduino Nano ESP32 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino-nano-esp32/arduino-nano-esp32-joystick */ #define VRX_PIN A0 // Arduino Nano ESP32 핀이 VRX 핀에 연결됨 #define VRY_PIN A1 // Arduino Nano ESP32 핀이 VRY 핀에 연결됨 #define LEFT_THRESHOLD 1000 #define RIGHT_THRESHOLD 3000 #define UP_THRESHOLD 1000 #define DOWN_THRESHOLD 3000 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 int valueX = 0 ; // X축 값을 저장 int valueY = 0 ; // Y축 값을 저장 int command = COMMAND_NO; void setup() { Serial.begin(9600) ; } void loop() { // X와 Y 아나로그 값 읽기 valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // 아나로그 값을 명령어로 변환 // 명령어 재설정 command = COMMAND_NO; // 좌/우 명령어 확인 if (valueX < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (valueX > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // 상/하 명령어 확인 if (valueY < UP_THRESHOLD) command = command | COMMAND_UP; else if (valueY > 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"); // 할 일 추가 } }

사용 방법

  • 위의 코드를 복사하여 Arduino IDE로 열기
  • Arduino IDE에서 Upload 버튼을 클릭하여 Arduino Nano ESP32에 코드를 업로드
  • 조이스틱의 손가락을 왼쪽/오른쪽/위/아래 또는 어떤 방향으로든 밀기
  • 시리얼 모니터에서 결과 확인하기.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ NOTE THAT:

한 시점에는 명령이 없을 수도 있고, 하나의 명령이 있거나 두 개의 명령(예: UP과 LEFT를 동시에)이 있을 수 있습니다.

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

아래의 세부 사항은 아두이노 나노 ESP32 - 조이스틱이 서보 모터를 제어합니다 튜토리얼에서 제공됩니다.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, 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!