Mục lục:

Điều khiển từ xa hồng ngoại I2C với Arduino: 8 bước (có hình ảnh)
Điều khiển từ xa hồng ngoại I2C với Arduino: 8 bước (có hình ảnh)

Video: Điều khiển từ xa hồng ngoại I2C với Arduino: 8 bước (có hình ảnh)

Video: Điều khiển từ xa hồng ngoại I2C với Arduino: 8 bước (có hình ảnh)
Video: Arduino - Kết Nối & Điều Khiển Cảm Biến Hồng Ngoại 2024, Tháng bảy
Anonim
Điều khiển từ xa hồng ngoại I2C với Arduino
Điều khiển từ xa hồng ngoại I2C với Arduino
Điều khiển từ xa hồng ngoại I2C với Arduino
Điều khiển từ xa hồng ngoại I2C với Arduino

PreambleThis có thể hướng dẫn chi tiết cách tạo bộ điều khiển từ xa đa năng bằng I2C cho giao diện.

Làm thế nào bạn nói kỳ lạ, sử dụng một thiết bị I2C nô lệ?

Có, một thiết bị nô lệ I2C.

Điều này là do thời gian chính xác của các gói IR là khá khắt khe và một Arduino điển hình sẽ gặp khó khăn nếu nó đang thực hiện nhiều tác vụ khác cùng một lúc. Tốt hơn là phân phối tải tính toán bằng cách chỉ định các hoạt động chuyên sâu về thời gian cho các bộ xử lý chuyên dụng bất cứ khi nào có thể (tốt hơn là nên làm điều đó trong phần cứng). Do I2C là một phương thức truyền thông mạnh mẽ và được ghi chép rõ ràng giữa các IC, tôi đã chọn đây làm giao diện.

Giới thiệu

Như đã đề cập ở trên, hướng dẫn này mô tả cách điều khiển các thiết bị gia dụng như TV, đầu đĩa DVD và Vệ tinh, v.v. bằng cách sử dụng thư viện IRremote trên Arduino.

Nó kết thúc với một ví dụ thiết kế biến Arduino thành mô-đun điều khiển từ xa I2C nô lệ (hình 1 ở trên) với mạch thử nghiệm nguyên mẫu (hình 2 ở trên) và tiếp tục chi tiết cách thu nhỏ thiết kế của bạn xuống các thành phần tối thiểu cần thiết để có thể được nhúng vào một thiết kế khác. Trong trường hợp của tôi, tôi sử dụng thiết bị nhúng này trong thiết bị điều khiển từ xa IoT Universal dựa trên ESP8266-12E.

Tôi cần những bộ phận nào?

Để xây dựng mạch được mô tả trong Bước 1 (Bộ phát hồng ngoại), bạn sẽ cần các bộ phận sau;

  • 2 điện trở 10K tắt
  • 1 tắt điện trở 390R
  • 1 tắt điện trở 33R
  • 1 tắt 3K8 điện trở
  • 1 đèn LED đỏ tắt
  • 1 tắt IR Led TSAL6400
  • 1 tắt Transistor BC337
  • 1 tắt tụ điện 220uF
  • 1 tắt Arduino Uno

Để xây dựng mạch được mô tả trong Bước 4 (Bộ thu IR), bạn sẽ cần các bộ phận sau;

  • 1 tắt 10K điện trở
  • 1 tắt TSOP38328
  • 1 tắt tụ điện 220uF
  • 1 tắt Arduino Uno

Để xây dựng mạch được mô tả trong Bước 5 (Mạch kiểm tra nô lệ), bạn sẽ cần các bộ phận sau;

  • 4 điện trở 10K tắt
  • 2 tắt điện trở 390R
  • 1 tắt điện trở 33R
  • 1 tắt 3K8 điện trở
  • 2 đèn LED đỏ tắt
  • 1 tắt IR Led TSAL6400
  • 1 tắt Transistor BC337
  • 1 tắt tụ điện 220uF
  • 2 nút SPST tắt
  • 2 tắt Arduino Unos

