Trong bài viết trước, các bạn đã biết các chân GPIO của Raspberry Pi có một chức năng quan trọng đó là chúng cho phép Raspberry Pi giao tiếp với các linh kiện vật lý bên ngoài như đèn LED, động cơ, nút nhấn, v.v..
Các chân GPIO có thể được cấu hình làm chân đầu ra Output hoặc chân đầu vào Input. Nếu nó được thiết lập làm chân Output, thì nó sẽ xuất tín hiệu điều khiển thiết bị được kết nối với chân này, chẳng hạn như điều khiển sáng tắt một đèn LED. Ngược lại, nếu chân GPIO được cấu hình làm chân Input, nó sẽ đọc dữ liệu từ thiết bị bên ngoài.
Để giúp các bạn hiểu rõ được chức năng này của các chân GPIO, trong bài viết này tôi sẽ minh họa cho các bạn thấy qua một ví dụ đơn giản. Tôi kết nối một nút nhấn với một chân GPIO và một đèn LED với một chân GPIO khác của Raspberry Pi. Sau đó, tôi viết một chương trình bằng ngôn ngữ Python để làm cho đèn LED sáng lên mỗi khi người dùng nhấn nút nhấn.
GPIO của Raspberry Pi là chân đầu vào
Như đã trình bày ở trên, rõ ràng nếu muốn Raspberry Pi đọc giá trị từ thiết bị bên ngoài thì chân GPIO tương ứng phải được khai báo là chân đầu vào Input. Nhưng khi một chân GPIO của Raspberry Pi được khai báo là chân Input, thì nó phải luôn duy trì ở mức CAO hoặc mức THẤP, nếu không thì chân iput lúc này sẽ ở trạng thái “thả nổi” không xác định được trạng thái 0 hay 1.
Vì vậy để xác định rõ ràng mức logic, chân input này cần một điện áp tham chiếu 5V khi không nhấn nút, khi nhấn nút thì điện áp là 0V, giải pháp là:
Tất nhiên, chúng ta không thể kết nối như hình trên vì khi không nhấn nút thì điện áp input là 5V và khi nhấn nút thì…ngắn mạch!!!. Vì thế, vì thế chúng ta phải đặt một điện trở vào giữa nguồn VCC, nút nhấn, GND.
Hình ảnh trên cho thấy một chân đầu vào được kéo lên mức cao và đưa xuống mức thấp cùng với sự trợ giúp của điện trở kéo lên (pull-up) và kéo xuống (pull-down). Trong trường hợp kéo lên, đầu vào sẽ luôn duy trì trạng thái mức CAO và khi nút nhấn được nhấn, đầu vào sẽ xuống mức logic THẤP. Ngược lại, khi một chân đầu vào được kéo xuống, nó sẽ luôn đọc mức THẤP và khi nhấn nút, nó sẽ đọc mức logic CAO.
Tóm lại, điện trở kéo lên (điện trở nối với nguồn) hay điện trở kéo xuống (điện trở nối mass) có tác dụng loại bỏ hiện tượng trôi nổi điện áp ở ngõ vào. Giá trị điện trở ở đây nhằm tránh hiện tượng ngắn mạch và đảm bảo an toàn cho vi điều khiển.
Giá trị điện trở này bằng bao nhiêu thì hợp lý?
Để xác định giá trị của điện trở chúng ta sử dụng định luật Ohm.
V = IxR hay R = V/I
Trong trường hợp của điện trở kéo lên, giá trị của điện trở được tính theo công thức sau đây:
Rpull-up = (Vsupply – VH(min))/Isink
Trong đó: Vsupply là điện áp nguồn cung cấp, VH (min) là điện áp tối thiểu được chấp nhận là mức logic CAO và Isink là dòng điện tối đa được hút vào bởi chân kỹ thuật số.
Công thức tính giá trị của điện trở trong trường hợp điện trở kéo xuống như sau:
Rpull-down = (VL(max) – 0)/Isource
Trong đó: VL(max) điện áp tối đa được chấp nhận là mức logic THẤP và Isource là dòng điện tối đa được cấp bởi chân kỹ thuật số.
Ví dụ thực tế
Giả sử chúng ta có một mạch logic trong đó nguồn cung cấp là 3,3V và điện áp nhỏ nhất chấp nhận mức logic CAO là 3V, và dòng điện Isink tối đa là 30uA, khi đó chúng ta có thể chọn điện trở kéo lên bằng cách sử dụng công thức như sau:
Rpull-up = (Vsupply – VH(min))/Isink = (3,3V – 3V)/30×10-6 = 10kΩ
Bây giờ, Nếu chúng ta xem xét cùng một ví dụ đã nêu ở trên, trong đó mạch chấp nhận 1V là điện áp tối đa chấp nhận mức logic thấp và có thể cấp dòng điện lên đến 200uA thì điện trở kéo xuống sẽ là,
Rpull-down = (VL(max) – 0)/Isource = (1V – 0)/200×10-6 = 5kΩ
Như vậy khi nhấn nút thì dòng 0.5mA này sẽ đi xuống mass và chân input sẽ được nối mass, đảm bảo an toàn cho vi điều khiển. Giá trị điện trở này trong các mạch số thường là 4,7kΩ hoặc 10kΩ.
Nút nhấn
Nút nhấn là thiết bị đầu vào đơn giản nhất có thể được kết nối với bất kỳ bộ vi điều khiển hoặc bộ xử lý nào như Arduino hoặc Raspberry Pi.
Một nút nhấn đơn giản nhất bao gồm bốn chân như hình bên dưới. Trong đó, các chân A và B, chân C và D được kết nối với nhau. Vì vậy, mặc dù nút nhấn có bốn chân nhưng về mặt kỹ thuật, chúng ta chỉ sử dụng hai chân mà thôi.
Giao tiếp nút nhấn với Raspberry Pi
Như đã đề cập ở phần trên, khi một chân GPIO được khai báo là Input, nó phải được kết nối với VCC hoặc GND cùng với hoặc là điện trở kéo lên hoặc là điện trở kéo xuống.
Tuy nhiên, các bo mạch hiện đại hiện nay như Arduino và Raspberry Pi thì các điện trở kéo lên/kéo xuống đã được kết nối sẵn bên trong. Do đó, bạn không cần phải kết nối thêm điện trở kéo lên hoặc kéo xuống với chân đầu vào mà chỉ cần định cấu hình bằng lập trình/phần mềm.
Bằng cách sử dụng tính năng này, chân được cấu hình sẽ kéo lên hoặc kéo xuống từ bên trong chip.
Khi thiết lập chân GPIO của Raspberry Pi là chân đầu vào, bạn phải thêm một câu lệnh bổ sung trong chương trình để kích hoạt điện trở kéo lên hoặc kéo xuống bên trong.
Trong bài hướng dẫn này, bằng cách giao tiếp nút nhấn với Raspberry Pi, chúng ta sẽ đọc trạng thái của chân đầu vào và từ đó, điều khiển cho đèn LED SÁNG hoặc TẮT.
Sơ đồ mạch
Hình ảnh sau đây cho thấy sơ đồ mạch giao tiếp nút nhấn với Raspberry Pi.
Như được hiển thị trong sơ đồ mạch, chúng ta sẽ kết nối một đèn LED với chân số 22 (GPIO25) và một nút nhấn với chân số 16 (GPIO23) của Raspberry Pi. Để hạn chế dòng điện chạy qua LED, chúng ta kết nối một điện trở có giá trị 220Ω nối tiếp với đèn LED.
Chương trình Python
Sau khi kết nối mạch xong, chúng ta có thể mở Raspberry Pi và viết đoạn chương trình bằng ngôn ngữ Python như sau:
Xem thêm: Cách viết và chạy chương trình Python trên Raspberry
import RPi.GPIO as GPIO # Đính kèm thư viện RPi.GPIO vào chương trình
import time
GPIO.setmode(GPIO.BCM) # Thiết lập kiểu đánh số chân BCM
GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_UP) #Nút nhấn kết nối với chân GPIO23
GPIO.setup(25, GPIO.OUT) #LED kết nối với chân GPIO25
try:
while True:
button_state = GPIO.input(23)
if button_state == False:
GPIO.output(25, True)
print(‘Nut nhan da duoc nhan …’)
time.sleep(0.2)
else:
GPIO.output(25, False)
except:
GPIO.cleanup()
Sau khi viết chương trình xong, bạn thực thi chương trình. Nếu bạn làm đúng như hướng dẫn thì mỗi khi nút nhấn được nhấn xuống, bạn sẽ thấy dòng chữ “Nut nhan da duoc nhan …” hiển thị trên màn hình và đèn LED sẽ sáng lên. Khi thả nút nhấn ra thì đèn LED sẽ tắt.
Lời kết
Bài viết này đã hướng dẫn cho bạn cách đọc trạng thái của nút nhấn bằng cách sử dụng Raspberry Pi và ngôn ngữ lập trình Python.