Raspberry Pi Button (Nút Nhấn)

Hướng dẫn này chỉ cho bạn cách sử dụng Raspberry Pi với nút nhấn. Cụ thể, chúng ta sẽ học:

Nút nhấn còn được gọi là pushbutton, tactile button hoặc momentary switch. Đây là một linh kiện cơ bản và được sử dụng trong nhiều dự án Raspberry Pi. Nó rất dễ sử dụng. Tuy nhiên, nó có thể gây khó hiểu cho người mới bắt đầu do các khía cạnh cơ học, vật lý và cách sử dụng. Hướng dẫn này đã đơn giản hóa nó cho người mới bắt đầu.

Phần cứng cần chuẩn bị

1×Raspberry Pi 5
1×breadboard-mount Button with Cap
1×breadboard-mount Button Kit
1×Panel-mount Push Button
1×mô-đun nút nhấn
1×breadboard
1×dây jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Raspberry Pi
1×(Khuyến nghị) Raspberry Pi Prototyping Base Plate & Breadboard Kit
1×(Khuyến nghị) HDMI Touch Screen Monitor for Raspberry Pi

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Nút Nhấn (Button)

Khi sử dụng nút nhấn, người mới bắt đầu thường gặp phải hai khó khăn phổ biến:

1. Vấn đề floating input (đầu vào thả nổi):.

  • Triệu chứng: Giá trị đọc được từ chân đầu vào không tương ứng với trạng thái nhấn nút.
  • Nguyên nhân: Không sử dụng điện trở pull-up hoặc pull-down trên chân đầu vào.
  • Giải pháp: Sử dụng điện trở pull-up hoặc pull-down, điều này sẽ được đề cập trong hướng dẫn này.

2. Hiện tượng chattering (rung nhiễu):.

  • Triệu chứng: Code Raspberry Pi phát hiện nhiều lần nhấn nút mặc dù nút chỉ được nhấn một lần.
  • Nguyên nhân: Vấn đề cơ học và vật lý khiến trạng thái của nút nhấn (hoặc công tắc) nhanh chóng chuyển đổi giữa LOW HIGH nhiều lần.
  • Giải pháp: Để giải quyết vấn đề này, hướng dẫn Raspberry Pi - Button - Debounce (Chống Nhiễu Nút Nhấn) sẽ trình bày việc sử dụng kỹ thuật debounce.

Đây là điều cần xem xét đối với các ứng dụng yêu cầu phát hiện nhấn chính xác.

※ Lưu ý:

Đừng nhầm lẫn nút nhấn với những linh kiện sau:

Pinout Của Nút Nhấn

Có nhiều loại nút nhấn khác nhau, có thể được phân loại rộng rãi thành hai nhóm:

  • Nút nhấn gắn PCB (phù hợp để gắn trên breadboard)
  • Nút nhấn gắn bảng điều khiển
push nút nhấn

Nút nhấn gắn PCB thường có bốn chân.

nút nhấn sơ đồ chân

Tuy nhiên, những chân này được nối với nhau bên trong theo cặp. Do đó, chúng ta chỉ cần sử dụng hai trong số bốn chân, là những chân không được nối nội bộ.

Có bốn phương pháp kết nối với nút nhấn, hai trong số đó là đối xứng (tham khảo hình ảnh).

how to use nút nhấn

? Tại sao chúng ta chỉ sử dụng hai chân của nút nhấn, khi nó có bốn chân?

⇒ Để đảm bảo rằng nó vẫn giữ chắc chắn trên PCB (bảng mạch in) và có thể chịu được áp lực tác dụng.

Nút nhấn gắn bảng điều khiển thường có hai chân.

two-pin push nút nhấn sơ đồ chân
image source: diyables.io

Module nút nhấn bao gồm điện trở pull-down tích hợp, đảm bảo rằng đầu ra duy trì LOW khi nút không được nhấn. Nó có ba chân:

  • GND: Kết nối chân này với ground (đất).
  • VCC: Kết nối chân này với nguồn cung cấp 3.3V.
  • OUT: Kết nối chân này với đầu vào digital trên Raspberry Pi của bạn.

Với cấu hình này, module xuất ra LOW khi nút không được nhấn và xuất ra HIGH khi nút được nhấn.

Cách Hoạt Động

  • Khi nút không được nhấn, chân A và chân B không liên kết.
  • Tuy nhiên, khi nút được nhấn, chân A và chân B trở nên kết nối.
how nút nhấn works

Raspberry Pi - Button

