Published Book on Amazon
All of IOT Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 1 | |
All of IOT Starting with the Latest Raspberry Pi from Beginner to Advanced – Volume 2 |
출판된 한글판 도서
최신 라즈베리파이(Raspberry Pi)로 시작하는 사물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (상) | |
최신 라즈베리파이(Raspberry Pi)로 시작하는 사물인터넷(IOT)의 모든 것 – 초보에서 고급까지 (하) |
Original Book Contents
25.8.2 digital sensor DS18b20를 이용한 온도 측정
25.8.2.1 DS18B20 sensor 특징
시중에는 온도를 측정하는 여러 가지의 센스가 있지만, Raspberry Pi는 ADC (Analog to Digital Converter) 장치가 없으므로 TMP36과 같은 analog 온도 sensor는 직접적으로 사용할 수 없다.
여기서는 digital sensor인 DS18B20을 Raspberry Pi와 직접 연결하여 온도를 측정할 것이다.
시중에서 판매되는 DS18B20 sensor에는 여러 가지가 있는데, 아래 그림과 같이 원래의 원형 sensor도 있고, 일반적인 DS18B20 sensor를 Arduino와 같은 실험용 interface board에서 용이하게 사용할 수 있도록 약간 변형한 것도 있다. 두 가지 모두 모든 성능과 특징은 동일하지만 connector의 배열 위치가 약간 다르게 되어 있다. 어떤 것을 사용하더라도 pin의 위치만 고려하면 모든 것이 동일하다.
|
원형 sensor 변형 sensor
No | 원형 sensor | 변형 sensor | 기능 |
1 | GND | - | ground |
2 | Vdd | + | power |
3 | DQ | S | data line |
그림 25‑20 digital 온도 sensor DS18b20
DS18B20은 다음과 같은 특징을 가지고 있다.
항목 | 내용 |
Interface | 1-Wire bus Interface 방식 사용 |
전압 범위 | 3.0V to 5.5V |
전원 공급 방식 | external supply 가능, parasite power 가능 (data line을 통한 전원 공급) |
운영 온도 | -55°C to +125°C (-67°F to +257°F) |
측정 오차 | ±0.5°C from -10°C to +85°C |
온도계 해상도 | User Selectable from 9 to 12 Bits |
Digital 전환 | 12-Bit Digital Word in 750ms (Max) |
Resistor 사용 | weak pullup resistor, 4.7 K ~10 K ohm |
DS18B20는 Maxim에서 개발한 1-Wire bus protocol을 사용하는데, 이 방식은 한 개의 control signal을 사용한 bus communication 방식으로, microprocessor (the master device)는 각 장치에 부여된 64 bit code를 이용하여 bus에 연결된 장치를 구별하고, 명령을 내린다. 즉 하나의 bus에 여러 개의 장치를 동시에 연결하여 사용할 수 있다는 것을 의미한다. 이 방식에서 하나의 bus에서 연결할 수 있는 장치의 수는 개념적으로는 제한이 없다.
|
DS18B20에서는 모든 device가 3-state 또는 open-drain port (DS18B20의 DQ pin)을 경유하여 bus에 연결되므로 control line은 weak pullup resistor를 필요로 한다. 통상 4.7KΩ 또는 10KΩ의 pull-up 저항을 사용한다.
DS18B20 sensor는 외부의 별도 전원을 사용할 수도 있지만, parasite power mode를 사용하면 별도의 전원을 사용하지 않고도 sensor를 운영할 수 있다. parasite power mode란 온도 측정 값을 전달하는데 사용되는 data line을 사용하여 sensor에 전원을 공급하는 방식을 의미한다. 이런 방식을 사용하며 data line에 공급되는 전류를 이용하여 sensor 자체의 전원을 공급하는 것이다. 아래 그림에서 왼쪽은 외부의 별도 전원을 사용한 경우이며, 오른쪽은 parasite power mode를 사용한 경우이다.
parasite power mode에서는 bus가 "High" 상태일 때 pull-up resistor를 통하여 공급된 전원이 DQ pin을 경유하여 sensor에 전원이 공급된다. bus signal이 "High" 상태일 때 내부의 capacitor (CPP)에 충전을 하고, bus가 "Low" 상태이면 내부 장치에 전원을 공급한다.
DS18b20에 대한 보다 상세한 내용에 대해서는 다음을 참고하기 바란다.
■ http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
25.8.2.2 Raspberry Pi와 sensor의 연결
1-Wire protocol을 사용하는 DS18B20 sensor는 bus에 병렬로 설치된다. 모든 sensor는 동일 data pin을 사용한다. data line은 Raspberry Pi의 pin 7(BCM port 4)에 연결하도록 한다.
data line에 pull-up 저항을 사용하는데, 4.7K ~ 10K ohm 저항을 사용한다. 여러 개의 sensor가 동시에 설치되는 경우에도 pull-up 저항은 하나만 설치하면 된다.
다음은 Raspberry Pi의 pin 1에서 공급되는 3.3V전원으로 sensor에 별도의 외부 전원을 공급하는 방식으로 회로를 구성한 형태이다.
25.8.2.3 1-Wire bus protocol의 활성화
Raspbian/Occidentalis은 DS18b20에서 사용하는 1-Wire bus protocol을 지원한다. 1-Wire protocol을 사용하고자 하면 해당 protocol을 먼저 활성화해야 한다.
1-Wire protocol 활성화를 하려면 먼저 "/boot/config.txt" 파일에서 다음 내용을 추가한다.
~ 중략 # Activate 1-Wire protocol dtoverlay=w1-gpio |
"config.txt" 파일을 수정하고 시스템을 reboot를 한다. "/sys/bus/w1/" 폴더가 생성되어 있으면 정상 처리된 것이다.
pi@raspberrypi ~ $ ls /sys/bus -l |
~ 중략 drwxr-xr-x 4 root root 0 Jun 14 22:51 spi drwxr-xr-x 4 root root 0 Jun 14 22:17 usb drwxr-xr-x 4 root root 0 Jun 14 22:51 w1 drwxr-xr-x 4 root root 0 Jun 14 22:51 workqueue |
만약 해당 폴더가 생성되어 있지 않다면, "modprobe" 명령을 사용하여 다음과 같은 절차로 해당 장치를 활성화하고, 다시 위의 "/sys/bus/w1/" 폴더가 생성되어 있는지 확인한다.
sudo modprobe w1-gpio |
sudo modprobe w1-therm |
25.8.2.4 DS18B20의 온도 측정 값 interface 파일
1-Wire bus protocol이 정상적으로 활성화되고, Raspberry Pi와 sensor가 연결되면 sensor에서 측정한 값이 Raspberry Pi의 특정 파일로 interface된다. interface되는 자료는 "/sys/bus/w1/devices" 폴더 밑에 생성된다.
해당 폴더의 내용을 확인하여 "28-xxxxxx" 형식의 폴더가 생성되어 있는지를 확인한다. 이 폴더는 1-Wire bus protocol에 설치된 하나의 특정 sensor를 의미하고, 이 폴더가 생성되어 있다면 Raspberry Pi가 sensor와 정상적으로 연결되어 sensor의 측정 자료를 interface하고 있다는 것을 의미한다.
sensor가 측정한 온도 값은 "/sys/bus/w1/devices/28-xxxxxx/w1_slave" 파일에 저장된다.
|
해당 파일의 내용을 확인해 보면 다음과 같은 형식일 것이다.
be 01 55 00 7f ff 0c 10 1f : crc=1f YES be 01 55 00 7f ff 0c 10 1f t=27875 |
여기서 두 번째 행에서 "t=nnnnn" 형태로 되어 있는 자료가 sensor가 측정한 섭씨 온도 값으로 1000으로 나누어서 사용한다. 위의 값은 "27.875 CEL"가 될 것이다.
25.8.2.5 온도 값 처리 프로그램 작성
여기서는 Raspberry Pi의 "/sys/bus/w1/devices/28-xxxxxx/w1_slave" 파일에 interface되어 있는 자료를 읽어서 화면에 보여주는 프로그램을 작성할 것이다.
프로그램 개발언어는 Python 3를 사용한다. Python 3 IDLE를 시작하고, 아래와 같은 Python 프로그램을 작성하여 "sensor_temP_DS18B20.py" 파일에 저장한다.
import os import glob import time
# os.system('modprobe w1-gpio') # os.system('modprobe w1-therm')
w1_device_dir = '/sys/bus/w1/devices/' w1_data_dir = glob.glob(w1_device_dir + '28*')[0]
w1_device_file = w1_data_dir + '/w1_slave'
def read_temp_raw(): f = open(w1_device_file, 'r') lines = f.readlines() f.close() return lines
def read_temp(): lines = read_temp_raw() while lines[0].strip()[-3:] != 'YES': time.sleep(0.2) lines = read_temp_raw()
equals_pos = lines[1].find('t=') if equals_pos != -1: temp_string = lines[1][equals_pos+2:] temp_c = float(temp_string) / 1000.0 temp_f = temp_c * 9.0 / 5.0 + 32.0 return temp_c, temp_f
while True: print("CEL temperature =%f \t FAH temperature =%f" %read_temp()) time.sleep(1) |
위의 프로그램의 내용을 좀 살펴보면 다음과 같다.
■ sensor에서 interface하는 device file을 "/sys/bus/w1/devices/28-xxxxxx/w1_slave"로 설정한다.
■ 파일의 첫 행에서 끝에 "YES"라는 값이 있을 때까지 해당 파일을 반복적으로 읽는다.
■ 온도 측정 값이 들어오면, "t="로 시작하는 값을 읽어서 CEL 온도와 FAH 온도로 변환한다.
■ CEL 온도와 FAH 온도를 인쇄한다.
Terminal 화면에서 sudo 명령으로 다음과 같이 프로그램을 실행한다. 그러면 sensor에서 측정한 온도 값이 화면에 계속적으로 표시될 것이다.
sudo python sensor_temp_DS18B20.py |