Arduino
10-08-2016, 02:17:38 PM
Arduino - Các giải pháp giúp tăng lượng IO cho các KIT phát triển.
Arduino UNO với nền tảng là chip Atmega328 cũng như nhiều KIT phát triển khác là số lượng IO khá hạn chế (nhằm mục đích giảm giá thành, giảm kích thước v.v...). Điều này gây không ít khó khăn trong một số ứng dụng. Có rất nhiều ứng dụng về mặt thuật toán xử lý thì đơn giản, nên không gian bộ nhớ của những Kit này rất là "vô tư". Nhưng lại đòi hỏi lượng IO lớn cho các giao tiếp như LCD, truyền data kiểu song song, giao tiếp với nhiều thiết bị, linh kiện bên ngoài như chỉ báo (LED), nút bấm (button), vi chỉnh (biến trở) v.v..
Để giải quyết, nâng số lượng IO thì có rất nhiều cách. Như thay đổi cách giao tiếp qua SPI, 1 wire, 2 wire, serial v.v... Nhưng những cách này lại có một nhược điểm là đòi hỏi phải thêm nhiều linh kiện. Mà trong điều kiện thử nghiệm nhằm phát triển ý tưởng thì việc lắp thêm linh kiện e là không thoải mái chút nào (tăng độ phức tạp, tăng chi phí, đôi lúc lại không có sẵn linh kiện. Để tiện lợi hơn có rất nhiều Kit giao tiếp đã được chế tạo và bán sẵn.
Nhưng nếu ta đang cao hứng, muốn học, nghiêm cứu, ứng dụng "ngay và luôn" nhưng lại không có các kit mở rộng ấy thì làm thế nào?
Qua chủ đề này mình xin giới thiệu một vài cách để có thể giảm tối thiểu số IO cần cho các tác vụ đơn giản như button, hiện LED v.v... với những linh kiện rất sẵn. Tất nhiên nó cũng có nhược điểm riêng của nó.
Dùng nhiều nút bấm (button) chỉ với 01 kênh ADC (analog input).
Giải pháp này khá đơn giản là sử dụng các điện trở, nối tiếp với nhau để tạo thành cầu phân áp nhiều mức. Kết nối các nút bấm vào đó và dùng ADC để đọc mức điện áp khi được bấm. Thường thì có 2 cách sau.
Cách 1.
Xem sơ đồ
23675
Với cách này ta có mức điện áp ở output là:
Ux= X*V+/(n+1) trong đó X là nút bấm thứ X nên (1 ≤ X ≤ n) và n là số nút bấm.
Cách 2.
Xem sơ đồ
23676
Với cách này ta có mức điện áp ở output là:
Ux= V+[1 - 1/(1+X)] trong đó X là nút bấm thứ X nên (1 ≤ X ≤ n) và n là số nút bấm.
Tụ C1 & trở R10 = 1M có nhiệm vụ tăng tính ổn định cho hệ thống. Với cách 2 có thể bỏ luôn trở R10 mà không gây ảnh hưởng gì đến mạch.
Từ ouptut có thể kết nối trực tiếp vào ADC input hoặc có thể nối tiếp thêm trở (VD 100ohm).
V+ có thể là 5V, 3.3V.... tùy thuộc vào áp ref của ADC.
Việc đọc và phân tích thế nào để nhận biết nút nhấn nào đã được nhấn trên VXL (arduino) mình sẽ trình bày sau.
Ưu điểm của giải pháp.
Có thể dùng nhiều nút bấm chỉ với một input duy nhất. Số lượng nút có thể nở rộng rất nhiều, càng nhiều thì độ chính xác khi nhận diện nút sẽ giảm dần..
Những dạng nút có thể dùng cách này như nút điều hướng (up/down, left,right), nút bấm số (0,1...8,9), nút chức năng (OK, Reset). Tức về nguyên tác sử dụng, cùng lúc chỉ bấm 1 nút duy nhất.
Nhược điểm.
Chỉ dùng được với nút bấm
Mỗi lần chỉ bấm được một nút, nếu có nút nào bị dính là lỗi cả dãy nút.
Arduino UNO với nền tảng là chip Atmega328 cũng như nhiều KIT phát triển khác là số lượng IO khá hạn chế (nhằm mục đích giảm giá thành, giảm kích thước v.v...). Điều này gây không ít khó khăn trong một số ứng dụng. Có rất nhiều ứng dụng về mặt thuật toán xử lý thì đơn giản, nên không gian bộ nhớ của những Kit này rất là "vô tư". Nhưng lại đòi hỏi lượng IO lớn cho các giao tiếp như LCD, truyền data kiểu song song, giao tiếp với nhiều thiết bị, linh kiện bên ngoài như chỉ báo (LED), nút bấm (button), vi chỉnh (biến trở) v.v..
Để giải quyết, nâng số lượng IO thì có rất nhiều cách. Như thay đổi cách giao tiếp qua SPI, 1 wire, 2 wire, serial v.v... Nhưng những cách này lại có một nhược điểm là đòi hỏi phải thêm nhiều linh kiện. Mà trong điều kiện thử nghiệm nhằm phát triển ý tưởng thì việc lắp thêm linh kiện e là không thoải mái chút nào (tăng độ phức tạp, tăng chi phí, đôi lúc lại không có sẵn linh kiện. Để tiện lợi hơn có rất nhiều Kit giao tiếp đã được chế tạo và bán sẵn.
Nhưng nếu ta đang cao hứng, muốn học, nghiêm cứu, ứng dụng "ngay và luôn" nhưng lại không có các kit mở rộng ấy thì làm thế nào?
Qua chủ đề này mình xin giới thiệu một vài cách để có thể giảm tối thiểu số IO cần cho các tác vụ đơn giản như button, hiện LED v.v... với những linh kiện rất sẵn. Tất nhiên nó cũng có nhược điểm riêng của nó.
Dùng nhiều nút bấm (button) chỉ với 01 kênh ADC (analog input).
Giải pháp này khá đơn giản là sử dụng các điện trở, nối tiếp với nhau để tạo thành cầu phân áp nhiều mức. Kết nối các nút bấm vào đó và dùng ADC để đọc mức điện áp khi được bấm. Thường thì có 2 cách sau.
Cách 1.
Xem sơ đồ
23675
Với cách này ta có mức điện áp ở output là:
Ux= X*V+/(n+1) trong đó X là nút bấm thứ X nên (1 ≤ X ≤ n) và n là số nút bấm.
Cách 2.
Xem sơ đồ
23676
Với cách này ta có mức điện áp ở output là:
Ux= V+[1 - 1/(1+X)] trong đó X là nút bấm thứ X nên (1 ≤ X ≤ n) và n là số nút bấm.
Tụ C1 & trở R10 = 1M có nhiệm vụ tăng tính ổn định cho hệ thống. Với cách 2 có thể bỏ luôn trở R10 mà không gây ảnh hưởng gì đến mạch.
Từ ouptut có thể kết nối trực tiếp vào ADC input hoặc có thể nối tiếp thêm trở (VD 100ohm).
V+ có thể là 5V, 3.3V.... tùy thuộc vào áp ref của ADC.
Việc đọc và phân tích thế nào để nhận biết nút nhấn nào đã được nhấn trên VXL (arduino) mình sẽ trình bày sau.
Ưu điểm của giải pháp.
Có thể dùng nhiều nút bấm chỉ với một input duy nhất. Số lượng nút có thể nở rộng rất nhiều, càng nhiều thì độ chính xác khi nhận diện nút sẽ giảm dần..
Những dạng nút có thể dùng cách này như nút điều hướng (up/down, left,right), nút bấm số (0,1...8,9), nút chức năng (OK, Reset). Tức về nguyên tác sử dụng, cùng lúc chỉ bấm 1 nút duy nhất.
Nhược điểm.
Chỉ dùng được với nút bấm
Mỗi lần chỉ bấm được một nút, nếu có nút nào bị dính là lỗi cả dãy nút.