ESP32는 입출력핀의 갯수와 용도도 많을 뿐더러 이를 응용한 모듈의 유형도 많아 입출력핀을 사용하는 방법이 좀 복잡하다.

 

아래는 ESP32칩을 사용한 기본 모듈인 WROOM32의 핀배열이고 각각의 용도를 표시한 것이다.

 

 

그러나 위 WROOM 32 모듈은 제품 양산용으로서 일반적인 아두이노 메이커들이 직접 사용하여 개발하기에는 불편하기 떄문에 여기에 USB연결장치, 정전압 레귤레이터, 2.54mm 사이즈 핀배열 기능을 추가한 ESP32개발용 보드들을 사용하게 되는데 이 개발용 보드들도 여러 종류가 있어 혼동스럽다. 다음은 일반적으로 많이 사용하는 36핀 ESP32 개발용 보드의 핀인데, 다른 개발용 보드들은 이와는 다른 핀배열을 가질 수 있으므로 반드시 보드에 표시된 GPIO번호를 정확히 확인하고 회로를 구성해야 한다.

 

 

 

ESP32 개발용보드에 표시된 각각의 GPIO핀들의 용도는 다음과 같다.

 

1.입력전용핀

 

GPIO34 에서 GPIO39 까지 6개의 핀은 입력전용으로 출력용도로 사용하면 안된다.

 

2.FLASH메모리 전용핀

 

GPIO6 에서 GPIO11 까지 6개의 핀은 WROOM-32 기본 모듈에서 FLASH메모리용으로 이미 사용하고 있는 핀이다. 개발용 보드에 간혹 이 GPIO6~GPIO11까지의 핀이 연결되어 표시된 경우가 있는데 이를 임의로 사용하면 안된다.

   -GPIO 6 ( SCK/CLK )

   -

3.터치센서용 핀

 

ESP32에는 10개의 터치센서가 내장되어 있다. 즉, 손가락으로 GPIO핀을 터치하면 정전용량를 감지하여 센서로 작동되므로 이 GPIO핀에 구리판 등을 연결하여 터치센서로 사용할 수 있다. 또한 이 터치센서 핀들은 Deep Sleep모드에서 깨어나기 위한 Wake up으로 사용될 수 있으므로 예를 들어 절전sleep 모드에 있다가 사람이 터치하면 깨어나 작동되는 자동화된 기기를 손쉽게 제작할 수 있게 된다.  

 

T0 (GPIO 4)
T1 (GPIO 0)
T2 (GPIO 2)
T3 (GPIO 15)
T4 (GPIO 13)
T5 (GPIO 12)
T6 (GPIO 14)
T7 (GPIO 27)
T8 (GPIO 33)
T9 (GPIO 32)    

 

4.ADC ( Analog to Digital Converter ) 핀

 

ESP8266에서는 10 bit 해상도의 ADC가 1개 있었는데 ESP32에서는 12bit 해상도 ADC가 무려 18 채널이 지원된다. 

12bit 해상도이므로 0~4095까지 구분( 10bit일떄에는 0~1023) 구분할 수 있다. 즉 0V는 0로 3.3V는 4094로 구분되므로훨씬 정교한 제어가 가능해 진다. 

 

ADC1_CH0 (GPIO 36)
ADC1_CH1 (GPIO 37)
ADC1_CH2 (GPIO 38)
ADC1_CH3 (GPIO 39)
ADC1_CH4 (GPIO 32)
ADC1_CH5 (GPIO 33)
ADC1_CH6 (GPIO 34)
ADC1_CH7 (GPIO 35)
ADC2_CH0 (GPIO 4)
ADC2_CH1 (GPIO 0)
ADC2_CH2 (GPIO 2)
ADC2_CH3 (GPIO 15)
ADC2_CH4 (GPIO 13)
ADC2_CH5 (GPIO 12)
ADC2_CH6 (GPIO 14)
ADC2_CH7 (GPIO 27)
ADC2_CH8 (GPIO 25)
ADC2_CH9 (GPIO 26)

   

 

5.DAC ( Digital to Analog Converter ) 핀

 

ESP32에는 8 bit 해상도의 2개의 DAC채널이 있어 디지털값을 아날로그 Volt값 출력으로 변환할 수 있다.

DAC1 (GPIO25)
DAC2 (GPIO26) 

 

6.RTC ( Real Time Clock ) 핀

 

