본문 바로가기

Programming/IoT_Embedded

아두이노 디지털 핀에 24V 입력받기(저항으로 전압강하, 전압분배)

아두이노나 라즈베리파이 같은 보드는 GPIO라는 입출력 핀들을 제공하는데요.
입출력 신호로 사용하는 전압은 각각  5v와 3.3v입니다.
이런 신호를 TTL(Transistor to Transistor Logic, 네트웍에서 말하는 TTL하고 다름)라고 하는데요.
보통 자체 동작전압을 가지고 입출력을 받는 회로를 만드는 경우에는 아무 문제가 없는데
별도 자체 전원으로 동작하는 외부 장치에서 신호를 받는 경우는 전압 때문에 입력을 받을 수가 없는 경우가 많습니다.

가장 대표적인 예가 PC하고 연결할때 시리얼포트를 쓰는 경우가 있는데,
PC는 HIGH/LOW를 +12V/-12V로 표현하는데, 
이걸 직접 아두이노나 라즈베리파이에 연결하면 당연히 보드가 타버리게 되죠.


또 다른 예로는 아파트나 사무실 천정에 하나씩은 달려 있는 화재 감지기의 경우 인데요.

이것은 24V로 동작합니다. 그래서 화재가 나면 24V를 HIGH값으로 입력 받아야 하는데,
이걸 아두이노나 라즈베리파이에 그대로 받았다가는 순식간에 타버리게 되죠.

그 외에도 우리는 특정 전압을 어떤 전압으로 낮추어서 사용해야 할때가 많습니다.
이렇게 전압을 원하는 수준으로 내려야 할 때 사용하는 방법은 여러가지가 있는데요.

지금 소개할 방식은 저항을 이용한 전압분배 방식으로 TTL 신호를 받아 들기에 적합하고
회로 구현도 아주아주아주 쉽고 비용도 엄청 저렴합니다.

무엇보다도 전압분배에 대한 이해를 하는 것은 전자회로에 아주 중요한 기초이니까 함께 알아 보시죠.



먼저 저항과 전압의 관계에 대해서 좀 살펴 볼까요?

아래의 그림처럼 저항을 연결하고 저항 전/후의 전압을 측정하면 얼마 일까요?


배터리가 1.5v라고 했을때 몇 오옴 짜리 저항이든 간에, 저항과 플러스(양극,+)와 맞다은 곳은 1.5v이고
저항과 마이너스(음극, -)와 맞다은 곳은 0v 입니다.
어떤 분은 너무 당연하기도 하고 어떤 분은 이해가 안 갈겁니다.

이해 안되시는 분을 위해 아주 쉽게 설명하자면,
음극은 0v고 양극은 1.5v 겠죠? 그런데, 저항 다리가 각각의 극하고 붙어 있자나요.
그러니까 저항과 연결된 선 어디를 측정해도 연결된 극의 전압이 나옵니다.

실제로 멀티미터로 측정을 하려고 해도 우수운 그림 밖에 나오지 않습니다.
그림에서 저항의 왼쪽 전압을 측정하려면 아래 그림 처럼 될텐데, 우숩지요?



그럼 이제 다른 그림을 하나 더 볼까요?


10k옴 저항을 2개 연결했습니다.
그리고 나서 각 구간의 전압을 측정해 보면 가운데 영역은 몇 볼트가 나올까요?

실제로 측정해 보면 0.75v가 나옵니다.



만약 위의 건전지 처럼 1.5v 아니라 3v를 연결했다면 가운데 영역의 전압을 얼마가 나올까요?

네 예상하신것 처럼 1.5v가 나옵니다.

여기서 테스터기(멀티미터)의 리드봉(probe)을 아래와 같이 놓고 측정해도 같은 값이 나옵니다.


이렇게 어떤 회로 전과 후에 전압이 달라지는 것을 전위차라고 하구요.
일반적으로 우리가 "전압이 얼마다” 라고 이야기 하는 것은 바로 이 전위차를 말하는 것입니다.

