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의 실드를 사용할 수 있습니다. (다만 베이스 실드를 사용할 때는 핀 간격 문제로 사용에 제약이 있습니다.)이 그림에 의하면 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입니다.
회로 구성하기
다음과 같이 Wemos D1 mini 기준 A0핀에 3.3V 핀을 연결한 회로를 만듭니다.
analogRead()함수를 사용하기
출력 결과:
4095
analogReadResolution()함수를 사용하기
출력 결과:
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를 각각 연결한 회로를 만듭니다.
ledc함수군을 사용하여 LED의 밝기를 한꺼번에 바꾸기
외부 analogWrite함수를 사용하여 LED의 밝기를 한꺼번에 바꾸기
ESP32에서 공식적으로 제공하지는 않지만, 외부 인사(Abdelouahed ERROUAGUY)가 만든 analogWrite라이브러리를 여기(github)에서 다운로드 받아서 설치합니다.
프로그램 안에서는 #include <analogWrite.h> 지시어를 지정해야 합니다.
다음은 [그림3]와 같은 회로에서 두 개의 LED의 밝기를 한꺼번에 연속적으로 바꾸는 프로그램입니다.