ESP32는 RTC GPIO기능이 지원된다. ESP32 메인 프로세서가 deep sleep모드일 때에도 RTC GPIO핀들은 Ultra Low power co-Processor를 통해 메인 프로세서를 깨울 수가 있는데 다음과 같은 핀들을 통해 외부에서 이 wake up신호를 줄 수 있다.

 

RTC_GPIO0 (GPIO36)
RTC_GPIO3 (GPIO39)
RTC_GPIO4 (GPIO34)
RTC_GPIO5 (GPIO35)
RTC_GPIO6 (GPIO25)
RTC_GPIO7 (GPIO26)
RTC_GPIO8 (GPIO33)
RTC_GPIO9 (GPIO32)
RTC_GPIO10 (GPIO4)
RTC_GPIO11 (GPIO0)
RTC_GPIO12 (GPIO2)
RTC_GPIO13 (GPIO15)
RTC_GPIO14 (GPIO13)
RTC_GPIO15 (GPIO12)
RTC_GPIO16 (GPIO14)
RTC_GPIO17 (GPIO27)

 

7.PWM ( Digital to Analog Converter ) 핀

 

ESP32에는 16개의 PWM 채널이  지원되는데 각각의 채널은 각자 다른 특성의 PWM 신호를 생성할 수 있다. 즉 PWM 신호를 생성하려면 다음 사항을 지정해야 한다.  

 

PWM신호의 주파수

Duty cycle ( 출력하려는 값 )

PWM채널

PWM신호를 출력하려는 GPIO핀 번호    

 

PWM출력용 GPIO핀은 임의의 출력핀을 사용하면 되므로 입력전용핀인 GPIO 34 ~ 39번을 제외한 임의의 핀을 사용하면 된다.   

 

DAC1 (GPIO25)
DAC2 (GPIO26) 

 

8.I2C 통신용 핀

 

ESP32를 아두이노 IDE에서 사용할 때에는 다음과 같은 GPIO핀을 사용해야 한다.

 

GPIO 21 (SDA)
GPIO 22 (SCL)

 

9.SPI 통신용 핀

 

SPI용 핀은 다음과 같이 배치되어 있다.

 

SPI MOSI MISO CLK CS
VSPI GPIO 23 GPIO 19 GPIO 18 GPIO 5
HSPI GPIO 13 GPIO 12 GPIO 14 GPIO 15

10.인터럽트 

 

ESP32의 모든 GPIO핀은 인터럽트용으로 사용할 수 있다.

 

 

구매좌표 : 

 

 

US $3.6 26% OFF|ESP32 ESP 32 Development Board Wireless WiFi Bluetooth Dual Core CP2104 Filters Power Management Module 2.4GHz N

Smarter Shopping, Better Living! Aliexpress.com

www.aliexpress.com

 

 

아두이노 ESP-WROOM-32 와이파이 블루투스 듀얼 모듈

COUPANG

www.coupang.com

 

ESP32개발환경을 설치하고난 후  아두이노 다른 프로그램을 그대로 Load하여 컴파일하면 대부분 에러없이 진행되나 PWM출력을 위한 analogWrite 문장에서 에러가 발생된다. 이는 ESP32에서는 다양한 방식의 PWM출력을 지원하기 위해 PWM채널이라는 개념이 추가되어 호출방법이 달라졌기 때문이다.

 

 PWM 채널 설정

 

1. ESP32에서는 16개의 독립적인 PWM채널을 사용할 수 있게 되었으며 어느 채널을 사용할 지 선택해야 한다.

 

2 사용하고자 하는 채널의 PWM 주파수를 지정해 주어야 한다. 즉 1초에 몇번 ON/OFF를 반복할 것인지를 지정해야 하는데 통상 LED밝기 조절의 경우 5000Hz 정도면 충분하고, 참고로  아두이노 우노의 경우 490 Hz 또는 980 Hz이다.

 

3. PWM해상도를 지정해 주어야 한다. 아누이노 우노에서는 8 bit 해상도 이었기 때문에 0~255까지의 숫자로 세기를 지정할 수 있었는데 ESP32환경에서는 1bit에서 16 비트까지 임의로 지정해서 사용할 수 있다. 예를 들어 16bit로 지정하면 0~65535까지 좀더 정밀하게 세기를 지정할 수 있게 된다.

 

ESP32에서 채널의 설정은 다음과 같은 문장으로 지정한다.

 

ledcSetup(ch, freq, resolution);   // ch: PWM channel (0~15), freq: PWM 주파수, resolution: PWM  해상도

 

