Tự học Arduino – 2024 – Phần 2 – Ngõ vào số cho Arduino (Digital Input)

Ngõ vào số cho Arduino (Digital Input for Arduino)

Một trong những chức năng thú vị(nếu không muốn nói là thú vị nhất) của Arduino nói riêng và của tất cả các thiết bị tự động hóa nói chung là khả năng tương tác với thế giới vật lý. Ví dụ, chúng ta có thể đo điện áp, thu thập dữ liệu từ nhiều loại cảm biến, bật các thiết bị hoặc điều khiển động cơ và cơ cấu chấp hành lệnh khác. Sự tương tác này chủ yếu được thực hiện thông qua việc sử dụng các ngõ vào và ngõ ra kỹ thuật số (digital) và tương tự (analog).

Trong các bài viết này – Tự học Arduino – 2024 – Phần 2, chúng ta sẽ học cách sử dụng các chức năng vào ra kỹ thuật số cho Arduino, vốn là thành phần cơ bản của hầu hết các dự án. Chúng ta sẽ bắt đầu chuỗi tự học với các ngõ vào kỹ thuật số vì chúng là đơn giản nhất, mặc dù chúng ta sẽ thấy rằng các chức năng khác cũng không phức tạp hơn nhiều.

Mặc dù chúng ta đang sử dụng Arduino làm nền tảng, điều quan trọng cần lưu ý là hầu hết các khái niệm này có thể áp dụng cho bất kỳ thiết bị tự động hóa và vi điều khiển nào khác. Cuối cùng, chúng ta sẽ xem code và cách thiết lập chúng trong Arduino, nhưng trước tiên chúng ta sẽ xem xét ngắn gọn một số lý thuyết tổng quát.

Ngõ vào số (Digital Input) là gì?

Tín hiệu số là sự biến đổi điện áp giữa GND và +Vcc mà không đi qua các giá trị trung gian. Do đó, một tín hiệu số chỉ có hai trạng thái. Giá trị điện áp thấp được liên kết với mức logic THẤP hoặc ‘0’, trong khi giá trị cao hơn được liên kết với mức logic CAO hoặc ‘1’.

Tuy nhiên, trong thế giới vật lý, các giá trị điện áp thực tế là liên tục. Quá trình đọc tín hiệu số – digital là quá trình rời rạc hóa một tín hiệu tương tự – analog, cụ thể là giá trị điện áp, thành một giá trị số được biểu diễn bằng hai trạng thái, THẤP và CAO.

450px-LogicLevel_visualization Tự học Arduino - 2024 - Phần 2 - Ngõ vào số cho Arduino (Digital Input)
Giá trị điện áp được so sánh để phân biệt mức thấp và mức cao trong ngõ vào kỹ thuật số Arduino

Trên thực tế, một ngõ vào số thực hiện so sánh giá trị đo được với một giá trị điện áp ngưỡng. Nếu giá trị đo được cao hơn điện áp ngưỡng, nó sẽ trả về mức CAO, và nếu thấp hơn, sẽ trả về mức THẤP. Giá trị điện áp ngưỡng có thể thay đổi từ một thiết bị tự động hóa này sang thiết bị khác, và thậm chí có thể không ổn định theo thời gian.

Nói chung, có thể giả định hợp lý rằng điện áp ngưỡng gần với điểm giữa giữa GND và +Vcc. Tuy nhiên, chúng ta nên tránh cung cấp các điện áp gần với điện áp ngưỡng vì chúng có thể gây ra các phép đo không chính xác.

Kết nối ngõ vào số (digital input) trên Arduino

Trong Arduino, các ngõ vào và ngõ ra số có thể sử dụng trên cùng một chân, do đó chúng được gọi là I/O số (digital I/O). Điều này có nghĩa là cùng một chân có thể thực hiện cả hai chức năng đầu vào và đầu ra, mặc dù không thể thực hiện đồng thời. Cần phải cấu hình một chân I/O là đầu vào hoặc đầu ra trong code.

Arduino có số lượng I/O số khác nhau tùy thuộc vào từng mẫu, như chúng ta đã thấy trong bài viết “Sơ đồ chân Arduino Uno, Pro Mini, Mega 2560 và Nano”. Ví dụ, Arduino UNO có 16 I/O số và Arduino MEGA có 54.

Trong Arduino, các giá trị nguồn thông thường là 0V và 5V. Trong trường hợp này, điện áp ngưỡng sẽ rất gần với 2.5V. Do đó, nếu chúng ta có thể nói một cách đơn giản rằng Arduino sẽ trả về giá trị đọc là THẤP, và nếu đo được một giá trị từ 2.5V đến 5V, nó sẽ trả về CAO. Thực tế sẽ có sự khác biệt đôi chút.

5V-logic-levels_fixed Tự học Arduino - 2024 - Phần 2 - Ngõ vào số cho Arduino (Digital Input)

Không bao giờ cấp mức điện áp ngoài phạm vi từ 0 – 5V. Nếu không vi điều khiển của chúng ta sẽ hỏng hoặc không sử dụng được chân này nữa

Giả sử chúng ta muốn sử dụng Arduino để kết nối với một cảm biến, hoặc bất kỳ thiết bị nào khác, có đầu ra điện áp liên tục từ 0V đến 5V. Chúng ta có thể đọc giá trị điện áp từ cảm biến với một cấu hình như sau.

entrada-digital-arduino-1 Tự học Arduino - 2024 - Phần 2 - Ngõ vào số cho Arduino (Digital Input)
Kết nối ngõ vào số với arduino

Việc đọc ngõ vào số sẽ trả về giá trị “CAO” nếu giá trị điện áp đo được cao hơn điện áp ngưỡng, và “THẤP” nếu giá trị điện áp thấp hơn.

