Spisu treści:

Uniwersalny pilot do telewizora - Ardiuino, podczerwień: 5 kroków
Uniwersalny pilot do telewizora - Ardiuino, podczerwień: 5 kroków

Wideo: Uniwersalny pilot do telewizora - Ardiuino, podczerwień: 5 kroków

Wideo: Uniwersalny pilot do telewizora - Ardiuino, podczerwień: 5 kroków
Wideo: Arduino 23: JAK ZROBIĆ PILOTA? 2024, Lipiec
Anonim
Uniwersalny pilot do telewizora - Ardiuino, na podczerwień
Uniwersalny pilot do telewizora - Ardiuino, na podczerwień

Cześć! W tej instrukcji pokażę ci, jak zbudować i zaprogramować własnego uniwersalnego pilota, który będzie działał z większością rzeczy korzystających z pilota na podczerwień, a także „słucha” i dekoduje sygnał podczerwieni wysyłany przez różne inne piloty.

Trochę tła tego, co zainspirowało mnie do zbudowania tego pilota - ja, jak większość z Was, ciągle gubię swoje piloty, a ta nieszczęście jest dość frustrujące, więc myślę, że to rozwiążemy! Zbudowałem ten pilot i dyskretnie osadziłem go w mojej niestandardowej ramie łóżka (jestem również stolarzem) - nie mogę zgubić pilota, jeśli jest on częścią mojej ramy łóżka!

Kieszonkowe dzieci

Potrzebne rzeczy: -Arduino UNO lub Nano - przebieg może się różnić w zależności od innych płyt

-Płytka stykowa bez lutowania (lub stripboard do lutowania, jeśli chcesz, aby była bardziej trwała)

-Zworki o różnych kolorach i długościach

-Chwilowe przyciski (5) (możesz dodać więcej przycisków, ale będziesz musiał użyć pinów cyfrowych, ponieważ używane są wszystkie piny analogowe oprócz jednego - musisz sprawdzić, czy prawidłowo używasz rezystorów podciągających lub ściągnij rezystory i odbij przyciski)

-10K Ohm rezystor (5) (jeśli chcesz więcej przycisków, będziesz potrzebować ich więcej)

Rezystor -470 Ohm (2)

-LED na podczerwień

-Czerwona dioda LED

-Czujnik podczerwieni (użyłem numeru części VS1838B, możesz użyć innego, po prostu sprawdź piny)

(Opcjonalnie) Lutownica, lut, topnik lutowniczy.

Krok 1: Budowanie obwodu:

Budowanie obwodu
Budowanie obwodu

1). Zawsze lubię zaczynać od rozłożenia moich komponentów, ponieważ to zawsze steruje układem na płytce prototypowej.

-Wciskać przyciski

-LEDS: czerwona dioda LED i dioda podczerwieni są połączone w tandemie, dzięki czemu możesz zobaczyć, co robi dioda podczerwieni.

-Czujnik

2). Rezystory

- Pięć rezystorów 10K, które dołączyliśmy do przycisków, to rezystory typu „pull down”. Rezystory ściągające zapewniają, że gdy przycisk nie zostanie wciśnięty, odpowiedni pin Arduino otrzyma 0 V (lub przynajmniej blisko niego). Więcej informacji na temat rezystorów pull down (lub pull up) znajdziesz w szczegółowym przewodniku:

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

Rezystory te mogą nie być całkowicie potrzebne, ale jeśli otrzymujesz „duchowe” popchnięcia, jest to bardziej niż prawdopodobne spowodowane sprzężeniem pojemnościowym i rezystory ściągające zapobiegają temu.

3). Przewody obwodu

4). 5V i przewody uziemiające

Użyj dostarczonego zdjęcia w celach informacyjnych! nie bój się jednak zmieniać go dla swoich potrzeb!

Krok 2: Kod:

#include const int PIN_ODBIORU = 7; // odczyt czujnika podczerwieni int Button1 = A4;// Najdalszy lewy int Button2 = A3; // drugi od lewej int Button3 = A2; // Środkowy int Button4 = A1; // drugi od prawej int Button5 = A0; // Najdalej na prawo int LED = 3; // IR LED i czerwona dioda LED int val = 0; // Zmiana wartości IRsend irsend; IRrecv nieodwoł.(RECV_PIN); decode_results wyniki;

