라즈베리 파이 버튼

이 튜토리얼은 버튼을 사용하여 Raspberry Pi를 사용하는 방법을 안내합니다. 자세히는, 우리는 배울 것입니다:

버튼은 푸시버튼, 촉각 버튼 또는 순간 스위치라고 불립니다. 이는 기본적인 구성 요소이며 많은 Raspberry Pi 프로젝트에서 사용됩니다. 사용하기 쉽습니다. 그러나 기계적, 물리적 측면과 사용 방법으로 인해 초보자에게 혼란스러울 수 있습니다. 이 튜토리얼은 초보자를 위해 이를 간단히 설명합니다.

Hardware Preparation

1×Raspberry Pi 4 Model B Amazon
1×Breadboard-mount Button with Cap 쿠팡 | Amazon
1×Breadboard-mount Button Kit 쿠팡 | Amazon
1×Panel-mount Push Button Amazon
1×Breadboard 쿠팡 | Amazon
1×Jumper Wires Amazon
1×(추천) Screw Terminal Block Shield for Raspberry Pi 쿠팡 | Amazon
1×(추천) USB-C Power Cable with On/Off Switch for Raspberry Pi 4B Amazon
1×(추천) Plastic Case and Cooling Fan for Raspberry Pi 4B Amazon
1×(추천) HDMI Touch Screen Monitor for Raspberry Pi Amazon
공개: 이 섹션에서 제공된 링크 중 일부는 제휴 링크입니다. 이 링크를 통해 구매한 경우 추가 비용없이 수수료를 받을 수 있습니다. 지원해 주셔서 감사합니다.

버튼 정보

버튼을 사용할 때, 초보자들은 종종 두 가지 일반적인 어려움에 직면합니다:

1. 부유 입력 문제:

  • 증상: 입력 핀에서 읽은 값이 버튼 눌림 상태와 일치하지 않습니다.
  • 원인: 입력 핀에 풀업 또는 풀다운 저항이 사용되지 않았습니다.
  • 해결책: 이 튜토리얼에서 다룰 풀업 또는 풀다운 저항을 사용하십시오.

2. 채터링 현상:

  • 증상: Raspberry Pi 코드가 버튼을 한 번만 눌러도 여러 번 눌림으로 감지됩니다.
  • 원인: 기계적 및 물리적 문제로 인해 버튼(또는 스위치)의 상태가 LOWHIGH 사이를 여러 번 빠르게 전환하고 있습니다.
  • 해결책: 이 문제를 해결하기 위해 Raspberry Pi - 버튼 - 바운스 방지 튜토리얼에서 바운스 방지 기법을 사용하는 방법을 설명할 것입니다.

정확한 압력 감지가 필요한 애플리케이션의 경우, 이는 고려되어야 할 사항입니다.

※ NOTE THAT:

버튼을 다음과 혼동하지 마세요:

버튼 핀아웃

푸시 버튼에는 다양한 유형이 있으며, 크게 두 그룹으로 분류할 수 있습니다:

  • PCB 장착 푸시 버튼 (브레드보드에 장착 가능)
  • 패널 장착 푸시 버튼
버튼을 누르다

PCB 장착 버튼은 일반적으로 네 개의 핀이 있습니다.

버튼 핀 배치

그럼에도 불구하고, 이 핀들은 내부적으로 쌍으로 연결되어 있습니다. 결과적으로, 내부적으로 연결되지 않은 네 개의 핀 중 두 개만 사용하면 됩니다.

버튼에 연결하는 방법은 네 가지가 있으며, 그 중 두 가지는 대칭적입니다 (이미지를 참조하세요).

버튼 사용 방법

왜 버튼에는 네 개의 핀이 있지만, 우리는 두 개의 핀만을 사용하는 걸까요?

PCB(인쇄 회로 기판)에 안전하게 고정되고 어떤 압력이 가해져도 견딜 수 있도록 하기 위해서입니다.

패널 장착 버튼은 보통 두 개의 핀이 있습니다.

2핀 푸시 버튼 핀아웃
image source: diyables.io

작동 방식

  • 버튼이 눌리지 않았을 때, 핀 A와 핀 B는 연결되지 않습니다.
  • 그러나 버튼이 눌리면, 핀 A와 핀 B가 연결됩니다.
버튼 작동 방식

라즈베리 파이 - 버튼

하나의 버튼 핀은 VCC 또는 GND에 연결되어 있습니다. 동일한 버튼의 다른 핀은 Raspberry Pi 핀에 연결되어 있습니다. 입력으로 설정된 Raspberry Pi 핀의 상태를 확인하여 버튼이 눌렸는지 여부를 확인할 수 있습니다.

버튼 상태 및 누름 상태

버튼과 라즈베리 파이의 연결, 그리고 라즈베리 파이의 핀 구성은 버튼 상태와 누름 상태 간의 관계를 결정합니다.