Code Arduino đọc ngõ vào số

Code để thực hiện việc đọc rất đơn giản. Chúng ta chỉ cần cấu hình một I/O số là đầu vào với pinMode() và thực hiện việc đọc với digitalRead().

int pin = 2;
int value = 0;

void setup() {
  Serial.begin(9600);   //start serial port
  pinMode(pin, INPUT);  //define pin as input
}

void loop(){
  value = digitalRead(pin);  //digital pin reading

  //send message to serial port based on the value read
  if (value == HIGH) {
      Serial.println("On");
  }
  else {
      Serial.println("Off");
  }
  delay(1000);
}

Đoạn code này thực hiện việc đọc giá trị từ một chân kỹ thuật số (digital pin) của Arduino và in ra trạng thái tương ứng (“On” hoặc “Off”) qua cổng nối tiếp (serial port). Dưới đây là giải thích chi tiết cho từng phần của mã:

Biến toàn cục:

int pin = 2;      // Khai báo biến pin, chỉ định chân số 2
int value = 0;    // Khai báo biến value để lưu giá trị đọc từ chân số
  • pin: Đặt chân số 2 là chân sẽ được sử dụng để đọc tín hiệu số.
  • value: Biến này sẽ lưu giá trị đọc từ chân số (HIGH hoặc LOW).

Hàm setup():

void setup() {
  Serial.begin(9600);   // Bắt đầu giao tiếp serial với tốc độ 9600 baud
  pinMode(pin, INPUT);  // Định nghĩa chân số 2 là đầu vào
}
  • Serial.begin(9600): Bắt đầu giao tiếp nối tiếp với tốc độ truyền dữ liệu là 9600 baud, cho phép Arduino giao tiếp với máy tính qua cổng USB.
  • pinMode(pin, INPUT): Định nghĩa chân số 2 là đầu vào, chuẩn bị để đọc tín hiệu từ thiết bị kết nối với chân này.

Hàm loop():

void loop(){
  value = digitalRead(pin);  // Đọc giá trị từ chân số 2
  • digitalRead(pin): Hàm này đọc giá trị từ chân số 2. Giá trị này có thể là HIGH (nếu điện áp đo được cao hơn ngưỡng) hoặc LOW (nếu điện áp thấp hơn ngưỡng).
  // Gửi thông điệp đến cổng nối tiếp dựa trên giá trị đọc được
  if (value == HIGH) {
      Serial.println("On");
  }
  else {
      Serial.println("Off");
  }
  • if (value == HIGH): Nếu giá trị đọc được là HIGH, nghĩa là có điện áp cao (trên ngưỡng) tại chân số 2, Arduino sẽ gửi dòng chữ “On” đến máy tính thông qua cổng serial.
  • else: Nếu giá trị đọc được là LOW, nghĩa là điện áp thấp (dưới ngưỡng), Arduino sẽ gửi dòng chữ “Off” đến máy tính.
  delay(1000);  // Dừng chương trình trong 1 giây (1000ms)
}
  • delay(1000): Tạm dừng chương trình trong 1 giây trước khi thực hiện lần lặp tiếp theo. Điều này giúp dễ dàng quan sát thay đổi trạng thái.

Đọc ngõ vào số trong trường hợp điện áp lớn hơn 5V

Chúng ta đã đề cập rằng trong bất kỳ trường hợp nào, chúng ta cũng không nên đưa một điện áp vượt ra ngoài phạm vi từ 0 đến 5V vào một chân của Arduino vì có thể gây hư hỏng vĩnh viễn. Nếu chúng ta muốn đo một mức điện áp cao hơn giới hạn nguồn, cách thuận tiện nhất là sử dụng một mạch phân áp đơn giản.

Ví dụ, để đọc một tín hiệu số giữa 0 đến 12V, chúng ta có thể sử dụng một cấu hình như sau.

entrada-digital-divisor-tension-arduino-1 Tự học Arduino - 2024 - Phần 2 - Ngõ vào số cho Arduino (Digital Input)
Mạch chia áp ngõ vào số cho arduino

Với cấu hình này, chân số của Arduino sẽ nhận được một điện áp dao động từ 0 đến 3,84V, đủ để vượt qua điện áp ngưỡng và vẫn nằm dưới giới hạn nguồn.

Giá trị của các điện trở được sử dụng sẽ phụ thuộc vào mức điện áp mà chúng ta muốn đọc và trở kháng của cảm biến. Nói chung, các điện trở này cần phải đáp ứng các điều kiện sau:

  1. Cung cấp điện áp cao hơn điện áp ngưỡng: Đảm bảo rằng điện áp ở chân Arduino đủ cao để được nhận diện là mức logic “CAO”.
  2. Phải lớn hơn nhiều so với trở kháng tương đương của thiết bị đang đo: Điều này giúp tránh làm thay đổi điện áp của tín hiệu đo khi được kết nối với mạch phân áp.
  3. Phải không đáng kể so với trở kháng của ngõ vào Arduino: Điều này đảm bảo rằng điện áp ở ngõ vào Arduino không bị sụt áp đáng kể.
  4. Phải giới hạn dòng điện chạy qua chúng để giảm thiểu tổn thất: Điều này không chỉ giúp bảo vệ mạch mà còn giúp tiết kiệm năng lượng.
  5. Phải có khả năng tản nhiệt phù hợp với công suất mà chúng sẽ chịu đựng: Đảm bảo các điện trở không bị quá nhiệt và hư hỏng khi hoạt động trong thời gian dài.

Bạn có thể sử dụng website sau đây để tính toán điện trở cần thiết để chia điện áp ngõ vào số cho Arduino tại đây

Nguồn: https://www.luisllamas.es/