John's 개발자의 관심노트

아두이노 IDE 파헤치기 [2 / 3], CDS 센서 활용, 아두이노 ADC 제어, 아두이노 PWM 제어 본문

[개발]/Arduino

아두이노 IDE 파헤치기 [2 / 3], CDS 센서 활용, 아두이노 ADC 제어, 아두이노 PWM 제어

John-Co 2022. 9. 27. 00:30

"[기본]" 단계의 두 번째 글에서는 첫 번째 글에서 배운 프로젝트 생성하는 방법을 베이스로,

간단한 회로 구성부터, 실제 동작시키는 코드를 작성해보며 Arduino IDE 툴과 더 친해져 보고자 한다.

 

준비물은,

Bread Board와 LED 1개, CDS 센서 1개 를 가지고 프로젝트를 생성해 볼 예정이고,

 

프로젝트의 내용은,

CDS 센서, 즉 조도 센서를 가지고 주변 빛의 양을 측정하고,

그 빛의 양에 따라 LED 의 밝기를 조절하는 프로그램을 만들어 볼 것이다.

센서 회로 구성

먼저 , CDS 센서란 무엇일까?

포토 레지스터 (Photoresistor) 라고 불리며, 말 그대로 레지스터! 즉 저항인데,

빛의 양에 따라 저항값이 달라지는 센서고, 조도센서라고도 불리는데 빛을 감지하는 센서라고 생각하자.

CDS 센서 (출처 : 쿠팡)

 

빛의 양이 많아지면 저항값이 작아지고,

반대로 빛의 양이 적어지면, 저항값은 커진다.

 

회로 구성은 간단하게 아래와 같이 구성했다.

"IN" 부분과, Arduino Board 의 ADC 핀인, A0 ~ A5 중 하나에 연결되고,

위 회로도를 기반으로 동작을 예상한다면,

 

점점 밝아질수록 IN에 걸리는 전압은 높아지고 (밝기 ↑ / ADC 값 ↓),

점점 어두워질수록 IN에 걸리는 전압은 낮아진다. (밝기 / ADC 값 ).

 

Bread Board와 Arduino Board 와 연결을 하면 아래 그림과 같이 구성이 되니 직접 회로를 꾸려보자.

조도 센서에 걸리는 저항값에 따른 전압 레벨 측정을 위해 ADC 핀인 "A1" 을 사용했고,

측정 레벨에 따른 LED 제어를 위해 PWM 제어가 가능한 "3" 번 핀을 사용했다.

 

위 Pin을 선택한 이유는 딱히 없고, 다른 핀에 적용을 해보고 싶다면 자율적으로 적용해봐도 문제는 없다.

Arduino Sketchbook (Project) 생성

이제 Sketchbook을 생성해서 프로젝트를 구성해보면 되는데,

잘 기억이 나지 않는다면, 아래 링크를 붙여두었으니 참고 하자.

 

[기본] 아두이노 IDE 파헤치기 [1 / 3]

오늘은 Arduino IDE 툴을 가지고 프로젝트를 만들어서 개발을 해보려고한다. 개인적으로 Arduino IDE 의 경우 초보자를 위한 목적성이 강해서 그런지, 소규모 프로젝트에는 상관 없지만 점점 규모가

johnconomics.tistory.com

일단 위 링크처럼 아두이노 프로그램을 실행 시키고, "Ctrl + N" → "Ctrl + S" 를 눌러서,

"Example_Sketchbook" 프로젝트를 생성했다.

코드는 작지만, 연습을 위해 다음과 같이 파일을 분리해서 프로젝트를 구성하는 연습을 해볼건데,

일단 LED 제어 코드, CDS 센서 제어 코드, Main 동작 코드로 분류해보자.

 

오른쪽 상단부근에 아래와 같은 그림의 버튼을 누르고,

"새 탭" 버튼을 누르고,

(또는, "Ctrl + Shift + N" 키를 누른다.)

하단에 "새로운 파일을 위한 이름:" 탭이 나오고 거기에 파일명을 적는다.

첫 번째는 "led", 두 번째는 "cds".

이렇게 해서 코딩 전 단계까지 왔다. 모든 작업을 마무리하고나면 아래 그림과 같다.

PWM, ADC 코딩하기

이제 LED 제어를 위한 PWM (Pulse Width Modulation) Code와,

센서 값을 읽어 내기위한 ADC (Analog to Digital Converter) Code 를 작성해보자.

 

먼저, PWM과 ADC란 무엇인지 간단하게 알아보면,

ADC란?
"Analog to Digital Converter" 의 약자로 아날로그 신호를 디지털화 한다 라고 생각하면 된다. 그 과정은 "표본화(Sampling) → 양자화(Quantization) → 부호화(Encoding)" 방식을 거치게 되는데, 간단하게 MCU에서 사용할 수 있는 값은 0과 1로 이루어진 디지털 값이기 때문에, 아날로그 값을 사용하려면 위와 같은 과정이 필요하고, 위 과정이 진행되면 우리는 아날로그 전압값을 읽어낼 수 있다 정도로 이해하면 된다.
PWM 이란?
"Pulse Width Modulation" 의 약자로 펄스, 파형을 조절하는 기능이다. 펄스의 폭을 조절하여 파형의 평균 전압값을 제어할 수 있다. 보통 Duty 비 라고 하는 것을 제어하는데 이를 통해, LED 밝기 또는 모터 속도 등을 제어할 수 있다.