Raspberry Pi에서 버튼을 사용하는 두 가지 방법이 있습니다:

  • 하나의 버튼 핀을 VCC에 연결하고 다른 핀을 풀다운 저항과 함께 Raspberry Pi 핀에 연결합니다.
    • 버튼을 누르면 Raspberry Pi 핀 상태가 HIGH가 됩니다. 그렇지 않으면 LOW가 됩니다.
    • 내부 또는 외부 저항을 사용할 수 있습니다. 내부 저항은 Raspberry Pi에 내장되어 있으며, 코드로 설정할 수 있습니다.
  • 하나의 버튼 핀을 GND에 연결하고 다른 핀을 풀업 저항과 함께 Raspberry Pi 핀에 연결합니다.
    • 버튼을 누르면 Raspberry Pi 핀 상태가 LOW가 됩니다. 그렇지 않으면 HIGH가 됩니다.
    • 내부 또는 외부 저항을 사용할 수 있습니다. 내부 저항은 Raspberry Pi에 내장되어 있으며, 코드로 설정할 수 있습니다.

    ※ NOTE THAT:

    풀다운 저항이나 풀업 저항을 사용하지 않으면 버튼이 눌리지 않았을 때 입력 핀이 "플로팅" 상태에 들어가게 되어, 상태가 HIGH 또는 LOW(불안정)일 수 있으며 잘못된 감지를 초래할 수 있습니다.

    • 최악의 방법: Raspberry Pi 핀을 입력으로 초기화하고(pinMode(BUTTON_PIN, INPUT) 사용) 외부 풀다운/풀업 저항을 사용하지 않습니다.
    • 최고의 방법: Raspberry Pi 핀을 내부 풀업 입력으로 초기화하고(pinMode(BUTTON_PIN, INPUT_PULLUP) 사용) 외부 풀다운/풀업 저항을 사용할 필요가 없습니다.

    초보자를 위해 이 튜토리얼은 가장 간단한 접근 방식을 사용합니다: 외부 저항 없이 내부 풀업 입력으로 Raspberry Pi 핀을 설정합니다. 풀업/풀다운 저항을 어떻게 연결해야 하는지 걱정할 필요가 없습니다. 필요한 것은 Raspberry Pi 코드만 사용하는 것입니다.

Wiring Diagram

  • Raspberry Pi와 PCB 장착 버튼 간의 배선도
라즈베리 파이 버튼 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

  • 라즈베리 파이와 패널 장착 버튼 간의 연결 다이어그램
라즈베리 파이 두 핀 푸시 버튼 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:

Raspberry Pi Screw Terminal Block Shield

버튼 프로그래밍 방법

  • GPIO.setup() 함수를 사용하여 Raspberry Pi 핀을 내부 풀업 입력으로 초기화합니다. 예를 들어, 핀 16:
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
  • Raspberry Pi 핀의 상태를 결정하기 위해 GPIO.input() 함수를 사용합니다.
button_state = GPIO.input(16) # 버튼 상태 읽기

※ NOTE THAT:

두 가지 일반적인 사용 사례가 있습니다:

  • 첫 번째: 입력 상태가 HIGH인 경우 한 가지 동작을 수행하고, 입력 상태가 LOW인 경우 반대 동작을 수행합니다.
  • 두 번째: 입력 상태가 LOW에서 HIGH로 (또는 HIGH에서 LOW로) 변경되면 어떤 동작을 수행합니다.

우리는 애플리케이션에 따라 이 중 하나를 선택합니다. 예를 들어, 버튼을 사용하여 LED를 제어할 때:

  • 버튼을 눌렀을 때 LED가 켜지고, 버튼이 눌리지 않았을 때 꺼지기를 원하면 첫 번째 사용 사례를 사용해야 합니다.
  • 버튼을 누를 때마다 LED가 켜짐과 꺼짐으로 전환되기를 원하면 두 번째 사용 사례를 사용해야 합니다.

Raspberry Pi 코드 - 버튼 상태 읽기

