라즈베리 파이 GPIO 핀으로 푸시버튼 사용하기

푸시버튼 브레드보드 특징 이미지

라즈베리 파이와 함께 LED를 사용해 본 적이 있다면, GPIO 출력이 어떻게 작동하는지 아마 알고 있을 것입니다. 코드는 전기를 일반 목적 입력/출력(GPIO) 핀을 통해 흐르게 하고, LED를 통과시켜 불을 켭니다. 하지만 반대로 해본 적이 있나요? 푸시버튼을 사용하면 정확히 그 반대의 작업을 할 수 있습니다. 이 튜토리얼에서는 GPIO 핀을 입력 핀으로 변환하여 여러분이 누르는 모든 버튼을 듣는 방법을 보여줍니다!

목차

  • 푸시버튼 작동 원리
  • 4핀 푸시버튼
  • 라즈베리 파이 GPIO 핀으로 푸시버튼 사용하기
  • 푸시버튼 사용 방법
  • 푸시버튼 하드웨어
  • 임포트 명령어
  • 설정 명령어
  • 루프 명령어
  • 자주 묻는 질문

또한 읽어보세요: 라즈베리 파이로 깜박이는 LED 만들기

푸시버튼 작동 원리

푸시버튼은 스위치의 일종입니다. 두 개의 별도 전도 핀이 서로 분리되어 완전한 회로를 방지합니다. 푸시버튼을 누르면 실제로 두 핀을 함께 눌러 회로를 완성하게 됩니다. 하지만 손을 떼면 스프링 같은 메커니즘이 핀을 다시 분리합니다.

푸시버튼 브레드보드 단독

또한 읽어보세요: 라즈베리 파이를 비디오 회의 스테이션으로 변환하는 방법

4핀 푸시버튼

센서 키트의 일반적인 푸시버튼은 네 개의 핀을 가지고 있으며, 각 핀은 서로 분리되어 있습니다. 버튼 영역 바로 아래에는 금속으로 된 움직이는 판이 있으며, 푸시버튼이 아래로 눌리면 모든 다른 핀을 연결합니다.

푸시버튼 뒷면

4핀 푸시버튼 내부에는 두 개의 판이 있습니다. 각 판은 두 개의 외부 핀에 연결되어 있습니다. 두 판은 서로 분리되어 있으며, 버튼 아래의 금속 판을 눌러야만 연결됩니다.

4핀 푸시버튼 핀아웃

어떤 면에서 푸시버튼에서는 항상 두 핀이 연결되어 있습니다. 4핀 푸시버튼을 누르면 네 개의 핀이 모두 연결됩니다.

또한 읽어보세요: 라즈베리 파이로 아두이노 프로그래밍하기

라즈베리 파이 GPIO 핀으로 푸시버튼 사용하기

이번에는 라즈베리 파이 GPIO 핀이 푸시버튼의 버튼 누름을 감지하도록 만들 것입니다. 전기가 흐르면 라즈베리 파이는 작동 중임을 알려주는 메시지를 출력합니다.

필요한 것들

  • 푸시버튼 (4핀)
  • 저항기 (100Ω에서 1000Ω 사이의 저항기)
  • 점퍼 와이어
  • 전압계 (선택 사항)
  • 라즈베리 파이
  • 모니터 및 키보드 (또는 SSH)

또한 읽어보세요: 라즈베리 파이 4에 윈도우 11 설치하기

푸시버튼 사용 방법

  1. 원하는 코드 편집기를 열고 다음 코드를 붙여넣습니다:
import RPi.GPIO as GPIO  
from time import sleep  
  
GPIO.setwarnings(False)  
GPIO.setmode(GPIO.BOARD)  
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)  
  
while True:  
    if GPIO.input(7) == GPIO.HIGH:  
        print("Pin 7 is HIGH!")  
    elif GPIO.input(7) == GPIO.LOW:  
        print("Pin 7 is LOW...")  
        sleep(0.15)
  1. “rpi-pushbutton.py”로 저장합니다 (파일 확장자가 동일한 한 원하는 이름으로 저장할 수 있습니다).

  2. 회로를 구성합니다. 푸시버튼의 한 핀을 핀 7과 병렬로 저항기에 연결합니다. 저항기의 반대편에 GND 핀(핀 6, 7, 14, 20, 25, 30, 34 또는 39)에 점퍼 와이어를 연결한 다음, 별도의 푸시버튼 핀에 3.3V 핀(핀 1 또는 17)에 또 다른 점퍼 와이어를 연결합니다.

푸시버튼 회로도 및 브레드보드 버전

