Triger Pin에 스타트 펄스 신호를 주면 HC-SR04에서 사운드 웨이브를 전방으로 쏘아서 물체에 반사되어 돌아오는 시간만큼 Echo 핀으로 펄스신호를 보냅니다. 이떄, 소리의 속도는 340m/s로 일정하므로 초음파를 발사하고 Echo핀으로 다시 돌아오는 시간을 588μs라고 한다면 다음과 같은 공식으로 물체와의 거리를 알 수 있습니다.
물체와의 거리 = 소리의 속도 X (걸린 시간 / 2) = 340m/s X (588μs / 2) = 10cm
#-*-coding:utf-8-*-
# 필요한 라이브러리를 불러옵니다.
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#센서에 연결한 Trig와 Echo 핀의 핀 번호 설정
TRIG = 23
ECHO = 24
print("Distance measurement in progress")
#Trig와 Echo 핀의 출력/입력 설정
GPIO.setup(TRIG,GPIO.OUT)
GPIO.setup(ECHO,GPIO.IN)
#Trig핀의 신호를 0으로 출력
GPIO.output(TRIG, False)
print("Waiting for sensor to settle")
time.sleep(2)
try:
while True:
GPIO.output(TRIG, True) # Triger 핀에 펄스신호를 만들기 위해 1 출력
time.sleep(0.00001) # 10µs 딜레이
GPIO.output(TRIG, False)
while GPIO.input(ECHO)==0:
start = time.time() # Echo 핀 상승 시간
while GPIO.input(ECHO)==1:
stop= time.time() # Echo 핀 하강 시간
check_time = stop - start
distance = check_time * 34300 / 2
print("Distance : %.1f cm" % distance)
time.sleep(0.4) # 0.4초 간격으로 센서 측정
except KeyboardInterrrupt:
print("Measurement stopped by User")
GPIO.cleanup()
적외선 인체감지 센서(PIR 센서, Passive Infrated Sensor)는 적외선을 통해 사람의 움직임을 감지하는 센서입니다. 건물의 복도나 현관문 천장에 있는 조명 등에 설치되어 사람의 움직임이 감지되면 자동으로 조명을 켜주는데 이용되는 센서입니다. 즉 감지 각도 범위 안에 적외선의 변화가 있을시 High(1) 신호를 출력하고 없을시 Low(0) 신호를 출력합니다.
어떤 자료의 '길이', '각도' 또는 '전압'과 같이 외부적인 원인에 의해 연속적으로 변하는 것들을 물리량으로 나타내는 것을 의미한다.
라즈베리 파이의GPIO는 아두이노와 다르게 디지털 입력만 가능합니다. 그래서 ADC(Analog to Digital Converter) 기능을 가진 MCP300 이라는 IC를 사용하여 아날로그에서 변환된 디지털 값을 SPI(Serial Peripheral Interface) 통신을 이용하여 라즈베리 파이로 읽을수 있다.
#-*-coding:utf-8-*-
# 필요한 라이브러리를 불러옵니다.
import spidev
import time
# 딜레이 시간 (센서 측정 간격)
delay = 0.5
# MCP3008 채널중 센서에 연결한 채널 설정
pot_channel = 0
# SPI 인스턴스 spi 생성
spi = spidev.SpiDev()
# SPI 통신 시작하기
spi.open(0, 0)
# SPI 통신 속도 설정
spi.max_speed_hz = 100000
# 0 ~ 7 까지 8개의 채널에서 SPI 데이터를 읽어옵니다.
def readadc(adcnum):
if adcnum > 7 or adcnum < 0:
return -1
r = spi.xfer2([1, 8 + adcnum << 4, 0])
data = ((r[1] & 3) << 8) + r[2]
return data
while True:
# readadc 함수로 pot_channel의 SPI 데이터를 읽어옵니다.
pot_value = readadc(pot_channel)
print ("---------------------------------------")
print("POT Value: %d" % pot_value)
time.sleep(delay) # delay 시간만큼 기다립니다.
LDR(Light Dependent Resistor)는 광센서 모듈로써 빛의 세기에 따라서 저항값이 달라지는 소자입니다. 주위가 밝으면 저항값이 줄어들고, 주위가 어두우면 저항값이 증가합니다.
#-*- coding: utf-8 -*-
# 필요한 라이브러리를 불러옵니다.
import spidev
import time
# 딜레이 시간 (센서 측정 간격)
delay = 0.5
# MCP3008 채널중 센서에 연결한 채널 설정
ldr_channel = 0
# SPI 인스턴스 spi 생성
spi = spidev.SpiDev()
# SPI 통신 시작하기
spi.open(0, 0)
# SPI 통신 속도 설정
spi.max_speed_hz = 100000
# 0 ~ 7 까지 8개의 채널에서 SPI 데이터를 읽어옵니다.
def readadc(adcnum):
if adcnum > 7 or adcnum < 0:
return -1
r = spi.xfer2([1, 8 + adcnum << 4, 0])
data = ((r[1] & 3) << 8) + r[2]
return data
while True:
# readadc 함수로 ldr_channel의 SPI 데이터를 읽어옵니다.
ldr_value = readadc(ldr_channel)
print ("---------------------------------------")
print("LDR Value: %d" % ldr_value)
time.sleep(delay)
조이스틱의 X축 Y축 움직임에 따라 저항 값이 변하는 가변저항이 달려있어서 X축 Y축 움직임이나 방향등을 표현할 수 있고 조이스틱을 수직으로 눌려서 스위치 기능도 가능한 모듈입니다.
#-*- coding: utf-8 -*-
# 필요한 라이브러리를 불러옵니다.
import spidev
import time
# 딜레이 시간 (센서 측정 간격)
delay = 0.5
# MCP3008 채널설정
sw_channel = 0
vrx_channel = 1
vry_channel = 2
# SPI 인스턴스 spi 생성
spi = spidev.SpiDev()
# SPI 통신 시작하기
spi.open(0, 0)
# SPI 통신 속도 설정
spi.max_speed_hz = 100000
# 0 ~ 7 까지 8개의 채널에서 SPI 데이터를 읽어옵니다.
def readadc(adcnum):
if adcnum > 7 or adcnum < 0:
return -1
r = spi.xfer2([1, 8 + adcnum << 4, 0])
data = ((r[1] & 3) << 8) + r[2]
return data
# 무한루프
while True:
# X, Y 축 포지션
vrx_pos = readadc(vrx_channel)
vry_pos = readadc(vry_channel)
# 스위치 입력
sw_val = readadc(sw_channel)
# 출력
print("X : {} Y : {} SW : {}".format(vrx_pos, vry_pos, sw_val))
# delay 시간만큼 기다림
time.sleep(delay)