이전 포스트에서도 잠시 다루었지만, 아래 그림 처럼
저항 없이 양극과 음극이 만나면 어떻게 되고 그때 전압은 얼마 일까요?

이렇게 연결하면 건전지가 뜨거워 지면서 배터리 홀더와 전선, 그리고 배터리 까지 불타버립니다.
이걸 이용해서 김병만이 정글의 법칙에서 껌종이로 불도 피우고 그랬죠.

왜 그런지는 이전 포스트를 참조 하시구요.

지금은 이때 전압이 얼마인가 하는게 중요합니다.
전압(전위차)은 바로 0V입니다.

다들 아시는 옴의 법칙
짜잔!!  

이 법칙에서 R 즉 저항이 0(zero, 영)이 되면 V 즉 전압도 0(zero, 영)이 될 수 밖에 없습니다.
무슨 수에 0을 곱하면 무조건 0이 되는거 다 아시죠?



이제 그럼 본격적인 실험을 해보죠.
이번엔 2개의 저항의 값을 서로 다르게 해보는 거에요.
아래 그림 처럼 10k옴, 20k옴 저항을 연결하면 각 영역의 전압은 얼마 일까요?
 


각각 1v와 2v가 나옵니다.

이것을 다이어그램으로 다시 그리면 아래와 같게 되죠.


그럼 이제 원래 알아 보려고 했던 전압을 낮추는 방법을 알아 볼께요.

앞서 알아 보았듯이, 저항 2개를 연결하고 그 가운데 영역의 전압을 측정해 보면 
입력 전압보다 낮아 지는 것을 알 수 있습니다.
이때 저항의 입력전압과 저항 값에 따라 그 가운데 영역의 전압을 알아 낼 수 있는데요.
그 가운데 영역을 이용해서 TTL 신호로 사용하는 겁니다.

이때 저항 2개를 각각 R1, R2 라고 부르면,  두 저항의 값이 동일할 때는
R1에 걸리는 전압과 R2에 걸리는 전압이 동일하기 때문에 전압은 절반으로 나누어 집니다.
이와 달리 R1과 R2의 저항 값을 달리하게 되면 그 비율에 따라 나뉘게 됩니다.
이것을 공식으로 세우면 아래와 같은 공식이 완성 됩니다.

  



이제 저항 2개만 있으면 원하는 전압을 뽑아 낼 수 있게 되었습니다.

그럼 24V 전압을 아두이노 입력으로 받으려면 R1,R2의 저항 값은 얼마 일까요?
막상 계산하려니까 수학의 스트레스 스멜이 슬슬 올라 오나요?(학교 다닐때 저는 수학이 너무 싫었어요..)

쉽게 계산 하는 방법을 알려 드릴께요.

위 공식에 대입하면,
Vout  = 5v  (아두이노 디지털 핀으로 입력 받아야 하니까)
Vin    = 24v (24v 전압을 입력 받는 다고 했으니까)
그럼 식으로 만들어 보죠.

5 = R2/(R1+R2) * 24

그 다음이 막막하네요…  일단, 이항 부터 해보면...

R2/(R1 + R2) =  5 / 24

오잉! R2가 나와 버렸네요.

R2  = 5

그럼 R1도 구해야죠~

R1 + R2 = 24
R2 = 24  - R1 =  24 - 5 = 19

R1 = 19, R2 = 5 네요. 간단하죠?

자 그럼 19옴하고 5옴을 연결하면 될까요?
잘 보면 저 공식은 각 저항 값의 배수 중 어떤것을 적용해도 같다는 걸 알 수 있어요.

