Arduino Cơ Bản

Học từ con số 0 - Bắt đầu hành trình lập trình nhúng

Mục Lục Bài Học

1. Giới Thiệu Arduino

Arduino là một nền tảng phần cứng mã nguồn mở được thiết kế để tạo ra các dự án điện tử tương tác. Arduino bao gồm:

Arduino Uno R3 - Board phổ biến nhất

Thông Số Giá Trị
Vi điều khiển ATmega328P
Điện áp hoạt động 5V
Chân Digital I/O 14 chân (6 chân PWM)
Chân Analog Input 6 chân (A0-A5)
Flash Memory 32KB
SRAM 2KB
EEPROM 1KB
Tốc độ xung nhịp 16MHz

2. Cài Đặt Arduino IDE

Bước 1: Download Arduino IDE

Truy cập arduino.cc/software và tải bản phù hợp với hệ điều hành của bạn (Windows, macOS, Linux).

Bước 2: Cài đặt Driver

Đối với Arduino Uno/Nano (chip CH340), có thể cần cài driver riêng. Windows thường tự động cài đặt driver.

Bước 3: Kết nối Arduino

  1. Kết nối Arduino với máy tính qua cáp USB
  2. Mở Arduino IDE
  3. Chọn Tools → Board → Arduino Uno
  4. Chọn Tools → Port → COM3 (hoặc cổng tương ứng)
💡 Mẹo: Để xác định cổng COM, bạn có thể rút và cắm lại Arduino, xem cổng nào xuất hiện/biến mất trong menu Port.

3. Cấu Trúc Chương Trình Arduino

Mọi chương trình Arduino đều có 2 hàm chính:

Cấu trúc cơ bản
// Hàm setup() chạy 1 lần khi Arduino khởi động
void setup() {
  // Khởi tạo chân, cảm biến, Serial...
}

// Hàm loop() chạy lặp đi lặp lại mãi mãi
void loop() {
  // Code chính của chương trình
}

Các kiểu dữ liệu thông dụng

5. Digital Input/Output - Nút Nhấn Điều Khiển LED

Học cách đọc tín hiệu từ nút nhấn và điều khiển LED.

Sơ đồ kết nối:

Đọc nút nhấn và điều khiển LED
const int BUTTON_PIN = 2;
const int LED_PIN = 13;

void setup() {
  // Cấu hình chân nút nhấn là INPUT
  pinMode(BUTTON_PIN, INPUT);
  
  // Cấu hình chân LED là OUTPUT
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // Đọc trạng thái nút nhấn
  int buttonState = digitalRead(BUTTON_PIN);
  
  // Nếu nút được nhấn (HIGH), bật LED
  if (buttonState == HIGH) {
    digitalWrite(LED_PIN, HIGH);
  } 
  else {
    digitalWrite(LED_PIN, LOW);
  }
}

Nâng cao: Toggle LED (Bật/Tắt khi nhấn nút)

Toggle LED với debounce
const int BUTTON_PIN = 2;
const int LED_PIN = 13;

bool ledState = false;           // Trạng thái LED
bool lastButtonState = LOW;      // Trạng thái nút trước đó
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

void setup() {
  pinMode(BUTTON_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  int reading = digitalRead(BUTTON_PIN);
  
  // Kiểm tra xem nút có thay đổi trạng thái không
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  
  // Nếu đã đủ thời gian debounce
  if ((millis() - lastDebounceTime) > debounceDelay) {
    // Nếu nút được nhấn (chuyển từ LOW sang HIGH)
    if (reading == HIGH && lastButtonState == LOW) {
      // Đảo trạng thái LED
      ledState = !ledState;
      digitalWrite(LED_PIN, ledState);
    }
  }
  
  lastButtonState = reading;
}
💡 Debounce là gì? Khi nhấn nút, tín hiệu điện có thể bị nhiễu và nhảy giữa HIGH/LOW nhiều lần trong vài milliseconds. Debounce giúp loại bỏ nhiễu này.

6. Analog Input - Đọc Giá Trị Cảm Biến

Arduino có 6 chân Analog (A0-A5) để đọc giá trị điện áp từ 0-5V thành số từ 0-1023.

Ví dụ 1: Đọc biến trở (Potentiometer)

Kết nối: Biến trở 3 chân: VCC → 5V, GND → GND, OUT → A0

Đọc giá trị biến trở
const int POT_PIN = A0;

void setup() {
  // Khởi động Serial để xem giá trị trên màn hình
  Serial.begin(9600);
}

void loop() {
  // Đọc giá trị analog (0-1023)
  int potValue = analogRead(POT_PIN);
  
  // Chuyển đổi sang điện áp (0-5V)
  float voltage = potValue * (5.0 / 1023.0);
  
  // In ra Serial Monitor
  Serial.print("Giá trị: ");
  Serial.print(potValue);
  Serial.print(" - Điện áp: ");
  Serial.print(voltage);
  Serial.println("V");
  
  delay(500);
}

Ví dụ 2: Cảm biến nhiệt độ LM35

Kết nối: LM35: VCC → 5V, GND → GND, OUT → A0

Đọc nhiệt độ từ LM35
const int TEMP_PIN = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  // Đọc giá trị analog
  int reading = analogRead(TEMP_PIN);
  
  // Chuyển đổi sang điện áp
  float voltage = reading * 5.0 / 1023.0;
  
  // LM35: 10mV/°C, vậy nhiệt độ = voltage * 100
  float temperatureC = voltage * 100;
  
  Serial.print("Nhiệt độ: ");
  Serial.print(temperatureC);
  Serial.println(" °C");
  
  delay(1000);
}

