Tìm kiếm mã

Bài 8/31 : AnalogWrite LED Fade, vòng lặp for, vòng lặp while và vòng lặp do while | SunFounder Robojax

Bài 8/31 : AnalogWrite LED Fade, vòng lặp for, vòng lặp while và vòng lặp do while | SunFounder Robojax

Hướng dẫn này khám phá cách sử dụng thực tế hàm analogWrite() của Arduino, hàm này rất cần thiết để điều khiển tốc độ động cơ hoặc độ sáng của đèn LED thông qua Điều chế độ rộng xung (PWM). Ngoài hàm cơ bản, bạn sẽ học cách triển khai các cấu trúc vòng lặp khác nhau—for, whiledo...while—để tạo hiệu ứng mờ dần động và quản lý các tác vụ lặp lại một cách hiệu quả trong các dự án của bạn. Kiến thức này tạo nền tảng để tạo ra các dự án điện tử phản hồi nhanh và phức tạp hơn.

bài-8-analog-write-6-góc-nhìn-đấu-dây

Khả năng làm mờ đèn LED hoặc điều khiển tốc độ động cơ mở ra nhiều khả năng. Dưới đây là một số ứng dụng thực tế bạn có thể xây dựng:

  • Đèn chiếu sáng xung quanh: Tạo một chiếc đèn bàn tự động sáng dần khi bạn vào phòng và tắt dần khi bạn rời đi.
  • Chỉ báo trực quan: Xây dựng màn hình trạng thái sử dụng nhịp xung chậm cho chế độ "chờ" và nhấp nháy nhanh cho điều kiện "lỗi".
  • Điều khiển tốc độ động cơ: Điều khiển tốc độ của quạt DC nhỏ hoặc bánh xe robot, cho phép tăng tốc và giảm tốc mượt mà.
  • Tác phẩm nghệ thuật sắp đặt: Thiết kế tác phẩm điêu khắc ánh sáng tương tác tuần tự qua các mức độ sáng khác nhau.
  •  

Phần cứng và Linh kiện

Đối với dự án này, bạn sẽ cần các linh kiện sau từ bộ kit Arduino của mình:

  • 1x bo mạch Arduino (ví dụ: Uno, Nano)
  • 1x đèn LED (bất kỳ màu nào)
  • 1x điện trở 220-ohm hoặc 330-ohm
  • 1x Breadboard
  • Dây nối

Hiểu về Điều chế độ rộng xung (PWM)

bài-8-analog-write-1-kỹ-thuật-số-cao-thấp

PWM là một kỹ thuật dùng để mô phỏng đầu ra tương tự bằng tín hiệu kỹ thuật số. Thay vì cung cấp điện áp không đổi, Arduino nhanh chóng bật và tắt một chân. Tỷ lệ thời gian tín hiệu ở mức CAO so với mức THẤP được gọi là chu kỳ nhiệm vụ. Ví dụ: chu kỳ nhiệm vụ 50% nghĩa là chân ở mức CAO một nửa thời gian và mức THẤP một nửa thời gian (trong video ở phút 02:54). Việc chuyển đổi nhanh này được đèn LED hiểu là sự thay đổi độ sáng hoặc được động cơ hiểu là sự thay đổi tốc độ.

bài-8-analog-write-3-chu-kỳ-nhiệm-vụ-50-phần-trăm
bài-8-analog-write-2-chu-kỳ-nhiệm-vụ-1
bài-8-analog-write-4-chu-kỳ-nhiệm-vụ-10-20-50

Hàm analogWrite() chấp nhận giá trị từ 0 đến 255, tương ứng với chu kỳ nhiệm vụ từ 0% đến 100%. Vì PWM của Arduino là hệ thống 8-bit, giá trị tối đa là 28 - 1 = 255 (trong video ở phút 04:10). Giá trị 0 là tắt hoàn toàn, 127 là khoảng 50% chu kỳ nhiệm vụ và 255 là bật hoàn toàn.

Hướng dẫn đấu dây

analog_wirte_đấu-dây-LED
analog_wirte_sơ-đồ-LED

Để thiết lập mạch, hãy kết nối các linh kiện như sau:

  1. Kết nối chân dài (cực dương) của đèn LED với một đầu của điện trở.
  2. Kết nối đầu còn lại của điện trở với một chân PWM kỹ thuật số trên Arduino. Trong ví dụ này, chúng ta sẽ sử dụng chân 9.
  3. Kết nối chân ngắn (cực âm) của đèn LED với chân nối đất (GND) trên Arduino.

Đây là mạch tiêu chuẩn để điều khiển đèn LED. Điện trở rất cần thiết để giới hạn dòng điện chạy qua đèn LED và ngăn đèn bị cháy.

Giải thích mã

Mã của dự án này tập trung vào một vài yếu tố chính có thể cấu hình ở đầu sketch. Hãy phân tích chúng.

int ledPin = 9;    // Đây là chân nơi đèn LED được kết nối

Dòng này xác định chân Arduino sẽ được sử dụng để điều khiển đèn LED. Đây là một biến tên là ledPin và được gán giá trị 9. Để sử dụng một chân PWM khác (ví dụ: chân 3, 5, 6, 10 hoặc 11 trên Uno), bạn chỉ cần thay đổi giá trị duy nhất này và cập nhật hệ thống dây điện tương ứng.

for (int value = 0 ; value <= 255; value += 5) {
    analogWrite(ledPin, value);
    delay(30);
}

Đây là một vòng lặp for giúp tăng dần độ sáng của đèn LED. Vòng lặp bắt đầu với biến value ở giá trị 0. Miễn là value nhỏ hơn hoặc bằng 255, mã bên trong cặp dấu ngoặc nhọn {} sẽ được chạy. Sau mỗi lần lặp, value được tăng thêm 5 (value += 5). Bên trong vòng lặp, analogWrite() gửi mức độ sáng hiện tại đến chân LED, và một delay(30) ngắn được dùng để làm chậm quá trình chuyển đổi sao cho hiệu ứng mờ dần có thể nhìn thấy được. Bạn có thể điều chỉnh bước tăng (5) để làm hiệu ứng mờ dần mượt hơn hoặc nhanh hơn, và thời gian trễ (30 mili giây) để kiểm soát tốc độ mờ dần.

Trình Diễn Dự Án Trực Tiếp

Sau khi tải mã lên Arduino của bạn, bạn sẽ thấy đèn LED mờ dần một cách mượt mà từ trạng thái tắt hoàn toàn đến độ sáng tối đa. Vòng lặp sau đó sẽ bắt đầu lại, liên tục lặp lại hiệu ứng tăng sáng. Điều này minh họa khái niệm cốt lõi của việc sử dụng vòng lặp for với analogWrite() để tạo ra đầu ra động.

Khám Phá Các Biến Thể Vòng Lặp

Bài học video cũng đề cập đến các cấu trúc vòng lặp khác hữu ích cho các tình huống khác nhau. Mặc dù mã chính sử dụng vòng lặp for, việc hiểu các lựa chọn thay thế này là rất giá trị.

Vòng Lặp While: Vòng lặp while thực thi lặp đi lặp lại một khối mã miễn là một điều kiện nhất định còn đúng. Nó kiểm tra điều kiện trước khi chạy mã. Điều này hữu ích khi bạn không biết trước vòng lặp cần chạy bao nhiêu lần (trong video ở phút 15:51).

Vòng Lặp Do...While: Vòng lặp này tương tự như vòng lặp while, nhưng nó kiểm tra điều kiện của mình sau khi khối mã đã được thực thi. Điều này đảm bảo rằng mã bên trong vòng lặp chạy ít nhất một lần, bất kể điều kiện ban đầu là gì (trong video ở phút 19:17).

Các Chương

  • [00:00] Giới thiệu về AnalogWrite và PWM
  • [01:30] Hiểu về Chu Kỳ Nhiệm Vụ và Tín Hiệu PWM
  • [06:03] Đấu Dây Mạch LED
  • [07:25] Mã Điều Khiển Độ Sáng LED Cơ Bản
  • [09:45] Làm Mờ LED với Vòng Lặp For
  • [15:47] Giới thiệu về Vòng Lặp While
  • [19:17] Cấu Trúc Vòng Lặp Do...While

Hình ảnh

analog_wirte_schematic-LED
analog_wirte_schematic-LED
analog_wirte_wiring-LED
analog_wirte_wiring-LED
lesson-8-analog-write-1-digital-high-low
lesson-8-analog-write-1-digital-high-low
lesson-8-analog-write-2-duty-cycle-1
lesson-8-analog-write-2-duty-cycle-1
lesson-8-analog-write-3-50_percent_duty_cycle
lesson-8-analog-write-3-50_percent_duty_cycle
lesson-8-analog-write-4-duty-cycle-10-20-50
lesson-8-analog-write-4-duty-cycle-10-20-50
lesson-8-analog-write-6-wiring-view
lesson-8-analog-write-6-wiring-view
930-Lesson 8/31: Analog write, fading LED light and learn loop
Ngôn ngữ: C++
/*
 * Lesson 8/31: Analog write. fading LED and learn loop
Download and resource page https://robojax.com/RJT591
watch video tutorial https://www.youtube.com/watch?v=oo0v3wWbNIE
 * written/updated by Ahmad Shamshiri www.Robojax.com
 * Dec 12, 2022
 * 

*/
int ledPin = 9;    

void setup() {
  
}

void loop() {
  for (int value = 0 ; value <= 255; value += 5) {
    analogWrite(ledPin, value);
    delay(30);
  }
}

Tài nguyên & tài liệu tham khảo

Tập tin📁

Thư viện Arduino (tệp nén)

Hướng dẫn Sử dụng