라즈베리파이 GPIO, 터치센서로 LED 켜키


안뇽하세요 라이프온룸 입니이다. ㅎㅎ 

라즈베리파이의 GPIO, 왠지 써야 뽕을 뽑을 것만 같은 이 느낌 ! 그래서 준비했습니다. 

터치센서와 LED를 달아서 LED 켜기 !! ㅋㅋㅋㅋㅋ 뭐 쉬운 예제이지만 앞으로 미세먼지센서, 조도센서, IR 리시버 등등등 을 사용하기 위한 초석적인 포스트로 삼고자 준비했어요 ㅎㅎ 

여튼 오늘의 주인공 터치 센서입니다 !!! 

이 이 외에도 LED 와 저항이 필요 하겠죠 ? 그럼 준비물 소개는 여기 까지 하고 GPIO를 파헤쳐 봅시다. 

1. 라베리파이의 GPIO에 대해 알아보즈아 ~ 

gpio 는 General purpose input/output 의 약자입니다. 말그대로 자용자에 의해 제어될 수 있는 디지털 신호 핀이지요 라즈베리파이의 GPIO 핀배열은 다음과 같습니다. 

다양한 기능을 제공함을 알 수 있죠 여기서 주의 할 점은 라즈베리파이의 경우 아두이노와 다르게 GPIO 입력 3.3V max 입니다. 이 이상의 전압이 들어갈 경우 라즈베리파이가 고장 날 수 있으니 신중하게 작업 하시기 바랄게요 !

그럼으로 터치센서 연결 시에도 VCC에 3.3v 를 넣어야 합니다. 당연하겠지만 GPIO output 도 3.3V 까지만 제한 됩니다. 보통 아두이노용 센서들은 5V 에 맞춰진 경우가 많은데 라즈베리파이에서 사용하시려면 스펙을 잘보고 사용하셔야 합니다. 

나중에 코딩 할 때도 설명 드리겠지만 1~40 은 Raspberry pi connector numbering (BOARD) 라고 부르고 GPIOX 의 X에 해당하는 번호는  Broadcom pin number(BCM) 라고 해서 실제 브로드컴 칩의 핀번호 입니다. 

 

2. 회로 연결

연결은 다음과 같이 하면 됩니다. 쉽죠잉 ㅎㅎ 아 그리고 전원을 끄고 연결하시는 것을 추천드립니다. 괜히 핀 잘 못 손데면 쇼트나서 보드가 고장날 지도 몰라요 ㅜㅜ 

  • 초록색:  3.3V – Touch VCC
  • 빨산색: GPIO4 – Touch SIG
  • 노란색: GPIO17 – LED + 
  • 하얀색: GND

LED 연결시 저항을 220옴 사용했는데요! 엄밀히 말하면 LED 의 데이터쉬트를 보고 소비 전압 전류를 알아낸 뒤 계산을 해서 달아야 합니다. 그런데 데이터시트는 보기 귀찮으늬 아래 표를 참고하시면 됩니다. 

그럼 계산은 어떻게 하느냐 적색 LED의 경우를 보면 최소 전압 1.8V 일때 20mA 즉 0.02A 가 흐르죠 ? 그럼 회로를 그려보면 아래와 같습니다. 

LED 에 1.8V 가 걸리고 직렬임으로 저항에는 3.3 -1.8 = 1.5V 가 걸립니다. 그리고 회로에는 0.02A 가 흐른다고 가정해 보죠 

그러면 중학교인가요 ? 때 배운 옴의 법칙(V=IR) 에 따라 1.5V = 0.02A * 저항 입니다. 그럼 계산을 해보면 75Ω 이 나옵니다. ! 그래서 75Ω 이상의 저항을 달아줘야 하지만 저는 그냥 220Ω 을 달았어요 ㅎㅎ 잘 동작합니다. 

그리고 저항은 반드시 달아야 합니다. 라즈베리파이의 3.3V 에 빨간색 LED를 직빵으로 연결하면 LED가 타버립니다. .. 

자 그럼 사전 지식은 이쯤이면 된 것 같고 저는 연결을 다 했습니다. 

 

여튼 연결을 마쳤으면 코드를 한번 보죠 

3. 코드 

코드를 짜기전에 설치해줘야 할 라이브러리가 있습니다. 

sudo apt-get install RPI.GPIO
pip install RPi.GPIO

