Mục lục:

Điều khiển từ xa TV đa năng - Ardiuino, Hồng ngoại: 5 bước
Điều khiển từ xa TV đa năng - Ardiuino, Hồng ngoại: 5 bước

Video: Điều khiển từ xa TV đa năng - Ardiuino, Hồng ngoại: 5 bước

Video: Điều khiển từ xa TV đa năng - Ardiuino, Hồng ngoại: 5 bước
Video: Hướng dẫn giải mã remote hồng ngoại bằng Arduino | Điện Tử Lê Nguyên 2024, Tháng bảy
Anonim
Điều khiển từ xa cho TV đa năng - Ardiuino, Hồng ngoại
Điều khiển từ xa cho TV đa năng - Ardiuino, Hồng ngoại

Xin chào! Trong phần hướng dẫn này, tôi sẽ chỉ cho bạn cách xây dựng và lập trình điều khiển từ xa đa năng của riêng bạn sẽ hoạt động với hầu hết mọi thứ sử dụng điều khiển từ xa hồng ngoại và điều đó cũng sẽ "nghe" và giải mã tín hiệu hồng ngoại được gửi bởi nhiều điều khiển từ xa khác.

Một chút thông tin cơ bản về những gì đã truyền cảm hứng cho tôi để tạo ra điều khiển từ xa này - tôi cũng như hầu hết các bạn, mất điều khiển từ xa liên tục và tai họa này khá bực bội, vì vậy tôi nghĩ hãy giải quyết nó! Tôi đã chế tạo chiếc điều khiển từ xa này và gắn nó vào khung giường tùy chỉnh của tôi một cách kín đáo (tôi cũng là một thợ làm đồ gỗ) - Tôi không thể làm mất điều khiển từ xa nếu nó là một phần của khung giường của tôi!

Quân nhu

Những thứ bạn cần: -Arduino UNO hoặc Nano - số dặm có thể thay đổi với các bảng khác

-Bảng breadboard không màu (hoặc dải hàn có thể hàn được nếu bạn muốn làm cho nó lâu dài hơn)

- Dây đeo có nhiều màu sắc và độ dài

-Các nút ấn tạm thời (5) (bạn có thể thêm nhiều nút hơn, nhưng bạn sẽ cần sử dụng chân kỹ thuật số, vì tất cả ngoại trừ 1 trong các chân tương tự đều được sử dụng - bạn sẽ cần xem xét để đảm bảo sử dụng đúng cách các điện trở kéo lên hoặc kéo điện trở xuống và tháo các nút nhấn)

Điện trở -10K Ohm (5) (nếu bạn muốn có nhiều nút nhấn hơn, bạn sẽ cần nhiều nút này hơn)

-470 Ohm điện trở (2)

- Đèn LED hồng ngoại

-Dẫn màu đỏ

-Infrared Sensor (Tôi đã sử dụng số bộ phận VS1838B, bạn có thể sử dụng bộ cảm biến khác, chỉ cần kiểm tra pin-out)

(Tùy chọn) Sắt hàn, Chất hàn, Chất hàn.

Bước 1: Xây dựng mạch:

Xây dựng mạch
Xây dựng mạch

1). Tôi luôn thích bắt đầu với việc bố trí các thành phần của mình, vì điều này luôn thúc đẩy bố cục trên breadboard.

-Nút ấn

-LEDS: đèn LED đỏ và đèn LED hồng ngoại được nối dây song song, vì vậy bạn có thể thấy đèn LED hồng ngoại đang làm gì.

-Cảm biến

2). Điện trở

- Năm điện trở 10K ta gắn vào các nút ấn gọi là điện trở “kéo xuống”. Kéo điện trở xuống để đảm bảo rằng khi không nhấn nút nhấn, chân Arduino tương ứng nhận được 0 Volts (hoặc ít nhất là gần với nó). Để biết thêm thông tin về điện trở kéo xuống (hoặc kéo lên), đây là hướng dẫn chuyên sâu:

www.electronics-tutorials.ws/logic/pull-up…

Những điện trở này có thể không hoàn toàn cần thiết, nhưng nếu bạn nhận được những cú đẩy "ma", nhiều khả năng nguyên nhân là do khớp nối điện dung và các điện trở kéo xuống ngăn cản điều này.

3). Dây mạch

4). 5V và dây nối đất

Sử dụng hình ảnh được cung cấp để tham khảo! Tuy nhiên, đừng ngại thay đổi nó theo nhu cầu của bạn!

Bước 2: Mã:

