Spisu treści:

Pilot na podczerwień I2C z Arduino: 8 kroków (ze zdjęciami)
Pilot na podczerwień I2C z Arduino: 8 kroków (ze zdjęciami)

Wideo: Pilot na podczerwień I2C z Arduino: 8 kroków (ze zdjęciami)

Wideo: Pilot na podczerwień I2C z Arduino: 8 kroków (ze zdjęciami)
Wideo: GENERATOR KODU ARDUINO: Wyświetlacz LCD 16x2 - HD44780 i2c- #18 2024, Lipiec
Anonim
Pilot na podczerwień I2C z Arduino
Pilot na podczerwień I2C z Arduino
Pilot na podczerwień I2C z Arduino
Pilot na podczerwień I2C z Arduino

Wstęp Niniejsza instrukcja zawiera szczegółowe informacje na temat tworzenia uniwersalnego pilota zdalnego sterowania przy użyciu interfejsu I2C.

Jak dziwne mówisz, używając urządzenia podrzędnego I2C?

Tak, urządzenie podrzędne I2C.

Wynika to z faktu, że dokładne taktowanie pakietów IR jest dość wymagające, a typowy Arduino będzie miał problemy, jeśli wykonuje już wiele innych zadań w tym samym czasie. Lepiej jest rozłożyć obciążenie obliczeniowe, przypisując czynności wymagające dużej ilości czasu do dedykowanych procesorów, gdy tylko jest to możliwe (lepiej rób to na sprzęcie). Biorąc pod uwagę, że I2C jest dobrze udokumentowaną i solidną metodą komunikacji między układami scalonymi, wybrałem ten interfejs jako interfejs.

Wstęp

Jak wspomniano powyżej, ta instrukcja opisuje, jak sterować urządzeniami gospodarstwa domowego, takimi jak telewizor, odtwarzacz DVD i satelita itp., Za pomocą biblioteki IRremote na Arduino.

Kończy się przykładem projektu, który przekształca Arduino w podrzędny moduł zdalnego sterowania I2C (rys. 1 powyżej) z prototypowym obwodem testowym (rys. 2 powyżej) i szczegółowo opisuje, jak zmniejszyć projekt do minimum niezbędnych komponentów, aby mógł być osadzony w innym projekcie. W moim przypadku używam tego wbudowanego urządzenia w uniwersalnym urządzeniu zdalnego sterowania IoT opartym na ESP8266-12E.

Jakich części potrzebuję?

Do zbudowania obwodu przedstawionego w kroku 1 (nadajnik podczerwieni) potrzebne będą następujące części;

  • 2 rezystory 10K
  • 1 wyłączony rezystor 390R
  • 1 wyłączony rezystor 33R
  • 1 wyłączony rezystor 3K8
  • 1 wyłączona czerwona dioda LED
  • 1 szt. Dioda podczerwieni TSAL6400
  • 1 szt. Tranzystor BC337
  • 1 kondensator 220uF
  • 1 szt. Arduino Uno

Do zbudowania obwodu przedstawionego w kroku 4 (odbiornik podczerwieni) potrzebne będą następujące części;

  • 1 wyłączony rezystor 10K
  • 1 szt. TSOP38328
  • 1 kondensator 220uF
  • 1 szt. Arduino Uno

Aby zbudować obwód przedstawiony w kroku 5 (obwód testowy urządzenia podrzędnego), będziesz potrzebować następujących części;

  • 4 rezystory 10K
  • Rezystor 2 szt. 390R
  • 1 wyłączony rezystor 33R
  • 1 wyłączony rezystor 3K8
  • 2 zgaszona czerwona dioda LED
  • 1 szt. Dioda podczerwieni TSAL6400
  • 1 szt. Tranzystor BC337
  • 1 kondensator 220uF
  • 2 przyciski SPST
  • 2 szt. Arduino Unos

Aby zbudować obwód przedstawiony w kroku 6 (projekt skurczony), będziesz potrzebować następujących części;

  • 3 rezystory 10K
  • 1 wyłączony rezystor 270R
  • 1 wyłączony rezystor 15R
  • 4 wyłączone rezystory 1K
  • 1 wyłączona czerwona dioda LED
  • 1 szt. Led IR TSAL6400 lub TSAL5300
  • 1 szt. Tranzystor BC337
  • 1 szt. kondensator elektrolityczny 220uF @ 6.3v
  • 1 szt. kondensator elektrolityczny 1000uF @ 6.3v
  • 2 kondensatory 0.1uF
  • 2 kondensatory 22pF
  • 1 szt. 16 MHz Xtal
  • 1 szt. ATMega328P-PU

Uwaga: Do zaprogramowania ATMega328P potrzebne będzie również urządzenie FTDI

