Bài 4: Chỉnh độ sáng đèn Led bằng biến trở với Arduino (Analog In + Analog Out)

From MakerLab Wiki
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 InputOuput, đề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 InputOutput.
Để 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ở
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"Cần gạt""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?

Bộ chia điện áp
Bộ chia điện áp
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?

Signal Analog
Signal 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
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.
PWM
PWM
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ậtTần số cố định (Tperiod), bằng cách chuyển đổi qua lại giữa xuất mức HIGHLOW.
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

Icon-Info-White.png Trước khi bắt đầu:

  • Yêu cầu đã cài phần mềm Arduino IDE (nên cài phiên bản mới nhất đã ổn định).
  • Các bạn có thể xem các bài hướng dẫn cơ bản về cách cài, cách sử dụng IDE này tại đây nhé.

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

  1. Gắn Shield "Arduino MakerEDU" lên bo Vietduino.
  2. Kết nối Module Biến trở với Shield bằng dây "XH2.54 3Wires" vào Port A1.
  3. Kết nối Module LED với Shield bằng dây "XH2.54 3Wires" vào Port D9.
  4. Kết nối bo Vietduino với máy tính thông qua cáp MicroUSB.

Code

  1. Mở Arduino IDE.
  2. Vào File -> New (hoặc Ctrl+N) tạo 1 file Arduino mới và đặt tên là ...\PWM_Led.ino
  3. Vào Tool để cấu hình Board:...Port:... đúng tương ứng với bo Arduino bạn đang dùng.
  4. Copy đoạn Code sau và nhấp vào Verify (Ctrl+R) để IDE kiểm tra lỗi cú pháp.
  5. 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

Template:Kxncode

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.
Icon-Attention-White.png Lưu ý:

  • Hàm này chỉ dùng được với những chân Analog.
  • Những chân này thường có kí hiệu bắt đầu bằng chữ 'A' trên bo Arduino.

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àm analogReadResolution() 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%) .
Icon-Attention-White.png Lưu ý:

  • Hàm này chỉ dùng được với những chân Digital có tính năng PWM.
  • Những chân này thường dùng kí hiệu '~' hay '#' trên bo mạch Arduino.

Kiểu dữ liệu trả về:

  • Không có.

Kết quả Demo

Icon-Warning-White.png Vấn đề nguồn:

  • Các bạn lưu ý, bất cứ ứng dụng nào chúng ta có dùng đến hàm analogRead(), để kết quả chạy đúng theo Code. Ta phải cấp nguồn riêng cho các board Arduino ở jack DC, hoặc chí ít phải đảm bảo nguồn cấp qua cổng USB đúng 5V!
  • Vì thực tế hàm này trả về giá trị MAX 1.023 bằng với giá trị điện áp đang cấp nuôi cho Vi Điều Khiển trên bo Arduino, chứ không phải là 5V.
  • Nên khi nguồn điện áp này không đúng 5V có thể làm chương trình trả về kết quả sai số nhỏ, hay xuất hiện những lỗi không mong muốn, thậm chí hoạt động sai!

Nếu mình đã cấp đủ nguồn rồi, thì ...

Icon-Done-White.png Successful:

  • Khi các bạn xoay Biến trở, đèn LED sẽ thay đổi cường độ ánh sáng theo. Với tần suất theo dõi Biến trở và cập nhập cho LED cứ mỗi 0,01s.

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.