아두이노 조이스틱 서보 모터

이 튜토리얼에서는 아두이노와 조이스틱을 사용하여 두 개의 서보 모터 또는 서보가 장착된 팬-틸트 키트를 제어하는 방법을 배울 것입니다.

조이스틱에는 서로 직각으로 배치된 두 개의 내장된 가변 저항기( X축과 Y축이라고 함)가 있습니다. 이 가변 저항기들은 VRX와 VRY 핀에 아날로그 값을( X값과 Y값이라고 함) 출력합니다. 우리는 이 아날로그 값을 사용하여 두 개의 서보 모터를 독립적으로 제어할 것입니다: X값은 서보 #1을 제어하고 Y값은 서보 #2를 제어합니다. 팬-틸트 키트의 경우, 두 서보 모터의 움직임은 3-D 움직임을 만듭니다.

두 가지 애플리케이션 사용 사례가 있습니다:

사례 1: 조이스틱의 엄지 움직임에 따라 서보 모터가 회전합니다:

사례 2: 조이스틱을 사용하여 서보 모터에 명령합니다(위/아래/좌/우 명령)

다음 파트에서 두 가지 사용 사례에 대한 코드를 탐색할 것입니다.

아두이노 조이스틱 서보 모터

준비물

1×아두이노 우노 R3 쿠팡 | 아마존
1×USB 2.0 타입 A-to-B 케이블 (USB-A PC용) 쿠팡 | 아마존
1×USB 2.0 타입 C-to-B 케이블 (USB-C PC용) 아마존
1×조이스틱 (Joystick) 쿠팡 | 아마존
2×서보 모터 쿠팡 | 아마존
2×(추천) 서보 모터가 포함된 팬 틸트 키트 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 아두이노 우노용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino Uno 쿠팡 | 아마존
1×(추천) 아두이노 우노용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

조이스틱과 서보 모터에 대하여

조이스틱과 서보 모터(핀아웃, 작동 방식, 프로그래밍 방법 등)에 대해 잘 모른다면, 다음 튜토리얼에서 그들에 대해 알아보세요:

선연결

아두이노 조이스틱 서보 모터 연결 배선도

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

아두이노 코드

아두이노 코드 - 조이스틱의 엄지 움직임에 따라 서보 모터가 회전합니다.

/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-joystick-servo-motor */ #include <Servo.h> #define VRX_PIN A0 // 아두이노 핀 VRX와 연결됨 #define VRY_PIN A1 // 아두이노 핀 VRY와 연결됨 #define SERVO_X_PIN 2 // 서보 모터 1에 연결된 아두이노 핀 #define SERVO_Y_PIN 3 // 서보 모터 2에 연결된 아두이노 핀 Servo xServo; // 서보 1을 제어하기 위한 서보 객체 생성 Servo yServo; // 서보 2를 제어하기 위한 서보 객체 생성 void setup() { Serial.begin(9600) ; xServo.attach(SERVO_X_PIN); yServo.attach(SERVO_Y_PIN); } void loop() { // 아날로그 X와 Y 아날로그 값을 읽기 int xValue = analogRead(VRX_PIN); int yValue = analogRead(VRY_PIN); int xAngle = map(xValue, 0, 1023, 0, 180); // 서보의 각도(0에서 180)에 맞게 조정 int yAngle = map(yValue, 0, 1023, 0, 180); // 서보의 각도(0에서 180)에 맞게 조정 xServo.write(xAngle); // 서보 모터 1 회전 yServo.write(yAngle); // 서보 모터 2 회전 // 아두이노 IDE의 시리얼 모니터에 데이터 출력 Serial.print("Joystick: "); Serial.print(xValue); Serial.print(", "); Serial.print(yValue); Serial.print(" => Servo Motor: "); Serial.print(xAngle); Serial.print("°, "); Serial.print(yAngle); Serial.println("°"); }

사용 방법

  • 아두이노를 USB 케이블을 통해 PC에 연결하세요
  • 아두이노 IDE를 열고, 올바른 보드와 포트를 선택하세요
  • 위의 코드를 복사하고 아두이노 IDE로 열어주세요
  • 아두이노 IDE에서 Upload 버튼을 클릭하여 코드를 아두이노에 업로드하세요
