본문으로 이동
주 메뉴
주 메뉴
사이드바로 이동
숨기기
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
특수 문서 목록
학교의 모든 지식. SMwiki
검색
검색
보이기
로그인
개인 도구
로그인
로그아웃한 편집자를 위한 문서
더 알아보기
기여
토론
아두이노:저항계 만들기
편집하기
문서
토론
한국어
읽기
편집
원본 편집
역사 보기
도구
도구
사이드바로 이동
숨기기
동작
읽기
편집
원본 편집
역사 보기
일반
여기를 가리키는 문서
가리키는 글의 최근 바뀜
파일 올리기
문서 정보
보이기
사이드바로 이동
숨기기
Sam
(
토론
|
기여
)
님의 2025년 8월 22일 (금) 06:00 판
(
차이
)
← 이전 판
|
최신판
(
차이
) |
다음 판 →
(
차이
)
경고: 이 문서의 오래된 판을 편집하고 있습니다.
이것을 게시하면, 이 판 이후로 바뀐 모든 편집이 사라집니다.
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
{{아두이노}} == 개요 == 아두이노로 저항계 만들기. 오옴미터(Ohmmeter). 옴미터 만들기에 관한 문서. === 원리 === {| class="wikitable" !원리 !설명 !비고 |- |아두이노 아날로그 핀 | * 아날로그 핀은 0~1023의 전압신호를 받을 수 있다. * 때문에 읽어들이는 전압을 토대로 간접적으로 저항을 측정한다. | |- |전압 분배 법칙 | * 아두이노에서 공급되는 5V 전압을 이용하여, * 알려진 저항(R_known)과 측정할 저항(R_unknown)을 직렬로 연결하고, * 아두이노의 아날로그 핀(A0)으로 중간 전압을 읽는다. |전압값을 이용해 저항값을 유도하는 방식. 옴의 법칙과 전압 분배 공식 사용. |- |회로 구성 |[[파일:저항계 회로 구성.png|섬네일|값을 모르는 저항 대신 가변저항으로 두어 실습하면 좋을듯.]]초록선과 검은선을 미지의 저항에 연결하면 된다. |실제로는 R_known = 10kΩ 정도를 많이 사용. |- |계산식 유도 | * <math>5V = iR_{known} + iR_{unkown}</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>에서 A0에 인가되는 전압은<math>V_{A0} = \frac{R_{unknown}}{R_{known} + R_{unknown}}5 </math>이다. * 정리하면 <math>R_{\text{unknown}} = R_{\text{known}} \cdot \left(\frac{V_{A0}}{5 - V_{A0}}\right)</math>의 관계로부터 저항을 얻을 수 있다. * 전압으로 바꾸지 않고 읽은 값 그대로 사용하면 <math>R_{\text{unknown}} = R_{\text{known}} \cdot \left(\frac{raw}{1023 - raw}\right)</math> |아두이노가 읽은 전압으로 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단계로 값을 보여주기 때문에 양자화오차(컴퓨터가 아날로그 신호를 받아들일 때 생기는 오차)가 발생한다. 아는 저항은 적절한 값으로 바꾸어주어야 한다.<syntaxhighlight lang="c++"> 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("%]"); } </syntaxhighlight> === 유의사항 === * R_unknown의 한쪽은 반드시 아두이노 GND에 연결되어야 정확한 측정 가능. * A0 핀에 직접 전압을 넣지 않고 반드시 전압 분배 회로를 사용해야 함. * 아두이노의 전원(5V)이 정확하지 않으면 결과 오차가 생김. * 측정할 수 있는 저항 범위는 보통 수백Ω ~ 수백kΩ 정도가 적당. * 저항값이 너무 작으면 발열 및 회로 손상 위험이 있음. === 오차 === {| class="wikitable" !오차 원인 !상세 내용 !해결법 및 완화책 |- |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 === * 가변저항값을 아날로그 단자로 읽을 수 있으니, 여기에서 저항값을 조절하여 저항계를 만든다면? 상황에 따라 다양한 저항을 쓰는 저항계가 될 수 있을듯? 정밀도를 높히도록.
요약:
학교의 모든 지식. SMwiki에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
학교의 모든 지식. SMwiki:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)
이 문서에 포함된 문서:
틀:아두이노
(
편집
)
검색
검색
아두이노:저항계 만들기
편집하기
새 주제