• Skip to primary navigation
  • Skip to main content
  • Skip to primary sidebar
  • Skip to footer

IoTmaker

사물인터넷에 대한 모든 것 여기서 해결하셔요!

  • 홈
  • 책:마이크로파이썬을 활용한 사물인터넷
  • 책:따라 하면서 배우는 사물인터넷
  • 온라인 교육 코스
  • 새로운 소식
  • 의견보내기
  • 내 수강정보
  • 로그인
  • 회원가입

ESP32의 아나로그 핀 사용법

2021-02-01 작성자 IoTmaker 댓글 달기

책에서 사용하는 부품 구입하기

 1  아나로그 입력

ESP32를 사용하는 개발 보드에서 아나로그 입력 핀을 사용하는 방법을 설명합니다.

아나로그 입력에 사용할 수 있는 핀

마이크로컨트롤러에는 아나로그 전압을 읽어서 디지털 형식의 숫자로 알려주는 장치가 있는데 이 것을 ADC(Analog to Digital Converter)라고 합니다. ESP32에는 두 개의 ADC장치가 있습니다. ADC장치1에는 8개의 채널이 있는데, 핀(GPIO) 32~39가 연결되어 있습니다. ADC장치2에는 10개의 채널이 있고, 핀(GPIO) 0, 2, 4, 12 ~ 15 ,25 ~ 27이 연결되어 있습니다.

ADC장치2는 WiFi 를 실행할 때 사용되므로 ADC장치2에 연결되어 있는 핀은 아나로그 입력용으로 사용하지 않는 것이 좋습니다. ADC장치1에 연결되어 있는 핀이 8개이긴 해도, 개발보드에 모두 노출되어 있지는 않고, 노출되어 있는 핀도 보드의 사정에 따라 사용이 제한될 수 있습니다. 핀을 제대로 사용하기 위해서는 사전에 개발 보드의 핀 특성을 미리 익혀 두어야 합니다.

[그림1]은 MH-ET LIVE ESP32 Mimikit이라는 ESP32 개발보드의 핀 구성도입니다. 이 보드에는 양쪽에 두줄로 핀이 있는데 안쪽 핀 두줄은 LOLIN(Wemos) D1 mimi의 핀과 호환이 됩니다. 그래서 이 보드에는 LOLIN(Wemos) D1 mini의 실드를 사용할 수 있습니다. (다만 베이스 실드를 사용할 때는 핀 간격 문제로 사용에 제약이 있습니다.)

[그림1] MH-ET LIVE ESP32 minikit 핀 구성도 (출처 www.esp32learning.com)

이 그림에 의하면 GPIO36,39,35,34를 아나로그 입력핀으로 사용하도록 권장하고 있습니다. ADC장치1에 연결되어 있는 나머지 핀(GPIO32,33)을 아나로그 입력핀으로 사용하기 위해서는 상황에 맞는테스트를 한 후, 정상 작동이 되는지 확인하여야 합니다. WiFI를 사용하지 않는 경우에는ADC장치2에 연결되어 있는 핀도 아나로그 입력핀으로 사용할 수 있지만, 다른 기능과 충돌이 되지 않도록 주의하여야 합니다.

ADC의 해상도(resolution)

입력된 아나로그 전압을 디지털 숫자로 표현할 때 그 정밀도를 해상도(또는 분해능)라고 합니다. ESP32의 해상도는 12비트이므로 입력되는 전압을 4096(=212) 단계로 나누어서 표시합니다. 그래서 0V는 0이 되고 최대 측정 전압이면 4095(=212-1)가 됩니다.

3.3V 기준의 개발보드에서 아나로그 핀에 걸리는 전압을 읽으면 0~4095의 값을 얻게 됩니다. 만약 핀에서 읽은 값이 512라면 핀에 걸리는 전압은 0.41(=3.3/4095*512)V입니다.

ESP8266(Wemos D1 mini)의 해상도는 10비트이므로, A0핀에 3.3V가 걸리면 읽을 수 있는 값은 1023(=210-1)입니다. (*실제로 테스트를 하면 1024가 읽힙니다. 1023이 읽히는 것이 바람직합니다.)
회로 구성하기