7. PWM - Điều Chỉnh Độ Sáng LED

PWM (Pulse Width Modulation) cho phép điều chỉnh "độ sáng" của LED bằng cách bật/tắt nhanh với chu kỳ khác nhau.

Arduino Uno có 6 chân PWM: 3, 5, 6, 9, 10, 11 (có dấu ~ trên board)

Điều chỉnh độ sáng LED với PWM
const int LED_PIN = 9;  // Phải là chân PWM

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // Tăng độ sáng từ 0 đến 255
  for (int brightness = 0; brightness <= 255; brightness++) {
    analogWrite(LED_PIN, brightness);
    delay(10);
  }
  
  // Giảm độ sáng từ 255 về 0
  for (int brightness = 255; brightness >= 0; brightness--) {
    analogWrite(LED_PIN, brightness);
    delay(10);
  }
}

Điều khiển độ sáng LED bằng biến trở

LED điều khiển bởi biến trở
const int POT_PIN = A0;
const int LED_PIN = 9;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // Đọc biến trở (0-1023)
  int potValue = analogRead(POT_PIN);
  
  // Chuyển đổi sang giá trị PWM (0-255)
  int brightness = map(potValue, 0, 1023, 0, 255);
  
  // Điều chỉnh độ sáng LED
  analogWrite(LED_PIN, brightness);
  
  delay(10);
}
✅ Hàm map(): Chuyển đổi giá trị từ một khoảng sang khoảng khác.
map(value, fromLow, fromHigh, toLow, toHigh)

8. Serial Communication - Giao Tiếp Máy Tính

Serial cho phép Arduino giao tiếp với máy tính hoặc các thiết bị khác qua cổng USB.

Gửi dữ liệu từ Arduino → Máy tính

Serial - Gửi dữ liệu
void setup() {
  // Khởi động Serial với tốc độ 9600 baud
  Serial.begin(9600);
  Serial.println("Arduino đã khởi động!");
}

void loop() {
  Serial.print("Thời gian: ");
  Serial.print(millis());
  Serial.println(" ms");
  
  delay(1000);
}

Nhận lệnh từ Máy tính → Arduino

Serial - Nhận dữ liệu và điều khiển LED
const int LED_PIN = 13;

void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  
  Serial.println("Gửi '1' để bật LED, '0' để tắt LED");
}

void loop() {
  // Kiểm tra xem có dữ liệu từ Serial không
  if (Serial.available() > 0) {
    // Đọc ký tự
    char command = Serial.read();
    
    if (command == '1') {
      digitalWrite(LED_PIN, HIGH);
      Serial.println("LED đã BẬT");
    }
    else if (command == '0') {
      digitalWrite(LED_PIN, LOW);
      Serial.println("LED đã TẮT");
    }
  }
}

Ứng dụng: Menu điều khiển qua Serial

Menu Serial đa chức năng
const int LED_PIN = 9;
int ledBrightness = 0;

void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  
  printMenu();
}

void loop() {
  if (Serial.available() > 0) {
    char command = Serial.read();
    
    switch(command) {
      case 'h':  // Help - hiện menu
        printMenu();
        break;
        
      case '+':  // Tăng độ sáng
        ledBrightness += 25;
        if (ledBrightness > 255) ledBrightness = 255;
        analogWrite(LED_PIN, ledBrightness);
        Serial.print("Độ sáng: ");
        Serial.println(ledBrightness);
        break;
        
      case '-':  // Giảm độ sáng
        ledBrightness -= 25;
        if (ledBrightness < 0) ledBrightness = 0;
        analogWrite(LED_PIN, ledBrightness);
        Serial.print("Độ sáng: ");
        Serial.println(ledBrightness);
        break;
        
      case '1':  // Bật tối đa
        ledBrightness = 255;
        analogWrite(LED_PIN, ledBrightness);
        Serial.println("LED BẬT tối đa");
        break;
        
      case '0':  // Tắt
        ledBrightness = 0;
        analogWrite(LED_PIN, ledBrightness);
        Serial.println("LED TẮT");
        break;
    }
  }
}

void printMenu() {
  Serial.println("\n===== MENU ĐIỀU KHIỂN LED =====");
  Serial.println("h - Hiện menu này");
  Serial.println("+ - Tăng độ sáng");
  Serial.println("- - Giảm độ sáng");
  Serial.println("1 - Bật LED tối đa");
  Serial.println("0 - Tắt LED");
  Serial.println("==============================\n");
}
⚠️ Lưu ý: Để xem Serial Monitor, vào Tools → Serial Monitor hoặc nhấn Ctrl+Shift+M. Đảm bảo tốc độ baud ở góc dưới phải là 9600.

Bài Tập Thực Hành

  1. Đèn giao thông: Tạo hệ thống đèn giao thông với 3 LED (đỏ, vàng, xanh) chuyển đổi theo chu kỳ.
  2. Báo động nhiệt độ: Sử dụng LM35, khi nhiệt độ > 30°C thì bật LED cảnh báo và buzzer.
  3. Đo khoảng cách: Dùng cảm biến HC-SR04 đo khoảng cách và hiển thị qua Serial.
  4. Điều khiển RGB LED: Dùng 3 biến trở điều khiển màu sắc của RGB LED.