ESP32 마이크로파이썬 조이스틱

이 튜토리얼은 ESP32와 MicroPython을 사용하여 조이스틱을 다루는 방법을 안내합니다. 자세히 말하면, 우리는 다음을 배우게 됩니다:

ESP32 마이크로파이썬 및 조이스틱

준비물

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

조이스틱 소개

당신은 게임, 장난감 또는 굴삭기와 같은 대형 기계를 제어하는 데 사용되는 조이스틱을 본 적이 있을 것입니다. 조이스틱은 정사각형 형태로 배열된 두 개의 포텐셔미터와 버튼으로 구성되어 있습니다. 다음과 같은 출력 값을 제공합니다:

  • 수평(좌-우) 위치의 범위는 0부터 4095까지입니다.
  • 수직(상-하) 위치의 범위는 0부터 4095까지입니다.
  • 버튼의 상태는 ON(HIGH) 또는 OFF(LOW)입니다.

두 개의 아날로그 값을 결합함으로써, 조이스틱은 휴식 상태에서 중앙에 위치한 2차원 좌표를 생성합니다. 다음 섹션에서 다룰 테스트 코드를 사용하여 이 좌표들의 실제 방향을 확인할 수 있습니다. 일부 응용 프로그램은 세 가지 출력 모두를 사용할 수 있는 반면, 다른 응용 프로그램은 일부만 사용할 수 있습니다.

핀아웃

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

  • GND 핀: 접지(0V)에 연결됩니다.
  • VCC 핀: ESP32의 3.3V 전원에 연결됩니다.
  • VRX 핀: 수평 위치(X좌표)를 위한 아날로그 값을 제공하며, 이 핀은 ESP32의 ADC 핀에 연결됩니다.
  • VRY 핀: 수직 위치(Y좌표)를 위한 아날로그 값을 제공하며, 이 핀은 ESP32의 ADC 핀에 연결됩니다.
  • SW 핀: 보통 열려 있는 조이스틱의 푸시 버튼에 연결되며, 버튼이 눌리지 않았을 때는 풀업 저항을 사용하여 이 핀을 HIGH 상태로 유지하고, 버튼이 눌렸을 때는 LOW 상태로 유지합니다.
조이스틱 핀아웃

작동 방식

  • 좌/우 이동:
    • 조이스틱을 왼쪽이나 오른쪽으로 이동하면 VRX 핀의 전압이 변화됩니다.
    • 왼쪽으로 이동하면 전압이 0V로 감소하고, 오른쪽으로 이동하면 전압이 3.3V로 증가합니다.
    • ESP32는 이 전압을 측정하여 0에서 4095 사이의 숫자로 변환하는데, 0V는 0에 해당하고 3.3V는 4095에 해당합니다.
  • 상/하 이동:
    • 조이스틱을 위나 아래로 이동하면 VRY 핀의 전압이 영향을 받습니다.
    • 위로 이동하면 전압이 0V로 감소하고, 아래로 이동하면 전압이 3.3V로 증가합니다.
    • ESP32는 이 전압을 읽어 VRX 핀과 유사하게 0에서 4095 사이의 숫자로 변환합니다.
  • 결합된 이동:
    • 어떤 방향으로 조이스틱을 이동하더라도 각 축에 따라 VRX와 VRY 핀의 전압이 함께 변화됩니다.
  • 조이스틱 누르기:
    • 조이스틱을 누르면 내부 버튼이 활성화됩니다.
    • SW 핀에 연결된 풀업 저항 때문에 누를 때 이 핀의 전압이 3.3V에서 0V로 떨어집니다.
    • ESP32는 이를 디지털 신호로 해석하여, 누르지 않았을 때는 HIGH(3.3V)로, 누르면 LOW(0V)로 인식합니다.

    조이스틱을 움직이면 VRX 및 VRY 핀의 전압이 조정되어 ESP32가 이를 0에서 4095 사이의 값으로 읽습니다. 조이스틱을 누르면 SW 핀의 전압이 변하며 ESP32는 이 변화를 HIGH 또는 LOW로 감지합니다.

선연결

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

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

ESP32와 조이스틱을 연결하는 방법

조이스틱 프로그래밍 방법

