본문 바로가기
esp32 보드활용

ESP32 가변저항 활용

by SwMaker_Jun 2026. 9. 28.
728x90
반응형

 

ESP32에서 가변저항 값 읽어오기

이번 실습에서는 ESP32 보드에 **가변저항(Potentiometer)**을 연결하고, 가변저항을 돌렸을 때 변화하는 아날로그 값을 Thonny에서 확인해 보겠습니다.

가변저항은 손잡이를 돌리는 위치에 따라 출력되는 전압이 달라지는 부품입니다. 따라서 ESP32의 아날로그 입력 기능인 **ADC(Analog to Digital Converter)**를 이용하면 가변저항의 위치를 숫자로 변환하여 읽을 수 있습니다.

1. 가장 간단하게 가변저항 값 읽어보기

먼저 다음과 같이 코드를 작성해 볼 수 있습니다.

가변저항
왼쪽핀 - GND
가운데 - 아날로그핀
오른쪽 - VCC

 

===============================================

기본예제 

from machine import ADC, Pin
import time

pot = ADC(Pin(34))

while True:
    value = pot.read()
    print(value)
    time.sleep(0.1)

 

===============================================

 

코드를 한 줄씩 살펴보겠습니다.

from machine import ADC, Pin

ESP32의 GPIO 핀과 ADC 기능을 사용하기 위해 machine 모듈에서 Pin과 ADC를 가져옵니다.

Pin은 ESP32의 GPIO 핀을 사용하기 위한 기능이고, ADC는 아날로그 전압을 디지털 값으로 변환하기 위한 기능입니다.

pot = ADC(Pin(34))

GPIO 34번 핀을 ADC 입력으로 사용하도록 설정합니다.

여기에서 pot은 가변저항의 값을 읽기 위해 만들어 놓은 ADC 객체입니다.

따라서 이후에는 pot을 이용하여 GPIO 34번 핀으로 들어오는 아날로그 신호를 읽을 수 있습니다.

value = pot.read()

가변저항에서 들어오는 전압을 ADC 값으로 읽어 value 변수에 저장합니다.

ESP32의 ADC는 일반적으로 12비트 값을 사용하기 때문에 다음과 같은 범위의 숫자로 표현할 수 있습니다.

0 ~ 4095

가변저항을 한쪽 끝으로 돌리면 0에 가까운 값이 나오고, 반대쪽으로 돌리면 큰 값이 나오게 됩니다.

print(value)

측정한 값을 Thonny의 Shell 화면에 출력합니다.

time.sleep(0.1)

0.1초마다 새로운 가변저항 값을 측정하도록 잠시 기다립니다.

 

 

 

2. 그런데 가변저항을 끝까지 돌렸는데 4095가 나오지 않는다?

위 코드는 문법적으로 잘못된 코드가 아닙니다.

실제로 가변저항의 변화도 확인할 수 있습니다.

하지만 실습하다 보면 한 가지 의문이 생길 수 있습니다.

“가변저항을 끝까지 돌렸는데 왜 4095까지 값이 올라가지 않을까?”

그 이유는 ESP32의 ADC에는 입력 전압을 어느 범위까지 측정할 것인지 설정하는 기능이 있기 때문입니다.

가변저항의 양쪽을 ESP32의 3.3V와 GND에 연결했다면 가운데 핀에서는 약 0V부터 3.3V까지의 전압이 출력될 수 있습니다.

따라서 이 범위를 보다 넓게 측정할 수 있도록 ADC의 입력 범위를 설정해 주는 것이 좋습니다.


3. ADC 입력 범위를 설정해 보자

===============================================

다음과 같이 코드를 수정합니다.

from machine import Pin, ADC
import time

# 가변저항을 GPIO34에 연결
pot = ADC(Pin(34))

# ADC 입력 전압 범위 설정
pot.atten(ADC.ATTN_11DB)

while True:
    value = pot.read()

    print("가변저항 값:", value)

    time.sleep(0.2)

 

===============================================

 

 

기존 코드와 비교하면 새로운 명령어가 하나 추가되었습니다.

pot.atten(ADC.ATTN_11DB)

여기서 atten은 **Attenuation(감쇠)**을 의미합니다.

ESP32의 ADC로 들어오는 전압을 내부적으로 조절하여 더 넓은 입력 전압 범위를 측정할 수 있도록 설정하는 기능입니다.

ADC.ATTN_11DB를 설정하면 가변저항처럼 0~3.3V 범위의 신호를 사용하는 센서나 입력 장치를 측정할 때 적합한 ADC 범위를 사용할 수 있습니다.

※ ESP32의 종류와 MicroPython 버전에 따라 실제 측정 가능한 전압 범위와 ADC 특성에는 차이가 있을 수 있습니다.


 

4. 두 코드의 차이 이해하기

처음 작성했던 코드는

pot = ADC(Pin(34))

처럼 GPIO 34번을 ADC로 사용하겠다는 것만 설정했습니다.

