본문 바로가기
코딩/라즈베리파이 피코

라즈베리파이 피코 내장 온도센서 사용하는 방법

by DIYver 2022. 7. 22.

 

라즈베리파이 피코 내부에는 자체적으로 온도센서가 내장되어 있다.
12비트 ADC 로 값을 읽어 올 수 있는데,
이번에는 그 방법을 살펴보고 실제로 온도값을 읽어오는 시간을 가져보도록 하겠다.

온도센서는 라즈베리파이 피코의 ADC 4핀에 연결되어 있다.
육안으로 보드를 살펴보면 라즈베리파이 피코 핀에는 ADC 4 핀은 보이지 않는다.
ADC 4는 오로지 온도센서만을 위한 핀인 것이다.

GPIO 핀을 사용해야 하니 당연히 machine 라이브러리를 포함시켜야 하고,
delay 를 걸어줘야 하니, utime 라이브러리도 포함시켜야 하겠다.
아래 코드를 복붙해서 Thonny 를 이용하여 실행해보자.

import machine
import utime

sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)

while True:
    reading = sensor_temp.read_u16() * conversion_factor
    temperature = round(27 - (reading - 0.706) / 0.001721,2)
    print("Temperature : ", temperature)
    utime.sleep(2)

 

 

작동을 확인해보면 온도가 2초마다 측정되어 출력되는 것을 확인할 수 있다.

코드를 해석을 해보도록 하자.

sensor_temp 라는 변수에 GPIO ADC 4번 핀을 매칭을 시켜주는 과정이다.

conversion_factor 라는 변수는 말 그대로 변환상수 로 이해하면 된다.
3.3 을 65535 로 나눈 값인데,
3.3은 3.3V 를 의미하고, 65535 값은 데이터의 최대 크기를 뜻한다.
이 값은 ADC 4번핀에서 읽어드린 값을 전압 단위로 변환할 때 사용한다.
온도 센서는 온도마다 출력되는 전압값이 정해져 있는데,
그 전압값을 라즈베리파이 피코에서 읽으면 데이터 값으로 읽게 된다.
데이터 값에 변환상수를 곱해주어야 센서에서 출력한 전압값을 알 수 있다.
즉, 센서의 출력 전압 값을 역으로 알아내는 방법인 것이다.

잘 이해가 안 된다면 아래의 순서를 이해해보면 좋겠다.

3.3V 온도센서에 전원 공급 >> 온도 측정 >> 온도 값에 따른 전압값 출력(analog data) >> 
피코의 ADC 4핀 에서 해당 전압값을 수신(analog data) >>
ADC 이므로 analog data를 digital data로 변환하여 피코에서 수신 (digital data) >>
conversion_factor 를 이용하여 digital data를 analog data를 역으로 계산 (analog data) >>
data sheet을 참조하여 센서 전압값에 따른 온도값을 구함

왜 analog 값을 바로 이용하지 못하고 이렇게 귀찮은 작업을 해야하냐고 물을 수 있다.
사람은 아날로그 값을 한번에 알아들을 수 있지만,
컴퓨터와 같은 디지털로 구성된 모든 것들은 0과 1로만 데이터를 처리하게끔 되어있다.
0와 1밖에 모르는데, 4라는 값을 입력하면 받아드리지 못하는 것이다.
그래서 4라는 값을 디지털 장치가 이해하게 하려면 2진수로 100 이라는 값을 입력해 주어야 하는 것이다.
오로지 0과 1 밖에 없는 데이터로 말이다.

 

코드 설명하다가 아주 기초적인 내용까지 나와버렸는데,
아는 사람들은 진작에 잘 건너 뛰었으리라 생각하고 다시 코드 해석에 들어가겠다.

reading 이라는 변수에 ADC 4핀의 값을 unsigned 16bit 의 크기로 읽어온 값에 변환상수를 곱하여 저장한다.
따라서 reading 이라는 값에는 온도센서의 출력 전압값이 저장되게 된다.

여기서 잠깐, 피코의 ADC는 12bit로 사용한다면서 왜 16bit 크기로 읽어오냐 궁금해 할 수 있다.
궁금해 하는 사람들은 나름 MCU와 코딩쪽에 진심인 사람들일 것이 분명하다.

그 궁금증을 풀기 위해서는 일단 micro python 공식 홈페이지에서 설명을 찾아볼 필요가 있다.
http://docs.micropython.org/en/v1.14/library/machine.ADC.html

 

class ADC – analog to digital conversion — MicroPython 1.14 documentation

© Copyright 2014-2021, Damien P. George, Paul Sokolovsky, and contributors Last updated on 02 Feb 2021.

docs.micropython.org

직접 읽어보고 싶은사람은 읽어봐도 좋다.
간단하게 설명을 하자면
코드에서 그냥 그렇게 쓰게끔 되어 있기에 16bit로 읽는 것이다.

machine 라이브러리를 사용하면 ADC핀 사용은 아래처럼 하게끔 되어 있다.

구조와 방법도 살펴보면 ADC클래스는 핀번호 괄호안에 넣고 쓰면 되는거고,
값을 읽는 방법은 read_u16 이라는 함수를 이용하게끔 되어있다.
16비트 이기 때문에 0 부터 65535 까지의 수가 저장되게 되는 것이다.

아직 혼란한 사람들이 있을 것이다.
12비트 값으로 16비트로 변환해서 읽는 거면 문제가 있는거 아니냐는 것이다.
당연한 것까지는 모르겠는데, micro python 에서 read_u16() 함수를 사용하면 자동으로 스케일업을 해주는 것이다.
0은 0 그대로, 4095 는 65535로 말이다.
착각하면 안 되는게, 센서 값을 16비트로 자세하게 받아들이는게 아니다.
12비트로 수신된 값을 16비트로 확장시켜서 감지하는 것이라, 분해능은 12비트가 맞고 숫자의 크기만 커진 것이다.
12비트의 4094는 16비트로 65520 정도의 값으로 읽히는 것이다.
65520 과 65535 사이의 값은 감지될 수가 없는 것이다...
그 사이의 값이 감지되면 분해능이 16bit 가 되는 것이다.

이제 어느정도 궁금증이 해결되었을 테니, 코드해석을 이어나가보자.

temperature 라는 변수에 27 - (reading - 0.706)/0.001721 수식 값에 소수점 세번째 자리에서 반올림 한 값을 저장하는 과정이다.
해당 수식은 사용된 온도센서의 data sheet 상의 온도 산출 공식이 되겠다.(섭씨 온도 산출 공식)
reading 에는 우리가 역계산한 출력 전압값이 저장되어 있으므로, temperature 변수에는 섭씨 온도가 저장되게 된다.

출력 창에 온도를 출력하고,
while 반복문과 utime.sleep(2) 명령을 통해 2초마다 온도를 측정해서 출력해주는 코드가 되는 것이다.

 

 

개발을 함에 있어서
항상 의문을 갖고 왜 그런지를 알아가는 과정은 정말 중요하다.

무작정 코드 복붙해서 하는 개발은 한계가 있다.
개발을 하면서 또는 코딩을 하면서 결과는 항상 예상할 수 있어야 하고,
예상된 결과가 도출되어야 한다.
그래야 문제가 생겼을 때, 근본적인 문제를 찾아서 빠르고 정확하게 해결할 수 있는 것이다.
만약 맨날 따라해서 코딩을 하는 경우라면 문제가 생겼을 때, 이것저것 만지다가 운 좋게 고치는 경우도 있겠지만
완전 망쳐버릴 수도 있게 되는 것이다.
생각하면서 개발하고 코딩하도록 하자.

댓글