추후에 더 자세한 내용을 가져와 알기쉽게 정리해서 올릴 예정이니, 일단은 이렇게 이해해보자.

 

"ADC" 를 사용해서 CDS 센서의 변화를 측정할 수 있고,

"PWM" 을 이용해서 LED 의 밝기를 제어할 수 있다.

 

아두이노에서 ADC 사용을 위해 사용하는 함수는 "analogRead()" 이고,

이 함수의 원형을 살펴보면, int analogWrite(uint8_t pin) 이렇다.

 

"pin" 은 우리가 읽고자 하는 포트 번호를 의미하고, "return" 값은 ADC 값이다.

ADC 값을 읽어내서 의미있는 값으로 사용을 하려면 아래 표를 참고해야한다.

출처 : https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/

Returns
The analog reading on the pin. Although it is limited to the resolution of the analog to digital converter (0-1023 for 10 bits or 0-4095 for 12 bits). Data type:int
출처 : https://www.arduino.cc/reference/en/language/functions/analog-io/analogread/

위 표의 의미는, 5 volt 의 Reference 전압을 가지고 10bit 분할해서 ADC 값을 산출한다 생각하면되는데,

즉, 읽은 ADC 값이 1024 라는 숫자라면,  ADC 로 입력 되는 전압이 5 volt 라는 의미인데,

ADC 값 1당 몇 volt를 의미하는지 계산하려면 아래와 같다.

* ADC 1 = (5 / 1024)

 

아두이노에서 PWM 제어를 위해 사용하는 함수는 "analogWrite()" 이고,

이 함수의 원형은 void analogWrite(uint8_t pin, int val) 이렇다.

Arduino 홈페이지에서 각 Parameter의 설명을 읽어보면,

Parameters
 ▶ pin : the Arduino pin to write to. Allowed data types : int
 ▶ value : the duty cycle : between 0 (always off) and 255 (always on). Allowed data types : int
출처 : https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/

"pin" 은 우리가 출력하고자 하는 포트 번호를 의미하고, "val" 의 경우는 Duty 비를 의미하는데,

위와 같이 "val" 의 값은 0~255 값으로 설정 되고, 0은 항상 Off, 255 는 항상 On 으로 설명되어 있다.

단순히 말해 숫자가 커질수록 평균전압은 상승하고 이에 따라 LED의 밝기는 밝아진다.

 

이제 우리가 원하는 기능 구현을 위해 사용하는 함수까지 모두 알아보았으니 우리가 만든 프로젝트 내에

각 파일별로 코딩을 시작해보자.

"led" Code

위쪽에 회로도를 참고해서, LED 제어를 위한 PIN 은 3번 핀이고,

해당 핀을 Output Mode로 설정하고, Duty 비를 설정해서 밝기를 조절할 수 있는 함수를 작성한다.

"cds" Code

위쪽 회로도와 같이 연결된 PIN은 "A1" 핀이고, ADC 표와 같이 ADC Ref 전압은 5 volt, Sample 수는 1024라는 정보를 기반으로

ADC 값 1당 몇 volt 인지 계산해 두고, 해당 값을 읽어 volt 값을 반환하는 함수를 작성한다.

"Example_Sketchbook" Code

 

setup() 함수에서는 "led_setup" 과 "cds_setup" 함수를 호출해서 ADC, PWM 사용 전 초기화를 진행하고,

Loop() 함수에서, cds 센서값을 읽고, 해당 값을 이용해 LED 의 밝기를 변화시키는 코드를 작성한다.

 

모든 코드를 작성해서 보드에 Upload를 하고나면 우리가 예상했던대로,

CDS 센서를 가려서 빛의 양을 감소시키면, LED가 어두워지고,

CDS 센서에 빛을 비춰서 빛의 양을 증가시키면, LED 또한 밝아지는것을 볼 수 있다.

(영상첨부를 하고 싶지만, 아직 방법을 찾아내지 못했다... 얼른 방법을 찾아봐야겠다...)

 

이렇게해서 간단하게 센서를 운용해서 LED 의 밝기를 자동화 시켜보는 프로젝트를 진행해 보았다.

 

다음 글에서는 우리가 자주 사용하는 기능을 함수로 미리 만들어두고

어디에서든 가져다 쓸 수 있는 라이브러리라는 것에 대해 알아보고 그것을 실제 프로젝트에 적용해 보는 방법을 써보려고한다.

 

끝!

위 글에 잘못된 부분이 있거나, 오류가 있다면 언제든지 댓글 남겨주세요.

반응형