행복한 하루
Arduino Nano IoT 33을 이용해서 DC 전압 측정 센서 테스트(SZH-SSBH-043) 본문
안녕하세요.
배터리 패키지에서 잔량을 신호로 주는 것이 있으면 좋겠지만 그런 배터리 패키지는 고가이고 일반적인 충전지에서 전압을 기반으로 잔량을 확인하고 있다고 합니다. 그리고 SoC(State of Charge)라는 용어로 충전상태를 나타내는 용어도 있다고 합니다. 예전에 SOC라고 하면 “Social Overhead Capital, 사회간접자본 투자” 혹은 “System on Chip, 시스템 온 칩”라고 이해를 했는데 또 하나의 약자를 알아야 하네요.
- 전압 측정 모듈을 테스트하지만 향후에 간단한 배터리 잔량을 확인하는 모듈로 만들어 볼 겸 테스트해보았습니다.
1. 배터리 잔량 측정 방법
- 배터리 측정 방법에는 기본적으로 4가지가 있다고 합니다. 전해질 비중 혹은 산도를 계산해서 확인하는 화학 측정법, 방전 곡선을 이용한 전압 측정법, 전류를 측정하여 시간에 따라 적분하여 계산하는 전류 적분법, 내부 압력을 측정하여 계산하는 압력 측정법 있습니다.
2. SZH-SSBH-043 사양
- DC 전압 측정 모듈은 B112 / SZH-SSBH-043 / PP-A735 등 여러 개로 불리고 있었습니다.
- 테스트할 모듈은 입력 전압을 전압분배 법칙을 이용해 전압 값을 신호로 출력해주는 기능을 합니다. 이것을 이용해서 배터리를 입력으로 해서 방전 곡선을 이용하면 배터리 잔량을 대략적으로 알 수 있지 않을까 합니다.
- Input voltage range : DC 0 ~ 25V
- Voltage detection range : DC 0.02445V ~ 25V
- Voltage analog resolution : 0.00489V
- DC input connector : the positive terminal connected to VCC, the negative pole GND
- Output interface (to Arduino / AVR board): "+" to 5 / 3.3V, "-" to GND, "s" to Arduino Analog input pin
- Size : 23mm * 14mm
3. 회로 구성
- 회로는 간단하게 저항 2개로 구성되어 있고 앞뒤로 커넥터로 이루어져 있습니다.
- 중간에 홀이 조금 특이하게 생겼습니다. 이유는 모르겠지만, 하부 동판은 입력 전원 GND와 연결되어 있는데, 상부 동판은 아무것도 연결되어 있지 않았습니다. 정확하게 어떤 이유에서 이렇게 해놓았는지는 모르겠습니다. 아시는 분 이 있다면 댓글로 알려주시면 저도 그렇고 다른 분들도 도움이 되지 않을까 합니다.
- 옴(ohm) 법칙에 의해 저항 직렬연결은 전압이 저항값에 비례해서 걸린다는 것을 알 수 있습니다. 그래서 저항 값이 큰 것에 큰 전압이 걸리고 적은 저항에 낮은 전압이 걸리게 됩니다. 그래서 R2에 걸리는 전압을 가지고 입력 전압을 계산할 수 있습니다.
- R1 : R2 = 30K : 7.5K = 3 : 0.75 = 1 : 0.25
- 입력 전압이 12V 일 경우
R1의 전압 + R2의 전압 = 12V 이므로 저항비로 계산하면,
x + 0.25x = 12V, 1.25x = 12, x = 12 / 1.25 가 되므로 x는 9.6가 됩니다. 결국 R1에 걸리는 전압은 9.6V, R2에 걸리는 전압은 2.4V가 됩니다. 그래서 12V 입력 전압을 인가하면 S(Signal) 핀에 2.4V가 출력됩니다.
4. 회로 연결
- 아두이노 나노와 OLED와 연결해서 측정되는 전압값을 확인하였습니다. 그래서 Signal 핀을 Arduino Nano ADC0(A0)에 연결해서 아날로그 값을 읽게 하였습니다.
- 전압 측정 모듈의 + 핀은 (NC)로 연결할 필요가 없습니다.
5. 소스 설명 및 계산식 설명
- OLED와 기타 내용들은 내용이 많고 이전 내용에도 있기 때문에 첨부한 파일을 참조하시면 좋을 것 같습니다. 그래서 수치 계산하는 부분만 남겨보았습니다.
- 참조 사이트에서도 계산식을 풀이해놓았는데 상세하게 설명해 놓지 않아서 조금 풀어서 설명해보았습니다.
- Signal 핀의 신호를 ADC0(A0)에 연결하고 변환된 아날로그 값을 계산해서 현재 전압 값을 계산합니다. A0 핀에서 ADC로 컨버팅 된 값을 읽어옵니다.
- Arduio Nano 레퍼런스 전압은 3.3V가 기본입니다.
analogReference(AR_DEFAULT); // IoT 33 외에 다른 버전에서는 analogReference(DEFAULT);
- Arduino ADC의 분해 능력은 10bit로 1024 단위로 3.3V를 분해할 수 있습니다. 약 0.0032V 단위로 3.3V까지 측정하다는 것입니다. 예로 A0(input_vol) 값에 2.56V가 입력되면 800으로 변환된 값을 얻을 수 있습니다. 이것을 다시 800 * 0.0032 = 2.56V가 됨을 알 수 있습니다.
- R2/(R1+R2) = 7.5k/(30k+7.5k) = 0.2는 전체 저항 값에서 R2가 차지하는 비중을 알 수 있습니다. 즉, 전체 저항 37.5k 기준으로 R1은 0.8(80%), R2는 0.2(20%) 비중으로 차지하고 있으므로 12V 전압도 동일한 비중으로 분배된다는 것입니다.
- 예를 들어, 입력 전압이 12V라고 할 때 저항 비중으로 구할 경우, 12V * 7.5 / (30+7.5) => 12V * 0.2 => 2.4V 가 됩니다. 이제 반대로 우리는 분배되어 온 R2 전압을 알고 있습니다. 그렇기 때문에 전체 입력 전압을 x로 놓고 전체 전압을 구할 수 있습니다.
- R2에 걸리는 전압(Signal)이 2.4V라고 할 때 전체 입력 전압을 x로 놓으면 x * 7.5 / (30+7.5) = 2.4V라고 공식을 만들 수 있습니다. 조금 풀어보면 x * 0.2 =2.4가 되고, 0.2를 우변으로 넘기면 x = 2.4 / 0.2가 됩니다. 그래서 최종적으로 전체 입력 전압 12V를 구할 수 있습니다.
- 위에서 본 R2의 걸리는 입력 전압이 2.56V라고 한다면, x * 0.2 =2.56 이 되고 x = 2.56 / 0.2 , x = 12.8V 가 됩니다.
- 처리속도를 조금 빠르게 하려면 매번 계산하는 식을 상수로 만들어 처리하면 좀 더 빠른 처리가 가능합니다. 여기서는 공식을 알아보기 위해 풀어서 작성되어 있습니다.
double input_vol = analogRead(A0);
double Vin = (input_vol * 3.3) / 1024.0; // 3.3 is Ref voltage
cal_vol = Vin / (7500.0/(30000.0+7500.0));
Serial.print("Input Analog : ");
Serial.println(input_vol);
Serial.print("Voltage : ");
Serial.println(cal_vol);
6. 실행 결과
- 정격전압 12.8V 배터리 전압을 측정하였습니다. 멀티 메타기에서 12.97V로 표시되었고 전압 센서로 계산한 값을 읽으면 12.85V로 나타났습니다.
- 값이 출렁이기는 하는데 +-0.2V 내외에서 움직이는 것으로 보였습니다. 추가로 소스상에서 평균을 구하는 로직 혹은 값을 안정화하는 로직을 넣으면 조금 더 안정된 수치를 볼 수 있을 거라고 생각됩니다.
- 참고로 Arduino Nano aref 핀에 5V로 레퍼런스 전압을 외부 전원으로 바꿔 주고,
analogReference(AR_EXTERNAL); 설정도 해주었지만, 5V로 측정이 되지 않았습니다. 제가 가지고 있는 모듈이 고장인지 추가적인 설정을 더 해주어야 하는지 모르겠지만, 아무튼 5V 레퍼런스 전압이 설정되지는 않았습니다.
감사합니다.
<참고 사이트>
1. [SMG] 아두이노 전압 측정 센서 모듈 [SZH-SSBH-043]
https://www.devicemart.co.kr/goods/view?no=1327414
2. 001. 전압센서, 회로와 코드를 보면서 원리를 짚어가기
https://jihoonkimtech.tistory.com/24
3. 아두이노 전압센서 사용하기 / 전압 분배 법칙 알아보기
https://blog.naver.com/roboholic84/221998409892
4. analogReference()
https://www.arduino.cc/reference/en/language/functions/analog-io/analogreference/
5. Lab: OLED Screen Display using I2Chttps://itp.nyu.edu/physcomp/lab-oled-screen-display-using-i2c/
6. 배터리 용어사전 – SoC (State of Charge)
7. Circuit simulation and schematics.
'IoT' 카테고리의 다른 글
Raspberry Pi에서 W5100S-EVB-Pico MicroPython 빌드시켜 보기 (0) | 2023.04.18 |
---|---|
Tinker Board 2S eMMC에 OS(Debian 10) 설치 및 Docker 설치하기 (0) | 2022.12.22 |
리튬 배터리(Li-Po) 3.7V 셀용 충전 겸 4.3V~27V 가변 부스트 출력 UPS 모듈(J5019)용 사용후기 (2) | 2022.03.24 |
이더넷(ethernet)을 이용한 2ch 릴레이(Relay) 모듈 테스트(2 Channel Ethernet LAN Relay Module) (0) | 2021.08.11 |
아두이노 나노(Arduino nano) 33 IoT 버전 부족한 시리얼 포트 방법(SoftwareSerial 대체(?)) (0) | 2021.06.27 |