라즈베리파이 피코 보드에서 유량계 (flowmeter) 사용하기

라즈베리파이 피코 보드에서 유량계 (flowmeter)  사용하기

1. 유량계 (Flow Meter) YF-S401과 측정 원리

라즈베리파이 피코 보드로 여러 가지 센서들을 취급하다가 유량계를 하나 접하게 되었다.

​

전면에는 상표명과 유량 범위 같은 것들이 적혀있었는데, 모델명이 YF-S401이었다.

뒷면에는 유체가 진행하는 방향이 화살표로 표기되어 있었다.

​

자료를 찾아보니, 다음과 같은 구조로 되어 있고, 내부 한쪽에 hall 센서가 붙어있다고 한다.

유량게를 통해 유체가 흘러갈 때, 유체의 흐름에 따라 내부의 수차(물레방아)가 회전하면서 hall 센서가 켜지는 구조라고 했다. 즉 쉽게 이야기하면 수차가 회전하면서 스위치를 한 번씩 눌러주는 구조였다.

​

유체의 흐름이 빠를수록 수차도 빠르게 회전하므로, 스위치는 더 빠른 간격으로 켜지게 되고, 일정한 양의 유체가 흘러갈 때마다 hall 센서가 켜지는 것이므로, hall 센서가 켜졌다 꺼진 횟수를 알면 유량게를 통해 흘러간 유체의 양을 계산할 수 있는 원리인 것이다.

그런데 내가 구입한 곳에는 이 유량계에 대한 기술적 자료는 제시된 쓸모 있는 자료는 거의 없었다.

필요한 자료를 인터넷에서 찾다 보니, 다음과 같은 Datasheet가 있기는 했다.

첨부파일

YF-S401.PDF

파일 다운로드

 

​

이 Data sheet에 주요 사양이 나와 있기는 하고, 유량을 계산하는 식이 있는듯한데, 문제는 이 식이 불완전하다. 이 식에 사용되는 변수에 대한 정의나 설명이 없어 식은 있으나 사용이 불가능했다.

​

결국 이 식을 버리고, 좀 더 자료를 찾아보았다.

그 결과 여러 자료에서 이 모델의 유량계는 5800 펄스 사이클이 1 Liter에 해당된다고 하는 자료들을 발견하게 되었다. 즉 수차로 인해 hall 센서가 5800번 켜졌다 꺼지면 1Liter의 유체가 흘러갔다는 의미였다.

​

​

2. 라즈베리파이 피코 보드에 적용해 보기

이 유량계를 사용해 보기 위해, 다음과 같이 라즈베리파이 피코 보드와 연결하였다.

이 유량계의 동작 전압이 5-24V이고 최소 4.5V 이상 전압이 필요하다고 하므로, 피코 보드의 5V에 연결해 주었다.

그리고 hall 센서에서 나오는 신호는 마치 푸시버튼과 동일한 입력을 제공하는 디지탈 입력신호이므로, GP16에 연결했다.

​

그리고 유체를 흘려주기 위해 작은 펌프와 유량계를 연결하고

펌프를 작동하면서, 유체의 흐름 속도와 유량을 측정해 보았다.

​

그리고, 코드는 GP16으로 들어오는 입력값의 변화 횟수를 세는 간단한 코드를 만들었다.

​

코드의 원리는 GP16으로 들어온 값이 High가 되었다가 다시 Low로 되는 것을 감지하면서 숫자를 세는 것이었고, 1초 간격(1000 msec)으로 유량을 계산하도록 했다. 처음에 임시로 사용한 계산식은 다음과 같다.

​

​

<초기 임시 적용한 계산식>

Pulse 수 = 입력 신호 변화 횟수 /2

초당 유량 = Pulse 수 / 5800 x 1000 (ml / Sec)

분당 유량 = 초당 유량 x 60 / 1000 (Liter/min)

총 유량 = 초당 유량 누적치

​

​

그 결과 원활하게 동작했고, 다음과 같은 결과물을 얻을 수 있었다. (물론 정확도는 다시 짚어보아야 한다.)

​

​

3. 유량계 검증 및 계산식 수정

이렇게 라즈베리파이 피코 보드에서 유량계를 사용할 수 있는 것과 잘 동작하는 것은 확인했지만, 아직 이 유량계가 정확한지를 알 수 없었다.

​

스펙상으로는 측정오차가 약 2%가 오차 범위라고 했다.

또한 Datasheet에는 다음과 같이 수직 방향으로 설치해야 한다는 주의사항도 있었다. 즉 설치 상태에 따라 측정치에 오류가 생길 수 있다는 의미로 느껴졌다.

​

​

​

​

이 유량계의 정확도를 확인하기 위해, 그리고 유량 계산 공식이 정확한지를 확인하기 위해, 다음과 같이 물 200을 준비했다. 물은 밀도가 1이므로, 상온에서 물 200g은 상온에서 200ml로 볼 수 있다.

​

​

이 물이 유량계를 통과하면서 측정된 총 유량을 살펴볼 계획이었다.

​

그런데 200g(200ml = 0.2L)를 가지고 측정을 했는데, 유량계에서 측정되는 총 유량은 다음 동영상과 같이 0.1L(100ml)로 나타나는 것이었다. 여러 차례 반복해 시험해도 동일한 100ml였다.

임시로 사용한 유량 환산식에 오류가 있었다는 의미였다.

​

다만 100ml라는 값은 재현성 있게 측정되었다. 즉 측정의 재현성은 나쁘지 않다는 의미이기도 했다.

​

결국, 나는 1L에 필요한 펄스의 수가 5800 Pulse가 아니라, 그 절반인 2900 Pulse라는 결론을 얻게 되었다.

​

내 경험으로는 중국에서 구입한 많은 센서들이 인터넷에 알려진 Data Sheet과 조금 다르게 작동하는 경우가 많았었다 (특히 서보모터). 그랬던 것처럼 이 Flow meter도 일반적으로 인터넷에 알려진 것과 동일한 방식으로 작동하지만, 유량 계산에 사용하는 펄스의 수만 딱 절반이었던 것이다. 과거 서보모터에서 경험한 것과 아주 유사한 경험이었다.

​

왜 이런 현상이 발생했는지 정확히 알 수는 없지만, 저작권에 대한 문제를 피하기 위해서 원래의 모델에 약간의 변화를 준 것이 아닐까 추정할 뿐이다.

​

​

이 때문에 계산식을 다음과 같이 수정하게 되었다.

​

<최종 계산식>

Pulse 수 = 입력 신호 변화 횟수 /2

초당 유량 = Pulse 수 / 2900(=5800/2) x 1000 (ml / Sec)

분당 유량 = 초당 유량 x 60 / 1000 (Liter/min)

총 유량 = 초당 유량 누적치

​

​

그리고 이에 맞게 코드도 다음과 같이 정정했다. 최종적으로 사용한 코드는 다음과 같다.

import machine
import utime

pulse=machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)
status=pulse.value()
t0=utime.ticks_ms()
count=0
totalflow=0
p_1liter=5880/2
while True:
if pulse.value()!=status :
        count+=1
        status=pulse.value()
    
    t1=utime.ticks_ms()
if (t1-t0)>=1000 :
        pulse_counted=count/2
print ("Number of Pulses  ", pulse_counted)
print ("Flowrate       == ", round(pulse_counted/(p_1liter)/(t1-t0)*1000*60, 2), "l/min")
        totalflow=totalflow+round(pulse_counted/p_1liter, 2)
print ("Total flow == ", totalflow*1000,"  ml")
        count=0
        t0=utime.ticks_ms()

​

이렇게 유량 환산식을 보정한 후, 동일하게 200ml 물을 가지고 측정한 결과는 다음과 같다.

정상적으로 200ml의 유량이 흘러간 것으로 잘 표시된다.

​