다행히도, DIYables는 ESP32와 함께 조이스틱을 사용하는 과정을 크게 간소화하는 조이스틱 라이브러리를 개발했습니다.

ESP32 MicroPython 코드 - 조이스틱의 상태 읽기

다음 MicroPython 스크립트:

  • 조이스틱에서 아날로그 값을 읽습니다.
  • 조이스틱의 엄지가 눌렸는지 해제되었는지 확인합니다.
  • 조이스틱의 엄지 누름 횟수를 읽습니다.
/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-joystick */ from DIYables_MicroPython_Joystick import Joystick from machine import Pin, ADC import time VRX_PIN = 39 # The ESP32 pin GPIO39 (ADC3) connected to VRX pin of joystick VRY_PIN = 36 # The ESP32 pin GPIO36 (ADC0) connected to VRY pin of joystick SW_PIN = 17 # The ESP32 pin GPIO17 connected to SW pin of joystick adc_vrx = ADC(Pin(VRX_PIN)) adc_vry = ADC(Pin(VRY_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=VRX_PIN, pin_y=VRY_PIN, pin_button=SW_PIN) # Configure the debounce time if necessary (default is 50ms) joystick.set_debounce_time(100) # debounce time set to 100 milliseconds while True: joystick.loop() # Must be called frequently to process button debouncing # Read the analog values from the X and Y axes x_value = joystick.read_x() y_value = joystick.read_y() press_count = joystick.get_press_count() # Check if the button has been pressed or released if joystick.is_pressed(): print("Button Pressed") if joystick.is_released(): print("Button Released") # Print the joystick's X and Y coordinates, and pressed count print(f'Joystick Position - X: {x_value}, Y: {y_value}, pressed count: {press_count}') time.sleep(0.1) # Delay to reduce the output frequency

자세한 사용 방법

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

  • 컴퓨터에 Thonny IDE가 설치되어 있는지 확인하십시오.
  • ESP32 보드에 MicroPython 펌웨어가 로드되었는지 확인하십시오.
  • MicroPython과 함께 ESP32를 처음 사용하는 경우, 단계별 지침을 위해 ESP32 마이크로파이썬 - 시작하기를 확인하십시오.
  • 제공된 다이어그램에 따라 조이스틱을 ESP32에 연결하십시오.
  • ESP32 보드를 USB 케이블로 컴퓨터에 연결하십시오.
  • 컴퓨터에서 Thonny IDE를 실행하십시오.
  • Thonny IDE에서 도구 옵션으로 이동하십시오.
  • 인터프리터 탭에서 드롭다운 메뉴에서 MicroPython (ESP32)을 선택하십시오.
  • 올바른 포트가 선택되어 있는지 확인하십시오. Thonny IDE는 일반적으로 자동으로 감지하지만, 필요에 따라 수동으로 선택해야 할 수도 있습니다 (예: Windows의 경우 COM12 또는 Linux의 경우 /dev/ttyACM0).
  • Thonny IDE에서 도구 패키지 관리로 이동하십시오.
  • “DIYables-MicroPython-Joystick”을 검색한 후 DIYables가 만든 Joystick 라이브러리를 찾으십시오.
  • DIYables-MicroPython-Joystick을 클릭하고 Install 버튼을 클릭하여 Joystick 라이브러리를 설치하십시오.
