본문 바로가기

개발자/Raspberry Pi

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

반응형

 

 

 

 

라즈베리파이와 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

 

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

 

 

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

 

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

 

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

 

 

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

 

 

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