일시 : 2018.01.09 14:00 ~ 16:00
내용 : 라즈베리파이 하드웨어 장치 제어 시작
Sensor Programming
//
MCU 모듈에 연결해서도 사용 가능
GPIO
I2C통신 : 온/습도, 빛 감지, FND(시간)
GPIO(General Purpose Input/Output)
General Purpose Input and Output (범용 입/출력 장치)
컴퓨터와 주변 장치를 연결하기 위해서는 입출력 인터페이스가 필요.
컴퓨터는 USB포트, HDMI 포트등을 통해 주변 장치를 연결하고,
임베디드 시스템에서는 다양한 하드웨어(센서)를 연결하기 위해 GPIO핀들을 제공.
CPU의 GPIO 핀에 연결되어 있음 -> GPIO 커넥터 셋팅을 통해 장치 제어 가능
AP(Application Process)는 물리적인 형태를 가지는 IC(Integrated Circuit)로 구현될때 제한된 개수의 핀을 가짐(라즈베리파이3은 40개의 GPIO핀을 제공)
핀은 한 순간에 하나의 동작 상태만. (입력, 출력 동시에 X)
GPIO로 MCU 또는 AP의 입/출력과 동작의 세부 상태를 설정
프로그램에서 레지스터를 통해 핀의 상태를 High(전류 흐름) 또는 Low로 설정하여 동작을 발생시킴
GPIO 커넥터(핀 40개), 파이썬에서는 BCM방식의 핀 번호를 따름
버스(Bus) : 디지털 회로에서 통신을 위한 신호선들. Rasp에서 외부 장치와 데이터 입출력을 위한 버스의 종류로는 I2C, SPI, UART가 있음
UART , 시리얼콘솔을 UART로 연결해서 사용O
0v -> 0
3.3v ->1 (라즈베리파이의 디지털 입출력핀들은 모두 3.3v로 동작)
파이썬에서는 BCM 방식의 핀 번호를 따름
라즈베리파이의 정확한 핀의 기능을 확인하려면 gpio readall 명령어로 확인 가능.
IC (Integrated Circuit) : 직접회로
트랜지스터, 저항, 다이오드 등 많은 회로 부품이 결합되어 있어 전기 회로 내에서 특정한 기능을 수행하도록 만든 회로 부품들의 집합체
GPIO LED
가변저항(전자회로에서 저항값을 임의로 바꿀 수 있는 전자 부품)으로 저항을 바꾸면 전류의 크기 변경
-> 밝기, 음량 조절, 속도 조절 등에 사용
LED사용하기 위해 CPU에서 14,15핀을 출력상태로 하고 전류를 high로 설정해주면 된다.
오실로 스코프로 전류가 흐르는지 확인(신호 값 측정)
오실로 스코프 : 시간에 따른 입력전압의 변화를 화면에 출력하는 장치. 전기진동이나 펄스처럼 시간적 변화가 빠른 신호를 관측
GPIO모듈 아래에 setup, output, clean 함수가 있음
GPIO.setmode(GPIO.BMC)
=> 확장 커넥터의 핀 방식을 BCM방식으로 연결, 셋모드 반드시 필요
GPIO.setup(led_pin1, GPIO.OUT)
=> setup() 함수 안에서 레지스터 제어, 출력/입력 설정
False : Low 상태 (전류 x)
True : High 상태 (전류 o)
입력상태일 때는 High 인지 Low인지 알 수 없다.
GPIO.cleanup()
=> 사용된 모든 GPIO의 출력 설정을 초기 설정(입력 상태)로 되돌려주는 함수
try / finally 구문 : 예외처리. try는 실행, finally는 강제 중지(
ctrl
+c
) 시키면 실행. finally로 되어있으면 error가 있어도 끝까지 실행됨.
실습
1초마다 LED 불이 들어오도록
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
led_pin1 = 14
led_pin2 = 15
GPIO.setup(led_pin1, GPIO.OUT)
GPIO.setup(led_pin2, GPIO.OUT)
try :
while True:
GPIO.output(led_pin1, False)
GPIO.output(led_pin2, False)
time.sleep(1)
GPIO.output(led_pin1, True)
GPIO.output(led_pin2, True)
time.sleep(1)
##ctrl+c로 인터럽트할 때 에러메세지가 나오지 않도록 할 때
except KeyboardInterrupt:
pass
finally:
print("Cleaning up")
GPIO.cleanup()
=> 클래스 사용
import RPi.GPIO as GPIO
import time
class LED :
led_pin1 = 0
led_pin2 = 0
def __init__(self):
GPIO.setmode(GPIO.BCM)
self.led_pin1 = 14
self.led_pin2 = 15
def turnOn(self, pin):
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, True)
def turnOff(self, pin):
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, False)
led_pin1, led_pin2 = 0, 0
try :
myLED = LED()
while True:
myLED.turnOn(myLED.led_pin1)
myLED.turnOn(myLED.led_pin2)
time.sleep(1)
myLED.turnOff(myLED.led_pin1)
myLED.turnOff(myLED.led_pin2)
time.sleep(1)
except KeyboardInterrupt:
pass
finally:
print("Cleaning up")
GPIO.cleanup()
사용자 값을 입력받아 LED로 2진수 표현하기
##0~4까지의 숫자를 입력받아 led로 2진수 표현하기
import RPi.GPIO as GPIO
import time
class LED:
def __init__(self):
GPIO.setmode(GPIO.BCM)
def turnOn(self, led_pin):
GPIO.setup(led_pin, GPIO.OUT)
GPIO.output(led_pin, True)
def turnOff(self, led_pin):
GPIO.setup(led_pin, GPIO.OUT)
GPIO.output(led_pin, False)
try :
while True:
num = int(input("0~3까지의 숫자를 입력하시오 : "))
myLed = LED()
myLed.led_pin1 = 14
myLed.led_pin2 = 15
if num == 0:
myLed.turnOff(myLed.led_pin1)
myLed.turnOff(myLed.led_pin2)
elif num == 1:
myLed.turnOff(myLed.led_pin1)
myLed.turnOn(myLed.led_pin2)
elif num == 2:
myLed.turnOn(myLed.led_pin1)
myLed.turnOff(myLed.led_pin2)
elif num == 3:
myLed.turnOn(myLed.led_pin1)
myLed.turnOn(myLed.led_pin2)
except KeyboardInterrupt:
pass
finally :
GPIO.cleanup()
'2017 멀티캠퍼스 > Raspberry Pi' 카테고리의 다른 글
#6 라즈베리파이 PIR 센서 (움직임 감지) (0) | 2018.01.14 |
---|---|
#5 라즈베리파이 GPIO 조이스틱 (0) | 2018.01.14 |
#4 라즈베리파이 DC Motor (0) | 2018.01.14 |
#2 라즈베리파이 개발환경 복습 (0) | 2018.01.01 |
#1 라즈베리파이 개발환경 (1) | 2018.01.01 |