수정한 코드에서는 여기에

pot.atten(ADC.ATTN_11DB)

를 추가하여 가변저항에서 들어오는 넓은 전압 범위를 측정하도록 ADC의 입력 범위까지 설정했습니다.

따라서 두 코드의 차이는 다음과 같이 이해할 수 있습니다.

처음 코드

GPIO34 → ADC로 사용 → 값 읽기

수정 코드

GPIO34 → ADC로 사용 → 입력 전압 범위 설정 → 값 읽기

즉, 첫 번째 코드는 ADC의 기본 사용 방법을 배우기 좋은 코드이고, 두 번째 코드는 3.3V를 사용하는 ESP32의 가변저항 실습에서 ADC 범위를 명시적으로 설정한 코드라고 볼 수 있습니다.


 

 

 

5. 최종 코드

가변저항의 값을 지속적으로 확인하는 최종 코드는 다음과 같습니다.

from machine import Pin, ADC
import time

# GPIO34를 ADC 입력으로 설정
pot = ADC(Pin(34))

# 넓은 입력 전압 범위를 사용하도록 설정
pot.atten(ADC.ATTN_11DB)

while True:

    # 가변저항 값 읽기
    value = pot.read()

    # 측정값 출력
    print("가변저항 값:", value)

    # 0.2초 대기
    time.sleep(0.2)

가변저항을 천천히 돌려 보면서 Thonny의 Shell에 출력되는 값이 어떻게 변하는지 확인해 봅시다.

가변저항 값: 25
가변저항 값: 487
가변저항 값: 1321
가변저항 값: 2517
가변저항 값: 3892
가변저항 값: 4095

이번 실습에서 중요한 것은 단순히 가변저항의 값을 읽는 것뿐만 아니라, 아날로그 전압이 ADC를 통해 디지털 숫자로 변환되는 과정을 이해하는 것입니다.

이렇게 읽어 온 값은 이후 LED 밝기 조절, 서보모터 각도 조절, 모터 속도 조절 등 다양한 피지컬 컴퓨팅 프로젝트의 입력값으로 활용할 수 있습니다.

 

 

 

 

 

 

6. 가변저항 값을 LED 밝기로 변환하기

가변저항의 최대값 4095를 LED PWM의 최대값 65535로 변환하면 됩니다.

다음과 같은 계산식을 사용할 수 있습니다.

brightness = int(value / 4095 * 65535)

예를 들어 가변저항 값이 약 절반인 2048이라면,

가변저항 : 약 2048
     ↓
LED PWM : 약 32768

이 되어 LED도 대략 중간 정도의 밝기로 켜지게 됩니다.


 

================================

 

6. 가변저항으로 LED 밝기 제어하기

이제 앞에서 배운 ADC와 PWM을 하나의 프로그램으로 연결해 봅시다.

from machine import Pin, ADC, PWM
import time

# 가변저항 설정
pot = ADC(Pin(34))
pot.atten(ADC.ATTN_11DB)

# LED PWM 설정
led = PWM(Pin(25))
led.freq(1000)

while True:

    # 가변저항 값 읽기
    value = pot.read()

    # 0~4095 값을 0~65535 값으로 변환
    brightness = int(value / 4095 * 65535)

    # LED 밝기 조절
    led.duty_u16(brightness)

    # 값 확인
    print("가변저항:", value,
          "LED 밝기:", brightness)

    time.sleep(0.1)

가변저항을 한쪽으로 돌리면 LED가 어두워지고, 반대쪽으로 돌리면 LED가 점점 밝아지는 것을 확인할 수 있습니다.


7. 코드의 동작 과정 이해하기

핵심 코드를 다시 살펴보겠습니다.

value = pot.read()

먼저 가변저항의 위치를 0~4095 범위의 숫자로 읽습니다.

↓

brightness = int(value / 4095 * 65535)

가변저항 값을 LED에서 사용할 수 있는 0~65535 범위로 변환합니다.

↓

led.duty_u16(brightness)

변환된 값을 PWM 출력으로 전달하여 LED의 밝기를 조절합니다.

결국 이번 프로그램은 다음과 같은 구조를 가지고 있습니다.

[입력]                 [처리]                 [출력]

가변저항  ─────→  값의 범위 변환  ─────→  LED
ADC 값            0~4095 → 0~65535          PWM 밝기

이것은 피지컬 컴퓨팅에서 매우 중요한 입력 → 처리 → 출력 구조의 기본적인 예입니다.


도전 과제

가변저항을 돌렸을 때 LED가 밝아지는 방향을 반대로 만들어 봅시다.

현재 프로그램은

가변저항 값 ↑ → LED 밝기 ↑

로 동작합니다.

이번에는

가변저항 값 ↑ → LED 밝기 ↓

가 되도록 프로그램을 수정해 봅시다.

힌트

brightness = 65535 - ?

가변저항의 입력값을 어떻게 변환해야 할지 생각해 봅시다.

728x90
반응형