예를 들면 첫번째로 실험했던 10k옴 2개를 연결했던걸 생각해 보세요.
3v를 반반씩 나누어서  1.5v로  되었어요.
그럼 여기서 1k옴 2개를 쓰면 어떻게 될까요? 당연히 1.5v 반반씩 나누어 집니다.
그럼 100k옴 2개는?, 10옴 2개는?, 1옴 2개는?
다~~~ 마찬가지입니다. 10K 뿐만 아니라 1,234옴 2개를 연결해도 마찬가지!!
왜냐하면 5:5 비율이니까요.

그럼 저 많은 것들 중에 어떤걸 써야 하죠? 

해답의 열쇠는 바로바로바로~~ 전류가 가지고 있습니다.
얼마 만큼의 전류를 필요로 하는냐에 따라 배수 중에 적합한 것을 적용하는 것입니다.

전류값은 어떻게 구할까요? 
다시 나옵니다. 옴의 법칙
짜잔!!  


이 식을  다시 쓰면,

두둥!!


앞서 예를든 3V에 10k옴 2개를 연결했을 때 각 저항에 흐르는 전류는 얼마인지 계산해 볼까요?

IR1 = VR1 / R1 = 1.5V / 10,000 = 0.00015 = 0.15mA

저항 값이 같고 그래서 각 저항에 걸리는 전압도 같으니 두번째 저항에 흐르는 전류도 똑 같겠죠?


다시 한번 더 해 볼까요?
앞서 보았던 아래 그림 처럼 3V에 10k, 20k 저항을 연결했을때 각각의 전류는 얼마 일까요?

IR1 = 1V / 10K = 1 / 10000 = 0.0001 = 0.1mA
IR2 = 2V / 20K = 2 / 20000 = 0.0001 = 0.1mA

어때요? 각각의 저항과 전압이 다른데도 흐르는 전류의 값은 같죠?
이 포스트를 읽고 계실 분이라면
     "하나의 회로에 흐르는 전류의 값은 같다"
라는 말을 어디서 들어 보셨을 것 같은데, 이제 이해 되시죠?

자 그럼 다시 원래대로 돌아 와서 24V 전압을 아두이노에 입력 받으려면 
저항을 어떤걸 써야 할까요?

아까 구한 대로 라면
R1 = 19, R2 = 5 입니다.
비율만 갖다면 어떤 값이든 상관 없다고 했으니까,
표준 저항(모든 수치에 맞는 저항을 다 만들 수는 없겠죠. 신발사이즈 처럼)에서 
고르기 편하게  R2를 1로 바꾸어서 다시 계산해면

R2/ (R1+ R2) 이니까, 5/24 였어요, 이걸 5로 약분하면
5/24 = 1/4.8 이네요.
그러면 R2 = 1, R1 = 4.8 - 1 = 3.8

R1 = 3.8, R2 = 1

정말 맞는지 공식에 다시 대입해 볼까요?


24 * 1 / ( 3.8 + 1) = 24 / 4.8 = 5

맞군요.


이제 10을 몇번 곱해야 할지는 필요한 전류에 따라 다릅니다.
우리는 아두이노 디지털 핀으로 입력 받기를 원하니까,
아두이노가 느낄 수 있는 정도의 전류만 있으면 되겠네요.

앞서 풀업/풀다운 저항 포스팅 에서도 설명 드린것 처럼
아두이노 입력 핀은 아무런 회로와 연결되어 있지 않으면
1(HIGH), 0(LOW)가 무작위로 입력됩니다.
아주 미세한 전자의 영향을 받는 것이죠.
이 상태를 Hi-Z(하이 임피던스)라고 하는데요.
이때는 아주 미세한 전류만 흘러도 인식할 수 있다는 뜻입니다.
수 마이크로 암페어의 전류만 있어도 가능합니다.

그럼, IR1, IR2가 수 uA(마이크로 암페어) 그러니까 0.x mA가 되도록 저항 값에 10을 곱해서 높여주면 되겠군요.
어차피 IR1과 IR2는 하나의 회로니까 전류값이 동일할 것이고, 그러면 편하게 IR2것만 계산해 보면 되겠네요.
IR2 = 5V / 1옴 = 5A  너무 크죠? 그럼 저항에 0을 4개 붙이면 0.0005A 즉 0.5mA가 되겠네요?

