본문 바로가기
Arduino&RasberryPi/Arduino Uno

9. Arduino - 가변저항을 이용한 analogRead() 값 변화 확인

by Rosmary 2019. 10. 28.
728x90
반응형

지금까지 입출력 관련 함수로, digitalWrite(), digitalRead() 그리고 analogWrite() 함수에 대해 알아보았다. 지난 포스팅에서 analogWrite() 함수와 짝을 이루는 analogRead() 에 대해서는 포스팅하지 못했는데, Serial Monitor로 출력되는 analogRead() 값이 무엇을 의미하는지 도통 알 수 없었기 때문이다.

 

다행히 가변저항('전위차계'라고도 하며, 영어로는 potentiameter라고 한다)을 다루면서, 이 analogRead() 함수의 사용법에 대해 명확하게 알게 되어, 포스팅을 작성하게 되었다. 물론, analogRead()를 설명하기 위해서, 가변저항이라고 불리는 녀석과, 전압을 읽는 핀에 대한 이해도 필요하다. (이 다음에 진행할 포스팅에서는 Arduino의 통신 종류 및 핀에 대해 다룰 예정이다. 가장 중요한 내용임에도 불구하고, 필자가 메뉴얼 없이 Arduino를 다루다보니 이제서야 내용을 완전히 파악하게 되었다...)

 

 

 

1. 가변저항 또는 전위차계(Potentiometer)

 

가변저항의 영문명을 분석해보면 다음과 같다. 우선, 포텐셜(potential)이라는 말을 많이 들어보았을 것이다. 한글로 굳이 직역하자면 "잠재있는"이라는 형용사로 해석할 수 있는데, 전기에서의 Potential은 어떠한 부품을 작동시킬 수 있는 힘, 그러니까 전압을 말한다고 생각하면 된다. 뒤의 meter는 우리가 거리를 측정할 때 자주 사용하는 m 단위를 일컫기도 하지만, 무언가를 조절하는 물품을 지칭할 때도, meter라는 단어를 많이 사용한다. 따라서, Potentiometer라는 단어의 의미는, 전압 크기를 조절할 수 있는 부품이라는 뜻을 갖는다고 생각하면 된다. 생긴 모양은 다양한데, 공통적으로 보이는 부분은, "3개의 회로 연결 소자 + 회전이 가능한 손잡이"이다. 아래의 사진에서, 하늘로 우뚝 솟은 커다란 원통이 손잡이에 해당하는 부분이며, 좌측으로 삐져나온 3개의 핀이 회로와 연결되는 소자다.

 

 

회전하는 손잡이에서 이 물건이 어떻게 사용되는지 대략적으로 파악할 수 있다. 한 쪽 방향으로 손잡이를 돌리면, 전압이 높아지고, 반대로 돌리면 전압이 낮아진다. 그렇다면, 어떤 원리 때문에 Potentiometer가 전압의 크기를 자유자재로 조절할 수 있는 것일까??

 

이제 한글 명칭으로 돌아와보자. 전위차계라는 말은 Potentiometer를 가장 영문 의미에 가깝게 나타낸 단어다. 반면, 가변저항이라는 말은, 이 Potentiometer의 작동 방식을 가장 잘 설명해주는 용어라고 보면 된다. 필자가 하고픈 말은, 이 Potentiometer는 회로의 저항 역할을 하며, 저항의 크기를 조절해줌으로써, 회로에 흐르는 전류량을 조절해주는 것이라고 보면 된다. 실제로, Potentiometer는 회로도에서 저항과 비슷한 모양으로 나타낸다.

 

 

전류량의 조절과 전압이 어떤 상관관계가 있길래 그런거죠...? 라고 묻는 분들은 V = IR 이라는 전기 회로의 구구단과 같은 공식을 생각하면 답이 보일 것이다. 

 

저항의 크기가 달라지면, 전체 회로에 흐르는 전류의 크기가 달라진다. 이 전류가 회로 위의 부품을 지날 때, 일정 크기의 저항과 맞닥들이게 되는데, V = IR 이라는 공식에 의해 각 부품에 걸리는 전압이 위의 그림처럼 도출된다. 만약 저항의 크기가 10옴이라면, 저항을 통과하기 위해 5V 중 1.25V를 소모하게 된 것이고, 저항의 크기가 20옴이라면 2V를 소모하게 되었다고 생각하면 된다. 그리고 잔여 전압이 발광 다이오드를 점등하는데 사용된다고 생각하면 된다.

 

*  저항 뿐만 아니라. 모든 전기부품, 심지어 전선까지도 일정 크기의 저항을 가지고 있다. 다만 저항에 비해 그 크기가 크지 않았기에, 중등 교과과정 이하에서는 부품의 저항은 무시한 채 문제를 풀어왔던 것이고...(따라서, 위의 그림에서 LED가 저항보다 더 큰 저항값을 가지는 것도 사실 말이 안된다. 필자가 계산을 쉽게 하려고 넣다보니 저런 실수가 나왔다)

 

그럼, 가변저항은 내부 구조가 어떻게 되어 있길래, 저항의 크기를 조절할 수 있는 것일까? 

 

 

가변 저항의 내부 구조는 다음과 같다. 전기는 1에서 3 방향으로 흐른다고 가정하자.  만약, 필자가 회전 손잡이를 좌측으로 최대한 돌리게 된다면, wiper라고 불리는 녀석이 1지점에 가깝게 위치하게 된다. 전류는 1에서 wiper 부분을 경유하여 2 부분으로 흘러가게 되는데, 내부에서의 이동 거리가 짧아지게 되므로, 저항은 작아진다. 반대로 손잡이가 우측으로 최대한 돌아간 상태라면, wiper가 3 지점에 가깝게 위치하게 되며, 전류가 1에서 3까지 이동거리가 길어지게 되므로 저항은 커지게 된다. 

 