다음과 같이 Wemos D1 mini 기준 A0핀에 3.3V 핀을 연결한 회로를 만듭니다.

[그림2] 회로도(A0에 3.3V를연결하기)
analogRead()함수를 사용하기
[그림2]와 같은 회로에서 analogRead()함수로 값을 읽는 프로그램입니다.

analogRead_test1
const int A0pin = 36; // A0: Wemos D1 mini
void setup() {
  Serial.begin(115200);
  Serial.println();
  int readVal = analogRead(A0pin);
  Serial.println(readVal);
}

void loop() {
}

출력 결과:
4095

analogReadResolution()함수를 사용하기
analogReadResolution()함수를 사용하여 해상도를 설정할 수 있습니다. 이 때 값은 9~12(비트)사이에서 지정합니다.

analogRead_test2
const int A0pin = 36; // A0: Wemos D1 mini
void setup() {
  Serial.begin(115200);
  Serial.println();
  analogReadResolution(10); // 10bit 해상도로 설정
  int readVal = analogRead(A0pin);
  Serial.println(readVal);
}

void loop() {
}

출력 결과:
1023

 2  아나로그 출력

아두이노 우노나 ESP8266에서는 analogWrite() 함수를 이용하여 PWM 방식으로 아나로그 출력을 합니다. 그러나 ESP32에서는 analogWrite()함수를 기본으로 제공하지 않습니다. 그래서 아두이노 표준이 아닌 별도의 함수를 이용하여 PWM 출력을 하여야 합니다.

PWM을 위한 3개의 ledc함수군

ESP32에는 LED를 정교하게 다루기 위한 PWM 관련 함수가 준비되어 있습니다. 이러한 함수의 이름은 모두 ledc(LED Controller)로 시작합니다.

ESP32에는 PWM 제어를 위한 채널이 16개 있습니다.

 1   먼저 채널을 선택하여 속성을 정의하고, ledcSetup()
 2  이 채널에 한 개 또는 복수 개의 핀을 할당합니다.ledcAttachPin()
 3  마지막으로 채널에 듀티 사이클을 지정하여 PWM을 실행합니다.ledcWrite()

그러면 해당 채널에 딸린 모든 핀에 동시에 PWM이 출력됩니다.

즉, ESP32에서는 PWM을 출력할 때 핀 번호가 아니라 채널 번호 기준으로 실행합니다.

기능 함수 이름 인수
채널 설정ledcSetup채널 번호0~15
주파수(Hz)숫자를 직접 지정
듀티 해상도
(비트)
1~12
8로 지정하면 0~255까지의 듀티 사이클 사용 가능
채널에
핀 할당
ledcAttachPin핀 번호GPIO를 지정
채널 번호 채널 설정에서 지정한 채널번호
여러 개의 핀을 하나의 채널에 지정할 수 있음.
이 경우 채널에 연결되어 있는 모든 핀이 한꺼번에 동작함.
채널의
듀티 변경
ledcWrite채널 번호 채널 설정에서 지정한 채널번호
듀티 사이클예를들면 0~255
채널 설정에서 정한 듀티 해상도 범위의 값을 지정
회로 구성하기

다음과 같이 GPIO16과 17에 LED를 각각 연결한 회로를 만듭니다.

[그림3] 회로도(GPIO14에 LED 연결하기)
ledc함수군을 사용하여 LED의 밝기를 한꺼번에 바꾸기
[그림3]와 같은 회로에서 두 개의 LED의 밝기를 한꺼번에 연속적으로 바꾸는 프로그램입니다.

ledc_test1
const int ledPin1 = 16; // GPIO16 = D4(Wemos D1 mini)
const int ledPin2 = 17; // GPIO17 = D3(Wemos D1 mini)

// PWM 속성 지정
const int freq = 5000;    // 주파수(Hz)
const int ledChannel = 0; // 채널 번호
const int resolution = 8; // 0~255
 
