아두이노:저항계 만들기
둘러보기로 이동
검색으로 이동
아두이노 관련 정보를 모으기 위한 틀. 틀:아두이노
- 아두이노:개요
- 아두이노:하드웨어
- 아두이노:코드
- 아두이노:핀 사용
- 아두이노:시리얼 통신
- 아두이노:편의함수
- 센서 사용
- 아두이노:LCD 사용
- 아두이노:스위치 사용
- 아두이노:릴레이
- 통신 관련, 정보 교환
- 아두이노:해결되지 않은 다양한 의문들
- 수업용 간단 실습
- 아두이노 모터 출력
- 미완문서
- 분류:아두이노 프로젝트
개요[편집 | 원본 편집]
아두이노로 저항계 만들기. 오옴미터(Ohmmeter). 옴미터 만들기에 관한 문서.
원리[편집 | 원본 편집]
간단 저항계 만들기[편집 | 원본 편집]
분압식 저항계(voltage divider ohmmeter)를 만들 것이다.
준비물[편집 | 원본 편집]
- 아두이노(보통 우노)
- 노트북(아두이노 IDE 설치해 코드 전달용) + USB 연결(R3는 USB B타입, R4는 USB C타입)
- 값을 아는 저항(아래 코드에선 10k옴 사용함), 값을 모르는 저항(가변저항으로 두면 실습용으로 좋을듯)
- 점퍼선 수-수2개(미지의 저항과 A0연결, 아는 저항과 A0 병렬연결), 암-수1개(미지의 저항과 아는 저항 연결)
코드[편집 | 원본 편집]
코드 작성 전 유의: 아두이노는 1023단계로 값을 보여주기 때문에 양자화오차(컴퓨터가 아날로그 신호를 받아들일 때 생기는 오차)가 발생한다.
아는 저항은 적절한 값으로 바꾸어주어야 한다.
const int analogPin = A0;
const float R_known = 10000.0; // 기준 저항 10kΩ
void setup() {
Serial.begin(9600);
}
void loop() {
int raw = analogRead(analogPin);
// 저항 측정.
float R_unknown = R_known * (float)raw / (1023.0 - (float)raw);
// 부록. 입력 전압 파악.
const float Vin = 5.0; // 아두이노 입력 전압 5V
float Vout = raw * (Vin / 1023.0); // A0에서 읽은 전압
// 처음 작성할 때 사용했으나, 버려진 코드. 참고. float R_unknown = R_known * (Vout / (Vin - Vout)); // 공식 적용
Serial.print("Raw: ");
Serial.print(raw);
Serial.print(" Vout: ");
Serial.print(Vout, 2);
Serial.print(" V Measured Resistance: ");
Serial.print(R_unknown, 2); // 소수점 2번째 자리까지만.
Serial.println(" ohms");
// 오차 관련정보를 함수에 전달.
printResistanceError(R_known, raw);
delay(1000);
}
void printResistanceError(float R_known, int raw) {
// 아두이노의 양자화로 인한 오차범위를 알려주는 함수.
// 중앙값 측정치
float R_meas = R_known * (float)raw / (1023.0 - (float)raw);
// 양자화로 인한 ±0.5 LSB 범위
float raw_low = raw - 0.5;
float raw_high = raw + 0.5;
// 저항 범위 계산
float R_low = R_known * raw_low / (1023.0 - raw_low);
float R_high = R_known * raw_high / (1023.0 - raw_high);
// 상대 오차(%)
float err_low = (R_low - R_meas) / R_meas * 100.0;
float err_high = (R_high - R_meas) / R_meas * 100.0;
Serial.print(" 오차범위: [");
Serial.print(R_low, 2); Serial.print(", ");
Serial.print(R_high, 2); Serial.print("] ohms");
Serial.print(" Error range: [");
Serial.print(err_low, 3); Serial.print("% , ");
Serial.print(err_high, 3); Serial.println("%]");
}
유의사항[편집 | 원본 편집]
- R_unknown의 한쪽은 반드시 아두이노 GND에 연결되어야 정확한 측정 가능.
- A0 핀에 직접 전압을 넣지 않고 반드시 전압 분배 회로를 사용해야 함.
- 아두이노의 전원(5V)이 정확하지 않으면 결과 오차가 생김.
- 측정할 수 있는 저항 범위는 보통 수백Ω ~ 수백kΩ 정도가 적당.
- 저항값이 너무 작으면 발열 및 회로 손상 위험이 있음.
오차[편집 | 원본 편집]
| 오차 원인 | 상세 내용 | 해결법 및 완화책 |
|---|---|---|
| ADC 해상도 제한 | 10bit(1024단계)로는 정밀한 변화 감지가 어려움 | 고해상도 외부 ADC 사용 또는 평균값 처리 |
| Vin 전압 불안정 | 5V 기준이 흔들리면 R_unknown 계산도 흔들림 | 정밀 레퍼런스 전압 사용 |
| R_known의 공차 | 저항이 표기값과 다를 수 있음(예: ±5%) | 정밀 저항(±1% 이하) 사용 |
| 노이즈/잡음 | 아날로그 측정값에 간섭 발생 | 커패시터, 풀다운 저항, 평균화 사용 |
| 코드상 반올림 오차 | 실수 처리 중 소수점 계산 손실 | float 대신 double, 또는 정밀 처리 |
생각해볼 만한 것[편집 | 원본 편집]
- 5V 전압을 나누어 갖기 때문에 저항 측정 자체의 한계는 없다. 다만... R_known 값을 바꿔가며 어떤 저항 범위에서 가장 정확하게 측정되는지 실험해보자.
- R_unknown ≪ R_known → Vout이 거의 0 V → ADC 값이 0 근처 → 분해능 부족, 상대 오차 ↑
- R_unknown ≫ R_known → Vout이 거의 Vin → ADC 값이 1023 근처 → 분해능 부족, 상대 오차 ↑
- 즉, 정확한 범위는 대략 R_known의 0.1배 ~ 10배 사이
- 여러 개의 고정 저항을 토글 스위치로 전환해가며 범위를 바꾸는 ‘자동 스케일 저항계’를 만들어볼 수 있을듯.
- 상용 멀티미터와 비교하여 오차율을 분석해보자.
- 블루투스나 OLED, LCD에 측정값을 출력하는 것도 재미있는 확장 프로젝트다.
- 아두이노 자체의 저항을 측정할 수도 있을까? A0핀의 저항을 말야.
해 볼 만한 활동[편집 | 원본 편집]
- 실제 전자 부품(LED, 가변저항, 센서 등)의 내부 저항을 측정해보자.
- 여러 개의 저항을 직렬/병렬로 연결하고 계산값과 측정값을 비교해보자.
- 물에 녹인 소금물이나 연필심의 저항을 측정해보고 전도도 실험에 활용해보자.
- 아두이노와 컴퓨터를 연결하지 않고 입력장치를 통해 숫자를 입력하고 LCD를 통해 나타내는 프로젝트.
Idea[편집 | 원본 편집]
- 가변저항값을 아날로그 단자로 읽을 수 있으니, 여기에서 저항값을 조절하여 저항계를 만든다면? 상황에 따라 다양한 저항을 쓰는 저항계가 될 수 있을듯? 정밀도를 높히도록.(자동스케일 저항계??)