Detailed Instructions

  • Raspberry Pi에 Raspbian 또는 다른 Raspberry Pi 호환 운영 체제가 설치되어 있는지 확인하세요.
  • Raspberry Pi가 PC와 같은 로컬 네트워크에 연결되어 있는지 확인하세요.
  • 라이브러리를 설치해야 하는 경우 Raspberry Pi가 인터넷에 연결되어 있는지 확인하세요.
  • 처음으로 Raspberry Pi를 사용하는 경우, Raspberry Pi 설정 방법을 참조하세요.
  • Linux와 macOS에서는 내장된 SSH 클라이언트를 사용하거나 Windows에서는 PuTTY를 사용하여 SSH를 통해 PC를 Raspberry Pi에 연결하세요. PC를 Raspberry Pi에 SSH로 연결하는 방법은 여기를 참조하세요.
  • RPi.GPIO 라이브러리가 설치되어 있는지 확인하세요. 설치되어 있지 않으면, 다음 명령어를 사용하여 설치하세요:
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • button.py 파일을 생성하고 다음 코드를 추가하세요.
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-button import RPi.GPIO as GPIO import time # Define the GPIO pin connected to the button BUTTON_PIN = 16 # Set the GPIO mode to BCM GPIO.setmode(GPIO.BCM) # Initialize the pushbutton pin as an input with a pull-up resistor # The pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) try: while True: # Read the state of the switch/button button_state = GPIO.input(BUTTON_PIN) # Print out the button's state print(button_state) # Small delay to avoid unnecessary printing time.sleep(0.1) except KeyboardInterrupt: print("\nExiting...") # Clean up GPIO settings GPIO.cleanup()
  • 파일을 저장하고 터미널에서 다음 명령을 실행하여 Python 스크립트를 실행하세요.
python3 button.py
  • 버튼을 여러 번 눌렀다가 놓으세요.
  • 시리얼 모니터에서 출력을 확인하세요.
PuTTY - Raspberry Pi
1 1 1 0 0 0 0 0 0 1 1 1

1은 높음, 0은 낮음.

이 스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 루프에서 계속 실행됩니다.

코드 설명

소스 코드의 주석에 포함된 줄별 설명을 확인하세요!

Raspberry Pi 코드 - 버튼 누름 이벤트 감지

Detailed Instructions

  • 다음 코드를 추가하여 button_pressed.py라는 Python 스크립트 파일을 생성하십시오.
# 이 Raspberry Pi 코드는 newbiely.kr 에서 개발되었습니다 # 이 Raspberry Pi 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. # 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: # https://newbiely.kr/tutorials/raspberry-pi/raspberry-pi-button import RPi.GPIO as GPIO import time # Define the GPIO pin connected to the button BUTTON_PIN = 16 # Set the GPIO mode to BCM GPIO.setmode(GPIO.BCM) # Initialize the pushbutton pin as an input with a pull-up resistor # The pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Variable to keep track of the previous button state prev_button_state = GPIO.input(BUTTON_PIN) try: while True: # Read the state of the switch/button button_state = GPIO.input(BUTTON_PIN) # Check if the button state has changed (press or release event) if button_state != prev_button_state: if button_state == GPIO.LOW: # Button is pressed print("The button is pressed!") else: # Button is released print("The button is released!") # Update the previous button state prev_button_state = button_state # Small delay to avoid unnecessary reading time.sleep(0.1) except KeyboardInterrupt: print("\nExiting...") # Clean up GPIO settings GPIO.cleanup()
  • 파일을 저장하고 터미널에서 다음 명령을 실행하여 Python 스크립트를 실행하세요:
python3 button_pressed.py
  • 버튼을 누른 상태로 잠시 유지하세요.
  • 시리얼 모니터에서 출력을 확인하세요.
PuTTY - Raspberry Pi
The button is pressed The button is released

스크립트는 터미널에서 Ctrl + C를 누를 때까지 무한 루프에서 계속 실행됩니다.

코드 설명

소스 코드의 주석에 포함된 줄별 설명을 확인하세요!

※ NOTE THAT:

버튼을 한 번만 눌렀다가 놓아도, 터미널의 출력에 여러 번 눌림 및 놓임 이벤트가 표시될 수 있습니다. 이것은 버튼의 예상되는 동작입니다. 이러한 현상을 “채터링”이라고 합니다. 이에 대해 더 알고 싶다면, Raspberry Pi - Button Debounce tutorial을 참조하십시오.

Video Tutorial

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

자신에게 도전하세요

  • 버튼을 누르면 LED가 켜져야 합니다.
  • 버튼을 누르지 않으면 LED가 꺼져야 합니다.
  • 버튼을 누를 때마다 LED가 켜짐과 꺼짐 사이에서 전환되어야 합니다.

추가 지식

입력 핀에 풀다운/풀업 저항을 사용해야 할 경우와 사용하지 말아야 할 경우는 언제인가요?

  • 센서가 닫힘 또는 열림 상태 중 하나를 가지고 있다면, 풀업 또는 풀다운 저항이 필요하며, 이를 통해 이러한 상태를 LOW HIGH로 만듭니다. 이러한 센서의 예로는 푸시버튼, 스위치, 자기 접촉 스위치(문 센서)가 있습니다.
  • 반면, 센서에 LOW HIGH라는 두 가지 정의된 전압 레벨이 있다면, 풀업 또는 풀다운 저항이 필요하지 않습니다. 이러한 센서의 예로는 동작 센서와 터치 센서가 있습니다.