ARDUINO TUTORIAL #5

15/01/2025 Lập Trình Độ khó: Trung bình

GIỚI THIỆU

Trong lập trình vi điều khiển và đặc biệt là Arduino, việc hiểu về hệ nhị phân (binary number) là rất quan trọng. Hệ nhị phân là ngôn ngữ cơ bản của máy tính và vi điều khiển, nơi mọi thông tin đều được biểu diễn bằng hai trạng thái: 0 và 1.

Tại sao cần học Binary?

  • Hiểu cách vi điều khiển xử lý thông tin
  • Làm việc với các thanh ghi (registers) và cờ (flags)
  • Tối ưu hóa bộ nhớ và tốc độ xử lý
  • Làm việc với các phép toán bitwise
  • Điều khiển nhiều chân GPIO cùng lúc

1. HỆ NHỊ PHÂN CƠ BẢN

Định nghĩa:

Hệ nhị phân (binary) là hệ đếm cơ số 2, chỉ sử dụng hai ký tự là 0 và 1 để biểu diễn tất cả các giá trị số. Mỗi chữ số nhị phân được gọi là một "bit" (binary digit).

Hệ nhị phân cơ bản
Hình ảnh minh họa về hệ nhị phân
Binary với LED
LED biểu diễn trạng thái nhị phân

Chuyển đổi giữa hệ nhị phân và hệ thập phân

Hệ nhị phân (Binary) Hệ thập phân (Decimal) Cách tính
0000 0 0×2³ + 0×2² + 0×2¹ + 0×2⁰
0001 1 0×2³ + 0×2² + 0×2¹ + 1×2⁰
0010 2 0×2³ + 0×2² + 1×2¹ + 0×2⁰
0011 3 0×2³ + 0×2² + 1×2¹ + 1×2⁰
0100 4 0×2³ + 1×2² + 0×2¹ + 0×2⁰
0101 5 0×2³ + 1×2² + 0×2¹ + 1×2⁰
0110 6 0×2³ + 1×2² + 1×2¹ + 0×2⁰
0111 7 0×2³ + 1×2² + 1×2¹ + 1×2⁰
1000 8 1×2³ + 0×2² + 0×2¹ + 0×2⁰

Ví dụ chuyển đổi:

Binary: 1011Decimal: 11

Cách tính: 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8 + 0 + 2 + 1 = 11

2. BINARY TRONG ARDUINO

Biểu diễn số nhị phân trong code:

Trong Arduino IDE, chúng ta có thể biểu diễn số nhị phân bằng cách thêm tiền tố 0b (hoặc B) trước dãy bit.

// Biểu diễn số nhị phân trong Arduino
byte binaryNumber = 0b10101010;  // Số nhị phân 10101010 = 170 trong hệ thập phân
byte anotherBinary = B00001111; // Số nhị phân 00001111 = 15 trong hệ thập phân

// In ra giá trị để kiểm tra
Serial.begin(9600);
Serial.print("Binary 10101010 in decimal: ");
Serial.println(binaryNumber, DEC);  // In ra: 170

Serial.print("Binary 00001111 in decimal: ");
Serial.println(anotherBinary, DEC); // In ra: 15

3. ĐIỀU KHIỂN NHIỀU LED VỚI BINARY

Một ứng dụng thực tế của binary trong Arduino là điều khiển nhiều LED cùng lúc bằng một byte (8 bit). Mỗi bit đại diện cho trạng thái của một LED.

// Định nghĩa các chân LED kết nối với Arduino
const int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9};
const int numLeds = 8;

// Hàm thiết lập ban đầu
void setup() {
  // Khởi tạo tất cả chân LED là OUTPUT
  for (int i = 0; i < numLeds; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
  
  Serial.begin(9600);
}

// Hàm điều khiển LED bằng số nhị phân
void setLedsFromBinary(byte pattern) {
  // Duyệt qua từng bit trong pattern
  for (int i = 0; i < numLeds; i++) {
    // Kiểm tra bit thứ i có bằng 1 không
    if (pattern & (1 << i)) {
      digitalWrite(ledPins[i], HIGH);  // Bật LED nếu bit = 1
    } else {
      digitalWrite(ledPins[i], LOW);   // Tắt LED nếu bit = 0
    }
  }
}

// Hàm chính lặp lại
void loop() {
  // Ví dụ: Bật LED ở vị trí chẵn (bit 0, 2, 4, 6)
  setLedsFromBinary(0b01010101);  // 85 trong hệ thập phân
  delay(1000);
  
  // Ví dụ: Bật LED ở vị trí lẻ (bit 1, 3, 5, 7)
  setLedsFromBinary(0b10101010);  // 170 trong hệ thập phân
  delay(1000);
  
  // Tất cả LED sáng
  setLedsFromBinary(0b11111111);  // 255 trong hệ thập phân
  delay(1000);
  
  // Tất cả LED tắt
  setLedsFromBinary(0b00000000);  // 0 trong hệ thập phân
  delay(1000);
}
Mạch LED điều khiển bằng binary
Mạch Arduino điều khiển 8 LED bằng số nhị phân

4. CÁC PHÉP TOÁN BITWISE TRONG ARDUINO

Arduino hỗ trợ các phép toán bitwise để thao tác trực tiếp với các bit của số nhị phân:

Toán tử Tên Ví dụ Kết quả Mô tả
& AND 0b1100 & 0b1010 0b1000 Bit kết quả = 1 nếu cả hai bit cùng là 1
| OR 0b1100 | 0b1010 0b1110 Bit kết quả = 1 nếu ít nhất một bit là 1
^ XOR 0b1100 ^ 0b1010 0b0110 Bit kết quả = 1 nếu hai bit khác nhau
~ NOT ~0b1100 0b0011 Đảo ngược tất cả các bit (0 thành 1, 1 thành 0)
<< Left Shift 0b0001 << 2 0b0100 Dịch trái các bit
>> Right Shift 0b0100 >> 2 0b0001 Dịch phải các bit
// Ví dụ về các phép toán bitwise
byte a = 0b11001100;  // 204
byte b = 0b10101010;  // 170

// Phép AND
byte resultAnd = a & b;  // 0b10001000 = 136

// Phép OR
byte resultOr = a | b;   // 0b11101110 = 238

// Phép XOR
byte resultXor = a ^ b;  // 0b01100110 = 102

// Phép dịch trái
byte resultLeftShift = a << 2;  // 0b00110000 = 48 (tràn bit)

// Phép dịch phải
byte resultRightShift = a >> 2; // 0b00110011 = 51

BÀI TẬP THỰC HÀNH

Yêu cầu:

Sử dụng kiến thức về hệ nhị phân và phép toán bitwise, hãy viết chương trình Arduino thực hiện các tác vụ sau:

  1. Kết nối 4 LED với các chân 5, 6, 7, 8 của Arduino
  2. Viết hàm hiển thị số đếm từ 0 đến 15 (0-1111 trong nhị phân) trên 4 LED này
  3. Sử dụng phép toán bitwise để xác định trạng thái của từng LED
  4. Mỗi số hiển thị trong 1 giây trước khi chuyển sang số tiếp theo

Gợi ý:

  • Sử dụng vòng lặp for từ 0 đến 15
  • Với mỗi số i, sử dụng phép toán AND với mask để kiểm tra từng bit
  • Ví dụ: để kiểm tra bit thứ 0, dùng (i & 0b0001)
  • Để kiểm tra bit thứ 1, dùng (i & 0b0010)
  • Tương tự cho các bit tiếp theo
Bài tập thực hành
Minh họa bài tập đếm nhị phân với LED
Quay lại Trang Lập Trình