#include const int RECV_PIN = 7; // Cảm biến IR đọc chân int Button1 = A4; // Xa nhất Left int Button2 = A3; // thứ 2 từ bên trái int Button3 = A2; // Giữa int Button4 = A1; // thứ 2 sang phải int Button5 = A0; // Xa nhất bên phải int LED = 3; // LED hồng ngoại & LED đỏ int val = 0; // Thay đổi giá trị IRsend irsend; IRrecv không thể thay đổi (RECV_PIN); giải mã kết quả;

void setup () {pinMode (Button1, INPUT); pinMode (Button2, INPUT); pinMode (Nút 3, NGÕ VÀO); pinMode (Nút 4, NGÕ VÀO); pinMode (Nút 5, NGÕ VÀO); pinMode (LED, OUTPUT); Serial.begin (9600); không thể thay đổi.enableIRIn (); Uncv.blink13 (true);} void loop () {{{if (analogRead (Button1)> 900) irsend.sendNEC (0xFF02FD, 32); // sử dụng đọc tương tự thay vì đọc kỹ thuật số để tránh các vấn đề về điện dung bị giam giữ. cũng giúp xóa các nút. // Việc đọc tín hiệu tương tự ở 900 cho phép một số khoảng trống trong các giá trị, nghĩa là, tín hiệu tia hồng ngoại sẽ được gửi ngay cả khi không áp dụng mức 5V đầy đủ vào chân. // nhưng 900 đủ cao để không đọc nhầm do độ trễ ghép điện dung (100);} // Bật & tắt dải RGB {if (analogRead (Button5)> 900) {for (int i = 0; i <3; i ++) // thay đổi giá trị trong "i <3" sẽ thay đổi số lần tín hiệu được lặp lại ngay lập tức. vì vậy "i <2" sẽ lặp lại tín hiệu hai lần. // bạn có thể cần thử với con số này nếu TV của bạn không phản hồi, nói chung, 1 hoặc 3 hoạt động tốt nhất, nếu những con số đó không hoạt động, hãy thử các số lẻ. // bạn cũng có thể cần phải xử lý các giá trị thời gian trễ tín hiệu nội bộ, chẳng hạn như đối với TV 10 của tôi hoạt động, nhưng 30 thì không. {irsend.sendSony (0xa90, 12); // Mã nguồn TV Sony, đối với TV của tôi, mã cần được gửi 3x3, vì vậy 3 xung, ba lần trễ riêng biệt (10); // "độ trễ tín hiệu nội bộ" for (int i = 0; i <3; i ++) {irsend.sendSony (0xa90, 12); // "12" là số bit, các giao thức khác nhau gọi số bit khác nhau. NEC là 32, Sony là 12, bạn có thể tra cứu độ trễ khác (10); for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i 900) {for (int i = 0; i <3; i ++) {irsend.sendSony (0xc90, 12); // Nguồn TV Sony Độ trễ giảm âm lượng (100);}}} delay (100);} if (’tcv.decode (& results)) // phần bên dưới của mã cho phép bạn diễn giải tín hiệu hồng ngoại từ các điều khiển từ xa khác nhau. {Serial.println (results.value, HEX); // nó sẽ tạo quy trình "NEC, Sony, v.v." và mã TV "c90, a90, FF02FD", bạn sẽ cần thêm 0x vào phía trước của công tắc Mã TV (results.decode_type) {case DENON: Serial.println ("DENON"); nghỉ; case NEC: Serial.println ("NEC"); nghỉ; case PANASONIC: Serial.println ("PANASONIC"); nghỉ; case SONY: Serial.println ("SONY"); nghỉ; case RC5: Serial.println ("RC5"); nghỉ; case JVC: Serial.println ("JVC"); nghỉ; case SANYO: Serial.println ("SANYO"); nghỉ; case MITSUBISHI: Serial.println ("MITSUBISHI"); nghỉ; case SAMSUNG: Serial.println ("SAMSUNG"); nghỉ; case LG: Serial.println ("LG"); nghỉ; case RC6: Serial.println ("RC6"); nghỉ; case DISH: Serial.println ("DISH"); nghỉ; case SHARP: Serial.println ("SHARP"); nghỉ; case WHYNTER: Serial.println ("WHYNTER"); nghỉ; case AIWA_RC_T501: Serial.println ("AIWA_RC_T501"); nghỉ; default: case UNKNOWN: Serial.println ("UNKNOWN"); break;} allowcv.resume ();}}

Bước 3: Độ sâu mã: Gửi tín hiệu IR

Tôi sẽ đề cập đến các dòng mã theo số dòng của chúng - để làm theo, hãy sử dụng liên kết này:

pastebin.com/AQr0fBLg

Đầu tiên, chúng ta cần bao gồm Thư viện Từ xa IR của z3t0.

Đây là một liên kết đến thư viện:

github.com/z3t0/Arduino-IRremote

Nếu bạn cần hướng dẫn về cách tải xuống thư viện đúng cách và cài đặt nó trong IDE:

www.arduino.cc/en/guide/libraries

Dòng 1 bao gồm thư viện.

Tiếp theo, chúng ta cần khai báo một vài biến, dòng 2-12 thực hiện việc này.

Chúng tôi sử dụng "cost int" để xác định các biến sẽ không thay đổi, tất cả trừ một biến thuộc danh mục này.

Chúng tôi sử dụng "int" để xác định các biến sẽ thay đổi.

Chúng tôi phải sử dụng một chân có xung với điều chế (PWM) cho chân LED của chúng tôi - bất kỳ chân nào có "~" bên cạnh nó sẽ đủ, trong mã của tôi - chúng tôi sử dụng chân kỹ thuật số 3.

Tiếp theo, chúng ta cần thực hiện một số thiết lập - mã này sẽ chỉ chạy một lần khi Arduino được cấp nguồn hoặc đặt lại.

Lưu ý rằng chúng tôi đang xác định đầu vào và đầu ra của mình (15-20), kích hoạt màn hình nối tiếp (21), bật cảm biến IR (22) và yêu cầu Arduino nhấp nháy đèn LED trên bo mạch bất cứ khi nào chúng tôi nhận được tín hiệu trong cảm biến (23).

Tiếp theo, chúng tôi sẽ xây dựng vòng lặp của mình - mã này sẽ chạy lặp lại, đi từ đầu đến cuối một số ít lần trong một giây.

Tại dòng 25, chúng tôi sử dụng câu lệnh if, điều này cho Arduino biết "hãy tìm tiêu chí cụ thể này, nếu tiêu chí đó được đáp ứng, hãy thực hiện điều cụ thể này". Trong trường hợp này, tiêu chí là analogRead (Button1)> 900, hay nói cách khác - "Arduino, Nhìn vào button1, mà chúng tôi đã xác định là chân A4 trước đó, nếu tín hiệu tương tự nhận được lớn hơn 900, vui lòng thực hiện hướng dẫn tiếp theo của chúng tôi, nếu không, hãy tiếp tục”. Có một chút để giải nén ở đây, vì vậy hãy đi sâu vào: tín hiệu tương tự trên Arduino có giá trị bằng hoặc nhỏ hơn 5V, với 5V bằng 1023 và 0V bằng 0. Bất kỳ điện áp nhất định nào từ 0 đến 5V đều có thể được xác định bằng một con số, và với một chút toán học, chúng ta có thể tìm ra con số đó, hoặc ngược lại, một hiệu điện thế. Chia 1024 (chúng ta bao gồm 0 dưới dạng một đơn vị) cho 5, ta được 204,8. Ví dụ, chúng tôi sử dụng số 900, để chuyển nó thành điện áp, chúng tôi chỉ cần chia 900 cho 204,8, cho chúng tôi ~ 4,4V. Chúng tôi đang yêu cầu Arduino tìm kiếm điện áp lớn hơn ~ 4,4 volt và nếu có, hãy thực hiện hướng dẫn tiếp theo của chúng tôi.

Nói về hướng dẫn tiếp theo (dòng 25), chúng ta thấy irsend.sendNEC (0xFF02FD, 32). Điều này nói rằng "Arduino, gửi một xung được điều chế tuân theo giao thức NEC, cụ thể là tín hiệu FF02FD và đảm bảo độ dài 32 bit của nó". Điều này sẽ làm cho đèn LED hồng ngoại của chúng tôi nhấp nháy theo cách mà các thiết bị khác có thể hiểu được. Hãy nghĩ về nó một chút giống như Mã Morse, nhưng chỉ với ánh sáng vô hình! Có rất nhiều giao thức khác nhau trên mạng, mỗi giao thức có hàng trăm nếu không phải hàng nghìn tín hiệu riêng lẻ và mỗi giao thức có số bit cụ thể của chúng - thiết bị của chúng tôi sẽ có thể nhận ra một lượng lớn các tín hiệu này, nhưng chúng tôi sẽ đi sâu vào vấn đề đó sau!

Tại dòng 28, chúng ta có độ trễ đầu tiên - đây là thời gian để ngăn chặn các tín hiệu lặp lại không chủ ý, khi nút được nhấn và tín hiệu IR được gửi đi, chúng ta có 100 mili giây để thoát khỏi nút. Điều này nghe có vẻ không tốn nhiều thời gian, nhưng trong thực tế, nó có vẻ hoạt động tốt. hàm trì hoãn cho Arduino biết "không làm gì trong X mili giây" và để tham khảo, chúng là 1000 mili giây trong một giây.

Chuyển sang nút tiếp theo của chúng tôi ở dòng 29, nút 5 (Ban đầu tôi có 4 nút trên điều khiển từ xa này, đã thêm nút thứ năm, vì vậy đó là lý do tại sao chúng tôi không có thứ tự). Về mặt tinh thần, nút này giống với nút 1, nhưng có một vài điểm khác biệt chính. Sự khác biệt đầu tiên bạn sẽ thấy là một câu lệnh for - đây thực chất là một vòng lặp khác - một vòng lặp với trong một vòng lặp lớn hơn, vòng lặp. Cụ thể chúng ta có "for (int i = 0; i <3; i ++)", đọc là "Arduino, cho phép bắt đầu từ 0, lặp lại các hướng dẫn sau cho đến khi chúng ta nhận được 3 lần". Hàm for được sử dụng vì rất nhiều thiết bị được lập trình để tìm kiếm tín hiệu lặp lại và trong trường hợp của chúng tôi ở đây là 3 lần. Bạn có thể chỉ cần thay đổi số 3 thành một số khác nếu thiết bị của bạn gọi đến một lịch lặp lại khác. Một điểm khác biệt chính khác với button5 là nó được lặp lại 3 lần hoặc 3x3. Nói cách khác, chúng tôi gửi tín hiệu 3 lần, đợi 10 mili giây, gửi lại 3 lần, đợi thêm 10 mili giây và sau đó gửi lại 3 lần. Loại giao tiếp này phổ biến để bật và tắt thiết bị và có thể chỉ là thứ mà TV hoặc thiết bị của bạn yêu cầu - chìa khóa của điều này là thử nghiệm với tất cả các biến cho đến khi bạn nhận được kết quả mong muốn. Thay đổi giá trị độ trễ ngắn, thay đổi giá trị lặp lại, gửi 6 lô thay vì 3, v.v. mỗi khi bạn thay đổi kênh trên TV, sound bar của bạn sẽ tắt - đó là lý do tại sao có các quy tắc tín hiệu khác nhau.

Ba nút tiếp theo được lập trình với các nguyên tắc giống nhau, ít nhất là một phần, được mô tả ở trên - vì vậy chúng ta có thể bỏ qua tất cả các bước xuống dòng 55.

Bước 4: Mã trong độ sâu: Nhận tín hiệu IR

Độ sâu mã: Nhận tín hiệu IR
Độ sâu mã: Nhận tín hiệu IR

Tại dòng 55, chúng tôi bắt đầu lập trình Arduino để giải thích các tín hiệu IR được gửi bởi các điều khiển từ xa khác - điều này là cần thiết để bạn có thể tìm ra các giao thức và tín hiệu mà điều khiển từ xa của bạn sử dụng. Dòng đầu tiên của mã ở dòng 55 là nếu (không thể sử dụng.decode (& kết quả) đọc là "Arduino, hãy tìm mã IR, nếu bạn tìm thấy, hãy trả về giá trị true, nếu không tìm thấy, hãy trả về false. Khi đúng, hãy ghi lại thông tin thành "kết quả" ".

Chuyển sang dòng 56, chúng ta có Serial.println (results.value, HEX) có nội dung "Ardunio, in kết quả trong màn hình nối tiếp ở định dạng HEX". Hex, có nghĩa là hệ thập lục phân, là một cách chúng ta có thể rút ngắn một chuỗi nhị phân (chỉ là 0 và 1) thành một thứ gì đó dễ nhập hơn một chút. Ví dụ: 101010010000 là "a90", mã được sử dụng để bật và tắt TV của tôi và 111111110000001011111101 là 0xFF02FD, điều khiển dải RGB của tôi. Bạn có thể sử dụng biểu đồ trên để chuyển đổi nhị phân thành hex và ngược lại, hoặc bạn có thể sử dụng liên kết sau:

www.rapidtables.com/convert/number/hex-to-…

Xuống dòng 57, chúng ta có một chức năng mới, được gọi là trường hợp chuyển mạch.

Về cơ bản, một trường hợp chuyển đổi cho phép chúng ta chỉ định các lệnh khác nhau dựa trên kết quả của một biến (trường hợp) nhất định. break thoát khỏi câu lệnh switch và được sử dụng ở cuối mỗi câu lệnh.

Chúng tôi sử dụng trường hợp công tắc ở đây để thay đổi cách chúng tôi in trong màn hình nối tiếp dựa trên các giao thức mà Arduino của chúng tôi cảm nhận được từ các điều khiển từ xa khác nhau.

Bước 5: Kết luận

Nếu bạn có câu hỏi - vui lòng liên hệ với tôi tại đây! Tôi rất vui khi cố gắng giúp đỡ bạn tốt nhất có thể.

Tôi hy vọng bạn đã học được điều gì đó mà bạn có thể sử dụng để làm cho cuộc sống của mình tốt hơn một chút!

-RB

Đề xuất: