Witam.
Dzisiaj mały projekcik, który przy odrobinie szczęścia można zrealizować w ciągu jednego wieczora z użyciem części znalezionych w szufladzie (zakładam tu oczywiście, że każdy szanujący się majsterkowicz ma w szufladzie co najmniej jeden egzemplarz Arduino – ot tak, na wszelki wypadek). Ale najpierw geneza projektu.
Jako że mój dekoder Polsatu zaczął chorować na dyskopatię oraz zdradzać objawy rychłego przejścia do Krainy Wiecznych Zakłóceń postanowiłem sprawić sobie coś nowego, a przede wszystkim nowocześniejszego. Jedynym sensownym wyborem był EVOBOX PVR – i po paru przygodach z paniami z Polsatu (pasujących niestety bardziej do Piekielnych niż Majsterkowa) nowiutki dekoder stanął na honorowym miejscu pod telewizorem.
Na pierwszy ogień poszła oczywiście konfiguracja tego, czego poprzedni dekoder nie miał – a mianowice CEC. Po kilku kliknięciach wydawało się, że dekoder świetnie się dogaduje z moim telewizorem i z nadzieją, że nie będę już musiał bawić się dwoma pilotami na raz spróbowałem skonfigurować regulację głośności. I tu zonk… okazało się, że mój telewizor nie ma najmniejszego zamiaru reagować na sygnał głośności z dekodera.
Dlatego postanowiłem zrobić coś, co przetworzy sygnał pilota Polsatu na kody Samsunga.
Przeszukanie szuflady dało nastęujące rezultaty:
Arduino Pro Mini (bez wlutowanych pinów)
Odbiornik podczerwieni (nie mam pojęcia jaki typ, z demontażu ze startymi oznaczeniami)
Dioda nadawcza
Uszkodzona ładowarka do e-papierosa (wykorzystałem kabel USB)
Różnej maści tranzystory, oporniki i kondensatory.
Zacząłem od prób z moim dyżurnym Arduino Uno. Początkowo spróbowałem podłączyć diodę nadawczą przez rezystor bezpośrednio do pinu wyjścia Arduino – niestety, okazało się że przy 220Ω dioda ledwo świeci i telewizor w ogóle na nią nie reaguje. Dlatego końcowy układ wygląda tak:
Można zastosować tu dowolny tranzystor przełączający NPN wytrzymujący co najmniej 100 mA. Pojemność kondensatora nie jest krytyczna (nie powinien być po prostu mniejszy niż 4.7µF, ja miałem pod ręką 10µF i taki zastosowałem). Rezystor R1 również może być dowolny – od 200Ω do 2kΩ powinien działać.
Zamówiłem obudowę Z-85 (korzystając z tego, że sąsiad wybierał się akurat do sklepu) i w międzyczasie zacząłem eksperymentować z programem. Już na wstępie okazało się, że bezpośrednia translacja jest niemożliwa. Telewizor reagował tylko na pierwszy impuls (nie powtarzanie), po wprowadzeniu półsekundowego odstępu natomiast impulsy z pilota przychodziły za często, i w efekcie telewizor albo głupiał, albo zmieniał głośność w tempie wyścigowym. Trochę prób – i wszystko zaczęło grać, telewizor zaczął reagować dokładnie tak jak chcę. Kod nie jest długi, chociaż pisany trochę “na kolanie” – ale działa bezbłędnie i mogę go tu z czystym sumieniem zamieścić.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
#include <IRremote.h> #define RECV_PIN 5 // Zamkomentuj jeśli nie chcesz kontrolki #define LED_PIN 13 // Odkomentuj jeśli potrzebujesz informacji na wyjściu // #define USE_SERIAL 1 IRrecv irrecv(RECV_PIN); IRsend irsend; // DOstosuj do swojego telewizora #define TV_VOLUP 0xE0E0E01FL #define TV_VOLDOWN 0xE0E0D02FL #define sendTV sendSAMSUNG // kody pilota dekodera POLSAT #define SAT_VOLUP 0x9737D515L #define SAT_VOLDOWN 0x419C5713L decode_results results; bool mresume = false; void setup() { #ifdef USE_SERIAL Serial.begin(9600); #endif #ifdef LED_PIN pinMode(LED_PIN, OUTPUT); #endif irrecv.enableIRIn(); } uint32_t last_vol_sent; void sendVol(int v) { #ifdef USE_SERIAL startLog(); Serial.print("Vol "); Serial.println(v); #endif for (int i=0; i< 4; i++) { if (v < 0) irsend.sendTV(TV_VOLDOWN, 32); else if (v > 0) irsend.sendTV(TV_VOLUP, 32); } irrecv.enableIRIn(); mresume = false; last_vol_sent = millis(); } int8_t vmode,vstep; uint32_t last_vol_key; void vol(int which) { #ifdef LED_PIN digitalWrite(LED_PIN, 1); #endif last_vol_key = millis(); if (vmode != which) { vstep = 0; sendVol(which); #ifdef LED_PIN digitalWrite(LED_PIN, 0); #endif delay(50); vmode = which; return; } if (!vstep && millis() - last_vol_sent >= 500) { vstep = 1; } } #ifdef USE_SERIAL int stepLog; void startLog(void) { char buf[16]; uint32_t m = millis(); int msec = m % 1000; m /= 1000; int mi = m % 60; int ha = (m / 60) % 60; sprintf(buf,"%02d:%02d.%04d ", ha, mi,msec); Serial.print(buf); } #endif void loop() { if (irrecv.decode(&results)) { mresume = true; #ifdef LED_PIN digitalWrite(LED_PIN, 1); #endif #ifdef USE_SERIAL startLog(); Serial.print(stepLog++, DEC);Serial.print(" "); Serial.print(results.decode_type, DEC);Serial.print(" "); Serial.print(results.bits, DEC);Serial.print(" "); Serial.println(results.value, HEX); #endif if (results.value == SAT_VOLDOWN) { vol(-1); } else if (results.value == SAT_VOLUP) { vol(1); } #ifdef LED_PIN else if (!vmode) { delay(10); digitalWrite(LED_PIN, 0); } #endif } if (vmode) { int delta = millis() - last_vol_key; if (delta > 550) { #ifdef USE_SERIAL startLog(); Serial.println("Stop"); #endif vmode = 0; #ifdef LED_PIN digitalWrite(LED_PIN, 0); #endif } else if (vstep) { delta = millis() - last_vol_sent; if (delta >= 200) sendVol(vmode); } } if (mresume) { irrecv.resume(); mresume = false; } } |
Trzeba tu pamiętać o odpowiednim skonfigurowaniu dekodera. W normalnej sytuacji telewizor powinien przejąć sygnał od trzech przycisków (V+, V-, Mute) i po włączeniu sterowania telewizorem dekoder na te klawisze nie reaguje. Na szczęście udało mi się znaleźć konfigurację, w której Mute obsługiwany jest bezpośrednio przez dekoder, natomiast V+ i V- o prostu są ignorowane. W tym celu należy wyłączyć sterowanie telewizorem i włączyć dźwięk przestrzenny.
Po odebraniu obudowy zacząłem przymierzać się do zmieszczenia tego wszystkiego wewnątrz. Początkowo myślałem o montażu “na pająka”, ale po dokładnym zmierzeniu uciąłem kawałek płytki uniwersalnej (cztery rzędy). Płytka trzyma się Arduino na kawałku druciku (ucięta końcówka od kondensatora) połączonym do GND i rezystorze R1 (od bazy tranzystora do D3). Teoretycznie w takiej sytuacji odbiornik powinien być również wlutowany w plytkę (wtedy trzecią łączówką byłoby połączenie płytki do D5) – niestety jak wspomniałem odbiornik miał bardzo krótko obcięte końcówki, i postanowiłem przykleić go po prostu do obudowy od wewnątrz, wiercąc uprzednio odpowiedni otwór.
Ponieważ do Arduino wlutowałem cztery piny kątowe służące do programowania, wykorzystałem je do umocowania całego układu wewnątrz. W tym celu z kawałka spienionego PCV 4mm wyciąłem prostokąt odpowiadający ścianie obudowy i wywierciłem w nim otworki (0.6mm) odpowiadające rozstawowi owych czterech pinów. Musiałem oczywiście wyciąć w nim jeszcze otwór na diodę (jak się później okazało jeszcze drugi na przeprowadzenie kabelka zasilającego), ale po złożeniu okazało się, że wszystko trzyma się znakomicie. W obudowie wywierciłem więc oprócz otworów na odbiornik i LEDę mały otworek na przedniej ścianie przez który prześwieca dioda sygnalizująca działanie pilota, złożyłem wszystko do kupy, obudowę okleiłem czarną taśmą izolacyjną (bo denko w Z-85 trzyma się na słowo honoru) i zadowolony z siebie zacząłem bawić się pilotem…
…no i na razie na zabawie się, skończyło, bo moje urządzenie przestało reagować na sygnał pilota Polsatu.
Powód okazał się trywialny. Otóż kabelki łączące odbiornik z płytką mają swoją określoną sprężystość, i po zamknięciu po prostu dociskały Arduino do denka, przy okazji wciskając reset. Pomogło doklejenie dwóch dodatkowych kawałeczków PCV do denka, aby utrzymać Arduino we właściwej odległości.
Po ponownym zmontowaniu całości przykleiłem urządzenie do stolika od telewizora taśmą dwustronna, aby nikomu nie przyszło do głowy przestawienie go w inne miejsce, podłączyłem zasilanie (w moim przypadku do huba, ale można podłączyć je do dowolnego nieużywanego gniazda USB w telewizorze – np. kamery) i teraz mogę cieszyć się obsługą obu urządzeń z jednego pilota.
Oczywiście taka obsługa jest możliwa tylko wówczas, gdy korzystamy z sygnału satelitarnego. W pozostałych przypadkach oryginalny pilot od telewizora może się przydać!
Obudowę Z-85 zamówiłem tylko dlatego, że nie miałem żadnego ładnego pudełeczka – te, które miałem nie bardzo nadawały się na wystawianie na widok. Samo umiejscowienie urządzenia podyktowane było w moim przypadku takim a nie innym ustawieniem telewizora – jest to sprawa indywidualna i w wielu przypadkach może się okazać, że obudowa może być dowolna bo urządzenie jest całkowicie schowane, lub zgoła nie jest w ogóle potrzebna.
Przepraszam za fatalną jakość zdjęć, ale nic lepszego od komórki nie mam, a mój model nie ma trybu makro.
Przyjemnego oglądania życzy
ethanak
Hm to jest urządzenie które jedynie zwiększa głośność jednym pilotem?
Nie tylko, również zmniejsza ;)
W mojej sytuacji nic więcej nie jest potrzebne – poza regulacją głośności reszta działa przez CEC. Można powiedzieć, że to po prostu taka proteza.
aha to tego nie doczytałem że inne komendy wykonuje przez CEC :) w takim razie za udaną protezę i operacje daje 5 :)
Widzę że autor obcykany w temacie pilotów. Mógł by autor umilić ludziom żywot i stworzyć jakiś poradnik dot. programowania pilotów? Mam tu na myśli coś nad czym zaczynam właśnie pracować. Już mnie wnerwiqa milion pilotów. Chciał bym stworzyć cos co udało by się przeprogramować kodami zczytanymi z innych pilotów tak by używac jednego pilota do dekodera tvsat, do tv i np. dekodera dvbt. Zczytać kody za pomocą irdy i Arduino już umiem ale nie umiem zaprogramować ich do jakiegokolwiek innego pilota.
Dzięki twojemu projektowi wpadłem na pomysł chcem użyć modulu Ethernet sheild i podłączyć to do sieci i za pomocą przeglądarki w smartfonie obsługiwać parę funkcji pilota.
Bardzo fajne rozwiązanie. Również chciał bym je wykonać tylko że nie znam się na Arduino. Czy mógł byś mi napisać dokładnie jaką bibliotekę IRremote należy pobrać ?