Lesson 06 — Vi điều khiển & GPIO

Mô phỏng tương tác: bảng GPIO bật/tắt LED ảo, nút nhấn với pull-up/pull-down, slider PWM (LED mờ/tỏ), slider ADC đọc cảm biến, khung code cập nhật theo hành động.

1. GPIO OUTPUT — Điều khiển LED

Bấm vào chân GPIO để chuyển HIGH/LOW. LED ảo tương ứng sẽ sáng/tắt. Xem code Arduino cập nhật bên dưới.

Các chân OUTPUT (bấm để bật/tắt):

LED ảo:

void setup() { pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); } void loop() { // Bấm chân ở bên trái // để xem lệnh tương ứng }
Bấm chân GPIO bên trái để xem kết quả và code tương ứng.

2. Input số — Nút nhấn & Pull-up/Pull-down

Trạng thái chân GPIO (chân 2):

HIGH

Pull-up: R kéo chân lên VCC → HIGH khi không nhấn

LED ảo:
void setup() { pinMode(2, INPUT_PULLUP); pinMode(13, OUTPUT); } void loop() { bool btn = digitalRead(2); // HIGH = thả, LOW = nhấn if (btn == LOW) { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW); } }
Chọn Pull-up hoặc Pull-down rồi nhấn giữ nút.

Pull-up (active-low)

VCC (5 V) 10 kΩ pull-up GPIO 2 SW GND Thả: HIGH Nhấn: LOW

Pull-down (active-high)

VCC (5 V) SW GPIO 2 10 kΩ pull-dn GND Thả: LOW Nhấn: HIGH

3. PWM — Điều chế độ rộng xung

analogWrite value: 128
Duty cycle D: 50.2%
V_avg (5 V supply): 2.51 V
Dòng LED (220 Ω, V_f=2V): 2.3 mA

LED ảo (độ sáng theo duty):

50%

Dạng sóng PWM:

void setup() { pinMode(9, OUTPUT); } void loop() { // analogWrite: 0..255 analogWrite(9, 128); // Duty = 128/255 = 50.2% // V_avg = 2.51 V }
Kéo thanh trượt để thay đổi duty cycle.

4. Input tương tự — ADC & cảm biến

Mô phỏng cảm biến điện trở (quang trở LDR) qua mạch phân áp. Kéo thanh trượt để thay đổi giá trị cảm biến.

Sáng nhất (LDR=500Ω) Tối nhất (LDR=200kΩ)
R_LDR ước tính: 14.2 kΩ
V_A0 (phân áp): 2.50 V
analogRead (0–1023): 511
Ngưỡng (> 500 = tối): Sáng → LED tắt

Mức ADC:

0 (0 V)511 (2.5 V)1023 (5 V)
const int LDR = A0; const int LED = 13; const int THR = 500; void setup() { pinMode(LED, OUTPUT); Serial.begin(9600); } void loop() { int val = analogRead(LDR); // val = 511 float v = val*5.0/1023.0; Serial.println(v); if (val > THR) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } delay(200); }
Kéo thanh trượt để thay đổi ánh sáng.

5. Sơ đồ tổng quan MCU (ATmega328P / Arduino Uno)

Các khối chức năng tích hợp trên 1 chip. Bấm vào khối để xem mô tả.

CPU ALU + Registers 16 MHz / 8-bit Flash ROM 32 KB chương trình SRAM 2 KB biến tạm EEPROM 1 KB lưu trữ GPIO 23 chân I/O Pull-up nội ADC 6 kênh, 10-bit Timer/Counter 3 timer, PWM UART SPI / I2C Giao tiếp nối tiếp Oscillator 16 MHz xung nhịp Tất cả trên 1 chip — ATmega328P (28 chân DIP)
Bấm vào khối màu sắc để xem mô tả chi tiết.