아두이노:전압계 만들기: 두 판 사이의 차이
보이기
새 문서: {{아두이노}} == 개요 == 전압계 만들기. === 원리 === {| class="wikitable" !아두이노 특성 !확인 !비고 |- |아두이노의 아날로그 핀은 전압에 따라 0~1023의 총 1024개 값을 반환한다.(전압은 0부터 5V까지) | |가변저항(potentiometer)의 원리 https://blog.kakaocdn.net/dna/VTamv/btqOP320cgb/AAAAAAAAAAAAAAAAAAAAAF05XBjJxz_zHvFETrjtY3WYNpjUt1gDwa6amKG1gJHE/img.gif?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1753973999&allo... |
잔글 →원리 |
||
| (같은 사용자의 중간 판 28개는 보이지 않습니다) | |||
| 2번째 줄: | 2번째 줄: | ||
== 개요 == | == 개요 == | ||
전압계 만들기. | 전압계 만들기. 볼트미터! voltmeter. | ||
=== 원리 === | === 원리 === | ||
<youtube>https://www.youtube.com/watch?v=ZVXi-MPeyWw</youtube> | |||
{| class="wikitable" | {| class="wikitable" | ||
!아두이노 특성 | !아두이노 특성 | ||
| 10번째 줄: | 11번째 줄: | ||
!비고 | !비고 | ||
|- | |- | ||
|아두이노의 아날로그 핀은 전압에 따라 0~1023의 총 1024개 값을 반환한다.(전압은 0부터 5V까지) | |아두이노의 아날로그 핀은 전압에 따라 0~1023의 총 1024개 값을 반환한다.(전압은 0부터 5V까지. 역전압은 인식 불가.) | ||
| | |[https://smwiki.info/images/b/b2/%EA%B0%80%EB%B3%80%EC%A0%80%ED%95%AD%EC%9D%84_%ED%86%B5%ED%95%9C_%EC%A0%84%EC%95%95_%ED%99%95%EC%9D%B8.png 연결 예시] | ||
# 가변저항의 양 끝을 5V입력과 GND에 입력한다. | |||
# 가운데 단자를 A0에 입력한다. | |||
# 다음의 코드를 사용한다. | |||
<syntaxhighlight lang="c++"> | |||
const int analogPin = A0; | |||
void setup() { | |||
Serial.begin(9600); // 시리얼 통신 시작 | |||
} | |||
void loop() { | |||
int adcValue = analogRead(analogPin); // 0~1023 Analog-to-Digital Converter의 약자. | |||
float voltage = adcValue * (5.0 / 1023.0); // 실제 전압으로 변환 | |||
Serial.print("ADC Value: "); | |||
Serial.print(adcValue); | |||
Serial.print(" → Voltage: "); | |||
Serial.print(voltage, 2); // 소수 둘째 자리까지 출력 | |||
Serial.println(" V"); | |||
delay(1000); // 1초마다 갱신 | |||
} | |||
</syntaxhighlight> | |||
|가변저항(potentiometer)의 원리 | |가변저항(potentiometer)의 원리 | ||
https:// | https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSl4Z4KDThbhbxDKIU9TaPkKVbqbkEHPD5AGA&s | ||
* 저항물질의 길이를 조절하여 저항의 크기를 바꾼다. | |||
* 아두이노에선 어떤 저항이든 전압값을 읽기 때문에 기왕이면 큰 저항값을 사용해서 전류가 많이 흐르지 않게 하는 게 유리함. | |||
|- | |- | ||
|아두이노가 읽을 수 있는 전압은 5V까지이기에, 저항들을 직렬연결하여 전압 분배법칙을 통해 정리한다. | |||
|보통 다음과 같이 연결. | |||
(Vin) ----[ R1 ]----+----[ R2 ]---- GND | |||
(병렬연결) | | |||
A0 (아날로그 입력) | |||
* 만약 10kΩ 2개를 사용하여 전압을 건다면 전체 걸린 전압의 절반이 A0로 입력될 것이다.(이 경우 총 10V까지 측정 가능) | |||
* 결국 입력되는 전압을 일반화해 보자. 알고자 하는 전압이 <math>V_{total}</math>이라면 각 저항의 걸리는 전압의 비는 각 저항의 크기와 같을 것이다. <math>R_1:R_2 = V_{total} \left ( \frac{R_1}{R_1+R_2} \right ) : V_{total} \left ( \frac{R_2}{R_1+R_2} \right )</math> 이므로 입력되는 전압 <math>V_{A0} = V_{total}\left ( \frac{R_2}{R_1+R_2} \right ) </math>이다. | |||
* 큰 저항을 사용하면 오차가 커질 수 있기에, 총 저항 합은 10kΩ ~ 100kΩ 사이로 잡는 게 적당. | |||
| | | | ||
|} | |} | ||
* | = 간이 전압계 만들기 = | ||
* | |||
=== 영상메뉴얼 === | |||
<youtube>https://www.youtube.com/watch?v=Aw41YnWr9Tc</youtube> | |||
[[파일:간이 전압계 연결법.png|섬네일|5V 이내일 경우, 연결은 이렇게!]] | |||
=== 회로구성 === | |||
* 측정하고자 하는 전압공급원의 -극은 GND와 연결시키고, +극을 통해 제공되는 전압을 측정하자. | |||
* 측정하고자 하는 전압이 5V보다 낮다면 곧바로 아날로그핀으로 넣어주면 된다. | |||
* 측정하고자 하는 전압이 5V보다 크다면 전압 강하와 저항비를 이용하여 저항의 중간에서 나오는 전압을 아날로그핀으로 측정한다.[[파일:간이 전압계 회로도.png|섬네일|5V 이상인 경우, 연결은 이렇게!]] | |||
=== 코드 === | |||
<syntaxhighlight lang="c++"> | |||
const int analogPin = A0; | |||
const float R1 = 20000; | |||
const float R2 = 20000; | |||
void setup() { | |||
Serial.begin(9600); | |||
} | |||
void loop() { | |||
int raw = analogRead(analogPin); | |||
float va0 = raw * (5.0 / 1023.0); // 아날로그 핀 전압. .0을 넣어준 것은 정수가 아니라, 실수로 만들기 위해. | |||
float vtotal = va0 * (R1 + R2) / R2; // 원래 입력 전압 계산 | |||
Serial.print("Raw: "); | |||
Serial.print(raw); | |||
Serial.print(" V_a0: "); | |||
Serial.print(va0); | |||
Serial.print(" Measured Voltage: "); | |||
Serial.print(vtotal, 2); // 소수점 2자리 | |||
Serial.println(" V"); | |||
delay(1000); | |||
} | |||
</syntaxhighlight> | |||
== 유의사항 == | |||
* A0 단자와 연결한 선을 배터리의 +극과 -극에 연결해도 정확한 전압이 측정되지 않는다. 떠 있는 상태(floating)로, 외부 교란이 섞인다. ==>> 전지의 -단자가 아두이노의 GND에 연결되게끔 구성. | |||
* 절대로 A0 단자에 5V 이상의 입력이 들어가게 하면 안된다. 파손... | |||
=== 오차 === | |||
{| class="wikitable" | |||
!오차 원인 | |||
!상세 내용 | |||
!해결법 및 완화책 | |||
|- | |||
|ADC 해상도 제한 | |||
|10bit로 미세 변화 감지 한계 | |||
|고해상도 ADC 모듈 사용 | |||
|- | |||
|기준 전압 불안정 | |||
|5V가 정확하지 않음(구동전압 자체가 5V가 아닌 경우) | |||
|외부 정밀 기준 전압 사용 | |||
|- | |||
|저항 오차 | |||
|저항 공차에 따른 측정 오차 | |||
|정밀 저항(±1% 이하) 사용 | |||
|- | |||
|전기 잡음 및 간섭 | |||
|주변 노이즈로 인한 신호 왜곡 | |||
|차폐, 필터링, 풀다운 저항 사용 | |||
|- | |||
|접촉 불량 | |||
|배선 불량, 납땜 불량 | |||
|배선 점검, 신뢰성 높은 연결 | |||
|- | |||
|코드 및 연산 오차 | |||
|반올림, 샘플링 간격 문제 | |||
|코드 최적화 및 평균값 처리 | |||
|- | |||
|환경 온도 영향 | |||
|온도 변화에 따른 부품 특성 변화 | |||
|온도 보상 회로 또는 보정 | |||
|} | |||
= 생각해볼 만한 것 = | |||
* 최대로 측정할 수 있는 전압은 어느 정도일까? | |||
* <math>V_{A0} =5= V_{total}\left ( \frac{R_2}{R_1+R_2} \right ) </math>일 때가 최대이므로, <math>V_{max}=5 \left ( \frac{R_1+R_2}{R_2} \right ) </math>인데, 10kΩ과 100kΩ 을 쓴다면 55V도 가능하지만, 20V 정도가 어느 정도 정밀도가 확보된 측정에 적절하지 않을지. | |||
== 해 볼 만한 활동 == | |||
* 오차의 원인 살펴보기.(생각보다 꽤 많음) | |||
* 같은 저항이라도 R_1, R_2에 몇 개를 연결하느냐에 따라 저항비가 달라진다. 조합을 통해 측정 가능 전압의 범위를 넓혀보자.(누가 가장 큰 전압을 측정하는 전압계를 만들었을까?) | |||
* 전지의 병렬, 직렬연결 후 뿜어내는 전압을 측정. | |||
* 시판되는 멀티미터에서 측정되는 값과 비교하는 것도 재미있다. | |||
=== Idea === | |||
* 저항계 만들때 떠올린 건데, R_1를 가변저항으로 만들고 R_2를 작은 저항으로 두어 상황에 따라 바꾸어 사용하면 쓸만할듯?(혹은 둘 다 가변저항으로 두든가. 가변저항값을 측정해서 반영하게끔) | |||
* 이걸 이용해서 LED에 최대 입력 가능 전압 띄워보고... | |||
* 전지의 직렬, 병렬연결 등 확인해보면 재미있을듯. | |||
2025년 12월 8일 (월) 04:22 기준 최신판
아두이노 관련 정보를 모으기 위한 틀. 틀:아두이노
- 아두이노:개요
- 아두이노:하드웨어
- 아두이노:코드
- 아두이노:핀 사용
- 아두이노:시리얼 통신
- 아두이노:편의함수
- 센서 사용
- 아두이노:LCD 사용
- 아두이노:스위치 사용
- 아두이노:릴레이
- 통신 관련, 정보 교환
- 아두이노:해결되지 않은 다양한 의문들
- 수업용 간단 실습
- 아두이노 모터 출력
- 미완문서
- 분류:아두이노 프로젝트
전압계 만들기. 볼트미터! voltmeter.
| 아두이노 특성 | 확인 | 비고 |
|---|---|---|
| 아두이노의 아날로그 핀은 전압에 따라 0~1023의 총 1024개 값을 반환한다.(전압은 0부터 5V까지. 역전압은 인식 불가.) | 연결 예시
const int analogPin = A0;
void setup() {
Serial.begin(9600); // 시리얼 통신 시작
}
void loop() {
int adcValue = analogRead(analogPin); // 0~1023 Analog-to-Digital Converter의 약자.
float voltage = adcValue * (5.0 / 1023.0); // 실제 전압으로 변환
Serial.print("ADC Value: ");
Serial.print(adcValue);
Serial.print(" → Voltage: ");
Serial.print(voltage, 2); // 소수 둘째 자리까지 출력
Serial.println(" V");
delay(1000); // 1초마다 갱신
}
|
가변저항(potentiometer)의 원리
https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSl4Z4KDThbhbxDKIU9TaPkKVbqbkEHPD5AGA&s
|
| 아두이노가 읽을 수 있는 전압은 5V까지이기에, 저항들을 직렬연결하여 전압 분배법칙을 통해 정리한다. | 보통 다음과 같이 연결.
(Vin) ----[ R1 ]----+----[ R2 ]---- GND (병렬연결) | A0 (아날로그 입력)
|

- 측정하고자 하는 전압공급원의 -극은 GND와 연결시키고, +극을 통해 제공되는 전압을 측정하자.
- 측정하고자 하는 전압이 5V보다 낮다면 곧바로 아날로그핀으로 넣어주면 된다.
- 측정하고자 하는 전압이 5V보다 크다면 전압 강하와 저항비를 이용하여 저항의 중간에서 나오는 전압을 아날로그핀으로 측정한다.

5V 이상인 경우, 연결은 이렇게!
const int analogPin = A0;
const float R1 = 20000;
const float R2 = 20000;
void setup() {
Serial.begin(9600);
}
void loop() {
int raw = analogRead(analogPin);
float va0 = raw * (5.0 / 1023.0); // 아날로그 핀 전압. .0을 넣어준 것은 정수가 아니라, 실수로 만들기 위해.
float vtotal = va0 * (R1 + R2) / R2; // 원래 입력 전압 계산
Serial.print("Raw: ");
Serial.print(raw);
Serial.print(" V_a0: ");
Serial.print(va0);
Serial.print(" Measured Voltage: ");
Serial.print(vtotal, 2); // 소수점 2자리
Serial.println(" V");
delay(1000);
}
- A0 단자와 연결한 선을 배터리의 +극과 -극에 연결해도 정확한 전압이 측정되지 않는다. 떠 있는 상태(floating)로, 외부 교란이 섞인다. ==>> 전지의 -단자가 아두이노의 GND에 연결되게끔 구성.
- 절대로 A0 단자에 5V 이상의 입력이 들어가게 하면 안된다. 파손...
| 오차 원인 | 상세 내용 | 해결법 및 완화책 |
|---|---|---|
| ADC 해상도 제한 | 10bit로 미세 변화 감지 한계 | 고해상도 ADC 모듈 사용 |
| 기준 전압 불안정 | 5V가 정확하지 않음(구동전압 자체가 5V가 아닌 경우) | 외부 정밀 기준 전압 사용 |
| 저항 오차 | 저항 공차에 따른 측정 오차 | 정밀 저항(±1% 이하) 사용 |
| 전기 잡음 및 간섭 | 주변 노이즈로 인한 신호 왜곡 | 차폐, 필터링, 풀다운 저항 사용 |
| 접촉 불량 | 배선 불량, 납땜 불량 | 배선 점검, 신뢰성 높은 연결 |
| 코드 및 연산 오차 | 반올림, 샘플링 간격 문제 | 코드 최적화 및 평균값 처리 |
| 환경 온도 영향 | 온도 변화에 따른 부품 특성 변화 | 온도 보상 회로 또는 보정 |
- 최대로 측정할 수 있는 전압은 어느 정도일까?
- 일 때가 최대이므로, 인데, 10kΩ과 100kΩ 을 쓴다면 55V도 가능하지만, 20V 정도가 어느 정도 정밀도가 확보된 측정에 적절하지 않을지.
- 오차의 원인 살펴보기.(생각보다 꽤 많음)
- 같은 저항이라도 R_1, R_2에 몇 개를 연결하느냐에 따라 저항비가 달라진다. 조합을 통해 측정 가능 전압의 범위를 넓혀보자.(누가 가장 큰 전압을 측정하는 전압계를 만들었을까?)
- 전지의 병렬, 직렬연결 후 뿜어내는 전압을 측정.
- 시판되는 멀티미터에서 측정되는 값과 비교하는 것도 재미있다.
- 저항계 만들때 떠올린 건데, R_1를 가변저항으로 만들고 R_2를 작은 저항으로 두어 상황에 따라 바꾸어 사용하면 쓸만할듯?(혹은 둘 다 가변저항으로 두든가. 가변저항값을 측정해서 반영하게끔)
- 이걸 이용해서 LED에 최대 입력 가능 전압 띄워보고...
- 전지의 직렬, 병렬연결 등 확인해보면 재미있을듯.