아두이노 코딩-108: WeMos LOLIN 보드에서 analogWrite 명령을 대체하는 ledcWrite 명령 예제
WeMos LOLIN 보드를 평가를 통해 사용하기 위해서는 기본적인 몇 가지 단계를 거쳐야 한다. 디지털 핀을 사용하여 LED ON OFF 한다든지 또는 아날로그적으로 LED 의 밝기를 조절한다든지 또는 아날로그 핀으로 가변저항의 전압을 읽어내는 것이 바로 그러한 것들이다. 그렇지만 LOLIN 보드 사용자가 직면할 수밖에 없는 리스크는 제대로 된 매뉴얼이나 PINOUT 다이아그램 및 필수적인 사용자 정보가 거의 없다는 점이다.
그럼에도 불구하고 아두이노 코딩에 관심을 가져왔다면 어떻게 이 보드를 평가해 가면서 사용할 수 있는지 100여회에 걸친 블로그 내용을 살펴보면 잘 알 수 있을 것이다. 즉 지금까지 해왔던 기본적인 성격의 배선과 코딩 중 불과 몇가지에 한해서 LOLIN 보드에 적용하여 성공을 이끌어내야 할 것이다. 아울러 LOLIN 보드 평가 끝 단계에 이르게 되면 그때서야 기존의 아두이노 우노라든지 또는 ESP8266 NodeMCU/WeMos가 제공하는 성능에 비해 LOLIN 보드가 제공하는 뛰어난 성능을 시험할 수 있는 무대에 서게 되는 것이다.
지난번에 언급한 LOLIN 보드에서 analogWrite() 명령이 제공되지 않는다는 점을 극복하기 위한 대체 코딩을 추진해 보자. 해답은 의외로 가까이에 있는듯하다. 아두이노 편집기에서 예제->ESP32->AnalogOut->LEDCSoftwareFade를 불러오자.
이 예제 코드는 analogWrite() 명령은 아니지만 대개의 마이크로 콘트롤러가 제공하는 타이머와 인터럽트를 사용한 펄스파 즉 듀티 생성을 바탕으로 LOLIN에 자체적인 ledcWrite() 명령을 제공하고 있어 아날로그적으로 디지털 핀에 설치된 LED의 밝기를 조절할 수 있다. 이 예제는 LOLIN보드의 붙박이 LED인 5번 핀을 대상으로 하고 있으므로 컴파일 업로딩 후 보드를 손으로 가려 어둡게 한 후 밝기변화를 관찰해 보기 바란다. 이 과정을 마치면 위 배선도에서처럼 18번 핀에 220Ω 전류제한저항과 직렬로 연결된 LED를 배선하자.
헤더 영역에서 채널, 타이머 해상도, 주파수 설정과 아울러 LED가 설치된 밝기 조절을 위한 디지털 핀을 정의 하고 있다. #define ⦁⦁ ⦁ 용법은 직접 정수나 실수로 선언하는 것과 마찬가지이다. 이러한 내용들은 아두이노 C/C++ 코딩과는 달리 Atmega 마이크로 콘트롤러 AVR 코딩을 하게 되면 흔히 맞닥뜨리는 하드웨어적인 냄새가 물씬 풍기는 파라메터들이다. 이 예제에 의하면 LOLIN 보드의 붙박이 LED가 설치된 5번 디지탈 핀은 아두이노우노에서 처럼 물결표시가 있어 PWM이 가능한 핀임을 알 수 있다. ESP32 PINOUT 다이아그램을 참조해 보면 거의 모든 디지털 핀이 PWM 이 가능함을 알 수 있다.
setup() 이전에 analogWrite 명령을 대체할 수 있도록 예제가 제공하는 ledcAnalogWrite 루틴에 대해서 알아보자. 사용자는채널 번호와 0∼255 사이의 밝기 값 변수 value를 지정해주어야 한다. 이 값에 따라 타이머 해상도를 사용하여 계산한 듀티 한주기 값 8791을 기준으로 (value/255) 비율만큼 ON 하는 듀티 시간을 결정하고 LOLOIN 보드 고유명령인 ledcWrite(채널, duty) 명령을 실행한다.
setup()에서 lㄷdcSetup 이라는 명령과 ledcAttaachPin 이라는 LOLOIN 자체 명령이 2종류 사용된다. 아울러 loop(0에서 실행되는 lㄷdcAnalogWrite는 앞에서 설명했던 루틴을 호출하는 명령이며 나머지 코드들은 아두이노 우노의 Fade 예제와 동일하다.
첨부된 동영상에서 좁쌀만한 붙박이 LED와 외부에 설치한 LED 밝기 변화를 관찰해 보자.