Để xây dựng mạch được mô tả trong Bước 6 (Thiết kế thu nhỏ), bạn sẽ cần các phần sau;

  • 3 tắt 10K điện trở
  • 1 tắt điện trở 270R
  • 1 tắt điện trở 15R
  • 4 tắt điện trở 1K
  • 1 đèn LED đỏ tắt
  • 1 tắt IR Led TSAL6400 hoặc TSAL5300
  • 1 tắt Transistor BC337
  • 1 tắt tụ điện 220uF @ 6.3v
  • 1 tắt tụ điện 1000uF @ 6.3v
  • 2 tắt 0,1uF tụ điện
  • 2 tắt tụ điện 22pF
  • 1 tắt 16MHz Xtal
  • 1 giảm giá ATMega328P-PU

Lưu ý: Bạn cũng sẽ yêu cầu thiết bị FTDI để lập trình ATMega328P

Tôi cần những kỹ năng gì?

  • Hiểu biết tối thiểu về điện tử,
  • Kiến thức về Arduino và IDE của nó,
  • Một chút kiên nhẫn,
  • Một số hiểu biết về I2C sẽ hữu ích (xem tại đây để biết một số thông tin chi tiết về I2C / Wire Library chung).

Các chủ đề được đề cập

  • Tổng quan ngắn gọn về mạch,
  • Tổng quan ngắn gọn về phần mềm,
  • Nội dung gói I2C,
  • Nhận mã điều khiển từ xa (ui32Data),
  • Cách kiểm tra thiết bị I2C Slave của bạn,
  • Thu nhỏ thiết kế của bạn,
  • Phần kết luận,
  • Tài liệu tham khảo được sử dụng.

Tuyên bố từ chối trách nhiệm

Như mọi khi, bạn tự chịu rủi ro khi sử dụng các hướng dẫn này và chúng không được hỗ trợ.

Bước 1: Tổng quan ngắn gọn về mạch

Tổng quan ngắn gọn về mạch
Tổng quan ngắn gọn về mạch

Mục đích của mạch là truyền mã điều khiển từ xa IR. Thiết kế của nó khá thẳng và khá đơn giản.

Khi bóng bán dẫn Q1 a BC337 NPN được bật thông qua một logic từ Arduino PWM O / P D3 đến Điện trở R5, dòng điện đi qua các Led 1 và 2. Chỉ được giới hạn bởi các điện trở chấn lưu R3 và R4 tương ứng. Q1 được sử dụng để tăng cường dòng điện đi qua Diode IR (IF Max = 100mA) vượt quá mức mà Arduino O / P có khả năng cung cấp ~ 40mA @ + 5v.

Tụ điện C1 một 220uF Electrolytic cung cấp một số ổn định ngăn chặn sự sụt giảm đường ray cung cấp bởi nguồn điện được rút ra bởi các Led 1 và 2.

Điện trở R1 và R2 là I2C kéo lên.

Bước 2: Tổng quan ngắn gọn về phần mềm

Tổng quan ngắn gọn về phần mềm
Tổng quan ngắn gọn về phần mềm
Tổng quan ngắn gọn về phần mềm
Tổng quan ngắn gọn về phần mềm
Tổng quan ngắn gọn về phần mềm
Tổng quan ngắn gọn về phần mềm

Mở đầu

Để biên dịch thành công mã nguồn này, bạn sẽ cần thư viện bổ sung sau;

IRremote.h

  • Theo: z3t0
  • Mục đích: Thư viện từ xa hồng ngoại cho Arduino: gửi và nhận tín hiệu hồng ngoại với nhiều giao thức
  • Từ:

Tổng quan về mã

Như thể hiện trong hình 1 ở trên, khi khởi động mã cấu hình I / O bộ điều khiển vi mô, sau đó thăm dò trạng thái của cờ phần mềm bên trong 'bFreshDataFlag'. Khi cờ này được đặt, bộ điều khiển xác nhận đó là dòng 'Bận' (đang gửi chân dữ liệu D4 ở mức thấp) và chuyển sang trạng thái 'eBUSY' tuần tự đọc các lệnh nhấn nút được giữ trong uDataArray và gửi dữ liệu được điều chế IR đến đèn LED hồng ngoại trong một trình tự truyền.

