본문 바로가기
라즈베리파이(Raspberry Pi)

(5) 라즈베리 파이 가변저항 / ADC

by kingyejin 2023. 12. 4.

[저항기]

종류 : 고정 저항기 + 가변 저항기

 

 

[저항기의 symbol]


1. 고정 저항기

: 고정된 저항값을 가지고 있는 것으로, 일반적으로 칼라 코드나 숫자 코드로 표시되어 있음.


2. 가변 저항기

: 전자회로에서 저항값을 임의로 바꿀 수 있는 저항기로, 저항을 바꾸면 전류의 크기도 바뀜. 소자의 특성상 3단자인 경우가 많고 일반적으로 회전형이 많이 사용되며 분압기를 구성함. 

 

*분압기: 샤프트나 손잡이를 회전시켜 회로의 전압을 저항치에 따라 그 분압비율로 가변된 전압을 얻도록 하는 전자소자

 

1핀과 3핀 단자 사이는 고정 저항이며그 위에 2핀 단자와 연결된 와이퍼(조절 슬라이더)가 위치 이동을 하며 저항값을 변화시킴. 

전원, 그라운드 순서로 연결했을 시에는 가운데 2번 핀을 우측으로 돌리면, 저항을 최대 값 1023에서 최소값 0을 읽을 수 있다.
그라운드, 전원 순서로 연결했을 시에는 가운데 2번 핀을 우측으로 돌리면, 저항을 최소 값 0에서 최소값 1023을 읽을 수 있다.

 

 

 

EX) RAW:RBW가 2:3일 때, 5V의 전압이 흐르면 각각 2V와 3V로 분압.

*VAW(전력)(VBW~VCC)/ VBW(비디오 대역폭 0~VBW) / VCC(전압)

 

회전형 가변저항 기본 구조

 


[실습]  가변 저항기 연결 회로 구성 후 가변저항을 회전시켜 LED 불빛이 꺼지고 켜지는 지점 확인

[전원->그라운드 순서 연결 (저항: 1023->0)]

 

DC 3V (전원) -ADC(1핀)/RLED(+)- ADC(2핀)/ GND-ADC(3핀) & RLED(-) )

* 전원, 그라운드 순서로 연결했을 시에는 가운데 2번 핀을 우측으로 돌리면, 저항을 최대 값 1023에서 최소값 0을 읽을 수 있다.


ADC (Analog-to-Digital Converter)

: analog 신호를 digital 신호로 변환시켜주는 장치

 

아날로그(analog): 어떤 양 또는 데이터를 연속적으로 변환하는 물리량 (전압,전류 등)

디지털(digital): 어떤 양 또는 데이터를 2진수 (1/0)의  이산적인 값으로 표현하는 것

 


*라즈베리 파이는 별도의 ADC가 내장되어 있지 않아서 별도의 ADC 칩을 구매하여 연결해야함. 

(아두이노 보드는 대부분 내장됨)

 

ADC의 성능: 12비트/ 14비트/ 16비트/ 24비트 [비트=분해능/분해능 해상도가 높을수록 정확도 높아짐]

EX) 10비트: 0V - 5V = 0 - 1024 / 즉, 2.5V = 512


ADC 가 필요한 이유?

 

마이크로컨트롤러(라즈베리파이)는 주로 디지털 값을 받아 처리한다. 

하지만 우리가 다루는 전압, 전류는 거의 아날로그 값으로 존재한다.

예를 들어 가변저항기의 2번 핀으로부터 입력받은 전압의 값은 아날로그 값이다.

그래서 이러한 아날로그 값을 디지털 값으로 변환시켜 라즈베리파이로 디지털 값을 주고,

라즈베리파이에서 다시 아날로그 값으로 변환해줘야 한다.

 

여기서 이렇게 아날로그값을 디지털값으로 변환해주는 장치가 바로 ADC이다.

*아날로그 값으로의 변환은 scripts 파일의 파이썬 코드에 계산식을 넣어주면 할 수 있다. (아래 실습 예제 코드를 참고)

 

EX) 가변 저항기로 출력한 전압값을 라즈베리파이로 읽기
1. 가변 저항기: 출력한 전압값  = 1.65V  (아날로그값) 

2. ADC: 1.65V (아날로그값) -> 512(디지털값) [ADC 성능이 10비트인 경우: 0~1024(디지털 값)]
3. RPI: 512(디지털값) ->1.65V(아날로그값) = 최종 우리가 궁금한, 보고싶은 값

 


[실습]  가변 저항에 인가되는 전압을  MCP3004를 통해 ADC 통신하여 전압값 읽기

*그라운드 - > 전원 순서 연결 (저항: 0 -> 1023)

 

1. 회로 연결

 

*가변저항기 : [ GND-ADC(1핀) / CH0(MCP3004와 연결) - ADC(2핀) /   DC 3V (전원) -ADC(3핀)]

*그라운드, 전원 순서로 연결했을 시에는 가운데 2번 핀을 우측으로 돌리면, 저항을 최소 값 0에서 최소값 1023을 읽을 수 있다.

 

*ADC:DC 3V (전원) -VCC & Uref /GPIO11-CLK / GPIO9-Dout / GPIO10-Din / GPIO8-CS/SHDN]

 

 

 

[MCP 칩으로 연결시, SPI 통신 연결 방법]


2. 파이썬 코드 실행

 

해당 코드를 실행하면 가변저항기를 돌렸을 때, readvol: 아날로그 값 / Voltage: 전압(아날로그 값이 10비트로 계산되어 디지털 값으로 변환된 값) 이 화면에 출력된다. => 왼쪽으로 돌리면 전압이 감소, 오른쪽으로 돌리면 전압이 증가하는 것 볼 수 있음.

 

*그라운드, 전원 순서로 연결했을 시에는 가운데 2번 핀을 우측으로 돌리면, 저항을 최소 값 0에서 최소값 1023을 읽을 수 있다. 

 

import time
import spidev

spi = spidev.SpiDev() #Spi 객체 생성
spi.open(0,0) # 0번채널 open
spi.max_speed_hz = 1000000 

# MCP3008의 0번 채널에서 아날로그 값을 불러옴
def ReadVol(vol):
	adc = spi.xfer2([1,(8+vol)<<4,0]) #SPI 통신을 사용하여 MCP3008에 명령을 전송하고 아날로그 값을 읽어옴.
	data = ((adc[1]&3)<<8)+adc[2] #MCP3008에서 아날로그 값을 디지털 값으로 변환
	return data
	
mcp3008 = 0 #MCP3008의 채널

# 디지털 값을 계산하여 아날로그 값으로 변환 및 출력
while True: 
	a_1 = ReadVol(mcp3008)
	print('readvol:', a_1, 'Voltage:', 3.3*a_1/1024) #저항과 전압은 비례
	time.sleep(0.5)