상세 컨텐츠

본문 제목

라즈베리파이 미니 프로젝트 4탄 ! [부품 공부 - ADC 모듈]

라즈베리파이 실습 및 미니 프로젝트 !

by 전자과_공대생 2021. 1. 21. 20:19

본문

728x90
반응형

날짜 : 2021.01.09 토요일 / 제목 : 프로젝트 준비 / 날씨 : 🥶🥶🥶🥶

 

안녕하세요 ! 전자과_공대생입니다 ~ (⌐■_■)

오늘은 어제보다는 조금 덜 추운 날씨이지만 그래도 여전히 춥네요 ㅠㅠ

그래도 프로젝트 주제를 정했으니 부품들을 하나씩 공부해야겠습니다 !

일단 오늘 사용해 볼 부품은 ADC 모듈입니다.

이 부품 제가 하려는 프로젝트에 필요한 부품입니다 !

그럼 오늘 할 실습을 알려드리겠습니다 !

 

 

{ 오늘 할 실습 }

👉ADC 모듈

👉ADC 모듈 응용

 

 

우선 ADC 모듈에 대해서 자세히 알려드리겠습니다 !

제가 알려드리는 내용은 ADC 모듈의 데이터 시트를 기반으로 하고 있다는 점을 알아주세요 !

아래 제가 참고한 데이터 시트를 첨부시키겠습니다 ~

MCP3008.pdf
0.73MB

우선 제가 사용할 ADC 모듈은 MCP3008입니다 !

MCP3004라는 ADC 칩도 존재를 하는데요.

이 둘의 차이는 채널의 양 차이입니다 !

MCP3004는 4 채널, MCP3008은 8 채널이며 이 외 사용 방법은 모두 동일합니다.

저는 MCP3008을 사용할 것이기 때문에 3008 기준으로 설명드리겠습니다.

MCP3004을 좀 더 보고 싶으신 분은 제가 올려드린 데이터 시트를 참고하시길 바랍니다 !

ADC 칩을 사용하는 이유는 아날로그 전압 값을 디지털 값으로 읽기 위해서입니다.

라즈베리파이에는 별도로 변환 역할을 하지 않기 때문에 ADC 칩을 사용합니다.

제가 하려는 프로젝트에서는 토양 수분 센서의 아날로그 전압 값을 디지털 값으로 읽기 위하여 사용합니다 !

프로젝트에서 사용할 MCP3008

위에 사진은 제가 이번 프로젝트에서 사용할 MCP3008입니다 !

그럼 이제 MCP3008에 대해서 좀 더 자세하게 설명드리겠습니다.

MCP3008 동작 위치

위에 사진은 MCP3008의 각자 다리의 역할을 나타낸 것입니다.

좀 더 자세하게 보여드리겠습니다!

좀 더 자세히 설명된 MCP3008

제가 직접 찍은 MCP3008 기준으로 말씀드리겠습니다.

아래 다리 8개가 채널입니다.

맨 왼쪽부터 CH0이며 맨 오른쪽이 CH7입니다 !

위의 다리는 맨 오른쪽부터 9번이며 차례대로 설명드리겠습니다.

맨 오른쪽 다리(9)는 DGND로 디지털의 GND입니다.

그다음은 \CS/SHDN(10)입니다.

\CS/SHDN은 칩 선택 또는 INPUT을 막는 역할이며 라즈베리파이에서는 SS(CE0 또는 CE1)에 연결하면 됩니다.

그다음은 Din(11), Dout(12)입니다.

Din은 데이터가 들어가는 곳이며 Dout은 데이터가 나오는 곳입니다.

그다음은 CLK(13)입니다.

말 그대로 클럭이며 클럭이 발생할 경우에만 동작을 합니다.

다음은 AGND(14)이며 아날로그 GND입니다.

다음은 V(RFF)(15), VDD(16)입니다.

V(RFF)은 래퍼런스 전압 입력을 넣어주는 것이며 VDD는 칩의 동작 전원입니다 !

 

각 다리마다의 역할을 알아봤습니다 !

이제 어떻게 아날로그 값을 디지털 값으로 바꿔서 출력해주는지 알려드리겠습니다.

우선 공식을 아래 사진과 같습니다.

값 변화 공식

Vin의 값이 줄어들 때마다 디지털 출력 값도 줄어듭니다.

이것을 나타내기 좋은 예시로는 가변 저항을 이용하여 Vin 값을 조정하면 출력 값이 어떻게 바뀌는지 알 수 있습니다 !

예시는 조금 있다가 보여드리도록 하겠습니다.

MCP3008을 구동하려면 동작 방식과 SPI 통신으로 보내야 할 데이터를 알아야 합니다.

신호 타이밍은 8비트로 세 번 나눠져 있습니다.

첫 바이트는 라즈베리파이로 DIN을 통해 start을 알립니다.

두 번째 바이트의 상위 4비트를 가지고 ADC 값을 얻고자 하는 채널을 선택합니다.

