아두이노:저항계 만들기

학교의 모든 지식. SMwiki
둘러보기로 이동 검색으로 이동

아두이노 관련 정보를 모으기 위한 틀. 틀:아두이노

  1. 아두이노:개요
  2. 아두이노:하드웨어
    1. 아두이노:우노보드
    2. 아두이노:ESP32
  3. 아두이노:코드
    1. 아두이노:컴퓨터에서 보드로
    2. 아두이노:안드로이드에서 보드로
    3. 아두이노:기초 문법
    4. 아두이노:라이브러리
  4. 아두이노:핀 사용
    1. 아두이노:전원공급
  5. 아두이노:시리얼 통신
    1. 아두이노:엑셀기록
    2. 아두이노:파이썬과 통신
  6. 아두이노:편의함수
  7. 센서 사용
    1. 아두이노:모션센서
    2. 아두이노:온습도센서
    3. 아두이노:조도센서
    4. 아두이노:인체감지센서
    5. 아두이노:pH미터 만들기(Gravity 아날로그 pH센서)
  8. 아두이노:LCD 사용
  9. 아두이노:스위치 사용
  10. 아두이노:릴레이
  11. 통신 관련, 정보 교환
    1. 아두이노:WIFI
    2. 아두이노:블루투스(외장모듈)
    3. 아두이노:IR 송수신
    4. 아두이노:RFID
  12. 아두이노:해결되지 않은 다양한 의문들
  13. 수업용 간단 실습
    1. 아두이노:LED
    2. 아두이노:초음파센서
    3. 아두이노:전압계 만들기
    4. 아두이노:저항계 만들기
  14. 아두이노 모터 출력
    1. 아두이노:서보 모터
    2. 아두이노:DC 모터
    3. 아두이노:BLDC 모터
  15. 미완문서
    1. 아두이노:스테핑 모터
  16. 분류:아두이노 프로젝트

개요[편집 | 원본 편집]

아두이노로 저항계 만들기. 오옴미터(Ohmmeter). 옴미터 만들기에 관한 문서.

원리[편집 | 원본 편집]

원리 설명 비고
아두이노 아날로그 핀
  • 아날로그 핀은 0~1023의 전압신호를 받을 수 있다.
  • 때문에 읽어들이는 전압을 토대로 간접적으로 저항을 측정한다.
전압 분배 법칙
  • 아두이노에서 공급되는 5V 전압을 이용하여,
  • 알려진 저항(R_known)과 측정할 저항(R_unknown)을 직렬로 연결하고,
  • 아두이노의 아날로그 핀(A0)으로 중간 전압을 읽는다.
전압값을 이용해 저항값을 유도하는 방식. 옴의 법칙과 전압 분배 공식 사용.
회로 구성
값을 모르는 저항 대신 가변저항으로 두어 실습하면 좋을듯.
초록선과 검은선을 미지의 저항에 연결하면 된다.
실제로는 R_known = 10kΩ 정도를 많이 사용.
계산식 유도
  • 5V=iRknown+iRunkown이다.
  • R1:R2=Vtotal(R1R1+R2):Vtotal(R2R1+R2)에서 A0에 인가되는 전압은VA0=RunknownRknown+Runknown5이다.
  • 정리하면 Runknown=Rknown(VA05VA0)의 관계로부터 저항을 얻을 수 있다.
  • 전압으로 바꾸지 않고 읽은 값 그대로 사용하면 Runknown=Rknown(raw1023raw)
아두이노가 읽은 전압으로 R_unknown을 계산할 수 있음.
주의사항 R_unknown이 너무 작으면 전류가 많이 흐르고, 너무 크면 오차가 커짐.

⇒ R_known과 R_unknown이 같은 크기일 때 가장 정확함.

10kΩ:10kΩ 또는 10kΩ:100kΩ 정도에서 안정적으로 동작.

간단 저항계 만들기[편집 | 원본 편집]

분압식 저항계(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[편집 | 원본 편집]

  • 가변저항값을 아날로그 단자로 읽을 수 있으니, 여기에서 저항값을 조절하여 저항계를 만든다면? 상황에 따라 다양한 저항을 쓰는 저항계가 될 수 있을듯? 정밀도를 높히도록.(자동스케일 저항계??)