팁: 올바른 핀 번호를 찾으려면 라즈베리 파이를 GPIO 핀이 오른쪽 상단 모서리에 위치하도록 잡으세요. 왼쪽 상단 핀은 핀 1이며, 그 오른쪽은 핀 2입니다. 핀 1 아래는 핀 3이고, 오른쪽은 핀 4이며, 계속해서 진행됩니다.

라즈베리 파이 핀아웃

  1. 라즈베리 파이에 전원을 공급하고 터미널을 엽니다. cd를 사용하여 Python 스크립트의 디렉토리로 이동한 다음 python3 rpi-pushbutton.py를 입력합니다. 다른 파일 이름을 사용했다면 “rpi-pushbutton” 대신 그 이름을 사용하세요.

터미널 Cd Python3 Rpi Pushbutton

  1. 터미널에서 Pin 7 is LOW...라는 새로운 텍스트가 0.15초마다 표시되어야 합니다. 버튼을 누르면 새로운 줄은 Pin 7 is HIGH!가 됩니다.

GND와 3.3V 핀을 바꾸면, 저항기에 3.3V가 연결되고 푸시버튼의 다른 쪽에 GND가 연결됩니다. 이 경우 푸시버튼의 논리가 반전됩니다. 항상 Pin 7 is HIGH!를 출력하고 버튼을 누르면 Pin 7 is LOW가 됩니다.

푸시버튼 풀업 대 풀다운 저항기

또한 읽어보세요: 2024년에 확인해야 할 최고의 라즈베리 파이 대안

푸시버튼 하드웨어

푸시버튼은 두 가지 종류의 저항기를 사용합니다: 풀업 저항기와 풀다운 저항기. 3.3V가 저항기에 연결된 경우 풀업 저항기입니다. 전압을 위로 끌어올립니다. 반면에 풀다운 저항기는 GND 핀이 연결되어 전압을 아래로 끌어내립니다.

저항기 없이 푸시버튼을 사용할 수는 있지만, 그렇게 하면 GPIO 핀이 플로트 상태가 됩니다. 플로트 상태의 GPIO 핀은 직접적인 전기 충전을 받지 않으므로 주변에서 충전을 찾습니다. 예를 들어, 강한 전자기장이 가까이에 있으면 그 대신 그것을 측정하게 됩니다.

저항기 없는 푸시버튼 회로

그래서 참조 지점이 필요합니다. GPIO 핀을 기본적으로 0V(GND)에 연결하면 버튼이 눌리지 않을 때 0V를 측정합니다. 하지만 그렇지 않으면 GPIO 핀의 값은 어디에나 있을 수 있습니다 – 심지어 음의 전압일 수도 있습니다!

플로팅 핀은 흥미로운 일을 할 수 있습니다. 핀을 플로트 상태로 두면 공기 중의 전압 차이를 감지할 수 있으며, 핀 근처에서 손가락이 움직이는 효과까지 측정할 수 있습니다. 마치 전자기 존재 센서와 같습니다.

하지만 라즈베리 파이에서 그렇게 할 수는 없습니다. 유용하게 사용하려면 아날로그 핀이 필요하지만, 라즈베리 파이에는 없습니다.

푸시버튼 코드

이를 이해하면 핀 7이 3.3V 또는 0V가 통과하는지를 감지한다는 것을 알 수 있습니다. 3.3V를 감지하면 HIGH로 보고합니다. 하지만 0V를 감지하면 LOW로 보고합니다.

코드를 세 부분으로 나누어 보겠습니다: 임포트 명령어, 설정 명령어, 루프 명령어.

임포트 명령어

두 개의 임포트 명령어를 사용하고 있습니다:

import RPi.GPIO as GPIO  
from time import sleep

import RPi.GPIO as GPIO는 RPi.GPIO 모듈을 가져와 라즈베리 파이의 GPIO 핀으로 작업할 수 있게 해줍니다. 끝에 as GPIO를 추가함으로써 Python에게 GPIO를 입력하는 것이 RPi.GPIO를 입력하는 것과 같다고 알려줍니다. 다른 문자열로 바꿀 수도 있으며, 코드는 올바르게 형식화하는 한 여전히 작동합니다.

반면에 from time import sleep는 Python의 시간 모듈의 일부만 가져옵니다. sleep() 함수를 사용할 수 있게 해줍니다.

설정 명령어

설정 명령어에서 RPi.GPIO 모듈의 세 가지 명령어로 설정을 수정하고 있습니다.