Sau khi dữ liệu được giữ trong uDataArray đã được gửi đầy đủ, trạng thái 'eIDLE' được tiếp tục và dòng 'Bận' được hủy xác nhận (đang gửi pin dữ liệu D4 cao). Thiết bị hiện đã sẵn sàng để nhận thêm các lần nhấn nút đánh dấu sự kết thúc của chuỗi truyền.

Tiếp nhận dữ liệu nhấn nút IR

Khi dữ liệu được gửi đến bộ điều khiển từ xa InfraRed qua I2C, nó sẽ kích hoạt ngắt và lệnh gọi hàm nhậnEvent () được kích hoạt không đồng bộ.

Sau khi được kích hoạt, dữ liệu I2C nhận được sẽ được ghi tuần tự vào bộ đệm 'uDataArray '.

Trong quá trình nhận dữ liệu, nếu phần cuối của chuỗi được báo hiệu bởi cái chính (bFreshData! = 0x00) thì 'bFreshDataFlag' được đặt, do đó báo hiệu sự bắt đầu của chuỗi truyền.

Hình 2… 3 đưa ra một ví dụ về một chuỗi gói tin điển hình.

Lưu ý: Có mã nguồn đầy đủ tại đây

Bước 3: Nội dung gói I2C

Nội dung gói I2C
Nội dung gói I2C

Định dạng của gói điều khiển được gửi đến nô lệ qua I2C được đưa ra ở trên trong hình 1, ý nghĩa của mỗi trường được đưa ra bên dưới

Ý nghĩa của các trường gói điều khiển

byte bEncoding;

  • Mã hóa điều khiển từ xa IR,

    • RC6 (Bầu trời) = 0,
    • SONY = 1,
    • SAMSUNG = 2,
    • NEC = 3,
    • LG = 4

uint32_t ui32Data;

Biểu diễn hex của luồng dữ liệu IR nhị phân 4 byte dữ liệu (dài không dấu), LSByte… MSByte

byte bNumberOfBitsInTheData;

Số Bit trong dữ liệu (Tối đa là 32). Phạm vi = 1… 32

byte bPulseTrainRepeats;

Có bao nhiêu lần lặp lại của chuyến tàu xung này. Phạm vi = 1… 255. Điển hình là 2… 4 lần lặp lại. Bạn có thể muốn mở rộng điều này cho các lệnh Bật / Tắt vì thiết bị nhận đôi khi yêu cầu lặp lại một số lần lặp lại tàu xung để nhận được tín hiệu bật

byte bDelayBetweenPulseTrainRepeats;

Độ trễ giữa các lần lặp lại của chương trình xung này. Phạm vi = 1… 255mS. Đặc biệt 22mS… 124mS

byte bButtonRepeats;

Mô phỏng việc nhấn lặp lại cùng một nút (nhưng không hỗ trợ mã đã sửa đổi như điều khiển từ xa của Apple, nó chỉ lặp lại mã nút). Phạm vi = 1… 256. Mặc định = 1

uint16_t ui16DelayBetweenButtonRepeats;

Độ trễ giữa các lần lặp lại nút (unsigned int). 2 byte trong tổng LSByte… MSByte. Phạm vi = 1… 65535mS. Mặc định = 0mS

byte bFreshData;

  • Dữ liệu mới. Một giá trị khác 0. Được viết cuối cùng, kích hoạt chuỗi IR TX. Phạm vi 0x00… 0xFF

    • Nhiều gói điều khiển sắp ra mắt = 0
    • Đây là gói điều khiển cuối cùng = Giá trị Non-Zero 1, 2,… 255

Lưu ý việc sử dụng chỉ thị trình biên dịch '_packed_'. Điều này là để đảm bảo dữ liệu là byte gói cho byte trong bộ nhớ bất kể hệ thống đích được sử dụng (Uno, Due, ESP8266, v.v.). Điều này có nghĩa là sự hợp nhất giữa registerAllocationType và dataArrayType chỉ cần tuần tự xung nhịp ra / xung nhịp theo byte từ một gói điều khiển, làm cho phần mềm TX / RX trở nên đơn giản.

Bước 4: Nhận mã điều khiển từ xa (ui32Data)

Nhận mã điều khiển từ xa (ui32Data)
Nhận mã điều khiển từ xa (ui32Data)
Nhận mã điều khiển từ xa (ui32Data)
Nhận mã điều khiển từ xa (ui32Data)
Nhận mã điều khiển từ xa (ui32Data)
Nhận mã điều khiển từ xa (ui32Data)
Nhận mã điều khiển từ xa (ui32Data)
Nhận mã điều khiển từ xa (ui32Data)

Có ba cách để bạn có được mã khóa điều khiển từ xa tương ứng;

  1. Qua đếm bit bằng máy hiện sóng,
  2. Tra cứu nó trên một trang web,
  3. Giải mã nó trực tiếp từ luồng dữ liệu trong phần mềm.

Qua đếm bit với một phạm vi

Đây không phải là một phương pháp hiệu quả vì nó mất khá nhiều thời gian và có thể cần nhiều lần thử, tuy nhiên nó có thể có độ chính xác cao. Nó cũng hữu ích trong việc xác thực trực quan các mã thu được bằng cách sử dụng phương pháp 2 và 3, cũng trong việc xác định bất kỳ điểm đặc biệt nào của điều khiển từ xa. Ví dụ: khi nhấn giữ một nút trên điều khiển Apple IR. Điều khiển từ xa ban đầu sẽ đưa ra một chuỗi lệnh sau đó làm theo chuỗi đó với một chuỗi nén lặp lại 0xF….

Tra cứu nó trên một trang web

Cơ sở dữ liệu mã điều khiển từ xa trên trang web Điều khiển từ xa hồng ngoại Linux là một nguồn tốt.

Tuy nhiên, nhược điểm là bạn có thể phải thử một vài mã cho đến khi bạn tìm thấy mã phù hợp với mình. Bạn cũng có thể phải giải thích một số biểu diễn của mã để chuyển chúng thành dạng hex tương đương.

Giải mã nó trực tiếp từ luồng dữ liệu

Sử dụng mạch trong hình 1 ở trên kết hợp với ví dụ thư viện IRremote 'IRrecvDumpV2.ino', có thể giải mã luồng dữ liệu trực tiếp từ điều khiển từ xa. Hình 2 cho thấy điều khiển từ xa TV Samsung đã được giải mã để nhấn nút bật / tắt trong cửa sổ đầu cuối Arduino IDE.

Máy thu / Máy phát kết hợp

Hình 3 và 4 ở trên mô tả một giải pháp cho phép cả nhận và truyền lệnh IR để cho phép tạo mẫu dễ dàng.

Để giải mã các lần nhấn nút điều khiển từ xa IR, bạn sẽ cần flash Arduino với ví dụ 'IRrecvDumpV2.ino' đi kèm với thư viện IRremote.

Nó cũng hoạt động tốt như nhau để truyền nếu lệnh IR. Đèn LED màu đỏ được bao gồm như một dấu hiệu trực quan cho thấy thiết bị đang hoạt động.

Bước 5: Cách kiểm tra thiết bị I2C Slave của bạn

Cách kiểm tra thiết bị I2C Slave của bạn
Cách kiểm tra thiết bị I2C Slave của bạn
Cách kiểm tra thiết bị I2C Slave của bạn
Cách kiểm tra thiết bị I2C Slave của bạn

Sử dụng mã nguồn ở đây và mạch được nêu ở trên trong hình 1, lập trình Arduino 'Master' với 'IR_Remote_Sim_Test.ino' và Arduino 'Slave' với 'IR_Remote_Sim.ino'.

Giả sử bạn có TV Sony Bravia, Sky HD box và Sony BT SoundBar, hãy nhấn nút 1 và TV của bạn sẽ chuyển sang BBC1 (kênh 101). Nhấn nút 2 và thanh âm thanh của bạn sẽ tắt tiếng. Nhấn lại và nó sẽ tắt tiếng.

Trong quá trình thực hiện chuỗi truyền IR, LED3 sẽ sáng cho biết máy phụ đang bận và LED1 sẽ nhấp nháy nội tuyến với quá trình truyền IR.