나머지 비트들은 동작에 영향을 미치지 않습니다.

D0 입력까지 다 받으면 DOUT 핀을 통해 ADC 값을 라즈베리파이로 보내기 시작합니다.

이때 ADC 값은 null 비트로 시작합니다 !

DOUT로 전달되는 신호 중 두 번째 바이트의 하위 2비트가 10비트 ADC 값의 최상위 비트가 됩니다.

그 뒤 세 번째 바이트의 8비트가 나머지 ADC 값의 하위 8비트가 됩니다 !

타이밍도

위에 타이밍도 사진에서 S/D, D2, D1, D0 네 비트는 다음처럼 ADC를 수행할 채널을 선택합니다.

수행 채널 선택

 

 

동작 원리에 대해서 자세하게 알아보았습니다 !

이제 ADC 모듈 응용에 대해서 해보겠습니다.

아까 말씀드린 것처럼 가변저항을 가지고 한번 해보겠습니다.

{ 필요한 재료 }

👉라즈베리파이

👉점퍼 케이블

👉MCP3008(ADC 칩)

👉가변저항

 

가변 저항을 아직 잘 모르시는 분들을 위해서 간단하게 설명하도록 하겠습니다 !

가변저항

가변저항은 다리가 총 3개인데 왼쪽부터 VDD, 채널, GND에 연결하면 됩니다 !

또한 저항 조절은 손잡이를 돌려 조절하면 됩니다.

 

그럼 구성한 회로를 보여드리도록 하겠습니다 !

ADC 모듈 응용 회로

좀 더 깔끔하게 정리한 회로를 보여드리도록 하겠습니다 !

정리된 ADC 모듈 응용 회로

MCP3008과 가변 저항 연결에 대해서는 위에서 많이 설명해드렸습니다.

따라서 간단하게만 말씀드리겠습니다.

우선 가변 저항의 양 끝은 3.3V와 GND로 연결하고 가운데 다리는 MCP3008의 CH0에 연결했습니다.

MCP3008에서 CLK, DIN, DOUT는 라즈베리파이의 SCLK, MOSI, MOSO에 각각 연결했습니다.

또한 \CS/SHDN은 라즈베리파이의 CE0에 연결하였습니다.

마지막으로 VDD, VRFF은 라즈베리파이의 3.3V에, DGND, AGND는 GND에 연결했습니다 !

이제 작성한 코딩을 보여드리도록 하겠습니다 !

회로 코딩 / 출처 - https://infinitt.tistory.com/39

우선 함수 ReadVol 윗부분은 다 설정하는 코드입니다.

spi.open(0,0)은 라즈베리파이의 CE0에 연결했을 때 작성하는 코드입니다.

라즈베리파이의 CE1에 연결한 경우 spi.open(0,1)로 설정해야 됩니다.

ReadVol 함수에서 첫 번째 줄은 3바이트의 데이터 1, (8+vol)<<4, 0을 순차적으로 보내고 3바이트를 받는다는 뜻입니다.

그다음 줄은 두 번째 바이트(adc [1])과 세 번째 바이트(adc [2])로 값을 복원한다는 뜻입니다.

mcp3008=0은 CH0이라는 뜻입니다.

 

그럼 작성한 코드의 결과 값을 보여드리도록 하겠습니다 !

결과 값

결과 값을 보시면 아시겠지만 이상하게 최대(1023), 최소(200대-오차 생각) 값은 잘 나옵니다.

하지만 중간 값들이 나오지 않았습니다.

실제로 가변 저항을 중간쯤으로 돌려도 최대 값이 계속 나오고 거의 다 돌려 갈 때쯤 최소 값이 바로 나타났습니다.

가변 저항의 문제인 줄 알고 다른 가변 저항으로도 시도해보았지만 값은 변하지 않았습니다..

이 오류 때문에 몇 시간을 계속 끙끙 앓았는데 결국 해답을 찾지 못했습니다....

물론 변환된 값은 잘 나왔기 때문에 프로젝트에는 큰 영향이 없을 것으로 예상됩니다.

하지만 오류가 발생했다는 것은 엄청난 큰 리스크를 불러올 수도 있기 때문에..

암튼 혹시 오류가 발생한 이유에 대해서 아시는 분은 댓글로 남겨주시면 감사드리겠습니다 !!

 

 

이렇게 오늘 할 실습을 모두 마쳤습니다 !

오늘 오류 하나 때문에 몇 시간을 소비했는데 결국 잡지를 못했습니다...

아쉽고 짜증 나지만 계속 이것만 잡고 있으면 다른 공부도 못 하기 때문에 일단 오류에 대한 생각은 접어둬야겠습니다.

다들 오류 조심하면서 실습해보시길 바랍니다..!

그럼 다음 포스팅에서 뵙겠습니다 !

이상 전자과_공대생이었습니다 ~ ! (⌐■_■)

감사합니다 ~~

728x90
반응형

관련글 더보기