ESP32 마이크로파이썬 조이스틱 서보 모터

이 가이드는 MicroPython을 사용하여 ESP32와 조이스틱으로 두 개의 서보 모터 또는 팬-틸트 키트를 제어하는 방법을 보여줍니다.

조이스틱에는 X축과 Y축이라고 불리는 서로 교차하는 패턴으로 배치된 두 개의 제어 구성 요소(포텐셔미터)가 들어 있습니다. 이 포텐셔미터들은 조이스틱의 VRX 및 VRY 핀에서 나오는 X값과 Y값 신호를 생성합니다. 이 신호들은 두 개의 서보 모터를 제어하는 데 사용되는데, X값은 서보 모터 #1을, Y값은 서보 모터 #2를 제어합니다. 팬-틸트 키트와 함께 사용될 때, 이 두 서보 모터는 협력하여 3차원으로 움직입니다.

애플리케이션은 두 가지 방법으로 사용할 수 있습니다:

조이스틱을 놓으면 조이스틱과 서보 모터 모두 초기 위치로 돌아갑니다.

조이스틱을 오른쪽으로 움직이면 서보 모터 #1이 반시계 방향으로 회전합니다.

조이스틱을 위로 움직이면 서보 모터 #2가 시계 방향으로 회전합니다.

조이스틱을 아래로 움직이면 서보 모터 #2가 반시계 방향으로 회전합니다.

조이스틱을 놓으면 서보 모터의 현재 위치가 유지됩니다.

조이스틱의 버튼을 누르면 서보 모터들이 중앙 위치로 리셋됩니다.

ESP32 마이크로파이썬 조이스틱 서보 모터

준비물

1×ESP32 ESP-WROOM-32 개발 모듈 쿠팡 | 아마존
1×USB 케이블 타입-A to 타입-C (USB-A PC용) 쿠팡 | 아마존
1×USB 케이블 타입-C to 타입-C (USB-C PC용) 아마존
1×조이스틱 (Joystick) 쿠팡 | 아마존
2×서보 모터 쿠팡 | 아마존
2×(추천) 서보 모터가 포함된 팬 틸트 키트 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) ESP32용 스크루 터미널 확장 보드 쿠팡 | 아마존
1×(추천) ESP32용 전원 분배기 쿠팡 | 아마존
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

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

만약 ESP32용 조이스틱, 서보 모터 또는 MicroPython 프로그래밍에 익숙하지 않다면, 이 튜토리얼들을 확인해보시길 추천드립니다:

이 튜토리얼들은 조이스틱 및 서보 모터 핀 배열에 대한 포괄적인 이해, 이러한 구성 요소들을 ESP32에 연결하는 방법, 그리고 MicroPython 코드를 사용하여 이들의 동작을 효과적으로 제어하는 방법을 제공합니다.

선연결

  • ESP32를 조이스틱 및 서보 모터와 브레드보드를 사용하여 연결하는 방법
ESP32 마이크로파이썬 조이스틱 서보 모터 배선도

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

ESP32를 조이스틱 및 서보 모터와 연결하는 방법

ESP32 MicroPython 코드

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

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-joystick-servo-motor */ from DIYables_MicroPython_Joystick import Joystick from DIYables_MicroPython_Servo import Servo from machine import Pin, ADC import time JOYSTICK_X_PIN = 36 # The ESP32 pin GPIO36 (ADC0) connected to VRX pin of joystick JOYSTICK_Y_PIN = 39 # The ESP32 pin GPIO39 (ADC3) connected to VRY pin of joystick BUTTON_PIN = 23 # The ESP32 pin GPIO23 connected to SW pin of joystick SERVO_X_PIN = 13 # The ESP32 pin GPIO13 connected to Servo motor 1 SERVO_Y_PIN = 25 # The ESP32 pin GPIO25 connected to Servo motor 2 adc_vrx = ADC(Pin(JOYSTICK_X_PIN)) adc_vry = ADC(Pin(JOYSTICK_Y_PIN)) # Set the ADC width (resolution) to 12 bits adc_vrx.width(ADC.WIDTH_12BIT) adc_vry.width(ADC.WIDTH_12BIT) # Set the attenuation to 11 dB, allowing input range up to ~3.3V adc_vrx.atten(ADC.ATTN_11DB) adc_vry.atten(ADC.ATTN_11DB) joystick = Joystick(pin_x=JOYSTICK_X_PIN, pin_y=JOYSTICK_Y_PIN, pin_button=BUTTON_PIN) # Initialize the two servos xServo = Servo(SERVO_X_PIN) # Use the constant for the X servo pin yServo = Servo(SERVO_Y_PIN) # Use the constant for the Y servo pin # Function to map the joystick value to servo angle def map_value(value, in_min, in_max, out_min, out_max): return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min) # Main loop while True: joystick.loop() # Must be called frequently to process joystick data # Read the X and Y axis values (12-bit resolution from the library) x_value = joystick.read_x() y_value = joystick.read_y() # Map the 12-bit values (0 to 4095) to servo angles (0 to 180 degrees) x_angle = map_value(x_value, 0, 4095, 0, 180) y_angle = map_value(y_value, 0, 4095, 0, 180) # Move the servos to the mapped angles xServo.move_to_angle(x_angle) yServo.move_to_angle(y_angle) # Print the joystick's X and Y values and the corresponding servo angles print(f'Joystick X: {x_value}, Y: {y_value} => Servo X Angle: {x_angle}°, Y Angle: {y_angle}°') time.sleep(0.05) # Delay to reduce the output frequency

