라즈베리파이 Python 8 - 버튼
이 튜토리얼에서는 Raspberry Pi에서 버튼을 사용하는 방법을 설명합니다. 자세히 알아보겠습니다:
- 버튼을 라즈베리파이에 연결하는 방법
- 버튼 상태를 읽도록 Raspberry Pi를 프로그래밍하는 방법
- 버튼에서 누르거나 떼는 이벤트를 감지하도록 Raspberry Pi를 프로그래밍하는 방법. Raspberry Pi에서 버튼을 사용할 때
- 플로팅 입력 문제를 방지하는 방법.
- 라즈베리파이에서 버튼 사용시 채터링 문제를 방지하는 방법입니다.
강의 순서
라즈베리파이 Python 4 - Delay 없는 LED Blink
버튼은 푸시 버튼, 촉각 버튼 또는 순간 스위치라고 합니다. 이는 기본 구성 요소이며 많은 Raspberry Pi 프로젝트에서 사용됩니다. 사용하기 쉽습니다. 하지만 기계적인 측면이나 물리적인 측면, 사용법 등으로 인해 초보자에게는 당황스러울 수도 있습니다. 이 튜토리얼은 초보자를 위해 이를 단순화합니다.
버튼 개요
버튼을 사용할 때 초보자는 종종 두 가지 일반적인 어려움에 직면합니다.
1. 플로팅 입력 문제:.
증상: 입력 핀에서 읽은 값이 버튼을 누른 상태와 일치하지 않습니다.
원인: 풀업 또는 풀다운 저항이 입력 핀에서 사용되지 않습니다.
해결책: 이 튜토리얼에서 다룰 풀업 또는 풀다운 저항을 사용하십시오.
2. 채터링 현상:
증상: Raspberry Pi 코드는 버튼을 한 번만 눌렀을 때에도 여러 버튼 누름을 감지합니다.
원인: 기계적, 물리적 문제로 인해 버튼(또는 스위치) 상태가 LOW와 HIGH 사이를 여러 번 빠르게 전환합니다.
해결 방법: 이 문제를 해결하기 위해 Raspberry Pi 버튼 디바운스 튜토리얼에서는 디바운스 기술의 사용을 보여줍니다.
정확한 프레스 감지가 필요한 애플리케이션의 경우 이는 고려해야 할 사항입니다.
* 참고 사항: 버튼을 다음과 혼동하지 마십시오.
- 리미트 스위치
- 온/오프 스위치
버튼 핀아웃
다양한 유형의 푸시 버튼이 있으며 크게 두 그룹으로 분류할 수 있습니다.
- PCB 장착 푸시 버튼(브레드보드 장착에 적합)
- 패널 장착 푸시 버튼
PCB에 장착하는 버튼은 보통 4개의 핀을 가지고 있습니다.
그럼에도 불구하고 이 핀들은 내부적으로 쌍으로 연결되어 있습니다. 결과적으로 4개의 핀 중 내부적으로 연결되지 않은 2개의 핀만 활용하면 됩니다. 버튼에 연결하는 방법은 4가지가 있는데, 그 중 2가지가 대칭형입니다(이미지 참조).
핀이 4개인 버튼의 핀 2개만 활용하는 이유는 무엇입니까? ⇒ PCB(인쇄 회로 기판)에 단단히 고정되어 있고 가해지는 모든 압력을 견딜 수 있는지 확인합니다. 패널 장착 버튼에는 일반적으로 두 개의 핀이 있습니다.
작동 원리
- 버튼을 누르지 않으면 A핀과 B핀이 연결되지 않습니다.
- 그러나 버튼을 누르면 핀 A와 핀 B가 연결됩니다.
라즈베리 파이 - 버튼
하나의 버튼 핀은 VCC 또는 GND에 연결됩니다. 동일한 버튼의 다른 핀은 Raspberry Pi 핀에 연결됩니다. 입력으로 설정된 라즈베리파이 핀의 상태를 확인하여 버튼이 눌렸는지 여부를 판단할 수 있습니다.
버튼 상태 및 누르는 상태
버튼과 라즈베리파이의 연결, 라즈베리파이의 핀 구성에 따라 버튼 상태와 누르는 상태의 관계가 결정됩니다.
Raspberry Pi에서 버튼을 사용하는 방법에는 두 가지가 있습니다.
1. 풀다운 저항을 사용하여 한 버튼의 핀을 VCC에 연결하고 다른 버튼의 핀을 Raspberry Pi의 핀에 연결합니다.
- 버튼을 누르면 라즈베리파이의 핀 상태가 HIGH가 됩니다. 그렇지 않으면 LOW가 됩니다.
- 내부 또는 외부 저항기를 사용할 수 있습니다. 내부 저항은 Raspberry Pi에 내장되어 있으며 코드를 통해 설정할 수 있습니다.
2. 풀업 저항을 사용하여 한 버튼의 핀을 GND에 연결하고 다른 버튼의 핀을 Raspberry Pi의 핀에 연결합니다.
- 버튼을 누르면 Raspberry Pi의 핀 상태가 LOW가 됩니다. 그렇지 않으면 HIGH가 됩니다.
- 내부 또는 외부 저항을 사용할 수 있습니다. 내부 저항은 Raspberry Pi에 내장되어 있으며 코드를 통해 설정할 수 있습니다.
* 참고 사항:
풀다운이나 풀업 저항을 모두 사용하지 않으면 버튼을 누르지 않으면 입력 핀이 "부동" 상태가 됩니다. 부동 상태 = 플로팅 상태란 정확히 Low 값이나 High 값을 갖지 않은 상태를 말합니다.
누르면 상태가 HIGH 또는 LOW(불안정)일 수 있으며 잘못된 감지로 이어질 수 있음을 의미합니다.
- 최악의 방법: Raspberry Pi 핀을 입력으로 초기화하고(pinMode(BUTTON PIN, INPUT) 사용) 외부 풀다운/풀업 저항을 사용하지 않는 것.
- 모범 사례: Raspberry Pi 핀을 내부 풀업 입력으로 초기화합니다(pinMode(BUTTON_PIN, INPUT PULLUP) 사용). 외부 풀다운/풀업 저항을 사용할 필요가 없습니다.
초보자의 편의를 위해 이 튜토리얼에서는 외부 저항기 없이 Raspberry Pi 핀을 내부 풀업 입력으로 설정하는 가장 간단한 접근 방식을 사용합니다. 풀업/풀다운 저항을 어떻게 연결해야 할지 고민할 필요가 없습니다. 필요한 것은 Raspberry Pi 코드를 사용하는 것뿐입니다.
연결도: 라즈베리파이와 PCB 마운트 버튼 사이의 배선도
라즈베리파이와 패널 마운트 버튼 연결도(케이스 혹은 전면 판 등에 체결하는 경우)
버튼 프로그래밍 방법
- GPIO.setup() 함수를 활용하여 Raspberry Pi 핀을 내부 풀업 입력으로 초기화합니다. 예를 들어 핀 16은 다음과 같습니다.
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
- GPIO.input() 함수를 활용하여 Raspberry Pi 핀의 상태를 확인합니다.
button_state = GPIO.input(16)
* 참고 사항:
두 가지 일반적인 사용 사례를 사용할 수 있습니다.
- 첫 번째: 입력 상태가 HIGH이면 하나의 동작을 수행합니다. 입력 상태가 LOW이면 그 반대입니다.
- 두 번째: 입력 상태가 LOW에서 HIGH로(또는 HIGH에서 LOW로) 변경되면 조치를 취하십시오.
용도에 따라 이들 중 하나를 선택합니다. 예를 들어, 버튼을 사용하여 LED를 제어하는 경우:
- 버튼을 눌렀을 때 LED가 켜지고 버튼을 누르지 않았을 때 LED가 꺼지기를 원한다면 첫 번째 사용 사례를 사용해야 합니다.
- 버튼을 누를 때마다 LED가 ON과 OFF 사이에서 전환되도록 하려면 두 번째 사용 사례를 사용해야 합니다.
RASPBERRY PI 코드 - 버튼 상태 읽기
자세한 지침
- Pi에 Raspbian 또는 기타 Raspberry Pi 호환 운영 체제가 설치되어 있는지 확인하십시오.
- Raspberry Pi가 PC와 동일한 로컬 네트워크에 연결되어 있는지 확인하세요.
- 일부 라이브러리를 설치해야 하는 경우 Raspberry Pi가 인터넷에 연결되어 있는지 확인하세요.
- 라즈베리파이를 처음 사용하신다면 라즈베리파이 설정방법을 참고하세요.
- Linux 및 macOS의 내장 SSH 클라이언트 또는 Windows의 PuTTY를 사용하여 SSH를 통해 PC를 Raspberry Pi에 연결합니다. SSH를 통해 PC를 Raspberry Pi에 연결하는 방법을 알아보세요.
RPi.GPIO 라이브러리가 설치되어 있는지 확인하십시오. 그렇지 않은 경우 다음 명령을 사용하여 설치하십시오.
설치 제거
sudo apt remove python3-rpi.gpio
새로운 라이브러리를 설치합니다.
sudo apt-get update
sudo apt install python3-rpi-lgpio
아래 코드를 button.py 스크립트 파일로 저장하세요.
"""
This Raspberry Pi code was developed by newbiely.com
This Raspberry Pi code is made available for public use without any restriction
For comprehensive instructions and wiring diagrams, please visit:
https://newbiely.com/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()
실행 명령은 $python3 button.py
아래는 실행 화면입니다. 1 : HIGH 0 : LOW
실행을 중지하려면 Ctrl-v 를 누르세요.
다음은 라즈베리파이 버튼을 누르는 이벤트를 감지하는 코드입니다. button_press.py 스크립트로 저장하세요.
"""
This Raspberry Pi code was developed by newbiely.com
This Raspberry Pi code is made available for public use without any restriction
For comprehensive instructions and wiring diagrams, please visit:
https://newbiely.com/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()
아래는 실행 화면 입니다.
소스코드의 주석에 담긴 단계별 설명을 확인해보세요!
* 참고 사항: 버튼을 한 번만 눌렀다 떼더라도 터미널의 출력에는 여러 개의 눌렀다 떼기 이벤트가 표시될 수 있습니다. 이는 버튼의 예상되는 동작입니다. 이런 현상을 '채터링'이라고 합니다. 이에 대해 자세히 알아보려면 Raspberry Pi - Button Debounce 튜토리얼을 참조하세요.
스스로에게 도전하세요
- 버튼을 누르면 LED가 켜져야 합니다.
- 버튼을 누르지 않으면 LED가 꺼져야 합니다.
- 버튼을 누를 때마다 LED가 ON과 OFF 사이에서 전환되어야 합니다.
추가 지식
풀다운/풀업 저항을 입력 핀에 사용해야 하는 경우와 사용하지 말아야 하는 경우는 무엇입니까?
센서가 닫힌 상태 또는 열린 상태인 경우 이러한 상태를 LOW 및 HIGH로 만들기 위해 풀업 또는 풀다운 저항이 필요합니다. 이러한 센서의 예로는 푸시 버튼, 스위치, 자기 접촉 스위치(도어 센서) 등이 있습니다.
반면, 센서에 이미 정해진 두 가지 전압 레벨(LOW 및 HIGH)이 있는 경우 풀업 또는 풀다운 저항이 필요하지 않습니다. 이러한 센서의 예로는 모션 센서와 터치 센서가 있습니다.
'라즈베리파이 5' 카테고리의 다른 글
라즈베리 파이 5 NVMe 프로토콜 M.2 솔리드 스테이트 드라이브용 어댑터 (0) | 2024.09.10 |
---|---|
라즈베리파이5 ssd1306 OLED Test (4) | 2024.09.04 |
시드 스튜디오, 초소형 라즈베리파이 RP2350 기반 XIAO RP2350 발표 (3) | 2024.08.31 |
라즈베리파이 Python 9 - 버튼 채터링 방지 (2) | 2024.08.27 |
라즈베리파이 python 7 - 교통 신호등 (0) | 2024.08.23 |
라즈베리파이 python 6 - RGB LED (0) | 2024.08.23 |
라즈베리파이 Python 5 - LED Fade 구현 (0) | 2024.08.22 |
라즈베리파이 Python 4 - Delay 없는 LED Blink (1) | 2024.08.21 |
더욱 좋은 정보를 제공하겠습니다.~ ^^