GPIO.setwarnings(False)  
GPIO.setmode(GPIO.BOARD)  
GPIO.setup(7, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

RPi.GPIO 모듈은 Python 스크립트를 시작할 때 GPIO 핀 사용에 대한 경고 메시지를 표시합니다. GPIO.setwarnings(False)는 이를 방지합니다.

GPIO.setmode(GPIO.BOARD)는 RPi.GPIO 모듈의 또 다른 명령어입니다. Python에게 “BOARD” 핀 배치를 사용하고 있다고 알려줍니다. RPi.GPIO에는 두 가지 핀 배치가 있습니다: BOARD와 BCM. BOARD는 핀 번호를 사용하여 핀을 선택할 수 있게 해줍니다. BCM(브로드컴의 약자)은 개별 브로드컴 SOC 채널로 핀을 선택할 수 있게 해줍니다. BOARD는 어떤 종류의 라즈베리 파이 보드를 사용하든 항상 동일하므로 사용하기 더 쉽습니다. BCM 핀 배치는 사용하는 모델에 따라 달라질 수 있습니다.

마지막으로 GPIO.setup(7, GPIO.IN)은 핀 7을 입력 핀으로 설정할 수 있게 해줍니다. .setup() 함수를 사용하고 7을 선택하려는 핀으로 읽습니다. GPIO.IN은 입력 핀으로 설정하려고 한다는 것을 의미합니다.

또한 읽어보세요: 아두이노 초보자 가이드

루프 명령어

임베디드 시스템은 일반적으로 몇 줄의 코드만 사용하고 이를 무한히 루프합니다. 다양한 프로그래밍 언어는 이를 수행하는 다양한 방법을 사용합니다. 그러나 개념은 동일합니다: 어떤 종류의 루프를 사용합니다. Python의 경우 while True:입니다.

while True:  
    if GPIO.input(7) == GPIO.HIGH:  
        print("Pin 7 is HIGH!")  
    elif GPIO.input(7) == GPIO.LOW:  
        print("Pin 7 is LOW...")  
        sleep(0.15)

while True:는 코드를 무한히 루프하게 합니다. 그 안에 넣은 모든 것은 보드에 전기가 공급되는 한 영원히 실행됩니다.

if GPIO.input(7) == GPIO.HIGH:는 if 문입니다. 입력 핀인 핀 7이 HIGH로 읽히면 그 안의 모든 것을 실행해야 한다고 말합니다.

print("Pin 7 is HIGH!")는 if 문 안에 있습니다. 단순히 콘솔에 Pin 7 is HIGH!를 출력합니다. 이를 다른 문자열, 숫자 또는 해당 내용을 포함하는 변수를 대체할 수 있습니다.

다음은 elif GPIO.input(7) == GPIO.LOW:입니다. 기본적으로 if GPIO.input(7) == GPIO.HIGH:와 동일하지만 첫 번째 부분이 다릅니다: if 대신 elif를 사용합니다. elif는 Else If의 약자입니다. 위의 모든 코드가 false를 반환하면 Python이 이 else-if 문을 실행해야 한다고 말합니다.

마지막으로 sleep(0.15)는 코드를 0.15초 동안 일시 중지합니다. 왜 코드를 일시 중지해야 할까요? 주로 성능 문제 때문입니다. 라즈베리 파이는 출력 코드를 너무 빠르게 보내서 GUI가 약간 지연될 것입니다. SSH를 통해 라즈베리 파이를 사용하는 경우에는 더욱 두드러집니다. 시간이 지남에 따라 눈에 띄는 지연이 발생할 것입니다. 코드를 일시 중지하면 성능 문제를 피하기 위해 속도를 늦춥니다.

또한 읽어보세요: Visual Studio Code를 사용하여 PlatformIO를 통해 아두이노 프로그래밍하기

자주 묻는 질문

라즈베리 파이에서 핀을 핫스왑하는 것이 안전한가요?

핫스왑, 즉 전원이 켜진 상태에서 라즈베리 파이의 핀을 교체하는 것은 일반적으로 좋지 않은 아이디어입니다. 스위치를 전원 공급 장치에서 제거한 후에 교체하는 것이 항상 더 안전합니다.

4핀 푸시버튼이 3핀 푸시버튼보다 나은 이유는 무엇인가요?

유용성 면에서는 기본적으로 동일합니다. 그러나 네 개의 핀을 사용하면 4핀 푸시버튼을 다른 푸시버튼에 직렬 회로로 연결할 수 있습니다.

라즈베리 파이의 모든 핀을 입력 핀으로 설정할 수 있나요?

라즈베리 파이는 40개의 핀을 가지고 있지만, 그 중 27개만 GPIO입니다. GPIO 핀만 입력 및 출력 핀으로 프로그래밍할 수 있습니다. 대부분의 IDE는 비-GPIO 핀을 입력 핀으로 재프로그래밍하는 것을 허용하지 않습니다.

모든 사진과 스크린샷은 Terenz Jomar Dela Cruz 제공