ESP32 마이크로파이썬 조이스틱 라이브러리
  • 제공된 MicroPython 코드를 복사하여 Thonny의 편집기에 붙여넣습니다.
  • ESP32에 코드를 저장하려면:
    • 저장 버튼을 클릭하거나 Ctrl+S를 누릅니다.
    • 저장 대화상자에서 MicroPython 디바이스를 선택합니다.
    • 파일 이름을 main.py로 지정합니다.
  • 녹색 실행 버튼을 클릭하거나 (또는 F5 키를 눌러) 스크립트를 실행합니다.
  • 조이스틱을 왼쪽, 오른쪽, 위 또는 아래로 이동합니다.
  • 조이스틱 상단을 눌러줍니다.
  • Thonny 하단의 Shell에서 메시지를 확인합니다.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot MPY: soft reboot Joystick Position - X: 1808, Y: 1869, pressed count: 0 Joystick Position - X: 1415, Y: 1872, pressed count: 0 Joystick Position - X: 0, Y: 0, pressed count: 0 Joystick Position - X: 0, Y: 590, pressed count: 0 Joystick Position - X: 0, Y: 786, pressed count: 0 Joystick Position - X: 0, Y: 1088, pressed count: 0 Joystick Position - X: 0, Y: 1872, pressed count: 0 Joystick Position - X: 0, Y: 2320, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 834, Y: 4095, pressed count: 0 Joystick Position - X: 1802, Y: 4095, pressed count: 0 Joystick Position - X: 2924, Y: 4095, pressed count: 0 Joystick Position - X: 4095, Y: 4095, pressed count: 0 Joystick Position - X: 4095, Y: 0, pressed count: 0 Joystick Position - X: 4095, Y: 0, pressed count: 0 Joystick Position - X: 2672, Y: 0, pressed count: 0 Joystick Position - X: 1152, Y: 0, pressed count: 0 Joystick Position - X: 0, Y: 0, pressed count: 0 Joystick Position - X: 0, Y: 1872, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 4095, Y: 1879, pressed count: 0 Joystick Position - X: 1800, Y: 1883, pressed count: 0 Joystick Position - X: 1805, Y: 1873, pressed count: 0 Joystick Position - X: 4095, Y: 4095, pressed count: 0 Joystick Position - X: 1803, Y: 1870, pressed count: 0 Joystick Position - X: 1797, Y: 1872, pressed count: 0 Button Pressed Joystick Position - X: 1801, Y: 1873, pressed count: 0 Button Pressed Joystick Position - X: 1803, Y: 4095, pressed count: 0 Button Released Joystick Position - X: 1801, Y: 4095, pressed count: 1 Joystick Position - X: 1797, Y: 4095, pressed count: 1 Joystick Position - X: 1805, Y: 4095, pressed count: 1 Joystick Position - X: 1805, Y: 1869, pressed count: 1 Joystick Position - X: 1802, Y: 1877, pressed count: 1 Joystick Position - X: 1802, Y: 1871, pressed count: 1 Button Pressed Joystick Position - X: 1804, Y: 1872, pressed count: 1 Joystick Position - X: 1799, Y: 1861, pressed count: 1 Joystick Position - X: 1805, Y: 1870, pressed count: 1 Joystick Position - X: 1806, Y: 1877, pressed count: 1 Button Released Joystick Position - X: 1805, Y: 1866, pressed count: 2 Joystick Position - X: 1808, Y: 1859, pressed count: 2 Button Pressed Joystick Position - X: 1799, Y: 1874, pressed count: 2 Joystick Position - X: 1808, Y: 1876, pressed count: 2 Joystick Position - X: 1803, Y: 1874, pressed count: 2 Joystick Position - X: 4095, Y: 4095, pressed count: 2 Button Released Joystick Position - X: 4095, Y: 4095, pressed count: 3 Joystick Position - X: 4095, Y: 4095, pressed count: 3
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

조이스틱을 사용할 때, Thonny 하단의 Shell에 표시되는 메시지를 확인하십시오. X 값이 0이면 왼쪽 위치를 나타내며, 그렇지 않으면 오른쪽 위치를 나타냅니다. Y 값이 0이면 위쪽 위치를 나타내며, 그렇지 않으면 아래쪽 위치를 나타냅니다.

이론적으로 X/Y 값의 범위가 0부터 4095까지이나, 실제로는 조이스틱의 기계적 특성으로 인해 이러한 극단적인 값에 도달하지 않을 수 있음을 유념하세요. 이러한 변동은 대부분의 응용 분야에서 정상적이고 허용됩니다.

※ 주의:

이 튜토리얼은 조이스틱에 연결된 ADC(아날로그-디지털 변환기)에서 값을 읽기 위해 adc.read() 함수를 사용하는 방법을 보여줍니다. ESP32의 ADC는 정밀도가 높지 않은 프로젝트에 적합하지만, 프로젝트에서 정확한 측정이 필요할 경우 아래 사항을 유념하십시오:

  • ESP32 ADC는 완벽하게 정확하지 않으며, 정밀한 결과를 얻기 위해서는 보정이 필요할 수 있습니다. 각 ESP32 보드는 약간씩 다를 수 있으므로, 개별 보드마다 보정이 필요합니다.
  • 보정은 특히 초보자에게는 어려울 수 있으며, 원하는 정확한 결과를 항상 보장하지 않을 수 있습니다.

