아두이노프로세싱 프로그래밍

아두이노 초보자를 위한 “아두이노 코딩에 의한 배터리 전압 정밀 측정”(업데이트)

coding art 2017. 3. 29. 21:19
728x90

아두이노 코드 끝나는 부분에 } 가 빠져 있어 수정 업데이트 하였음.

배선도 필요로 하는 분이 있어 확대된 그림 파일을 마지막에 첨부하였음.


자동차에 사용되는 납배터리의 표준 전압은 12.6V이며 통상 12V로 표현하기도 한다. 엔진 시동을 위한 크랭킹 시에 순간적인 전압 강하가 일어나며 12V 기준 20% 즉 9.6V 이하로 강하 여부를 측정하여 납 배터리의 정상 여부를 판단한다.

한편 엔진 시동 후에는 발전기의 가동으로 13.8∼14.8V 수준의 전압이 발생되어 전기장치에 전기를 공급하고 일부는 납 배터리를 충전할 수 있도록 미세 전류를 흘려준다.


즉 자동차의 시동용 납 배터리의 전압 사용 범위가 9∼15V 사이 이므로  여유 있게 5∼20V의 측정 범위를 가지도록 아두이노 보드의 아날로그 센서 입력 기능을 활용하여 코딩을 하기로 한다.

이러한 실측 시스템을 만들기 위해서 아두이노 보드의 전원 전압, 측정하고자 하는 배터리의 실제 전압 및 저항의 값을 멀티메터를 사용하여 실측하였다.


두 개의 저항의 멀티메터 실측값은 약간의 오차를 포함하여 각각 0.997K옴과 3.273K옴으로 측정되었다.




연결된 상태에서 측정한 9V 배터리의 실측 전압은 9.2V 였다. 아울러 아두이노 5V 전원은 4.86V 멀티 메터 실측값을 얻었다. 배터리는 회로를 구성하였을 때와 단품일 때의 오픈 서킷일 때의 전압이 다름에 유의한다. 대개 표준전압 9V인 배터리의 사용범위는 8.5∼9.5V 사이 영역에서 사용함을 참조하자.
아두이노 5V 전압선을 멀티메터로 측정하였더니 4.86V 가 측정되었다.

1K옴과 3.3K옴 저항의  실측 값을 실수형 전역 변수로 잡는다.
setup()에서는 통신 속도 설정이 잔부다.


loop()문에서 아날로그 채널 A0로부터 0∼1023 까지의 정수 값 형태로 전압을 읽는다.

A0에서 읽은 정수 값 형태의 전압을 아두이노 보드 전압 여기서는 arduVolt 즉 4.86V를 사용하여 환산한다.

옴의 법칙을 이용하여 환산된 실제 전압 값과 실측된 저항 값을 이용하여 전류를 계산한다.

1K옴에 흐르는 전류가 3.3K옴 저항으로 흐르기 때문에 3.3K옴 저항에 가해지는 전압도 계산이 가능하다. 하지만 여기서는 배터리 전압이 전체 저항에 가해지기 때문에 전류와 전체 저항 실측 값을 곱하여 최종적으로 배터리의 전압 값을 산출하였다.



멀티 실측 값 9.26V와 비교해 보면 아두이노 방식의 측정이 상당히 정밀함을 알 수 있다.



그밖에 회로의 안전을 검토해 보자. 9V 전압에 총 4.4K옴 저항 회로에 흐르는 전류는 약 2mA로 충분히 안전하다. 실수로 9V 전압을 1K옴에 가하게 되면 9mA로 그다지 문제 될 게 없다.

하지만 아두이노 전원 전압 5V는 TTL 기준이기 때문에 아두이노 보드 내에 채용되어 있는 전압 레귤레이터 회의의 성능 및 역할에 의해 어느 정도 5V와 괴리를 가질 수 있다. 여러 개 보드를 측정해 본 바에 의하면 4.8V를 조금 상회하는 수준이다. 자신이 사용하는 보드의 전압을 실측하여 코딩하면 될 것이다.

이 회로에서 저항 값을 10배로 키운 후 드라이버 조정이 가능한 가변 저항형을 사용하여 회로의 정밀도를 올린 후 아두이노 NodeMCU에서 무선와이파이를 통해 스마트폰에서 결과를 출력할 수 있도록 사물인터넷형으로 다시 코딩할 계획이다.

참고로 이번 코딩 및 실험을 제대로 수행하려면 멀티메터가 반드시 필요하다는 점을 지적한다. 멀티메터는 카시오 공학용 계산기 값 수준의 싼 멀티메터라도 코딩을 성공적으로 이끄는데 충분하다고 본다.


arduino_volt_01

float arduVolt = 4.86;// 아두이노 전압 멀티메터 실측치
float r_1K = 997.0;//1K옴 저항 실측치
float r_4K =4270.0;// 총 저항
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  int v_1k = analogRead(A0);// 0-1023
  Serial.println(v_1k);
  float volt_1k = arduVolt*v_1k/(1023);//A0에서의 전압 환산
  Serial.println(volt_1k);
  float i = volt_1k/r_1K;//1K옴 저항에서 전류 계산

  float volt_4k = i*r_4K;//옴 법칙에 의해 배터리 전압 계산
  Serial.println(volt_4k);
  delay(5000);

}//끝