PWM신호 출력하기

 

1. PWM채널을 설정했으면 setup함수에서 PWM신호를 출력할 ESP32 핀번호를 지정한다.

 

     ledcAttachPin(gpio, ch);   // gpio : GPIO 핀 번호,  ch : PWM channel

 

2. 실제 PWM신호를 출력하고자 할 때에 analogWrite문장 대신 다음과 같이 ledcWrite문장으로 지정하면 된다.

 

     ledcWrite(ch, duty); // ch : PWM channel, duty : Duty cycle

 

샘플프로그램

 

 

2 line : 0번 채널에 5000 Hz, 해상도 8bit( 0~255 )를 설정한다.

3 line : GPIO 15번 핀에 PWM 0번 채널을 할당한다.

6~9 line : PWM신호세기를 0~255까지 바꿔가며 출력한다.

샤프 GP2Y1010 미세먼지 센서는 이전에 소개한 PMS7003에 비해 4분의1가격의 적외선방식의 저가형 미세먼지 센서이다. 가격이 저렴하고 구조가 단순한 만큼 측정한계가 있으나 적절한 용도가 있다면 용도에 맟추어 활용할 수 있다.

 

 

GP2Y1010 미세먼지 센서 구조 

 

GP2Y1010 미세먼지 센서는 위와 같은 구조로서 1~3번단자까지를 이용하여 적외선LED를 발광시키고, 미세먼지에의해 반사되는 적외선의 양을 4~6번 단자를 통해 측정하는 방식이다.   

 

그런데 적외선 LED를 요건에 맞춰 구동시키기 위해서는 다음과 같이 220uF 짜리 커패시티와 150옴 저항으로 다음과 같이 회로를 구성해 주어야 한다. 따라서 통상 GP2Y1010 미세먼지 센서를 판매할 때에는 이 커패시티와 저항을 함께 포함해서 판매하는데 간혹 제외되어 있는 경우가 있으므로 주의해야 한다.  

 

 

회로를 구성하고 3번 단자에 신호를 주면 미세먼지 농도에 따라 5번단자의 전압이 변화되는데 다음은 제작사에서 제시한 미세먼지 농도별 전압변화 그래프이다. 즉 미세먼지 농도가 0 ~ 500 ㎍/m³ 로 변할 때 5번 단자 전압은 0.6 ~ 3.5V 로 변하므로 5번 단자 전압을 측정하면 미세먼지 농도를 추산할 수 있다는 것이다.  

 

 

아두이노와의 연결

 

 

위와 같이 회로를 구성하고 적외선 LED신호용 3번 단자는 아두이노 디지털출력핀 (여기에서는 10번), 전압을 읽기 위한 5번 단자는 아두이노 아날로그 입력핀(여기에서는 A5)에 연결한다

 

샘플프로그램

 

 

측정된 값

 

위 샘플프로그램으로 측정된 값을 아두이노 시리얼플로터 챠트로 출력해 보면 다음과 같은데 측정값 변동치가 너무 커서 알아보기가 힘들다.

 

 

 

개선된 프로그램

23 line : 20회 이동평균값으로 수치를 smooth시킨다.

 

개선된 샘플프로그램 측정값

 

 

GP2Y1010 미세먼지 센서의 한계

 

위와 같이 이동평균값으로 비교적 안정된 수치를 얻는다 해도 여전히 다음과 같은 한계가 있다.

 

1) 영점보정의 문제 : 각각의 센서는 영점보정이 안된 상태로서 기준점이 애메하여 출력되는 수치를 신뢰할 수 없다. 즉, 미세먼지가 전혀 없는 상태에서 출력값이 0이 되도록 조정하는 영점보정 작업을 센서별로 따로 해 주어야 한다. 

 

2)적외선 간섭문제 : 적외선 반사량을 측정하는 방식이므로 센서에 햇빛이나 다른 센 불빛이 비춰질 경우 측정값이 교란될 수가 있다. 즉 실내에서 측정했을 때와 실외에서 햇빛 아래에서 측정할 때가 각각 달라질 수 있다는 것이다.

 

위와 같은 한계에도 불구하고 가격이 저렴하기 때문에 적당한 용도 예를 들어 담배연기탐지나 납땜연기 탐지 등과 같이 정확한 수치보다는 개략적인 미세먼지 변화를 탐지하기 위한 용도로는 다양하게 활용할 수 있다.     

+ Recent posts