Giỏ hàng hiện tại chưa có sản phẩm nào!
Giỏ hàng hiện tại chưa có sản phẩm nào!
Giao tiếp arduino với remote phát thu hồng ngoại IR 38Khz là bài viết hướng dẫn cho các bạn cách thức hoạt động của hồng ngoại. Và cách chúng ta lập trình để điều khiển hoạt động của nó. Với bài viết này sẽ giúp cho các bạn cách thức viết chương trình điều khiển module thu hồng ngoại. Mục đích là giao tiếp được với các remote phát hồng ngoại. Sau khi xem bài viết này các bạn có thể thực hiện được với nhiều loại remote hồng ngoại khác trên thị trường.
1. NỘI DUNG BÀI VIẾT
|
2. GIỚI THIỆU VỀ REMOTE PHÁT THU HỒNG NGOẠI
Module remote phát thu hồng ngoại IR 38Khz được sử dụng trong các ứng dụng điều khiển thiết bị điện tử. Chúng ta thường thấy như trong remote điều khiển ti vi hoặc các remote điều khiển máy lạnh, quạt điện điều khiển từ xa.
Để thực hiện được việc thu phát hồng ngoại bằng module IR 38Khz thì chúng ta phải sử dụng 2 thành phần phát thu hồng ngoại riêng biệt. Bộ phận phát chính là remote điều khiển. Remote này sử dụng nguồn pin để phát tín hiệu hồng ngoại thông qua led phát hồng ngoại. Bộ phận thu, chính là module nhận tín hiệu, led thu hồng ngoại sẽ nhận tín hiệu từ bộ phận phát và giải mã tín hiệu để thực hiện những yêu cầu mà bên bộ phận phát đã phát.
3. NGUYÊN TẮC ĐIỀU KHIỂN REMOTE PHÁT THU HỒNG NGOẠI
Chúng ta sẽ kết nối module thu hồng ngoại với arduino. Sau đó nhấn các nút từ bộ phận phát (remote) để biết được mã HEX mà bên phát đã phát ra. Xác nhận và lưu lại những mã đã được nhấn để lập trình cho arduino điều khiển những thiết bị ngoại vi khác. Việc phát tín hiệu và lưu lại các giá trị này rất quan trọng. Bởi vì với mỗi remote sẽ có những mã cho các phím bấm là khác nhau. Do đó, để chương trình hiểu được những mã này, chúng ta bắt buộc phải viết chương trình thu thập những mã từ phím bấm. Những mã này sẽ là giá trị cho chương trình xác nhận và thực hiện những yêu cầu mong muốn.
4. THÔNG SỐ KỸ THUẬT CỦA MODULE
Bộ phận phát tín hiệu hồng ngoại – remote:
Module thu tín hiệu hồng ngoại
Module thu tín hiệu hồng ngoại có thành phần chính là led thu hồng ngoại. Có các chân tín hiệu được cài đặt sẵn.
5. NHỮNG LỆNH CẦN THIẾT ĐỂ ĐIỀU KHIỂN MODULE THU HỒNG NGOẠI
5.1 LỆNH KHAI BÁO THƯ VIỆN IRremote.h
Để cho arduino thực hiện được các lệnh điều khiển hồng ngoại, chúng ta cần khai báo thư viện IRremote cho arduino cho chương trình arduino IDE. Thư viện này được khai báo ở dòng đầu tiên của chương trình. Khi khai báo xong thư viện này thì chương trình mới hiểu được những lệnh của remote hồng ngoại.
Cú pháp: #include<Tên thư viện>
Trong trường hợp này, thư viện khai báo: #include<IRremote.h>
5.2 LỆNH KHAI BÁO ĐỐI TƯỢNG THUỘC THƯ VIỆN – IRremote
Chúng ta cần phải khai báo đối tượng để nhận tín hiệu điều khiển từ led thu hồng ngoại. Khi khai báo đối tượng này cần khai báo chân kết nối với module nhận hồng ngoại.
Cú pháp: IRrecv <Tên đối tượng>(<Chân kết nối với module thu hồng ngoại>);
Trong đó:
Ví dụ: chân số 8 của arduino kết nối với chân S của module thu hồng ngoại.
int chanRemote = 8;
IRrecv Hongngoai(chanRemote);
5.3 LỆNH KHAI BÁO BIẾN LƯU KẾT QUẢ GIẢI MÃ TÍN HIỆU – decode_results
Lệnh này được sử dụng để khai báo cho chương trình hiểu được biến lưu kết quả đọc được từ chân S của module thu hồng ngoại. Các mã của nút nhấn ở remote sẽ được lưu vào biến này. Chẳng hạn như trên remote có 8 nút nhấn thì mỗi nút nhấn sẽ có mã khác nhau. Những mã này khi module thu nhận được sẽ được lưu vào biến này. Mã lưu vào biến này mặc định là mã ở dạng số HEX.
Cú pháp: decode_results <Biến lưu kết quả>;
Ví dụ: decode_results ketqua;
5.4 LỆNH KÍCH HOẠT CHỨC NĂNG NHẬN TÍN HIỆU HỒNG NGOẠI – enableIRIn()
Lệnh kích hoạt này được sử dụng để kích hoạt module hồng ngoại. Lệnh này sử dụng trong chương trình void setup() để kích hoạt cho chương trình bắt đầu thực hiện quá trình đọc tín hiệu hồng ngoại. Quá trình sẽ tự động đọc tín hiệu từ chân S của module. Tuy nhiên, để biết đã có tín hiệu nhấn từ remote hay chưa thì chúng ta phải sử dụng lệnh để kiểm tra. Lệnh kiểm tra này sẽ được trình bày ở phần tiếp theo.
Cú pháp: <Tên đối tượng>.enableIRIn();
5.5 LỆNH KIỂM TRA CÓ TÍN HIỆU NHẤN TỪ REMOTE – decode()
Lệnh này được sử dụng để kiểm tra có nhấn nút từ remote hay không. Nếu có nhấn nút từ remote thì sẽ có tín hiệu đến chân S của module thu hồng ngoại. Mức tín hiệu sẽ là mức 1 khi có nhấn remote. Còn nếu không có nhấn nút remote thì mức tín hiệu là 0. Lưu ý cho lệnh này là chúng ta cần phải sử dụng phương pháp truyền theo dạng truyền địa chỉ.
Cú pháp: <Tên đối tượng>.decode(& <Biến lưu kết quả giải mã tín hiệu>);
Thường thì lệnh này sẽ được làm điều kiện cho hàm if để kiểm tra có nhấn nút trên remote hay không. Chúng ta thường sử dụng lệnh này kèm theo với hàm if để xác nhận có nhấn nút hay không. Hoặc cũng có thể kèm với vòng lặp while để chờ đến khi có nhấn nút remote thì chương trình mới thực hiện tiếp chương trình.
Ví dụ:
int Chanremote = 8;
IRrecv HR(Chanremote);
decode_results ketqua;
if(HR.decode(&ketqua)==0) // Nếu không có nhấn nút trên remote
if(HR.decode(&ketqua)==1)// Nếu có nhấn nút trên remote
Trong trường hợp khi có tín hiệu nhận, thì mã của phím bấm sẽ được lưu vào trong biến ketqua. Giá trị lưu trong biến ketqua sẽ là mã số thập lục phân (mã HEX). Khi cần đọc giá trị đã lưu trong biến lưu kết quả thì ta sử dụng lệnh value để lấy ra.
5.6 LỆNH ĐỌC GIÁ TRỊ CỦA BIẾN LƯU KẾT QUẢ GIẢI MÃ – value
Để đọc những giá trị của biến lưu kết quả giải mã tín hiệu chúng ta phải sử dụng lệnh value. Những giá trị đọc ra từ lệnh này sẽ là mã số HEX. Thường những lệnh này được sử dụng để đọc giá trị và so sánh với mã số của từng nút mà chúng ta đã lưu trước đó của từng nút nhấn trên bàn phím. Từ đó điều khiển các thiết bị ngoại vi khác.
Cú pháp: <Tên đối tượng>.value
Ví dụ:
if (Hongngoai.value == 0xFF6897)
Serial.println(“Ban bam so 0”);
5.7 LỆNH KẾT THÚC QUÁ TRÌNH ĐỌC – resume()
Để kết thúc quá trình đọc lệnh trước đó và bắt đầu đọc một lệnh mới, chúng ta phải sử dụng lệnh resume(). Lệnh này được sử dụng sau khi thực hiện lệnh đọc dữ liệu và lưu giá trị vào biến lưu kết quả giải mã tín hiệu.
Cú pháp: <Tên đối tượng>.resume();
Sau khi chúng ta đã tiến hành đọc dữ liệu và kiểm tra xem nút đang bấm là nút nào để xử lý những lệnh tương ứng. Bước tiếp theo chúng ta sẽ tiến hành kết thúc quá trình đọc lệnh cũ và tiến hành đọc dữ liệu mới.
Ví dụ:
if(HR.decode (&ketqua))
{
Serial.println(ketqua.value, HEX); // In mã nút nhấn ra màn hình
delay(200);
HR.resume();
}
6. ỨNG DỤNG VIẾT CHƯƠNG TRÌNH
Trong ví dụ này chúng ta tiến hành viết chương trình đọc những mã của nút nhấn trên remote và in những mã đó lên màn hình serial. Chương trình này chúng ta sẽ lấy các mã HEX của các nút nhấn. Từ những mã HEX của nút nhấn này để chương trình kiểm tra người dùng nhấn nút nào.
Các linh kiện cần thiết
Linh kiện | Số lượng |
Bo arduino UNO | 01 |
Remote hồng ngoại | 01 |
Module thu hồng ngoại | 01 |
Sơ đồ kết nối phần cứng
Đoạn code chương trình
#include <IRremote.h> int Chanremote=8; IRrecv HR(Chanremote); decode_results ketqua; String phimnhan; void setup() { Serial.begin(9600); HR.enableIRIn(); } void loop() { while (HR.decode(&ketqua)==0){ } delay(200); HR.resume(); if (ketqua.value==0xFF6897){ phimnhan="zero"; Serial.println(phimnhan); } if (ketqua.value==0xFF30CF){ phimnhan="one"; Serial.println(phimnhan); } if (ketqua.value==0xFF18E7){ phimnhan="two"; Serial.println(phimnhan); } if (ketqua.value==0xFF7A85){ phimnhan="three"; Serial.println(phimnhan); } if (ketqua.value==0xFF10EF){ phimnhan="four"; Serial.println(phimnhan); } if (ketqua.value==0xFF38C7){ phimnhan="five"; Serial.println(phimnhan); } if (ketqua.value==0xFF5AA5){ phimnhan="six"; Serial.println(phimnhan); } if (ketqua.value==0xFF42BD){ phimnhan="seven"; Serial.println(phimnhan); } if (ketqua.value==0xFF4AB5){ phimnhan="eight"; Serial.println(phimnhan); } if (ketqua.value==0xFF52AD){ phimnhan="nine"; Serial.println(phimnhan); } if (ketqua.value==0xFFA25D){ phimnhan="pwr"; Serial.println(phimnhan); } if (ketqua.value==0xFF629D){ phimnhan="v+"; Serial.println(phimnhan); } if (ketqua.value==0xFFE21D){ phimnhan="fun"; Serial.println(phimnhan); } if (ketqua.value==0xFF22DD){ phimnhan="rew"; Serial.println(phimnhan); } if (ketqua.value==0xFF02FD){ phimnhan="play"; Serial.println(phimnhan); } if (ketqua.value==0xFFC23D){ phimnhan="ff"; Serial.println(phimnhan); } if (ketqua.value==0xFFE01F){ phimnhan="dn"; Serial.println(phimnhan); } if (ketqua.value==0xFFA857){ phimnhan="v-"; Serial.println(phimnhan); } if (ketqua.value==0xFF906F){ phimnhan="up"; Serial.println(phimnhan); } if (ketqua.value==0xFF9867){ phimnhan="eq"; Serial.println(phimnhan); } if (ketqua.value==0xFFB04F){ phimnhan="st"; Serial.println(phimnhan); } }
Để lại một bình luận