아두이노 코딩
  • 시리얼 모니터 열기
  • 조이스틱을 어떤 방향으로 밀기
  • 서보 모터의 회전을 확인하기
  • 시리얼 모니터에서 결과 보기
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Coming soon
Ln 11, Col 1
Arduino Uno on COM15
2

아두이노 코드 - 조이스틱을 사용하여 서보 모터를 제어합니다

/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-joystick-servo-motor */ #include <Servo.h> #include <ezButton.h> #define VRX_PIN A0 // Arduino 핀이 VRX 핀에 연결됨 #define VRY_PIN A1 // Arduino 핀이 VRY 핀에 연결됨 #define SW_PIN 2 // Arduino 핀이 SW 핀에 연결됨 #define SERVO_X_PIN 2 // Arduino 핀이 서보 모터 1에 연결됨 #define SERVO_Y_PIN 3 // Arduino 핀이 서보 모터 2에 연결됨 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 #define LEFT_THRESHOLD 400 #define RIGHT_THRESHOLD 800 #define UP_THRESHOLD 400 #define DOWN_THRESHOLD 800 #define UPDATE_INTERVAL 100 // 100밀리초 ezButton button(SW_PIN); Servo xServo; // 서보 제어를 위한 서보 객체 생성 1 Servo yServo; // 서보 제어를 위한 서보 객체 생성 2 int xValue = 0 ; // X축의 값 저장 int yValue = 0 ; // Y축의 값 저장 int xAngle = 90; // 서보 #1의 중심 위치 int yAngle = 90; // 서보 #2의 중심 위치 int command = COMMAND_NO; unsigned long lastUpdateTime = 0; void setup() { Serial.begin(9600) ; xServo.attach(SERVO_X_PIN); yServo.attach(SERVO_Y_PIN); button.setDebounceTime(50); // 디바운스 시간을 50밀리초로 설정 } void loop() { button.loop(); // 반드시 loop() 함수 먼저 호출해야 함 if (millis() - lastUpdateTime > UPDATE_INTERVAL) { lastUpdateTime = millis() ; // 아날로그 X, Y 값 읽기 xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN); // 아날로그 값을 명령어로 변환 // 명령어 초기화 command = COMMAND_NO; // 좌우 명령어 확인 if (xValue < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (xValue > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // 상하 명령어 확인 if (yValue < UP_THRESHOLD) command = command | COMMAND_UP; else if (yValue > DOWN_THRESHOLD) command = command | COMMAND_DOWN; // 주의: 한 시점에 명령어가 없거나 하나 또는 두 개의 명령어가 있을 수 있음 // 명령어를 시리얼로 출력하고 명령어 처리 if (command & COMMAND_LEFT) { Serial.println("COMMAND LEFT"); xAngle--; } if (command & COMMAND_RIGHT) { Serial.println("COMMAND RIGHT"); xAngle++; } if (command & COMMAND_UP) { Serial.println("COMMAND UP"); yAngle--; } if (command & COMMAND_DOWN) { Serial.println("COMMAND DOWN"); yAngle++; } } if (button.isPressed()) { Serial.println("The button is pressed"); xAngle = 90; // 서보 #1의 중심 위치 yAngle = 90; // 서보 #2의 중심 위치 } xServo.write(xAngle); // 서보 모터 1 회전 yServo.write(yAngle); // 서보 모터 2 회전 // 아두이노 IDE의 시리얼 모니터로 데이터 출력 Serial.print("Servo Motor's Angle: "); Serial.print(xAngle); Serial.print("°, "); Serial.print(xAngle); Serial.println("°"); }

사용 방법

  • 아두이노 IDE 왼쪽 바의 Libraries 아이콘으로 이동하세요.
  • “ezButton”을 검색한 다음, ArduinoGetStarted.com에서 제공하는 버튼 라이브러리를 찾으세요.
  • EzButton 라이브러리를 설치하려면 Install 버튼을 클릭하세요.
아두이노 버튼 라이브러리
  • 위의 코드를 복사하고 Arduino IDE로 열기
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 Arduino에 업로드하기
  • 시리얼 모니터 열기
  • 조이스틱을 어떤 방향으로 밀기
  • 서보 모터의 회전 보기
  • 시리얼 모니터에서 결과 보기
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Ln 11, Col 1
Arduino Uno on COM15
2

코드 설명

소스 코드의 주석 라인에서 줄별 설명을 읽어보세요!

동영상

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

관련 튜토리얼