Tất nhiên nếu bạn không thiết lập hệ thống giải trí tương tự như trên, bạn có thể lập trình lại nô lệ bằng 'IRrecvDumpV2.ino', giải mã các lệnh từ xa mà bạn quan tâm, sau đó lập trình chúng thành 'IR_Remote_Sim_Test.ino' cho kịch bản đã cho.

Hình 2 cho thấy tổng quan về phần mềm kiểm tra mức hệ thống giữa Master và Slave.

Bước 6: Thu hẹp thiết kế của bạn

Thu hẹp thiết kế của bạn
Thu hẹp thiết kế của bạn

Ok, vì vậy giả sử bạn đã làm theo hướng dẫn này dựa vào hai Arduino để điều khiển các thiết bị gia đình của bạn không phải là cách sử dụng hiệu quả nhất nguồn Arduino của bạn. Do đó, nếu bạn xây dựng mạch hiển thị trong hình trên và làm theo hướng dẫn ở đây để lập trình ATMega328P với 'IR_Remote_Sim.ino', bạn sẽ có thể giảm toàn bộ hệ thống xuống các thành phần tối thiểu. Điều này sẽ cho phép bạn nhúng thiết kế của mình vào một số hệ thống khác.

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

Phần kết luận
Phần kết luận
Phần kết luận
Phần kết luận

Giải pháp này ổn định và hoạt động tốt, nó đã được nhúng vào một hệ thống khác trong vài tuần nay mà không gặp bất kỳ sự cố nào.

Tôi chọn Arduino Uno R3 vì tôi muốn một thiết bị có đủ RAM để tôi có thể có bộ đệm nút có độ sâu hợp lý. Tôi đã giải quyết kích thước bộ đệm là 20 gói (MAX_SEQUENCES).

Tấm chắn Hybrid TX / RX mà tôi làm cũng rất tiện dụng khi giải mã các điều khiển từ xa của Sony và Sky. Mặc dù thỉnh thoảng tôi phải thú nhận việc sử dụng phạm vi kỹ thuật số của mình để kiểm tra lệnh IR được giải mã phần mềm có giống với lệnh đến từ IR nhận được (TSOP38328).

Điều duy nhất tôi sẽ làm khác đi là sử dụng mạch điều khiển dòng điện không đổi cho đèn LED IR như được hiển thị ở trên trong hình 2.

Một điểm cần lưu ý nữa là, không phải tất cả các bộ phát IR đều được điều chế với 38KHz, TSOP38328 được tối ưu hóa cho 38KHz.

Bước 8: Tài liệu tham khảo được sử dụng

IRRemote.h

  • Theo: z3t0
  • Mục đích: Thư viện từ xa hồng ngoại cho Arduino: gửi và nhận tín hiệu hồng ngoại với nhiều giao thức
  • Từ:

Thư viện IR Remote

  • z3t0.github.io/Arduino-IRremote/
  • https://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html

Cảm biến thu IR (Hồng ngoại) - TSOP38238 (tương đương)

https://cdn-shop.adafruit.com/datasheets/tsop382.pdf

Để tránh cấu trúc dữ liệu đệm vào ranh giới từ

  • https://github.com/esp8266/Arduino/issues/1825
  • https://github.com/tuanpmt/esp_bridge/blob/master/modules/include/cmd.h#L15
  • https://stackoverflow.com/questions/11770451/what-is-the-mearies-of-attribute-packed-aligned4

Nguồn thông tin chi tiết từ xa IR tốt

https://www.sbprojects.com/knowledge/ir/index.php

I2C

  • https://playground.arduino.cc/Main/WireLibraryDetailedReference
  • https://www.arduino.cc/en/Reference/WireSend

Cơ sở dữ liệu IR Remotes

  • https://www.lirc.org/
  • https://lirc-remotes.sourceforge.net/remotes-table.html

BC337 Datasheet

https://www.onsemi.com/pub/Collateral/BC337-D. PDF

Biểu dữ liệu 1N4148

https://www.vishay.com/docs/81857/1n4148.pdf

Biểu dữ liệu ATMega328P-PU

Đề xuất: