// 구글 검색 // 네이버 검색

키보드 스위치 회로를 만들기 전에 우선 간단하게 관련 이론부터 알아보도록 합시다.

 

전압 분배 법칙

아래 회로에 5V의 전압을 공급해 주면 왼쪽에서부터 전류가 흐르기 시작해 저항1과 저항2를 거쳐 오른쪽에 접지된 부분까지 도달합니다. 이때 저항1의 왼쪽에서 전압을 측정하면 5V(공급전압)가 저항2의 오른쪽에서 측정하면 0V(접지)가 나옵니다. 이때 저항1과 저항2의 사이에서 전압을 측정하게 되면 얼마가 나오는 지를 설명해주는 것이 전압 분배 법칙입니다.

 

그림 1. 2개의 저항을 직렬 연결한 모습

결론부터 말하면 회로 전체 저항에서 저항2가 차지하는 비율에 비례한 전압이 측정됩니다. 예를들어 R1이 20Ω, R2가 30Ω이라면 저항2에는 V(in) x {30/(20+30)} = 5V x (3/5) = 3V의 전압이 걸리게 됩니다. 키보드 회로에서는 이 V(out)의 값을 측정하는 것으로 스위치가 눌러졌는지를 확인합니다.

 

스위치 연결

이제 한 단계 더 나아가 위 회로에서 저항2 대신에 스위치를 연결해 봅시다. 전압을 측정하기 위해 V(out) 부분을 아두이노의 GPIO 단자 중 한곳에 연결해 줍니다. 연결한 단자의 모드를 Input으로 변경하면 아두이노 함수를 사용해 전압을 읽을 수 있습니다. 마지막으로 V(in) 부분을 아두이노의 VCC 단자에, 접지 부분을 GND 단자에 연결해주면 회로 구성이 끝납니다. 참고로 VCC와 저항1에 해당하는 부분은 매우 빈번하게 사용되므로, 편의를 위해 아두이노 칩 내부에 구성되어 있습니다. V(out) 부분이 연결된 단자의 모드를 Input_Pullup 으로 변경하는 것으로 아래 회로에서 회색 부분을 생략할 수 있습니다. 이때 저항1을 풀업저항이라 부르며 5V보드에서 보통 10k~20kΩ 정도의 저항이 사용되고 있습니다.

 

그림 2. 저항2 대신 스위치를 연결한 모습

위 회로를 구성한 다음 아두이노로 전압을 읽으면, 스위치가 열려있을 때는 5V, 닫혀있을 때는 0V로 측정됩니다. 이는 스위치가 열려 있을 때는 무한대에 가까운 매우 큰 값을 가진 저항으로 간주할 수 있어 상대적으로 크기가 매우 작은 저항1을 무시하면 1 x VCC가 되기 때문이며, 스위치가 닫혀있을 때는 스위치 자체의 저항이 매우 작아 0으로 간주할 수 있기 때문에 0 x VCC가 되기 때문입니다.

 

전압 측정

지난 글에서 만든 키패드는 열에 해당하는 파란 선들을 Input_Pullup 모드로, 행에 해당하는 빨간 선들을 Output 모드로 설정한 다음 스위치의 상태를 읽었습니다. 이때 digitalRead() 함수로 읽은 결과값으로 스위치를 눌렀을 때 0, 누르지 않았을 때 1을 얻을 수 있었습니다. 이는 아두이노 내부적으로 특정 전압을 기준으로 결과를 0과 1로 구분하여 돌려주기 때문입니다. 제가 사용하는 보드의 경우 3.5V 정도를 기준으로 넘으면 1, 아니라면 0으로 구분하고 있었습니다. 이 기준값은 내부 회로구성에 따라 변하기 때문에 보드마다 차이가 있을 수 있습니다.

 

도표 3. 분해성능에 따른 출력값 분포

회로구성에 따라 조금더 세밀하게 전압을 구할수도 있는데, 한번 측정한 전압을 기준을 바꿔가며 반복해서 측정해 나간다면 한 단계를 거칠때 마다 해상도가 2배씩 늘어나게 됩니다. 1번 측정했을 때 해상도는 2, 2번 측정하면 2x2=4, 3번 측정하면 2x2x2=8이 됩니다. 즉 n번 측정을 했을 때, 해상도는 2^n이 되는 것입니다. 실제로 아두이노는 1024단계로 구분된 전압을 구할 수 있고 이를 analogRead() 함수를 통해 지원합니다. 엄밀하게는 10bit Digital Read라고 해야 하겠지만 측정 단위기 충분히 세밀하기 때문에 일반적인 용도로 사용한다면 아날로그로 간주해도 문제가 없습니다.

 

전압의 측정 범위는 기본적으로 보드의 작동 전압을 기준으로 하기 때문에, 5V 보드에서는 0~5V, 3.3V 보드에서는 0~3.3V의 범위에서 전압을 측정합니다. 추가로 Analog Reference 단자에 xV의 전압을 입력하면 0~xV 범위에서 전압을 측정할 수도 있습니다. 예를 들어 Analog Reference 단자에 4V의 전압을 입력하고 analogRead() 함수를 사용하면 0~4V 범위에서 4V/1024≒0.0039V=3.9mV 단위로 전압을 측정합니다. 이 때 2.7V의 전압을 analogRead() 함수로 읽으면 반환값으로 691을 돌려줍니다. 만약 0~5V 범위에서 측정했다면 측정 단위는 5V/1024≒0.0049V=4.9mV가 되기 때문에 반환값은 553이 됩니다. 실제로는 노이즈 등으로 어느정도 측정오차가 발생해 조금씩 결과값이 달라지기도 합니다.

 

합성저항

digitalRead() 함수는 전압의 상태를 2단계로 구분하기 때문에 스위치를 2개 이상 연결하면 어떤 스위치가 눌러졌는 지 구분할 수 없습니다. 하지만 analogRead() 함수를 사용하면 1024단계로 전압을 구분하므로 여러개의 스위치를 연결해도 측정된 전압의 차이를 통해 어떤 스위치가 눌러졌는지 구분할 수 있습니다. 전압의 차이는 스위치를 이용해 저항을 합성시키는 것으로 만들 수 있습니다.

 

그림 4. 저항의 직렬연결

스위치1 스위치2 스위치3 스위치4 합성저항
○ or ● ○ or  ○ or  0
○ or  ○ or  R3
○ or  R3 + R4
R3 + R4 + R5

 

먼저 저항을 직렬로 연결한 경우입니다. 왼쪽부터 스위치를 차례대로 하나씩 눌렀을 경우, 각 저항의 크기가 단순히 더해져 합성저항이 점점 커져가는 것을 확인할 수 있습니다. 2개 이상을 눌렀을 경우는 가장 왼쪽에 있는 스위치만 누른 것과 동일한 결과가 나옵니다. 예를들어 스위치2와 스위치3을 동시에 눌렀을 경우, 저항4와 스위치3을 직렬연결한 것에 스위치2를 병렬연결한 것으로 간주할 수 있는데 스위치의 저항이 0Ω이라 할 수 있으므로 부분 합성저항은 0Ω이 되어 결국 저항3만 연결한 경우와 같게 됩니다. 즉 동시에 여러 키를 눌러도 이를 인식할 수 없습니다. 반면 합성저항을 구하는 방법이 단순해 쉽게 크기를 조절할 수 있으므로, 측정되는 전압의 간격이 4.9mV가 되도록 만들면 이론적으로 하나의 단자로 1023개의 스위치 중 어느것이 눌러졌는지 확인할 수 있습니다. 실제로는 측정오차를 고려해야 하기 때문에 수는 줄어듭니다만 그래도 10개 정도는 여유롭게 연결할 수 있습니다.

 

그림 5. 저항의 병렬연결

스위치1 스위치2 스위치3 합성저항 예시
R3 60
R4 40
R5 30
(R3 x R4) / (R3 + R4) 24
(R3 x R5) / (R3 + R5) 20
(R4 x R5) / (R4 + R5) 17
(R3 x R4 x R5)
/ (R3 x R4 + R3 x R5 + R4 x R5)
11

 

다음으로 저항을 병렬로 연결한 경우입니다. 직렬로 연결한 경우와는 다르게 어떤 식으로 스위치를 눌러도 합성저항이 모두 다르게 나오는 것을 확인할 수 있습니다. 예시란은 저항3~저항5가 각각 60, 40, 30일 경우 합성저항이 어떻게 되는지 계산한 결과입니다. 합성저항의 크기가 너무 가까우면 측정오차로 인해 스위치 입력을 정확히 구분할 수 없는 경우가 생기므로, 실제로 사용할 경우 단자 하나에 스위치 3개 정도가 한계라고 생각합니다. 하지만 스위치의 동시입력을 구분할 수 있기 때문에 키보드에 적용하기에 직렬연결보다 적절합니다.

+ Recent posts