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:
- Phần cứng: Board Arduino với vi điều khiển ATmega (thường là ATmega328P trên Arduino Uno)
- Phần mềm: Arduino IDE - môi trường phát triển tích hợp
- Ngôn ngữ: Dựa trên C/C++, dễ học và sử dụng
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
- Kết nối Arduino với máy tính qua cáp USB
- Mở Arduino IDE
- Chọn Tools → Board → Arduino Uno
- Chọn Tools → Port → COM3 (hoặc cổng tương ứng)
3. Cấu Trúc Chương Trình Arduino
Mọi chương trình Arduino đều có 2 hàm chính:
// 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
int- Số nguyên (-32,768 đến 32,767)unsigned int- Số nguyên không dấu (0 đến 65,535)long- Số nguyên lớn (-2,147,483,648 đến 2,147,483,647)float- Số thực (3.4E-38 đến 3.4E+38)bool- Boolean (true/false)char- Ký tự đơn ('A', 'b', '1')String- Chuỗi ký tự ("Hello World")
4. Blink LED - Chương Trình Đầu Tiên
Đây là chương trình "Hello World" của Arduino - nhấp nháy LED.
Sơ đồ kết nối:
- LED Anode (+) → Chân 13 (hoặc dùng LED built-in)
- LED Cathode (-) → GND (qua điện trở 220Ω)
// Định nghĩa chân LED const int LED_PIN = 13; void setup() { // Cấu hình chân 13 là OUTPUT (xuất tín hiệu) pinMode(LED_PIN, OUTPUT); } void loop() { // Bật LED (HIGH = 5V) digitalWrite(LED_PIN, HIGH); delay(1000); // Đợi 1 giây (1000ms) // Tắt LED (LOW = 0V) digitalWrite(LED_PIN, LOW); delay(1000); // Đợi 1 giây }
pinMode(pin, mode)- Cấu hình chân là INPUT hoặc OUTPUTdigitalWrite(pin, value)- Ghi giá trị HIGH (5V) hoặc LOW (0V) lên chândelay(ms)- Dừng chương trình trong một khoảng thời gian (milliseconds)
Bài tập: LED nhấp nháy nhanh hơn
const int LED_PIN = 13; int delayTime = 1000; // Thời gian delay ban đầu void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(delayTime); digitalWrite(LED_PIN, LOW); delay(delayTime); // Giảm thời gian delay mỗi lần loop (nháy nhanh dần) delayTime = delayTime - 50; // Nếu delay quá nhỏ, reset lại if (delayTime < 100) { delayTime = 1000; } }
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:
- Nút nhấn: một đầu nối 5V, đầu kia nối chân 2 và GND (qua điện trở 10kΩ)
- LED: Anode → chân 13, Cathode → GND (qua điện trở 220Ω)
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)
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; }
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
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
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)
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ở
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); }
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
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
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
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"); }
Bài Tập Thực Hành
- Đè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ỳ.
- Báo động nhiệt độ: Sử dụng LM35, khi nhiệt độ > 30°C thì bật LED cảnh báo và buzzer.
- Đo khoảng cách: Dùng cảm biến HC-SR04 đo khoảng cách và hiển thị qua Serial.
- Điều khiển RGB LED: Dùng 3 biến trở điều khiển màu sắc của RGB LED.