*  전선도 미약하게나마 저항을 가진다고 위에서 언급했다. 그리고 저항의 크기는 전선의 길이가 길면 길수록, 그리고 굵기가 얇을수록 커진다. 마치 좁다랗고 긴 길과 넓고 짧은 길에 매우 많은 차량이 통과할 때를 생각하면 된다. 좁은 길에서는 차가 막히기 때문에 흐름이 원할하지 않고(전류가 잘 흐르지 않고), 반대로 넓은 길은 상대적으로 흐름이 원할한 것처럼 말이다.

 

가변 저항의 크기 범위는 0 ~ 10k 옴 사이다. 즉, 0 ~ 10000옴 사이의 저항 값을 가질 수 있는 부품이며, 10K 옴으로 가변 저항 크기를 설정하면, Arduino 전압(최대 5V)의 대부분은 이 저항을 통과하기 위해 사용될 수 밖에 없다. 

 

 

 

 

2.  analogRead() 함수로 전압값 측정하기

 

analogRead() 값은 0V ~ 5V 범위 내의 전압을 읽어들이는 함수다. 이 함수를 사용하기 위해서는 Arduino의 특정 핀을 사용해야하는데, Arduino Uno를 정면을 바라보았을 때, 우측 하단에 보이는 6개의 핀들이 그것이다. 각각 A0 ~ A5로 지정되어 있다. 마치 analogWrite() 함수를 사용할 수 있는 핀이, 3, 5, 6, 9, 10, 11번으로 지정된 것과 같은 이치라고 보면 된다. 

 

analogRead() 함수는 특정 핀으로 들어오는 전압을 측정한다. 따라서 analogRead() 함수는 다음과 같은 포맷으로 사용할 수 있다.

 

===========================================

analogRead( #Pin );   //단, #Pin은 A0, A1, A2, A3, A4, A5 만 가능

===========================================

 

이해를 위해, 간단하게 다음과 같은 회로를 구성한 뒤, 저항을 기준으로 전/후 전압을 측정해보려 한다.

 

늘 그러하듯이, 5V 전압을 220옴 저항 2개가 배치된 회로에 연결하고, 회로의 끝은 GND핀으로 연결해 주었다. 간략하게 회로도를 그리자면 아래와 같다.

 

그리고 전압값을 측정할 A0핀에 주황색 선 하나를 연결함으로써 시험 준비를 마쳤다. 반대편 선은 어느 회로나 핀과 연결하지 않고 그대로 둔다.  Arduino IDE에는 다음과 같은 코드를 작성해준다.

 

 

위의 코드를 Arduino에 밀어넣고, 주황색 선의 한 쪽 끝, 즉 측정선을 회로의 각 부분에 연결해보면, Serial Monitor에 출력되는 voltage 값이 지속적으로 변하는 것을 확인할 수 있다. 5V 핀과 첫 번째 저항 사이에 측정선을 위치시키면, 1023 라는 값이, 두 개의 저항 사이에 측정선을 위치시키면 509라는 값이, 마지막으로 두 번째 저항 이후의 회로에 측정선을 위치시키면, 0 값이 출력된다. 두 저항의 크기가 동일하기 때문에, 두 저항에 걸리는 전압이 정확히 반인 2.5V로 나뉘게 되며, 두 저항 사이에서 전압을 측정한 값 역시, 이 경향을 따라 analogRead() 함수의 값 역시, 1024의 절반 값인 509가 출력되게 된다.

 

 

 

3.  가변저항을 지나는 전압 측정하기.

 

이제, 회로에서 220옴 저항을 모두 제거한 뒤, 가변 저항을 연결하여 저항의 변화에 따른 전압값을 측정해보려고 한다. 회로는 아래와 같이 구성한다. 

 

A0와 연결된 주황색 선은, 가변저항의 2번째 소자로, GND와 연결된 초록색 선은 3번째 소자. 그리고 남은 흰색 선은 첫 번째 소자와 연결하였다. Arduino에 사용할 코드는 그대로 사용할 것이다. 

 

 

 

회로의 가변 저항을 좌우로 돌려 조절할 때마다, Serial Monitor의 값이 변하는 것을 확인할 수 있다. 지금까지의 내용을 토대로 결론지을 수 있는 내용은, Arduino는 외부에서의 Analog 전압값을 읽어들이는 코드로 AnalogRead() 함수를 사용하며, 이 함수를 사용하기 위한 핀으로 A0~A5핀을 사용한다는 것이다. 

 

참고로, analogRead() 값은 5v 전압에 연결했을 때, 0 ~ 1023 사이의 값이 출력되는데, 5V일 경우 1023이, 0V 일 때 0 값이 출력된다. 그래프 수식으로 나타내자면,  y = (5 / 1023)x 와 같이 표현할 수 있다. 이 수식을 이용하여 analogRead() 값을 Voltage 값으로 변경하여 Serial Monitor에 출력하는 것도 가능하다.

 

analogRead()와 analogWrite() 역시 1차 다항식 형태의 관계를 가진다. analogWrite() 값이 5V 에서 255 값을 가지므로, " analogWrite = (1023 / 255) analogRead "와 같은 수식으로 표현할 수 있다. 

 

그래프는.... 그리기 귀찮다...

끝.

 

FIN.

 

반응형

댓글