개발자/Raspberry Pi

라즈베리파이와 MCP3208 ADC 컨버터 사용하기 - 회로와 소스코드

지구빵집 2017. 2. 12. 15:49
반응형

 

 

 

 

라즈베리파이와 MCP3208 ADC 컨버터 사용하기 - 회로와 소스코드 

 

라즈베리파이의 GPIO는 아두이노와는 다르게 디지털 입력만 가능하도록 되어있다. 라즈베리파이는 ADC(Analog Digital Converter)가 내장되어있지 않다. 그래서 별도의 ADC를 사용해서 ADC 기능을 추가해야 한다. 여기서는 MCP3208 AD 컨버터를 SPI 인터페이스를 이용해서 사용하는 방법을 설명한다.

 

조도센서는 광량(빛의 세기)를 센싱하여 전기적 신호로 출력하는 센서이다. 센서의 출력은 단순히 밝고 어두운 상태 만을 표시해주는 디지털 출력과 빛의 세기에 따라 값이 변하는 아날로그 출력이 있다. 테스트 할 때는 조도 센서를 사용하여 디지털 출력과 아날로그 출력 각각에 대해 실습하는게 좋은데 여기서는 아날로그 출력만을 볼것이다.

 

사용되는 조도센서는 6495 (4-핀) 모델 이다. 조도센서는 일정 밝기 이상에서 하이가 출력되는 디지털 출력과 빛의 양에 따라 값이 변하는 아날로그 출력이 있다. 먼저 아날로그 출력을 이용한다. 아날로그 출력 값은 8채널 12bit 아날로그 디지털 컨버터인MCP3208을 이용하여 디지털 값으로 변환하여 출력한다.

 

조도센서의 외형과 핀 배치는 아래 그림과 같다.

 

센서의 특징과 전기적 특성을 아래에 나타내었다.

 

특징

 

1. 모델명 : GL5537(5Pie Photo Resistor)  

2. 종류 : Cds Photo CELL

2. 감도 조절 (파란색 가변저항 조정)밝기와 주변 빛의 세기를 감지

3. 출력 : 아날로그 전압 출력, 디지털 스위치 출력 (0, 1)

4. Power dissipation : 100mW  

5. Max Voltage : 150Vdc or AC

6. Temp.Range: : -30~+70℃

 

전기적 특성

 

- 작동 전압 : 3.3V ~ 5V DC

- 출력 : 아날로그 전압 출력, 디지털 스위치 출력 (0, 1)

- Light Resistance at 10Lux(at 25): min 20, max 50Kohm- 측정 조건 VDD = 5V , T = 25 ℃

- Gamma Value at 10~100Lux: 0.7typ

- Dark Resistance at 0 Lux(10sec after shut off 10Lux): min 2Mohm

- Peak Spectrol Response: min 550, max 650nm

 

반응형

 

이번엔 ADC 컨버터 MCP3208 에 대해 알아보자.

 

MCP3208 은  8-Channel 12-Bit A/D Converters 이다. 즉, 센서의  아날로그 출력 값을 12비트의 디지털 값으로 변환하는 ADC 칩이다. 예를들어 0v ~ 3.3v 의 센서 출력 값을 0 ~ 4095 (12bit) 의 디지털 값으로 변환해주는 기능을 한다. 라즈베리파이는 GPIO (General Purpose Input / Output), SPI, I2C, 그리고 UART 통신 포트들을 가진다. 그러나 아쉽게도 ADC 기능이 없다. 때문에 MCP3208 ADC 칩을 이용하여 외부에 ADC 기능을 가지도록 한다. 라즈베리파이와 MCP3208간에는 SPI 통신으로 ADC 데이터를 가져온다.

 

MCP3208은 아래와 같은 핀 구조를 가지고 있다. 그 아래는 Pin 기능을 보여준다. 

 

 

 

 

이를 아래의 회로도와 같이 라즈베리파이의 SPI 포트와 연결한다. MCP3208은 총 8개의 ADC 채널(CH0~CH7)을 가지고 있다. 이번 강좌에서는 조도센서의 아날로그 출력을 CH0에 연결하고 가변저항을 돌려가면서 ADC 값이 변하는 것을 테스트 한다. 이용하고자 하는 센서를 CH0 ~ CH7 어느 곳에 연결하여 사용해도 무방하다.

 

 

사용시에 라즈베리 파이의 SPI 기능이 Disable 되어 있을때는 아래 설정 화면으로 들어가 Enable 활성화 시켜준다.

 

 

 

 

 

 

 

소스코드를 아래와 같은 명령으로 입력한다. 윈도우에서 마우스로 긁어서 카피한 코드는 편집 화면에서 마우스 오른쪽 키를 사용하여 붙여넣기 할 수 있다.

 

$nano getlightsensor.c 하여 아래 소스코드를 넣는다.

 

 

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
63
64
65
66
67
68
69
70
71
72
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <wiringPi.h> 
#include <wiringPiSPI.h> 
 
#define CS_MCP3208 8 //GPIO 8 
#define SPI_CHANNEL 0 
#define SPI_SPEED 1000000 //1Mhz
 
// spi communication with Rpi and get sensor data 
 
int read_mcp3208_adc(unsigned char adcChannel) 
{
    unsigned char buff[3];
    int adcValue = 0;
    
    buff[0= 0x06 | ((adcChannel & 0x07>> 2);
    buff[1= ((adcChannel & 0x07<< 6);
    buff[2= 0x00;
    
    digitalWrite(CS_MCP3208, 0);
    wiringPiSPIDataRW(SPI_CHANNEL, buff, 3);
    
    buff[1= 0x0f & buff[1];
    adcValue = (buff[1<< 8 ) | buff[2];
    
    digitalWrite(CS_MCP3208, 1);
    
    return adcValue;
}
 
int main(void) {
 
    unsigned char adcChannel_light = 0;
 
    int adcValue_light = 0;
 
    float vout_light;
    float vout_oftemp;
    float percentrh = 0;
    float supsiondo = 0;
    
    printf("start");
 
    
    if(wiringPiSetupGpio() == -1)
    {
        fprintf(stdout, "Unable to start wiringPi :%s\n", strerror(errno));
        return 1;
    }
    
    if(wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1)
    {
        fprintf(stdout, "wiringPiSPISetup Failed :%s\n", strerror(errno));
        return 1;
    }
    
    pinMode(CS_MCP3208, OUTPUT);
    
    while(1)
    {
        adcValue_light = read_mcp3208_adc(adcChannel_light);
        
        //printf("Humiity = %u temparature = %u\n", adcValue_humi, adcValue_temp);
        printf("light sensor = %u\n", adcValue_light);
        
        delay(100);
    }
    return 0;
}
 
cs

 

 

컴파일은 아래와 같다.

 

$ gcc -o getlightsensor getlightsensor.c -lwiringPi

 

실행은 

 

$sudo ./getlightsensor

 

아래와 같이 조도센서를 가렸다 하면서 테스트 하면 아래와 같은 결과를 볼 수 있다.

 

 

아주 밝은 빛일때의 조도센서 출력 값

 

보통 밝기에서의 조도센서 출력 값

 

어둡게 하였을 경우 조도센서 출력 값

 

 

질문사항이나 궁금한 사항은 댓글에 주세요. 

 

 

 

 

반응형