void setup() {pinMode(Przycisk1, WEJŚCIE); pinMode(Przycisk2, WEJŚCIE); pinMode (Przycisk 3, WEJŚCIE); pinMode(Przycisk4, WEJŚCIE); pinMode (Przycisk 5, WEJŚCIE); pinMode (LED, WYJŚCIE); Serial.początek(9600); nieodwoł.enableIRIn(); irrecv.blink13(true);} void loop() {{{if (analogRead(Przycisk1)>900)irsend.sendNEC(0xFF02FD, 32); // użycie odczytu analogowego zamiast odczytu cyfrowego, aby uniknąć problemów z pojemnością. również pomaga odbić przyciski. // Odczyt analogowy na poziomie 900 pozwala na pewne ruchy w wartościach, co oznacza, że sygnał infra zostanie wysłany, nawet jeśli do pinu nie zostanie przyłożone pełne 5 V. //ale 900 jest wystarczająco wysokie, aby nie odczytać błędnie z powodu pojemnościowego opóźnienia sprzężenia (100);}//RGB Strip On&off {if (analogRead(Button5)>900) {for (int i = 0; i < 3; i++) // zmiana wartości w "i < 3" zmieni liczbę natychmiastowych powtórzeń sygnału. więc "i < 2" powtórzy sygnał dwukrotnie. // być może będziesz musiał pobawić się tą liczbą, jeśli Twój telewizor nie odpowiada, ogólnie 1 lub 3 działają najlepiej, jeśli nie, wypróbuj liczby nieparzyste. // być może będziesz musiał zagrać z wartościami opóźnienia sygnału intra, na przykład dla mojego telewizora 10 działa, ale 30 nie. {irsend.sendSony(0xa90, 12); // Kod zasilania telewizora Sony, dla mojego telewizora kod musi zostać wysłany 3x3, czyli 3 impulsy, trzy oddzielne czasy opóźnienia(10); // "opóźnienie sygnału wewnętrznego" for (int i = 0; i < 3; i++) {irsend.sendSony(0xa90, 12); // "12" to numer bitu, różne protokoły wymagają różnych numerów bitów. NEC to 32, Sony to 12, możesz sprawdzić pozostałe opóźnienia(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); // Opóźnienie zmniejszania głośności telewizora Sony (100);}}} delay (100);} if (irrecv.decode(&results)) // poniższa część kodu umożliwia interpretację sygnałów podczerwieni z różnych pilotów. { Serial.println(wyniki.wartość, HEX); // wygeneruje procedurę „NEC, Sony, itp..” i kod telewizora „c90, a90, FF02FD”, musisz dodać 0x z przodu przełącznika kodu telewizora (results.decode_type) {case DENON: Serial.println("DENON"); przerwa; przypadek NEC: Serial.println("NEC"); przerwa; przypadek PANASONIC: Serial.println("PANASONIC"); przerwa; case SONY: Serial.println("SONY"); przerwa; przypadek RC5: Serial.println("RC5"); przerwa; case JVC: Serial.println("JVC"); przerwa; przypadek SANYO: Serial.println("SANYO"); przerwa; sprawa MITSUBISHI: Serial.println("MITSUBISHI"); przerwa; sprawa SAMSUNG: Serial.println("SAMSUNG"); przerwa; sprawa LG: Serial.println("LG"); przerwa; przypadek RC6: Serial.println("RC6"); przerwa; case DISH: Serial.println("DISH"); przerwa; przypadek SHARP: Serial.println("SHARP"); przerwa; case WHYNTER: Serial.println("WHYNTER"); przerwa; sprawa AIWA_RC_T501: Serial.println("AIWA_RC_T501"); przerwa; domyślnie: case NIEZNANE: Serial.println("NIEZNANE"); przerwa;} nieodwoł.wznawianie();}}

Krok 3: Kod w głąb: Wysyłanie sygnałów IR

Będę odnosił się do linii kodu według ich numeru - aby śledzić dalej, użyj tego linku:

pastebin.com/AQr0fBLg

Najpierw musimy dołączyć IR Remote Library przez z3t0.

Oto link do biblioteki:

github.com/z3t0/Arduino-IRremote

Jeśli potrzebujesz przewodnika, jak poprawnie pobrać bibliotekę i zainstalować ją w IDE:

www.arduino.cc/en/guide/libraries

Linia 1 zawiera bibliotekę.

Następnie musimy zadeklarować kilka zmiennych, robią to wiersze 2-12.

Używamy " cost int ", aby zdefiniować zmienne, które się nie zmienią, ale wszystkie oprócz jednej należą do tej kategorii.

Używamy " int " do definiowania zmiennych, które ulegną zmianie.

Musimy użyć pinu z impulsem z modulacją (PWM) dla naszego pinu LED - wystarczy dowolny pin, który obok niego ma "~", w moim kodzie - używamy cyfrowego pinu 3.

Następnie musimy przeprowadzić konfigurację - ten kod uruchomi się tylko raz, gdy Arduino zostanie włączone lub zresetowane.

Zauważ, że definiujemy nasze wejścia i wyjścia (15-20), uruchamiamy monitor szeregowy (21), włączamy czujnik podczerwieni (22) i mówimy Arduino, aby mrugał diodą LED na płycie za każdym razem, gdy otrzymamy sygnał w czujniku (23).

Następnie zbudujemy naszą pętlę - ten kod będzie działał wielokrotnie, przechodząc od góry do dołu kilka razy na sekundę.

W linii 25 używamy instrukcji if, która mówi Arduino „szukaj tych konkretnych kryteriów, jeśli te kryteria są spełnione, zrób tę konkretną rzecz”. W tym przypadku kryterium to analogRead(Button1)>900, czyli innymi słowy - „Arduino, Look at button1, który wcześniej zdefiniowaliśmy jako pin A4, jeśli odbierany sygnał analogowy jest większy niż 900, przejdź do naszych następnych instrukcji, jeśli nie, przejdź dalej”. Jest tu trochę do rozpakowania, więc zanurkujmy: sygnał analogowy na Arduino ma wartość równą lub mniejszą niż 5 V, przy 5 V równym 1023, a 0 V równym 0. Dowolne napięcie z zakresu od 0 do 5 V można zdefiniować za pomocą liczba i przy odrobinie matematyki możemy obliczyć tę liczbę lub odwrotnie, napięcie. Podziel 1024 (zaliczymy 0 jako jednostkę) przez 5, co daje 204,8. Na przykład używamy liczby 900, aby przełożyć to na napięcie, po prostu dzielimy 900 przez 204,8, co daje ~4,4V. Mówimy Arduino, aby szukał napięcia większego niż ~4,4 V, a jeśli tak, wykonaj naszą następną instrukcję.

Mówiąc o następnych instrukcjach (linia 25), widzimy irsend.sendNEC(0xFF02FD, 32). To mówi „Arduino, wyślij modulowany impuls zgodny z protokołem NEC, w szczególności sygnałem FF02FD, i upewnij się, że ma on 32 bity”. To sprawi, że nasza dioda LED IR będzie migotać w sposób zrozumiały dla innych urządzeń. Pomyśl o tym trochę jak alfabetem Morse'a, ale tylko z niewidzialnym światłem! Istnieje wiele różnych protokołów, z których każdy zawiera setki, jeśli nie tysiące indywidualnych sygnałów, a każdy ma określoną liczbę bitów – nasze urządzenie będzie w stanie rozpoznać ogromną ilość tych sygnałów, ale zajmiemy się tym później!

W linii 28 mamy nasze pierwsze opóźnienie – ma to na celu zapobieżenie niezamierzonym powtarzaniu sygnałów, po naciśnięciu przycisku i wysłaniu sygnału IR mamy 100 milisekund, aby zdjąć palec z przycisku. to nie wydaje się dużo czasu, ale w praktyce wydaje się, że działa dobrze. funkcja opóźnienia mówi Arduino „nie rób nic przez X milisekund”, a dla porównania, są to 1000 milisekund na sekundę.

Przechodząc do naszego następnego przycisku w linii 29, button5 (pierwotnie miałem 4 przyciski na tym pilocie, dodałem piąty, więc dlatego nie jesteśmy w porządku). W duchu jest to to samo, co przycisk 1, ale z kilkoma kluczowymi różnicami. Pierwszą różnicą, jaką zobaczysz, jest instrukcja for - jest to zasadniczo kolejna pętla - pętla z inną większą pętlą, loopception. W szczególności mamy " for (int i = 0; i < 3; i++) ", przeczytaj to jako "Arduino, zacznijmy od 0, powtarzaj następujące instrukcje, aż dojdziemy do 3 razy". Funkcja for jest używana, ponieważ wiele urządzeń jest zaprogramowanych do wyszukiwania powtarzającego się sygnału, a w naszym przypadku 3 razy. Możesz po prostu zmienić numer 3 na inny numer, jeśli urządzenie wymaga innego harmonogramu powtórek. Kolejną kluczową różnicą w przypadku button5 jest to, że jest powtarzany ponownie, 3 razy lub 3x3. Innymi słowy, wysyłamy sygnał 3 razy, czekamy 10 milisekund, wysyłamy go ponownie 3 razy, czekamy kolejne 10 milisekund, a następnie wysyłamy ponownie 3 razy. Ten rodzaj komunikacji jest powszechny przy włączaniu i wyłączaniu urządzeń i może być właśnie tym, czego wymaga Twój telewizor lub urządzenie – kluczem do tego jest zabawa wszystkimi zmiennymi, aż uzyskasz pożądany rezultat. Zmień wartość krótkiego opóźnienia, zmień wartość powtarzania, wyślij 6 partii zamiast 3 itd. Urządzenia są celowo zaprogramowane z arbitralnymi regułami sygnału, wyobraź sobie, że pilot do telewizora wysyła sygnał tego samego typu, co soundbar; za każdym razem, gdy zmieniasz kanał w telewizorze, soundbar wyłącza się - dlatego obowiązują różne zasady dotyczące sygnału.

Kolejne trzy przyciski są zaprogramowane według tych samych zasad, przynajmniej w części, opisanych powyżej - możemy więc przejść do linii 55.

Krok 4: Kod w głąb: Odbieranie sygnałów IR

Kod w głąb: Odbieranie sygnałów IR
Kod w głąb: Odbieranie sygnałów IR

W linii 55 zaczynamy programować Arduino do interpretacji sygnałów podczerwieni wysyłanych przez inne piloty - jest to konieczne, abyś mógł dowiedzieć się, jakie protokoły i sygnały wykorzystują twoje piloty. Pierwsza linia kodu w linii 55 to if (irrecv.decode(&results) przeczytaj to jako „Arduino, poszukaj kodu IR, jeśli go znajdziesz, zwróć wartość true, jeśli nic nie znaleziono, zwróć false. informacje w "wyniki".

Przechodząc do linii 56, mamy Serial.println(results.value, HEX) z napisem „Ardunio, wydrukuj wyniki na monitorze szeregowym w formacie HEX”. Hex, czyli szesnastkowy, to sposób, w jaki możemy skrócić łańcuch binarny (tylko zera i jedynki) do czegoś łatwiejszego do wpisania. Na przykład 101010010000 to "a90", kod używany do wyłączania i włączania mojego telewizora, a 111111110000001011111101 to 0xFF02FD, który steruje moją taśmą RGB. Możesz użyć powyższego wykresu, aby przekonwertować binarny na szesnastkowy i odwrotnie, lub możesz użyć następującego linku:

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

Do linii 57 mamy nową funkcję, zwaną przypadkiem przełącznika.

Zasadniczo przypadek przełącznika pozwala nam określić różne instrukcje na podstawie wyników danej zmiennej (przypadek). przerwa wychodzi z instrukcji switch i jest używana na końcu każdej instrukcji.

Używamy tutaj przełącznika, aby zmienić sposób drukowania na monitorze szeregowym w oparciu o protokoły, które nasz Arduino wykrywa z różnych pilotów.

Krok 5: Wniosek

Jeśli masz pytanie - skontaktuj się ze mną tutaj! Chętnie postaram się pomóc najlepiej jak potrafię.

Mam nadzieję, że nauczyłeś się czegoś, co możesz wykorzystać, aby uczynić swoje życie trochę lepszym!

-RB

Zalecana: