센서 값 기록 및 그래프 그리기

  1.   센서 값 기록
  •  소스코드로 센서 값을 계속 받는다. 
  •  1초에 10개를 찍도록 하고, 임의로 5000개를 찍으면 break를 하도록 코드를 작성하였다.
  •  알코올을 감지하게 하였다.

      2.  그래프 그리기

  •  real-time 그래프를 시도해 보았지만 라즈베리 파이의 interval문제인지 그래프가 너무 느리게 나왔다. 
  •  따라서 저장된 .txt 파일로 그래프를 작성하였다.

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import matplotlib.pyplot as plt

mq2 = []
mq4 = []


do = open('data.txt','r').readlines()
#print do
for i in do :
	one = i.strip()
	one = one.split(',')
#	print one
	mq_2_data = round(float(one[0]),2)
	mq_4_data = round(float(one[1]),2)
	mq2.append(mq_2_data)
	mq4.append(mq_4_data)
#	print mq_2_data,"*****",mq_4_data,"/"



plt.title('MQ-2, MQ-4 sensor detect Alcohol')
plt.grid(True)
plt.plot(mq2,'b*-',label='MQ-2')
plt.legend(loc='upper left')
plt2 = plt.twinx()
plt2.plot(mq4,'m^-',label='MQ-4')
plt2.legend(loc='upper right')
plt.show()

  •  그래프 결과는 위와 같다.
  •  똑같이 알코올 감지 테스트를 했을 때 센서 둘 다 반응을 보였다. 동시에 감지시켰는데 MQ-2 센서의 반응이 더 빨랐다.

Gas Sensors & ADC converter

  1.  가스 센서(Gas Sensors)의 종류
  • 가스 센서는 반도체식(semiconductor) 이나 전기화학식(electro chemical) 이 있는데  반도체식 가스 센서가 구하기 쉽다.
  • 반도체식 가스 센서에는 MQ-x 시리즈, Figaro 센서, FIS 센서 등이 있다. 
  • Figaro 센서와 FIS 센서는 정밀도가 높은 장점이 있지만, 가격대가 매우 높고 설치장소에 제약이 있다.
  • MQ-x 센서는 시중에서 구하기 쉽고, 소형이여서 응답이 빠르며 가격이 저렴한 장점이 있다. 하지만 정밀도가 좀 떨어지는 단점이 있다. 

 

 

       2.  아날로그 신호 vs 디지털 신호

 

  

 

  • 아날로그 신호란 시간에 따라 연속적으로 변화하는 신호를 말하고, 디지털 신호는 시간에 따라 정해진 이산 값(0, 1) 만을 갖는 신호를 말한다.
  • MQ-x 가스 센서는 아날로그 신호를 내보낸다.
  • 라즈베리 파이는 디지털 신호를 받기 때문에 ADC 컨버터를 사용해 아날로그 신호를 디지털 신호로 변환시켜 주어야 한다.

 

     3.  ADC 컨버터

  • ADC(Analog to Digital Convert)는 아날로그 신호를 디지털 신호로 변환시켜주는 역할을 한다.

 

  • 종류에는 MCP3008,  PCF8591 등이 있다.

 

  • MCP3008은 8-channel 10-bit이며  SPI 통신을 사용해야 한다.
  • PCF8591은  5-channel( 4 ADC, 1 DAC) 8-bit이며 i2c 통신을 사용해야 한다.

 

     4.  소스코드

  • 가스 센서는 MQ-2, 4를 사용, ADC는 PCF8591을 사용하였다.
  • 풀업저항(Pull-up resistor)을 해주어야 한다(저항을 VCC 단자에 달아주는 것)

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import smbus
import time

bus = smbus.SMBus(1)

def setup(Addr):
        global address
        address = Addr

def read(chn): #channel
        try:
                if chn == 0:
                        bus.write_byte(address,0x48)
                if chn == 1:
                        bus.write_byte(address,0x41)
                if chn == 2:
                        bus.write_byte(address,0x42)
                if chn == 3:
                        bus.write_byte(address,0x43)
                bus.read_byte(address) # dummy read to start conversion
        except Exception, e:
                print "Address: %s" % address
                print e
        return bus.read_byte(address)


def write(val):
        try:
                gas = val # move string value to gas
                gas = int(gas) # change string to integer
                # print gas to see on terminal else comment out
                bus.write_byte_data(address, 0x48, gas)
        except Exception, e:
                print "Error: Device address: 0x%2X" % address
                print e
if __name__ == "__main__":
        setup(0x48)
        cnt = 0
        start = time.time()
        while True:
                f = open('data.txt','a')
                if cnt==5000: break
                mq2 = read(0)
                mq2 = mq2 * (5.0/255.0)
                mq3 = read(1)
                mq3 = mq3 * (5.0/255.0)
                mq4 = read(2)
                mq4 = mq4 * (5.0/255.0)
                mq4 = read(3)
                mq4 = mq4 * (5.0/255.0)
                write(mq2)
                write(mq3)
                write(mq4)
                df = str(mq2) + ',' + str(mq3) + ',' + str(mq4) + '\n'
                print df
                f.write(df)
                cnt += 1
                time.sleep(0.01)

        end_time = time.time() - start
        end_time = '{0}'.format(end_time)
        print end_time

i2c 통신모듈 활성화

  1. i2c 통신모듈 활성화
  • 시중에는 i2c 나 spi 인터페이스를 가진 많은 다양한 센서, 모듈 들이 있는데, 이런 부품을 라즈베리 파이와 사용하기 위해서는 라즈베리파이의 i2c, spi 인터페 이스를 어떻게 동작시키는 지 알아야한다.
  • i2c(Inter-Integrated Circuit)는 센서들과 마이크로컨트롤러(아두이노, 라즈베리파이) 간의 프로토콜 통신을 간편하게 처리할 수 있는 기능을 제공한다.
  • i2c는 SCL(serial clock)과 SDA(serial data) 2개의 커넥션을 가지고 있다. 
  • i2c, spi 인터페이스는 기본으로 쓸 수 있게 활성화 되어있지 않기 때문에, 사용하기 위해서는 몇몇 설정을 해주어야 한다.
  • 먼저 $ sudo raspi-config 명령어로 들어가서 spi와 i2c를 enable을 해주고 다음을 실행한다.

      1-1. blacklist 해제

      라즈베리파이에서  i2c 사용을 하기 위해서는  i2c-bcm2708 라인에 주석처리를 해주어야 한다.

      pi@raspberrypi ~ $ sudo nano /etc/modprobe.d/raspi-blacklist.conf

     #i2c-bcm2708  주석처리

     1-2. i2c device 활성화

     편집기를 실행하여 modules 설정파일 가장 아래 라인에 i2c-dev 를 입력한다. 

     pi@raspberrypi ~ $ sudo nano /etc/modules

    2. i2c 응용 툴 설치하기

    라즈베리 파이에서 i2c통신 환경설정과 접속상태, 파이썬 코딩 사용자를 위한 응용 툴을 설치한 후 리부트한다.

    pi@raspberrypi ~ $ sudo apt-get install i2c-tools libi2c-dev python smbus

    3. i2c 연결 장치 확인

    라즈베리 파이에는 i2c장치가 2개 제공되지만 기본적으로 i2c 1번을 사용하도록 설정되어 있다.

    아래 명령어를 수행하여 i2c 장치가 정상적으로 인식되어 있는지 확인한다.

    pi@raspberrypi ~ sudo i2cdetect -y 1