Một chân của nút được kết nối với VCC hoặc GND. Chân còn lại của cùng một nút được liên kết với một chân Raspberry Pi. Bằng cách kiểm tra trạng thái của chân Raspberry Pi được đặt làm đầu vào, chúng ta có thể xác định xem nút đã được nhấn hay chưa.

Trạng Thái Nút và Trạng Thái Nhấn

Kết nối giữa nút nhấn và Raspberry Pi, cũng như cấu hình chân của Raspberry Pi, sẽ xác định mối quan hệ giữa trạng thái nút và trạng thái nhấn.

Có hai cách để sử dụng nút nhấn với Raspberry Pi:

  1. Kết nối một chân của nút với VCC và chân kia với chân Raspberry Pi có điện trở pull-down
    • Khi nút được nhấn, trạng thái chân Raspberry Pi sẽ là HIGH. Ngược lại, nó sẽ là LOW
    • Có thể sử dụng điện trở nội bộ hoặc ngoại bộ. Điện trở nội bộ được tích hợp trong Raspberry Pi, và có thể được thiết lập qua code.
  • Kết nối một chân của nút với GND và chân kia với chân Raspberry Pi có điện trở pull-up
    • Khi nút được nhấn, trạng thái chân Raspberry Pi sẽ là LOW. Ngược lại, nó sẽ là HIGH
    • Có thể sử dụng điện trở nội bộ hoặc ngoại bộ. Điện trở nội bộ được tích hợp trong Raspberry Pi, và có thể được thiết lập qua code.

    ※ Lưu ý:

    Khi không sử dụng điện trở pull-down hay pull-up, chân đầu vào sẽ rơi vào trạng thái "floating" (thả nổi) khi nút không được nhấn, có nghĩa là trạng thái có thể là HIGH hoặc LOW (không ổn định) và sẽ dẫn đến phát hiện không chính xác.

    • Cách làm tệ nhất: khởi tạo chân Raspberry Pi làm đầu vào (bằng cách sử dụng GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_OFF)) và KHÔNG sử dụng bất kỳ điện trở pull-down/pull-up ngoại bộ nào.
    • Cách làm tốt nhất: khởi tạo chân Raspberry Pi làm đầu vào pull-up nội bộ (bằng cách sử dụng GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)). Nó KHÔNG cần sử dụng bất kỳ điện trở pull-down/pull-up ngoại bộ nào.

    Để thuận tiện cho người mới bắt đầu, hướng dẫn này sử dụng cách tiếp cận đơn giản nhất: thiết lập chân Raspberry Pi như một đầu vào pull-up nội bộ mà không cần điện trở ngoại bộ. Không cần phải lo lắng về cách kết nối điện trở pull-up/pull-down. Tất cả những gì cần thiết là sử dụng code Raspberry Pi.

    Sơ Đồ Đấu Nối

    • Sơ đồ đấu nối giữa Raspberry Pi và nút nhấn gắn PCB
    Raspberry Pi nút nhấn sơ đồ đấu dây

    This image is created using Fritzing. Click to enlarge image

    • Sơ đồ đấu nối giữa Raspberry Pi và nút nhấn gắn bảng điều khiển
    Raspberry Pi two-pin push nút nhấn sơ đồ đấu dây

    This image is created using Fritzing. Click to enlarge image

    Cách Lập Trình Cho Nút Nhấn

    • Sử dụng hàm GPIO.setup() để khởi tạo chân Raspberry Pi như một đầu vào pull-up nội bộ. Ví dụ, chân 16:
    GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    • Sử dụng hàm GPIO.input() để xác định trạng thái của chân Raspberry Pi.
    button_state = GPIO.input(16)

    ※ Lưu ý:

    Có hai trường hợp sử dụng phổ biến:

    • Thứ nhất: Nếu trạng thái đầu vào là HIGH, thực hiện một hành động. Nếu trạng thái đầu vào là LOW, làm ngược lại.
    • Thứ hai: Nếu trạng thái đầu vào thay đổi từ LOW sang HIGH (hoặc HIGH sang LOW), thực hiện một số hành động.

    Chúng ta chọn một trong những cách này tùy thuộc vào ứng dụng. Ví dụ, khi sử dụng nút nhấn để điều khiển LED:

    • Nếu chúng ta muốn LED bật khi nút được nhấn và tắt khi nút KHÔNG được nhấn, chúng ta NÊN sử dụng trường hợp sử dụng thứ nhất.
    • Nếu chúng ta muốn LED chuyển đổi giữa BẬT và TẮT mỗi khi chúng ta nhấn nút, chúng ta NÊN sử dụng trường hợp sử dụng thứ hai.

    Code Raspberry Pi - Đọc trạng thái của nút nhấn

    Các Bước Nhanh

    • Đảm bảo bạn đã cài đặt Raspbian hoặc bất kỳ hệ điều hành tương thích Raspberry Pi nào khác trên Pi của bạn.
    • Đảm bảo Raspberry Pi của bạn được kết nối với cùng mạng cục bộ với PC của bạn.
    • Đảm bảo Raspberry Pi của bạn được kết nối internet nếu bạn cần cài đặt một số thư viện.
    • Nếu đây là lần đầu tiên bạn sử dụng Raspberry Pi, hãy xem Raspberry Pi - Cài Đặt Phần Mềm
    • Kết nối PC của bạn với Raspberry Pi qua SSH sử dụng SSH client tích hợp trên Linux và macOS hoặc PuTTY trên Windows. Xem cách kết nối PC với Raspberry Pi qua SSH.
    • Đảm bảo bạn đã cài đặt thư viện RPi.GPIO. Nếu chưa, hãy cài đặt bằng lệnh sau:
    sudo apt-get update sudo apt-get install python3-rpi.gpio
    • Tạo file Python script button.py và thêm code sau:
    # Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi này được cung cấp để sử dụng công khai, không có ràng buộc. # Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: # https://newbiely.vn/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()
    • Lưu file và chạy Python script bằng cách thực thi lệnh sau trong terminal:
    python3 button.py
    • Nhấn và thả nút nhấn nhiều lần.
    • Kiểm tra kết quả đầu ra trên Serial Monitor.
    PuTTY - Raspberry Pi
    1 1 1 0 0 0 0 0 0 1 1 1

    1 là HIGH, 0 là LOW.

    Script chạy trong vòng lặp vô hạn liên tục cho đến khi bạn nhấn Ctrl + C trong terminal.

    Giải Thích Code

    Hãy xem giải thích từng dòng có trong phần comment của source code!

    Code Raspberry Pi - Phát hiện sự kiện nhấn nút

    Các Bước Nhanh

    • Tạo file Python script button_pressed.py và thêm code sau:
    # Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi này được cung cấp để sử dụng công khai, không có ràng buộc. # Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: # https://newbiely.vn/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()
    • Lưu file và chạy Python script bằng cách thực thi lệnh sau trong terminal:
    python3 button_pressed.py
    • Nhấn nút và giữ trong một khoảnh khắc.
    • Kiểm tra kết quả đầu ra trên Serial Monitor.
    PuTTY - Raspberry Pi
    The button is pressed The button is released

    Script chạy trong vòng lặp vô hạn liên tục cho đến khi bạn nhấn Ctrl + C trong terminal.

    Giải Thích Code

    Hãy xem giải thích từng dòng có trong phần comment của source code!

    ※ Lưu ý:

    • Ngay cả khi bạn chỉ nhấn và thả nút một lần, kết quả đầu ra trong Terminal có thể hiển thị nhiều sự kiện nhấn và thả. Đây là hành vi dự kiến của nút nhấn. Hiện tượng này được gọi là "chattering". Để tìm hiểu thêm về nó, vui lòng tham khảo hướng dẫn Raspberry Pi - Button Debounce.
    • Nếu bạn đang sử dụng module nút nhấn, hãy cấu hình chân ở chế độ input bằng cách sử dụng GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_OFF). Với thiết lập này, module sẽ xuất ra LOW khi nút không được nhấn và HIGH khi nút được nhấn.

    Video Tutorial

    Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

    Thử Thách Bản Thân

    • Khi nút được nhấn, LED sẽ được bật.
    • Khi nút không được nhấn, LED sẽ được tắt.
    • Mỗi lần nút được nhấn, LED sẽ chuyển đổi giữa BẬT và TẮT.

    Kiến Thức Bổ Sung

    Những trường hợp nào nên và không nên sử dụng điện trở pull-down/pull-up cho chân đầu vào?

    • Nếu cảm biến có trạng thái đóng hoặc mở, cần có điện trở pull-up hoặc pull-down để làm cho các trạng thái này trở thành LOW HIGH. Ví dụ về các cảm biến như vậy là nút nhấn, công tắc, và công tắc tiếp xúc từ tính (cảm biến cửa).
    • Mặt khác, nếu cảm biến có hai mức điện áp xác định (LOW HIGH), thì KHÔNG cần điện trở pull-up hoặc pull-down. Ví dụ về các cảm biến như vậy là cảm biến chuyển động và cảm biến cảm ứng.