자세한 사용 방법

Thonny IDE를 사용하여 ESP32에서 MicroPython 코드를 설정하고 실행하는 방법에 대한 지침은 다음과 같습니다:

  • 컴퓨터에 Thonny IDE가 설치되어 있는지 확인합니다.
  • ESP32 보드에 MicroPython 펌웨어가 로드되어 있는지 확인합니다.
  • MicroPython이 탑재된 ESP32를 처음 사용하는 경우, 단계별 지침은 ESP32 마이크로파이썬 - 시작하기 가이드를 참고하세요.
  • 제공된 다이어그램에 따라 ESP32 보드를 조이스틱 및 서보 모터에 연결합니다.
  • USB 케이블을 이용해 ESP32 보드를 컴퓨터에 연결합니다.
  • 컴퓨터에서 Thonny IDE를 실행합니다.
  • Thonny IDE에서 Tools Options로 이동합니다.
  • Interpreter 탭에서 드롭다운 메뉴에서 MicroPython (ESP32)를 선택합니다.
  • 올바른 포트가 선택되었는지 확인합니다. Thonny IDE는 보통 자동으로 감지하지만, 수동으로 선택해야 할 수도 있습니다(예: Windows의 경우 COM12 또는 Linux의 경우 /dev/ttyACM0).
  • Thonny IDE에서 Tools Manage packages로 이동합니다.
  • “DIYables-MicroPython-Servo”를 검색한 후, DIYables에서 만든 Servo Motor 라이브러리를 찾습니다.
  • DIYables-MicroPython-Servo를 클릭한 다음, Install 버튼을 눌러 Servo Motor 라이브러리를 설치합니다.
ESP32 마이크로파이썬 서보 모터 라이브러리
  • “DIYables-MicroPython-Joystick”을 검색한 후, DIYables에서 만든 Joystick 라이브러리를 찾으세요.
  • DIYables-MicroPython-Joystick을 클릭한 후, Joystick 라이브러리를 설치하기 위해 Install 버튼을 클릭하세요.
ESP32 마이크로파이썬 조이스틱 라이브러리
  • 제공된 MicroPython 코드를 복사하여 Thonny 편집기에 붙여넣으세요.
  • ESP32에 코드를 저장하려면 다음을 수행하세요:
    • 저장 버튼을 클릭하거나 Ctrl+S를 누르세요.
    • 저장 대화상자에서 MicroPython device를 선택하세요.
    • 파일 이름을 main.py로 지정하세요.
  • 녹색 실행 버튼을 클릭하거나(F5 누름) 스크립트를 실행하세요.
  • 조이스틱을 아무 방향으로 밀어보세요.
  • 서보 모터가 회전하는 것을 확인하세요.
  • Thonny 하단의 Shell에서 메시지를 확인하세요.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

※ 주의:

이 튜토리얼은 조이스틱에 연결된 ADC(아날로그-디지털 변환기)로부터 값을 읽기 위해 adc.read() 함수를 사용하는 방법을 보여줍니다. ESP32의 ADC는 고정밀이 필요하지 않은 프로젝트에 적합합니다. 그러나 프로젝트에 정확한 측정값이 필요하다면 다음 사항을 염두에 두십시오:

  • ESP32 ADC는 완벽하게 정확하지 않으며 정밀한 결과를 위해 캘리브레이션이 필요할 수 있습니다. 각 ESP32 보드는 약간씩 다를 수 있으므로 각 보드마다 캘리브레이션이 필요합니다.
  • 캘리브레이션은 특히 초보자에게 도전적일 수 있으며 항상 원하는 정확한 결과를 제공하지 않을 수도 있습니다.

정밀도가 요구되는 프로젝트의 경우, ESP32와 함께 외부 ADC(예: ADS1115) 사용을 고려하거나 더 신뢰할 수 있는 ADC를 가진 Arduino를 선택하십시오. ESP32 ADC를 캘리브레이션하고자 한다면 ESP32 ADC 캘리브레이션 드라이버를 참조하십시오.