아마 첫번째는 OS가 라즈베리안 이라면 전부 깔려 있을 거구요(혹시 몰라서요 ㅎㅎ) ! 두번째 명령만 하면 될 것 같네요 ㅎㅎ 참고로 저는 제가 진행하고 있는 프로젝트 에서 사용을 위해 가상환경에서 설치를 진행 했습니다. (python2.7, 가상환경이 아니어도 라이브러리만 깔면 동작합니다.)

https://github.com/hog225/echowemoclient

아래 코드를 입력 후 실행해 보세요 ! 그리고 터치버튼에 손을 대고 손을 때 보세요 손을 댈때 LED가 켜지고 때면 꺼지는걸 확인할 수 있을거에요 ㅎㅎ

 

 

# -*- coding: utf-8 -*-
import RPi.GPIO as g
import time

IN_TOUCH = 4 # GPIO 4
OUT_LED = 17 # GPIO 17 

# BCM
g.setmode(g.BCM)

#g.setup(IN_TOUCH, g.IN, pull_up_down = g.PUD_DOWN)
g.setup(IN_TOUCH, g.IN)
g.setup(OUT_LED, g.OUT, initial=g.LOW)


g.add_event_detect(IN_TOUCH, g.BOTH)
# 터치버튼을 누르면 LED ON 때면 OFF
def sensorCallBack(arg1):
    # arg1 BCM PinNumber
    value = g.input(arg1)

    print "Touch " + "GPIO Value : "+str(value)
    if value == 1:
        g.output(OUT_LED, value)
    else:
        g.output(OUT_LED, 0)

g.add_event_callback(IN_TOUCH, sensorCallBack)

print "Start"


try:
    while True:
        time.sleep(1)

except KeyboardInterrupt:
    print "Keyboard Interrupt"

except:
    print "other error "

finally:
    g.cleanup()
    

잠깐 설명을 하고 갈게요 ㅎㅎ

g.setmode(g.BCM)

제가 라즈베리파이 핀 번호에 대해 설명했었죠 ?? 위 코드에서 보면 g.setmode(g.BCM) 이라는 코드가 나옵니다. 이는 핀 번호를 GPIOX 의 X를 사용하겠다는 의미에요 ! 그래서 4, 17 번을 이용해 컨트롤을 해줘야 합니다. 

g.setup(IN_TOUCH, g.IN, pull_up_down = g.PUD_DOWN)

GPIO를 Input 으로 지정하는 경우 pull_up_down 지정을 옵션으로 줍니다. 옵션을 안주는 경우 PUD_OFF 가 디폴트 입니다. 풀업 혹은 풀 다운 회로를 구성해야 한다는 얘기지요 ! 터치센서 모듈의 경우 모듈 내부에서 이런 회로가 잘 되 있어서 신경 안써도 되겠지만 아날로그 스위치의 경우에는 회로를 연결해 줘야 합니다. 아날로그 스위치 연결 방법에 대해서는 아래 URL 을 참고하세요 ㅎㅎ 

https://grantwinney.com/using-pullup-and-pulldown-resistors-on-the-raspberry-pi/

터치센서의 경우는 PUD_OFF, PUD_DOWN, PUD_UP 상황에서도 추가 회로 없이 모두 동일하게 동작합니다. ㅎㅎ

g.add_event_detect(4, g.BOTH)

g.BOTH 는 핀의 전압이 g.RISING, g.FALLING일 경우 동시에 이벤트를 발생 시키겠다는 의미입니다. 

g.add_event_callback(IN_TOUCH, sensorCallBack)

이 함수는 sensorCallBack 이라는 함수를 4번 핀에 이벤트가 발생할 때마다 호출 하게합니다. 해당 함수에서 Sensor 입력값에 따라 GPIO를 조작하면 되겠죠 이 코드처럼요 !! ㅎㅎ

 

넵 오늘 포스팅은 여기까지 입니다. 

다음에는 이 터치 센서로 소노프를 제어해 봐야 겠어요 ㅋㅋㅋ 

다음시간에 또 만나도록 하죠 요즘 일교차가 큰데 감기 조심하시구요 ㅋㅋ

제 블로그 방문자 수 도 거의 남극에 있어서 추워하니 자주 오셔서 댓글로 응원해 주시면 감사하겠습니다. ㅎㅎ 

 

You may also like...

1 Response

  1. 익명 댓글:

    안녕하세요! sudo apt-get install RPI.GPIO
    pip install RPi.GPIO을 설치하고 코드 실행시 import Error: No module named RPI.GPIO라고 뜨는데 어떻게 해야하나요?ㅜㅜ

댓글 남기기

이메일은 공개되지 않습니다.