Bài 4: Chỉnh độ sáng đèn Led bằng biến trở với Arduino (Analog In + Analog Out)
Jump to navigation
Jump to search
Giới thiệu
Từ Bài 3, các bạn cũng thấy được một Mô hình hệ thống điều khiển đơn giản thật tế sẽ như thế nào.
- Trong đó các thành phần Input và Ouput, đều sử dụng tín hiệu Digital. Điểm chung của tín hiệu Digital là mình chỉ có 2 trạng thái khác nhau sử dụng, như Nút nhấn là NHẤN/NHẢ, LED là ON/OFF.
- Mà trong thật tế, thì số lượng các trường hợp, các tình huống, các giá trị, ... là vô số kể. Để được vậy ta cần một loại tín hiệu khác lấy mô phỏng từ tự nhiên, đó là Analog.
- Trong bài này, mình sẽ hướng dẫn các bạn cách sử dụng tín hiệu Analog trên các thành phần Input và Output.
- Để làm ứng dụng điều chỉnh được độ sáng của đèn LED theo ý muốn, thay vì chỉ bật tắt như các bài trước. Với thành phần Input mình sẽ cần đổi sang module Biến trở.
- Bắt đầu thôi nào!
Kiến thức cơ bản
Biến trở?
- Biến trở (Potentiometer) thật ra cũng là một thiết bị Điện trở, tuy nhiên điểm khác biệt giữa chúng, là nó có thể chọn được giá trị Trở kháng (Ω) theo ý muốn người dùng.
- Cấu tạo của Biến trở gồm 2 thành phần chính là "Cần gạt" và "Dãi dây dẫn".
- Giá trị Trở kháng của "Dây dẫn" được quyết định bởi nhiều yếu tố cấu tạo nên nó, như: vật liệu dây dẫn, tiết diện dây dẫn, chiều dài dây dẫn.
- Vậy nên cách đơn giản nhất để thay đổi giá trị Trở kháng của một thiết bị là thay đổi chiều dài của dây dẫn điện trong thiết bị đó.
- Dựa trên nguyên lý này, người ta thiết kế Biến trở có 3 đầu kết nối. Hai đầu bên ngoài kết nối với hai đầu "Dãi dây dẫn". Đầu giữa kết nối với "Cần gạt" bên trong, nó tạo một điểm tiếp xúc với "Dãi dây dẫn" và có thể được di chuyển từ đầu này sang đầu kia bằng cách xoay trục hoặc vặn vít hoặc bằng cách di chuyển thanh trượt.
Voltage Divider?
- Các bạn có thể thấy "Cần gạt" đã phân tách "Dãi dây dẫn" thành 2 Điện trở riêng biệt có tổng bằng tổng Trở kháng của dãi đó.
- Hai Điện trở này có thể được sử dụng để tạo ra một Bộ phân áp (Voltage Divider).
- Bằng cách cấp vào một nguồn Điện áp đầu vào (Vin) ở hai đầu bên ngoài của Biến trở, thì Điện áp đầu ra (Vout) giữa đầu giữa Biến trở và đầu nối Gnd còn lại, sẽ tìm được bằng công thức:
Vout = Vin * (R2 / (R1 + R2))
.
- Như vậy bằng cách dùng Biến trở, ta có thể điều chỉnh Vout theo ý muốn trong một khoảng Vin đã xác định.
Tín hiệu Analog?
- Analog Signal đề cập đến các giá trị có "Biên độ là Liên tục".
- Giống Digital, Biên độ của Analog cũng được giới hạn trong một số giá trị hữu hạn.
- Vd: với bo mạch Vietduino, tín hiệu Analog có thể nhận là vô số giá trị khác nhau trong Dãi điện áp từ 0V (min) cho đến 5V (max) . Nó có thể là bất cứ giá trị nào trong dãi này.
- Để hiểu chi tiết hơn về tín hiệu Analog và ứng dụng của nó. Các bạn có thể xem thêm bài viết này tại đây.
ADC?
- ADC (viết tắt của Analog to Digital Converter), là một Bộ chuyển đổi tín hiệu, giúp chuyển đổi tín hiệu Analog sang tín hiệu Digital, rồi mới đưa tín hiệu đến bộ Vi điều khiển.
- Hầu như trong mọi Vi điều khiển đều phải có bộ ADC này, vì đa số tất cả các chân Vi điều khiển chỉ hoạt động trên tín hiệu Digital ở chế độ Input cả Output !
- Vậy nên vai trò của bộ ADC rất quan trọng để giúp các Vi điều khiển có thể đọc hiểu được các tín hiệu Analog.
PWM?
- PWM (viết tắt của Pulse Width Modulation), là một kỹ thuật để tạo các tín hiệu giả lập Analog bằng các tín hiệu Digital.
- Các Vi điều khiển sẽ điều khiển các chân xuất ra tín hiệu Digital, để tạo ra 1 sóng hình chữ nhật có Tần số cố định (Tperiod), bằng cách chuyển đổi qua lại giữa xuất mức
HIGH
vàLOW
.
- Bên cạnh sóng này có thể thay đổi Độ rộng xung (Pulse Width), bằng cách thay đổi khoảng thời gian tín hiệu cần sử dụng (Ton) so với khoảng thời gian tín hiệu không sử dụng (Toff).
- Nhờ vậy ta sẽ có được những sóng với Duty Cycle điều chỉnh được từ 0% đến 100%, giúp mô phỏng bất kì mức điện áp nào trong Dãi điện áp từ 0V (min) cho đến 5V (max) tương ứng.
Phần mềm
Arduino
Trước khi bắt đầu:
|
Phần cứng
Danh sách thiết bị
Tên sản phẩm | Số lượng |
---|---|
Mạch Vietduino Uno (Arduino Uno Compatible) | 1 |
Mạch Arduino MakerEDU Shield | 1 |
Mạch biến trở MKL-M04 potentiometer module | 1 |
Mạch led đơn MKL-M01 10mm single LED module | 1 |
Cáp Micro USB | 1 |
Cáp Kết Nối MakerEDU XH2.54 3Wires 20cm Cable [XH2.54 - XH2.54] | 2 |
Hướng dẫn kết nối
- Gắn Shield "Arduino MakerEDU" lên bo Vietduino.
- Kết nối Module Biến trở với Shield bằng dây "XH2.54 3Wires" vào Port A1.
- Kết nối Module LED với Shield bằng dây "XH2.54 3Wires" vào Port D9.
- Kết nối bo Vietduino với máy tính thông qua cáp MicroUSB.
Code
- Mở Arduino IDE.
- Vào
File -> New
(hoặc Ctrl+N) tạo 1 file Arduino mới và đặt tên là ...\PWM_Led.ino
- Vào
Tool
để cấu hình Board:... và Port:... đúng tương ứng với bo Arduino bạn đang dùng. - Copy đoạn Code sau và nhấp vào Verify (Ctrl+R) để IDE kiểm tra lỗi cú pháp.
- Sau khi IDE kiểm tra không có lỗi trong Code, lúc này bạn có thể nhấp Upload (Ctrl+U) để nạp Code vào bo Arduino.
Code Example
Giải thích Code
analogRead(); /*** HÀM ***/
Chức năng:
- Đọc giá trị từ chân Analog được chỉ định. Trong các bo mạch Arduino có bộ ADC đa kênh, với độ phân giải mặc định 10-bit.
Điều này có nghĩa là nó sẽ Ánh xạ (Mapping) Dãi điện áp từ 0V đến 5V thành các giá trị Số Nguyên tương ứng từ 0 đến 1.023 .
Cú pháp:
- analogRead(pin);
Tham số:
- pin - chân (con số) chọn từ bo Arduino.
Lưu ý:
|
Kiểu dữ liệu trả về:
- Trả về một Số Nguyên trong phạm vi từ 0 đến 1.023 (kiểu dữ liệu
int
) với ADC 10 bit (210 = 1.024).
Hoặc bạn có thể tăng độ phân giải lên 12bit (212 = 4.096) bằng hàmanalogReadResolution()
sẽ cho phạm vi đo rộng hơn từ 0 đến 4.095.
map(); /*** HÀM ***/
Chức năng:
- Ánh xạ lại một số từ dải phạm vi này sang dải phạm vi khác.
Có nghĩa là, một giá trị từ fromLow sẽ được ánh xạ tới giá trị toLow, từ fromHigh đến toHigh, từ các giá trị ở giữa của dãi [fromLow <-> fromHigh] đến các giá trị ở giữa của dãi [toLow <-> toHigh].
Cú pháp:
- map(value, fromLow, fromHigh, toLow, toHigh);
Tham số: → tất cả đều là kiểu dữ liệu long
.
- value - giá trị đưa vào để thực hiện việc Ánh xạ.
- fromLow - giới hạn dưới của phạm vi hiện tại của giá trị.
- fromHigh - giới hạn trên của phạm vi hiện tại của giá trị.
- toLow - giới hạn dưới của phạm vi mục tiêu của giá trị.
- toHigh - giới hạn trên của phạm vi mục tiêu của giá trị.
Kiểu dữ liệu trả về:
- Giá trị sau khi Ánh xạ (kiểu dữ liệu
long
).
analogWrite(); /*** HÀM ***/
Chức năng:
- Xuất tín hiệu giả lập Analog (dùng sóng PWM) từ chân đã chỉ định.
Chân sẽ tạo ra một sóng PWM, có thể thay đổi Độ rộng xung dựa theo giá trị value.
Cú pháp:
- analogWrite(pin, value);
Tham số:
- pin - chân (con số) chọn từ bo Arduino.
- value - độ rộng xung PWM, với độ phân giải 8 bit (28 = 256), có giá trị từ 0 (0%) đến 255 (100%) .
Lưu ý:
|
Kiểu dữ liệu trả về:
- Không có.
Kết quả Demo
Nếu mình đã cấp đủ nguồn rồi, thì ...
Successful:
|
Các bạn có thể xem chương trình sẽ hoạt động như thế nào theo video dưới đây nhé.
!!! nhúng 1 clip youtube, để xem video trực tiếp trên trang này. Dùng extension <iframe> cho MediaWiki.
Tìm hiểu thêm
Về Bộ chia điện áp: | Voltage Divider Practicals.
Về Điều chế độ rộng xung: | PWM - Arduino.
Ngôn ngữ lập trình Arduino: | Language - Arduino Reference.