Tạo PWM Arduino IDE với ESP32 (Analog) – Điều chỉnh độ sáng đèn LED
Trong hướng dẫn này, IoTZone sẽ hướng dẫn bạn cách tạo tín hiệu PWM Arduino IDE với ESP32. Chúng ta sẽ cùng làm một dự án thực hành đơn giản: Điều chỉnh độ sáng đèn LED bằng bộ điều khiển LED trên mạch ESP32. Mình sẽ hướng dẫn bạn cách xuất cùng 1 tín hiệu PWM trên nhiều chân GPIOs khác nhau cùng một lúc.
Ngoài ra, trước khi thực hành theo hướng dẫn này, bạn nên cài đặt tiện ích ESP32 trong phần mềm Arduino IDE của mình theo hướng dẫn sau:
- Giới thiệu ESP32 là gì?
- Cách cài đặt Arduino IDE 2.0 lập trình ESP32 trên Windows, Linux và Mac OS X
Chuẩn bị trước khi tạo PWM Arduino IDE với ESP32
Bạn cần chuẩn bị các thiết bị sau:
- Mạch ESP32
- Đèn LED
- Điện trở 3x 330 Ohm
- Breadboard
- Dây Jumper
Bộ điều khiển LED PWM trên ESP32
Trên mạch ESP32 có bộ điều khiển LED PWM với 16 chân độc lập, cho phép chúng ta cấu hình để xuất các tín hiệu PWM với những thuộc tính khác nhau.
Để xuất tín hiệu PWM Arduino IDE và điều chỉnh độ sáng đèn LED trên ESP32, chúng ta sẽ thực hiện theo các bước sau:
- Chọn kênh PWM, bạn có thể chọn 16 kênh từ kênh 0 đến 15
- Cấu hình tần số PWM Arduino IDE. Với đèn LED, mình đề nghị bạn nên chọn tần số 5000 Hz. Giải thích thêm: Tần số là số chu kỳ mà hệ thống thực hiện trong 1 giây
- Chọn độ phân giải (resolution), chu kỳ nhiệm vụ (duty cycle) cho tín hiệu, cụ thể:
- resolution: 1 đến 16bit, chúng ta sẽ chọn độ phân giải 8bit. Điều này đồng nghĩa với việc bạn có thể kiểm soát độ sáng của đèn LED bằng giá trị từ 0 đến 255
- Chỉ định các chân GPIO dùng để xuất tín hiệu PWM Arduino, thông qua câu lệnh sau:
- ledcAttachPin(GPIO, channel)
- Câu lệnh trên gồm 2 thông tin: Chân GPIO xuất tín hiệu và kênh để tạo tín hiệu
- Điều khiển độ sáng đèn LED thông qua tín hiệu PWM, dựa trên câu lệnh sau:
ledcWrite(channel, dutycycle)
Câu lệnh trên gồm 2 thông tin: kênh tạo tín hiệu điều khiển PWM và chu kỳ nhiệm vụ (dutycycle)
Điều chỉnh độ sáng đèn LED
Mình sẽ hướng dẫn bạn chi tiết cách sử dụng bộ điều khiển LED PWM trên ESP32, thông qua phần mềm Arduino IDE qua ví dụ bên dưới nhé:
Kết nối phần cứng theo Schematic
Kết nối đèn LED và mạch ESP32 của bạn như hình bên dưới, lưu ý đèn LED nối với cổng GPIO 16:
Lưu ý: Nếu bạn đang dùng mạch ESP32 mẫu khác, vui lòng xem sơ đồ Schematic của mạch bạn đang dùng để kết nối đúng nhé!
Lập trình chương trình
Mình đã chuẩn bị sẵn đoạn code dưới, bạn chỉ cần copy và nạp vào Arduino IDE để chạy nhé:
// the number of the LED pin const int ledPin = 16; // 16 corresponds to GPIO16 // setting PWM properties const int freq = 5000; const int ledChannel = 0; const int resolution = 8; void setup(){ // configure LED PWM functionalitites ledcSetup(ledChannel, freq, resolution); // attach the channel to the GPIO to be controlled ledcAttachPin(ledPin, ledChannel); } void loop(){ // increase the LED brightness for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){ // changing the LED brightness with PWM ledcWrite(ledChannel, dutyCycle); delay(15); } // decrease the LED brightness for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){ // changing the LED brightness with PWM ledcWrite(ledChannel, dutyCycle); delay(15); } }
Giải thích chương trình
- Khai báo chân mà bạn đã cắm đèn LED (trong trường hợp này là chân GPIO 16)
const int ledPin = 16; // 16 corresponds to GPIO16
- Cấu hình các thuộc tính của tín hiệu PWM Arduino, cụ thể:
- Tần số (frequence): 5000 Hz
- Kênh tạo tín hiệu: 0
- Độ phân giải: 8bit
- Bạn có thể chọn các thuộc tính khác tùy thích, mỗi một thuộc tính sẽ tạo ra các tín hiệu PWM khác nhau
const int freq = 5000;
const int ledChannel = 0;
const int resolution = 8;
- Cấu hình LED PWM dựa trên thuộc tính của PWM mà bạn đã chọn trước đó bằng cách sử dụng câu lệnh sau:
ledcSetup(ledChannel, freq, resolution);
- Chọn cổng GPIO để nhận tín hiệu, trong đó gồm 2 thông tin sau:
- Tên GPIO nhận tín hiệu, trong trường hợp này là GPIO 16
- Kênh tạo ra tín hiệu (kênh LED), trong trường hợp này là kênh 0
ledcAttachPin(ledPin, ledChannel);
- Trong vòng lặp, bạn hãy thay đổi chu kỳ nhiệm vụ (dutyCycle) từ 0 đến 255 để tăng độ sáng cho đèn LED theo ý muốn:
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
- Thay đổi chu kỳ từ 255 đến 0 để giảm độ sáng đèn LED:
for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){
// changing the LED brightness with PWM
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
- Để cấu hình độ sáng cho đèn LED, bạn sử dụng câu lệnh bên dưới, với 2 thông tin là kênh đang tạo tín hiệu và chu kỳ nhiệm vụ:
ledcWrite(ledChannel, dutyCycle);
Vì đang dùng độ phân giải 8bit nên chu kỳ nhiệm vụ sẽ được điều khiển bằng chuỗi giá trị từ 0 đến 255. Và bạn lưu ý rằng thông tin dùng trong hàm ledcWrite() là kênh tạo tín hiệu chứ không phải cổng GPIO nhận tín hiệu.
Kết quả
Chọn đúng bo mạch và cổng COM trên Arduino IDE, sau đó pload chương trình trên vào mạch ESP32 của bạn và quan sát kết quả nhé! Chúng ta đã có thể điều khiển độ sáng của đèn LED thông qua tín hiệu xung PWM Arduino:
Cách nhận tín hiệu PWM Arduino giống nhau trên các cổng GPIO khác nhau
Bạn muốn nhận cùng 1 tín hiệu PWM Arduino từ cùng 1 kênh trong các GPIO khác nhau? Vậy thì bạn chỉ cần gán các cổng CPIO này vào cùng 1 kênh trong phần setup().
Cụ thể, dưới đây IoTZone sẽ hướng dẫn bạn cách điều chỉnh độ sáng của 3 đèn LED khác nhau, sử dụng cùng 1 tín hiệu PWM Arduino của cùng 1 kênh nhé!
Điều chỉnh độ sáng 3 đèn LED cùng lúc
Kết nối thiết bị
Bạn kết nối thêm 2 đèn LED khác vào mạch ESP32 của mình (qua cổng GPIO 5 và GPIO 1theo hình bên dưới:
Chương trình
Tương tự, bạn hãy sử dụng chương trình có sẵn bên dưới nhé:
// the number of the LED pin const int ledPin = 16; // 16 corresponds to GPIO16 const int ledPin2 = 17; // 17 corresponds to GPIO17 const int ledPin3 = 5; // 5 corresponds to GPIO5 // setting PWM properties const int freq = 5000; const int ledChannel = 0; const int resolution = 8; void setup(){ // configure LED PWM functionalitites ledcSetup(ledChannel, freq, resolution); // attach the channel to the GPIO to be controlled ledcAttachPin(ledPin, ledChannel); ledcAttachPin(ledPin2, ledChannel); ledcAttachPin(ledPin3, ledChannel); } void loop(){ // increase the LED brightness for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){ // changing the LED brightness with PWM ledcWrite(ledChannel, dutyCycle); delay(15); } // decrease the LED brightness for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){ // changing the LED brightness with PWM ledcWrite(ledChannel, dutyCycle); delay(15); } }
Chương trình này tương tự như chương trình điều chỉnh độ sáng 1 đèn LED bên trên, nhưng có một số thay đổi nhỏ:
- Thêm 2 biến số mới cho 2 đèn LED mới, sử dụng cổng GPIO 5 và GPIO 17:
const int ledPin2 = 17; // 17 corresponds to GPIO17
const int ledPin3 = 5; // 5 corresponds to GPIO5
- Trong phần setup(), thêm 2 dòng code sau để gắn cả 2 cổng GPIO cho kênh 0. Câu lệnh này sẽ giúp cả 2 GPIO đều cùng nhận dc 1 tín hiệu PWM Arduino được tạo ra trên kênh 0:
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
Kết quả
Upload code này vào mạch ESP32 của bạn và thử nghiệm xem sao nhé! Dưới đây là hình ảnh minh họa của mình:
Tất cả các cổng GPIO đều cùng nhận được một tín hiệu PWM Arduino. Do đó, khi bạn điều chỉnh độ sáng thì cả 3 đèn LED đều tăng giảm độ sáng đồng thời như nhau. Hãy thử nghiệm nhé!
Lời kết
Trong bài này, chúng ta đã cùng thực hiện cách sử dụng tín hiệu PWM Arduino để điều khiển độ sáng của đèn LED RGB trên mạch ESP32. Bạn có thể ứng dụng các kiến thức trên để điều khiển các thiết bị đầu ra khác, ví dụ như quạt,… bằng cách thiết lập các thuộc tính phù hợp cho từng loại tín hiệu.
Bạn gặp khó khăn trong việc thực hiện dự án này? Hãy để lại bình luận bên dưới để chúng tôi hỗ trợ nhé!