IR2 = 5V / 10,000옴 = 0.0005 = 0.5mA 

그럼 배율에 따라 3.8과 1에다가 10k씩 곱해서

R1 = 38kΩ, R2 = 10kΩ 

이제 되었네요.

그럼 실제로 실험을 해볼까요?
저는 38kΩ 저항이 없어서 20kΩ + 18kΩ을 직렬연결하였습니다.
실제로 38kΩ은 표준저항에 없구요. 구매하실때는 39kΩ을 구매하시면 됩니다.

먼저 24v 어뎁터를 준비합니다.

24v 어뎁터를 브레드 보드에 쉽게 연결할 수 있게 커넥터를 준비했습니다.



멀티미터로 어뎁터의 전압을 측정해보니 24.36v 가 나오네요.

20k + 18k , 10k를 연결해서 중간에서 전압을 측정하니 5.04v가 나오네요.


자 그럼 실제로 아두이노와 연결해서 마지막 실험을 해볼까요?
(주의!! 이렇게 고전압으로 회로를 구성할때는 반드시 위의 사진처럼 멀티미터로 먼저 테스트 해보는게 좋습니다.
무조건 아두이노나 라즈베리파이의 GPIO에 연결하면 순식간에 타버릴 수 있으니까요!
제가 그걸 모르고 라즈베리파이 4개나 태워 먹었어요.)

저는 아래와 같이 회로를 구성했습니다.
저는 38k옴 대신에 20k와 18k를 연달아(직렬) 연결했습니다.
그리고 10k옴과 연결한 사이에서 2번 핀으로 입력을 받는 겁니다.
그리고 당연히 2개의 회로의 GND를 연결해줍니다.(이거는 어떻게 설명하기 힘든 부분이네요.)


아래 코드는 아두이노에서 스위치 입력을 받아 LED를 깜빡이는 코드 입니다.
아두이노 IDE 메뉴에서 “파일” > “예제” > “02.Digital” > “Button”을 누르면 나옵니다.

const int buttonPin = 2;     // the number of the pushbutton pin
const int ledPin =  13;      // the number of the LED pin

// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  }
  else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}


아래 동영상은 최종 실험 모습을 담았습니다.



만약 라즈베리파이로 똑같은 회로의 입력을 받는다면 저항 값은 얼마로 해야 할까요?
라즈베리파이는 3.3v를 입력 값으로 받기 때문에 저항 값을 다시 계산해야 합니다.

다시 공식에 대입해 볼까요?


3.3 = R2 / (R1+R2) * 24
R2/(R1+R2) = 3.3/24 = 1/7.27
R2 = 1
R1 = 7.27 - 1 = 6.27


이렇게 2개의 저항을 이용해서 전압분배를 해 보았는데요.
이 전압분배와 저항의 관계는 두고두고 써먹을 데가 많기도 하고 전자 회로를 이해하는데 꼭 필요한 지식입니다.
이것을 이해해야 트랜지스터를 이용한 여러가지 회로를 만들 수가 있습니다.

그럼 누군가에게는 도움이 되었기를 바랍니다.

그나저나 악보는 언제 쓰나...






  • 학생 2016.09.07 22:00

    흐 교통카드 단말기에서 12v를 5v디지털 신호로 바꾸어 아두이노로 보내는데 큰 도움이 되었습니다. 감사합니다 ㅠㅠ

  • 궁금이 2016.11.03 22:29

    전압분배회로를 만들어서 전압을 낮춘다음 led를 연결하려하는데요..
    led에서 필요한 전류량을 어떻게 맞춰주나요?
    r1, r2 중간에서 전원을 따면 또 다른 회로가 구성되서 전류량이 바뀌는거 아닌가요?
    어려워요....;

    • Favicon of https://blog.xcoda.net BlogIcon 이세우 2016.11.14 20:14 신고

      전류량은 저항과 전압을 이용해서 제어 합니다.
      R1과 R2의 저항값이 얼마나 되느냐에 따라 R1과 R2에서 나갈 수 있는 전류량이 결정되는데, 거기서 다시 LED등을 연결하기 위해서는 LED에 필요한 전류와 전압을 위한 저항을 다시 연결해야 되겠지요.
      쉽게 생각하면 R1과 R2 사이에서 전원을 딴것을 아두이노 디지털 핀에서 나온 거라고 생각하고 LED 연결할 회로를 구성하면 됩니다.

      다만 충분히 필요한 전류가 나오기 위해서는 R1과 R2의 저항 값이 조정이 되야 겠지요.

      그럼 좋은 성과 있으시길 바랍니다.

  • 글쎄 2016.11.25 08:32

    5V에서 1.5V로 다운해서 쓸때 얼마짜리 저항을 써야되나요.
    3.7 V 리튬이온에서 1.5V 다운시에는 저항 얼마짜리 필요한가요.
    저항에서 손실이 얼마나 될까요.
    어떤 사람들은 전압 다운할때 다이오드 쓰는 사람도 있던데요

    • Favicon of https://blog.xcoda.net BlogIcon 이세우 2016.12.12 22:29 신고

      5V에서 1.5V로 전압 다운하시려면 공식대로 풀어 보시면 됩니다.
      1.5 = R2/R1+ R2 * 5

      계산이 힘드시면 아래 링크를 통해서 가지고 계시거나 구하기 쉬운 저항 값을 넣어 보시면 구하실 수 있습니다.
      http://www.electronics2000.co.uk/calc/potential-divider-calculator.php
      정 모르시겠으면
      R1 = 2.4K, R2=1K 하시면 되겠네요.

  • 감사합니다 2017.05.14 18:13

    정말 정말 감사합니다. 친절하고 자세한 설명이 너무 도움이 되었습니다!!!

  • 노기성 2017.08.20 23:23

    와...정말 가려운 부분을 제대로 긁어주셨네요 너무 감사합니다 ㅠㅠ

  • 김기원 2017.09.05 09:08

    좋은 글 감사합니다.
    대학때 배울때는 이렇게 시원하게 이해 못했는데
    지금은 필요해서 해야 하니 이해가 되네요.
    물론 설명을 잘해주셔서겠지요 ^^
    땅콩주택도 그렇고 여러글이 많은 도움이 되었습니다.

  • HyungChul 2018.01.26 10:08

    그동안 이해를 하지 못하고 사용 했던 것들이 싹 정리가 되네요.
    좋은 글 덕분에 한단계 성장한 기분 입니다.^^

  • 호랑이 2018.06.26 00:47

    도움이 많이 되었습니다. 감사합니다.

  • 대단합니다! 2019.04.03 19:46

    지금 찾고 있는 정보랑 조금 달라 자세히 읽진 않았지만 나중에 시간내서 꼭 정독할만한 중요한 내용입니다!

  • YM 2020.04.24 03:32

    미국에서, 실제로 24vdc 를 다운 하여, 아두이노로 IF 를 써서, Timing 을 써보려 합니다. 자세히 설명 되어 있어서, 잘 보고 갑니다. 해보고서 말씀 다시 올릴께요. 소중한 자료 감사합니다.

  • 박정식 2021.02.15 08:39

    안녕하세요 좋은자료 감사합니다!!

    알려주신대로 12v 값을 아두이노 아날로그로 값을 받으려고 12v 저항으로 4.8v 로 낮추어 테스터기로 찍어봤는데 정상적으로 4.8v가 나오지만 처음 순간적으로는 12v, 8v가 테스터기에 찍히고 4.8v 체크가 되는데 이는 아두이노에 영향이 없을까요??