정밀도가 중요한 프로젝트의 경우, ESP32와 함께 외부 ADC(예: ADS1115)를 사용하거나, 더욱 신뢰할 수 있는 ADC를 제공하는 Arduino를 고려해 보십시오. ESP32 ADC 보정을 원한다면, ESP32 ADC Calibration Driver를 참조하십시오.

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

아래의 MicroPython 코드는 아날로그 값을 명령어(MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN)로 변환합니다.

/* * 이 ESP32 마이크로파이썬 코드는 newbiely.kr 에서 개발되었습니다 * 이 ESP32 마이크로파이썬 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/esp32-micropython/esp32-micropython-joystick */ from DIYables_MicroPython_Joystick import Joystick from machine import Pin, ADC import time # Constants for threshold values LEFT_THRESHOLD = 1000 RIGHT_THRESHOLD = 3000 UP_THRESHOLD = 1000 DOWN_THRESHOLD = 3000 # Command constants COMMAND_NO = 0x00 COMMAND_LEFT = 0x01 COMMAND_RIGHT = 0x02 COMMAND_UP = 0x04 COMMAND_DOWN = 0x08 VRX_PIN = 39 # The ESP32 pin GPIO39 (ADC3) connected to VRX pin of joystick VRY_PIN = 36 # The ESP32 pin GPIO36 (ADC0) connected to VRY pin of joystick SW_PIN = 17 # The ESP32 pin GPIO17 connected to SW pin of joystick adc_vrx = ADC(Pin(VRX_PIN)) adc_vry = ADC(Pin(VRY_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=VRX_PIN, pin_y=VRY_PIN, pin_button=SW_PIN) # Configure the debounce time if necessary (default is 50ms) joystick.set_debounce_time(100) # debounce time set to 100 milliseconds def check_commands(x_value, y_value): command = COMMAND_NO # Check for left/right commands if x_value < LEFT_THRESHOLD: command |= COMMAND_LEFT elif x_value > RIGHT_THRESHOLD: command |= COMMAND_RIGHT # Check for up/down commands if y_value < UP_THRESHOLD: command |= COMMAND_UP elif y_value > DOWN_THRESHOLD: command |= COMMAND_DOWN return command while True: x_value = joystick.read_x() y_value = joystick.read_y() command = check_commands(x_value, y_value) if command & COMMAND_LEFT: print("COMMAND LEFT") if command & COMMAND_RIGHT: print("COMMAND RIGHT") if command & COMMAND_UP: print("COMMAND UP") if command & COMMAND_DOWN: print("COMMAND DOWN") time.sleep(0.5) # Delay to reduce the output frequency

자세한 사용 방법

  • 위의 코드를 복사하여 Thonny IDE의 에디터에 붙여넣습니다.
  • 스크립트를 ESP32 보드에 저장합니다.
  • 스크립트를 실행하기 위해 녹색 Run 버튼을 클릭하거나(F5 키를 누릅니다).
  • 조이스틱을 왼쪽, 오른쪽, 위쪽, 아래쪽 또는 원하는 방향으로 이동합니다.
  • Thonny 하단의 Shell에서 메시지를 확인합니다.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot MPY: soft reboot COMMAND UP COMMAND RIGHT COMMAND DOWN COMMAND DOWN COMMAND DOWN COMMAND RIGHT COMMAND DOWN COMMAND RIGHT COMMAND DOWN COMMAND LEFT COMMAND DOWN
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

※ 주의:

명령이 전혀 없을 수도 있고, 하나의 명령만 있을 수도 있으며, 심지어 동시에 두 개의 명령이 있을 수도 있습니다. 예를 들어 위쪽과 왼쪽 명령이 함께 실행되는 경우와 같습니다.

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

자세한 내용은 이 ESP32 마이크로파이썬 - 조이스틱 - 서보 모터 튜토리얼에서 확인하세요.

동영상

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