void setup(){
  // 0번 채널을 지정함(5000Hz,8비트 해상도)
  ledcSetup(ledChannel, freq, resolution);
  
  // 0번 채널에 을 GPIO16과 17을 동시에 연결함
  ledcAttachPin(ledPin1, ledChannel);
  ledcAttachPin(ledPin2, ledChannel);
}
 
void loop(){
  // LED 밝기를 높임
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
    // 채널0(두 개의 핀)의 밝기를 PWM을 사용해서 바꿈
    ledcWrite(ledChannel, dutyCycle);
    delay(10);
  }

  // LED 밝기를 낯춤
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // 채널0(두 개의 핀)의 밝기를 PWM을 사용해서 바꿈
    ledcWrite(ledChannel, dutyCycle);   
    delay(10);
  }
}
외부 analogWrite함수를 사용하여 LED의 밝기를 한꺼번에 바꾸기

ESP32에서 공식적으로 제공하지는 않지만, 외부 인사(Abdelouahed ERROUAGUY)가 만든 analogWrite라이브러리를 여기(github)에서 다운로드 받아서 설치합니다.

프로그램 안에서는 #include <analogWrite.h> 지시어를 지정해야 합니다.

다음은 [그림3]와 같은 회로에서 두 개의 LED의 밝기를 한꺼번에 연속적으로 바꾸는 프로그램입니다.

analogWrite_test
#include <analogWrite.h>  // https://github.com/ERROPiX/ESP32_AnalogWrite
const int ledPin1 = 16; // GPIO16 = D4(Wemos D1 mini)
const int ledPin2 = 17; // GPIO17 = D3(Wemos D1 mini)

// PWM 속성 지정
const int freq = 5000;    // 주파수(Hz)
const int resolution = 8; // 0~255

void setup(){
  // 모든 핀의 주파수와 해상도를 지정함
  analogWriteFrequency(freq);   // 생략하면 기본값은 5000
  analogWriteResolution(resolution);   // 생략하면 기본값은 8
}
 
void loop(){
  // LED 밝기를 높임
  for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){   
    // 두 핀의 밝기를 PWM을 사용해서 바꿈
    analogWrite(ledPin1,dutyCycle);
    analogWrite(ledPin2,dutyCycle);
    delay(10);
  }

  // LED 밝기를 낯춤
  for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
    // 두 핀의 밝기를 PWM을 사용해서 바꿈
    analogWrite(ledPin1,dutyCycle);
    analogWrite(ledPin2,dutyCycle); 
    delay(10);
  }
}

 3  ESP32 호환 보드 납땜 사례

MH-ET LIVE ESP32 minikit를 납땜하여 실드에 적층하여 사용하는 사례입니다. 안쪽에 있는 핀만 아래쪽으로 다리가 노출되어야 합니다.

[그림4] MH-ET LIVE ESP32 minikit 납땜 사례
[그림5] MH-ET LIVE ESP32 minikit를 납땜 후 트리플 베이스 실드에 적층한 사례(1)
[그림6] MH-ET LIVE ESP32 minikit를 납땜 후 트리플 베이스 실드에 적층한 사례(2)

카테고리:ESP32, IoTbook

Reader Interactions

답글 남기기 응답 취소

로그인을 해야 댓글을 남길 수 있습니다.

소셜 로그인
naver

Primary Sidebar

최신 글

  • 윈도우즈에서 Node-RED에 인증서 등록하고 SSL 적용하기
  • 윈도우즈에 Openssl 설치하고 인증서 만들기
  • 윈도우즈에 Node-RED 설치하고 실행하기
  • 아두이노 2.0 설치하고 ESP8266/ESP32 보드매니저 설정하기
  • 윈도우즈에 설치한 Mosquitto에 원격 접속허용하기

최신 댓글

    보관함

    • 2023년 3월
    • 2023년 2월
    • 2021년 8월
    • 2021년 2월
    • 2020년 10월
    • 2020년 8월
    • 2020년 7월

    카테고리

    • ESP32
    • ESP8266
    • IoT
    • IoTbook
    • Node-RED
    • 분류안됨

    메타

    • 로그인
    • 엔트리 피드
    • 댓글 피드
    • WordPress.org

    Footer

    Copyright © 2025 ·로그인