ESP32 MicroPython 코드 - 조이스틱으로 서보 모터 제어

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-joystick-servo-motor */ from DIYables_MicroPython_Joystick import Joystick from DIYables_MicroPython_Servo import Servo from machine import Pin, ADC import time JOYSTICK_X_PIN = 36 # The ESP32 pin GPIO36 (ADC0) connected to VRX pin of joystick JOYSTICK_Y_PIN = 39 # The ESP32 pin GPIO39 (ADC3) connected to VRY pin of joystick BUTTON_PIN = 23 # The ESP32 pin GPIO23 connected to SW pin of joystick SERVO_X_PIN = 13 # The ESP32 pin GPIO13 connected to Servo motor 1 SERVO_Y_PIN = 25 # The ESP32 pin GPIO25 connected to Servo motor 2 adc_vrx = ADC(Pin(JOYSTICK_X_PIN)) adc_vry = ADC(Pin(JOYSTICK_Y_PIN)) # Set the ADC width (resolution) to 12 bits adc_vrx.width(ADC.WIDTH_12BIT) adc_vry.width(ADC.WIDTH_12BIT) # Set the attenuation to 11 dB, allowing input range up to ~3.3V adc_vrx.atten(ADC.ATTN_11DB) adc_vry.atten(ADC.ATTN_11DB) joystick = Joystick(pin_x=JOYSTICK_X_PIN, pin_y=JOYSTICK_Y_PIN, pin_button=BUTTON_PIN) # Initialize the two servos xServo = Servo(SERVO_X_PIN) # Use the constant for the X servo pin yServo = Servo(SERVO_Y_PIN) # Use the constant for the Y servo pin # Define commands COMMAND_NO = 0x00 COMMAND_LEFT = 0x01 COMMAND_RIGHT = 0x02 COMMAND_UP = 0x04 COMMAND_DOWN = 0x08 # Define thresholds and intervals LEFT_THRESHOLD = 1000 RIGHT_THRESHOLD = 3000 UP_THRESHOLD = 1000 DOWN_THRESHOLD = 3000 UPDATE_INTERVAL = 100 # 100ms # Initialize variables xAngle = 90 # The center position of servo #1 yAngle = 90 # The center position of servo #2 command = COMMAND_NO last_update_time = time.ticks_ms() # Function to ensure the angle stays within the 0 to 180 degree range def limit_angle(angle): if angle < 0: return 0 elif angle > 180: return 180 return angle while True: joystick.loop() # Process joystick data current_time = time.ticks_ms() if time.ticks_diff(current_time, last_update_time) > UPDATE_INTERVAL: last_update_time = current_time # Read X and Y analog values x_value = joystick.read_x() y_value = joystick.read_y() # Reset command command = COMMAND_NO # Check left/right commands if x_value < LEFT_THRESHOLD: command |= COMMAND_LEFT elif x_value > RIGHT_THRESHOLD: command |= COMMAND_RIGHT # Check up/down commands if y_value < UP_THRESHOLD: command |= COMMAND_UP elif y_value > DOWN_THRESHOLD: command |= COMMAND_DOWN # Print and process commands if command & COMMAND_LEFT: print("COMMAND LEFT") xAngle -= 1 if command & COMMAND_RIGHT: print("COMMAND RIGHT") xAngle += 1 if command & COMMAND_UP: print("COMMAND UP") yAngle -= 1 if command & COMMAND_DOWN: print("COMMAND DOWN") yAngle += 1 # Limit the angles to the range of 0 to 180 degrees xAngle = limit_angle(xAngle) yAngle = limit_angle(yAngle) # Handle button press if joystick.is_pressed(): print("The button is pressed") xAngle = 90 # Reset to center position yAngle = 90 # Move servos to the calculated angles xServo.move_to_angle(xAngle) yServo.move_to_angle(yAngle) # Print servo angles to console print(f"Servo Motor's Angle: {xAngle}°, {yAngle}°")

자세한 사용 방법

  • 위 코드를 복사하여 Thonny IDE의 편집기에 붙여넣으세요.
  • 스크립트를 ESP32 보드에 저장하세요.
  • 녹색 Run 버튼을 클릭하거나 (또는 F5를 눌러) 스크립트를 실행하세요.
  • 조이스틱을 아무 방향으로나 움직이세요.
  • 서보 모터가 회전하는 것을 관찰하세요.
  • Thonny 하단의 Shell에서 메시지를 확인하세요.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

코드 설명

소스 코드의 주석에 있는 설명을 확인하세요.

동영상

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