Jakich umiejętności potrzebuję?

  • Minimalna znajomość elektroniki,
  • Znajomość Arduino i jego IDE,
  • Trochę cierpliwości,
  • Przydałoby się trochę zrozumienia I2C (zobacz tutaj niektóre ogólne szczegóły dotyczące I2C/Wire Library).

Omówione tematy

  • Krótki przegląd obwodu,
  • Krótki przegląd oprogramowania,
  • Zawartość pakietu I2C,
  • Pozyskiwanie kodów zdalnego sterowania (ui32Data),
  • Jak przetestować urządzenie I2C Slave,
  • Zmniejszenie projektu,
  • Wniosek,
  • Wykorzystane referencje.

Zastrzeżenie

Jak zawsze, używasz tych instrukcji na własne ryzyko i są one nieobsługiwane.

Krok 1: Krótki przegląd obwodu

Krótki przegląd obwodu
Krótki przegląd obwodu

Zadaniem układu jest przesyłanie kodów pilota na podczerwień. Jego projekt jest dość prosty i dość prosty.

Gdy tranzystor Q1 i BC337 NPN jest włączony poprzez logiczną jedynkę z Arduino PWM O/P D3 do Rezystora R5, prąd przepływa przez diody 1 i 2. Ograniczony tylko przez rezystory balastowe odpowiednio R3 i R4. Q1 służy do zwiększenia prądu przepływającego przez diodę IR (IF Max = 100mA) do wartości przekraczającej możliwości Arduino O/P ~40mA przy zasilaniu +5V.

Kondensator C1 a 220uF elektrolityczny zapewnia pewną stabilizację zapobiegającą opadaniu szyny zasilającej przez moc pobieraną przez diody 1 i 2.

Rezystory R1 i R2 to podciąganie I2C.

Krok 2: Krótki przegląd oprogramowania

Krótki przegląd oprogramowania
Krótki przegląd oprogramowania
Krótki przegląd oprogramowania
Krótki przegląd oprogramowania
Krótki przegląd oprogramowania
Krótki przegląd oprogramowania

Preambuła

Aby pomyślnie skompilować ten kod źródłowy, będziesz potrzebować następującej dodatkowej biblioteki;

IRzdalny.h

  • Przez: z3t0
  • Przeznaczenie: zdalna biblioteka podczerwieni dla Arduino: wysyłanie i odbieranie sygnałów podczerwieni z wieloma protokołami
  • Od:

Przegląd kodu

Jak pokazano na rysunku 1 powyżej, po uruchomieniu kod konfiguruje I/O mikrokontrolera, a następnie sprawdza stan wewnętrznej flagi oprogramowania „bFreshDataFlag”. Gdy ta flaga jest ustawiona, kontroler potwierdza, że jest zajęty (wysyłanie danych pin D4 w stanie niskim) i przechodzi do stanu eBUSY, sekwencyjnie odczytując przycisk wciskając polecenia trzymane w uDataArray i wysyłając dane modulowane IR do diody IR w sekwencja transmisji.

Gdy dane przechowywane w uDataArray zostaną w pełni wysłane, stan eIDLE jest wznawiany, a linia Busy jest anulowana (wysyłanie danych pin D4 high). Urządzenie jest teraz gotowe do przyjęcia kolejnych naciśnięć przycisków oznaczających koniec sekwencji transmisji.

Odbiór danych naciśnięcia przycisku IR

Gdy dane są wysyłane do pilota InfraRed przez I2C, wyzwala to przerwanie, a wywołanie funkcji receiveEvent() jest wyzwalane asynchronicznie.

Po uruchomieniu odebrane dane I2C są kolejno zapisywane w buforze 'uDataArray'.

Podczas odbioru danych, jeśli koniec sekwencji jest sygnalizowany przez mastera (bFreshData!=0x00), ustawiany jest 'bFreshDataFlag', tym samym sygnalizując początek sekwencji transmisji.

Rysunki 2…3 przedstawiają przykład typowej sekwencji pakietów.

Uwaga: Pełny kod źródłowy dostępny tutaj

Krok 3: Zawartość pakietu I2C

Zawartość pakietu I2C
Zawartość pakietu I2C

Format pakietu kontrolnego wysyłanego do urządzenia podrzędnego przez I2C jest podany powyżej na obrazku 1, znaczenie każdego pola podano poniżej

Znaczenie pól pakietu kontrolnego

bajt bKodowanie;

  • kodowanie pilota IR,

    • RC6 (niebo) = 0,
    • SONY = 1,
    • SAMSUNG = 2,
    • NEC = 3,
    • LG = 4

uint32_t ui32Data;

Szesnastkowa reprezentacja binarnego strumienia danych IR 4 Bajty danych (długie bez znaku), LSByte … MSByte

bajt bNumberOfBitsInTheData;

Liczba bitów w danych (maksymalnie 32). Zakres = 1 … 32

bajt bPulseTrainPowtarzania;

Ile powtórzeń tego pociągu pulsu. Zakres = 1 … 255. Zazwyczaj 2…4 powtórzenia. Możesz rozszerzyć to dla poleceń włączania/wyłączania, ponieważ urządzenie odbiorcze czasami wymaga kilku dodatkowych powtórzeń ciągu impulsów, aby otrzymać sygnał włączenia

bajt bOpóźnienieMiędzyPulsPociągPowtarzania;

Opóźnienie między powtórzeniami tego ciągu impulsów. Zakres = 1 … 255mS. Zazwyczaj 22mS … 124mS

bajt bPrzycisk Powtórzenia;

Symuluje wielokrotne naciskanie tego samego przycisku (ale nie obsługuje zmodyfikowanego kodu jak pilot Apple, po prostu powtarza kod przycisku). Zakres = 1 … 256. Domyślnie = 1

uint16_t ui16DelayBetweenButtonPowtarzane;

Opóźnienie między powtórzeniami przycisku (bez znaku int). Łącznie 2 bajty LSByte … MSByte. Zakres = 1 … 65535mS. Domyślnie = 0mS

bajt bFreshData;

  • Świeże dane. Wartość niezerowa. Napisany jako ostatni, wyzwala sekwencję IR TX. Zakres 0x00…0xFF

    • Więcej pakietów kontrolnych w przyszłości = 0
    • To jest końcowy pakiet kontrolny = wartość niezerowa 1, 2, … 255

Zwróć uwagę na użycie dyrektywy kompilatora '_packed_'. Ma to na celu zapewnienie, że dane w pamięci są pakietami bajt po bajcie, niezależnie od używanego systemu docelowego (Uno, Due, ESP8266 itp.). Oznacza to, że połączenie między registerAllocationType i dataArrayType wymaga jedynie sekwencyjnego wygaszacza/zegarniania w bajtach z pakietu kontrolnego, czyniąc oprogramowanie TX/RX prostym.

Krok 4: Uzyskiwanie kodów zdalnego sterowania (ui32Data)

Uzyskiwanie kodów zdalnego sterowania (ui32Data)
Uzyskiwanie kodów zdalnego sterowania (ui32Data)
Uzyskiwanie kodów zdalnego sterowania (ui32Data)
Uzyskiwanie kodów zdalnego sterowania (ui32Data)
Uzyskiwanie kodów zdalnego sterowania (ui32Data)
Uzyskiwanie kodów zdalnego sterowania (ui32Data)
Uzyskiwanie kodów zdalnego sterowania (ui32Data)
Uzyskiwanie kodów zdalnego sterowania (ui32Data)

Istnieją trzy sposoby uzyskania odpowiedniego kodu klucza zdalnego sterowania;

  1. Poprzez liczenie bitów za pomocą oscyloskopu,
  2. Sprawdź to na stronie internetowej,
  3. Dekoduj go bezpośrednio ze strumienia danych w oprogramowaniu.

Poprzez liczenie bitów z oscyloskopem

Nie jest to skuteczna metoda, ponieważ zajmuje sporo czasu i potencjalnie wymaga więcej niż jednej próby, jednak może być bardzo dokładna. Przydaje się również do wizualnego sprawdzania kodów uzyskanych metodami 2 i 3, a także do określania wszelkich cech pilota. Na przykład podczas przytrzymywania przycisku na pilocie Apple IR. Pilot początkowo wyda sekwencję poleceń, a następnie powtórzy skompresowaną sekwencję 0xF….

Sprawdź to na stronie internetowej

Dobrym źródłem jest baza danych kodu zdalnego sterowania na stronie Linux Infrared Remote Control.

Minusem jest jednak to, że być może będziesz musiał wypróbować kilka kodów, dopóki nie znajdziesz takiego, który działa dla Ciebie. Być może będziesz musiał również zinterpretować niektóre reprezentacje kodów, aby przekonwertować je na ich równoważną formę szesnastkową.

Dekoduj go bezpośrednio ze strumienia danych

Używając układu na rysunku 1 powyżej w połączeniu z przykładem biblioteki IRremote 'IRrecvDumpV2.ino' możliwe jest dekodowanie strumienia danych bezpośrednio z pilota. Zdjęcie 2 przedstawia zdekodowany pilot telewizora Samsung do naciśnięcia przycisku włączania/wyłączania w oknie terminala Arduino IDE.

Połączony odbiornik/nadajnik

Zdjęcia 3 i 4 powyżej przedstawiają rozwiązanie, które umożliwia zarówno odbiór, jak i transmisję poleceń IR, co pozwala na łatwe prototypowanie.

Aby zdekodować naciśnięcia przycisków pilota na podczerwień, musisz sflashować Arduino za pomocą przykładu „IRrecvDumpV2.ino”, który jest dostarczany z biblioteką IRremote.

Działa równie dobrze przy transmisji, jeśli polecenia IR. Czerwona dioda LED jest wizualną sygnalizacją działania urządzenia.

Krok 5: Jak przetestować urządzenie I2C Slave?

Jak przetestować urządzenie I2C Slave?
Jak przetestować urządzenie I2C Slave?
Jak przetestować urządzenie I2C Slave?
Jak przetestować urządzenie I2C Slave?

Korzystając z kodu źródłowego i obwodu przedstawionego powyżej na rysunku 1, zaprogramuj Arduino „Master” za pomocą „IR_Remote_Sim_Test.ino”, a Arduino „Slave” za pomocą „IR_Remote_Sim.ino”.

Zakładając, że masz telewizor Sony Bravia, dekoder Sky HD i zestaw Sony BT SoundBar, naciśnij przycisk 1, a telewizor przełączy się na BBC1 (kanał 101). Naciśnij przycisk 2, a soundbar zostanie wyciszony. Naciśnij ponownie, a wyciszenie zostanie anulowane.

Podczas wykonywania sekwencji transmisji IR LED3 zaświeci się wskazując, że urządzenie podrzędne jest zajęte, a dioda LED1 będzie migać zgodnie z procesem transmisji IR.

Oczywiście, jeśli nie masz skonfigurowanego takiego samego systemu rozrywki, jak powyżej, możesz ponownie zaprogramować urządzenie podrzędne za pomocą „IRrecvDumpV2.ino”, zdekodować interesujące Cię zdalne polecenia, a następnie zaprogramować je w „IR_Remote_Sim_Test.ino” dla swojego danego scenariusza.

Rysunek 2 przedstawia przegląd oprogramowania testowego na poziomie systemu między urządzeniem nadrzędnym i podrzędnym.

Krok 6: Zmniejszenie projektu

Zmniejszenie projektu
Zmniejszenie projektu

Ok, więc założenie, że postępowałeś zgodnie z instrukcjami, polegając na dwóch Arduino do sterowania urządzeniami domowymi, nie jest najbardziej wydajnym wykorzystaniem twojego zapasu Arduino. W związku z tym, jeśli zbudujesz obwód pokazany na powyższym obrazku i zastosujesz się do instrukcji tutaj, aby zaprogramować ATMega328P za pomocą 'IR_Remote_Sim.ino', będziesz w stanie zredukować cały system do minimalnych elementów. Umożliwi to osadzenie projektu w innym systemie.

Krok 7: Wniosek

Wniosek
Wniosek
Wniosek
Wniosek

Rozwiązanie jest stabilne i działa dobrze, od kilku tygodni jest osadzone w innym systemie bez żadnych problemów.

Wybrałem Arduino Uno R3, ponieważ chciałem mieć urządzenie z wystarczającą ilością pamięci RAM, aby móc mieć bufor przycisków o rozsądnej głębokości. Zdecydowałem się na bufor o rozmiarze 20 pakietów (MAX_SEQUENCES).

Wykonana przeze mnie hybrydowa osłona TX/RX przydała się również podczas dekodowania pilotów Sony i Sky. Chociaż muszę przyznać, że od czasu do czasu używam mojego cyfrowego oscyloskopu, aby sprawdzić, czy dekodowane programowo polecenie IR jest takie samo, jak to pochodzące z otrzymanej podczerwieni (TSOP38328).

Jedyną rzeczą, którą zrobiłbym inaczej, byłoby użycie obwodu sterowania prądem stałym dla diody podczerwieni, jak pokazano powyżej na rys. 2.

Kolejną kwestią, na którą należy zwrócić uwagę, jest to, że nie wszystkie nadajniki IR są modulowane z częstotliwością 38 kHz, TSOP38328 jest zoptymalizowany do 38 kHz.

Krok 8: Użyte referencje

IRRemote.h

  • Przez: z3t0
  • Przeznaczenie: zdalna biblioteka podczerwieni dla Arduino: wysyłanie i odbieranie sygnałów podczerwieni z wieloma protokołami
  • Od:

Biblioteka IR Remote

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

Czujnik odbiornika IR (podczerwień) - TSOP38238 (odpowiednik)

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

Aby uniknąć dopełniania struktury danych do granic słów

  • 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/co-jest-znaczenie-atrybutu-packed-aligned4

Dobre źródło danych pilota na podczerwień

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

I2C

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

Baza danych pilotów na podczerwień

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

Arkusz danych BC337

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

Karta katalogowa 1N4148

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

Zalecana: