Trong bài học trước, chúng ta đã tìm hiểu về đọc tín hiệu Analog từ cảm biến xoay. Ngoài ra, chúng ta cũng có thể xuất ra tín hiệu Analog thay vì chỉ xuất ra tín hiệu bật tắt bằng các trạng thái HIGH và LOW. Một số ví dụ: điều chỉnh độ sáng đèn LED, thay đổi tốc độ quay nhanh hay chậm của động cơ, cho âm thanh của loa to nhỏ theo ý muốn,…
Trong bài học này, chúng ta sẽ sử dụng tín hiệu Analog Output để tăng giảm độ sáng của đèn LED bằng giá trị của cảm biến xoay.
Trên thực tế, chip điều khiển không thể xuất ra được tín hiệu Analog thật mà chỉ có thể xuất ra tín hiệu HIGH (bật) và LOW (tắt). PWM là một cách thức thông minh mà chip điều khiển dùng để xuất ra tín hiệu Analog. PWM hoạt động như sau:
frequency = 1 / 0,1 = 10 (Hz)
Ví dụ sau sẽ giúp bạn hiểu rõ hơn: Cho thời gian một chu kỳ là 100 mili giây, tần số 10Hz:
Sơ đồ Duty Cycle (thời gian đèn LED sáng)
Để đơn giản hóa, firmware MicroPython của xController cũng đã hỗ trợ sẵn hàm xuất ra giá trị analog ở các chân tín hiệu sử dụng PWM mà không cần quan tâm nhiều đến việc cấu hình các thông số phức tạp như giải thích ở trên.
Tuy nhiên PWM là một khái niệm khá hay và quan trọng trong lập trình điện tử, các bạn có thể tham khảo thêm về cách làm việc với PWM trong MicroPython ở đây https://docs.micropython.org/en/latest/library/machine.PWM.html.
while True: sensor_value = pin41.read_analog() pwm_value = translate(sensor_value, 0, 4095, 0, 1023) pin11.write_analog(pwm_value)
Sau khi chạy chương trình, bạn xoay biến trở sẽ thấy sự thay đổi về độ sáng của đèn LED.
sensor_value = pin41.read_analog()
Đọc giá trị tín hiệu Analog của cảm biến xoay nối với ở chân IO của cổng số 4. và lưu vào biến sensor_value, trả về giá trị kiểu số nằm trong khoảng từ 0 đến 4095.
Tuy nhiên, do hàm xuất tín hiệu analog chỉ nhận giá trị truyền vào từ 0 đến 1023, trong khi cảm biến xoay có giá trị từ 0 đến 4095, nên ta cần sử dụng hàm quy đổi có sẵn trong firmware là translate() sau đây:
pwm_value = translate(sensor_value, 0, 4095, 0, 1023)
Giá trị quy đổi được lưu vào biến tên là pwm_value để sử dụng sau đó.
Hàm translate() có cấu trúc đầy đủ như sau:
translate(value, min_in, max_in, min_out, max_out)
Hàm translate sẽ quy đổi khoảng giá trị ban đầu thành khoảng giá trị khác mà chúng ta cần. Trong đó:
pin11.write_analog(pwm_value)
Xuất giá trị analog cho chân tín hiệu ở cổng số 4 với giá trị cần xuất ra là kết quả vừa quy đổi ở trên chứa trong biến pwm_value.
Hàm write_analog() có cú pháp như sau:
pinXY.write_analog(value)