2017 멀티캠퍼스/Raspberry Pi

#3 라즈베리파이 GPIO LED

꿈꾸는어린이 2018. 1. 14. 12:55

//

일시 : 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()