Skocz do zawartości

DevTomek

Użytkownicy
  • Zawartość

    16
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

DevTomek wygrał w ostatnim dniu 6 września

DevTomek ma najbardziej lubianą zawartość!

Reputacja

12 Dobra

O DevTomek

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Lodz
  • Języki programowania
    Java, C/C++
  • www

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. Widzę, że pod tym postem pojawiła się spora dyskusja, ale chciałbym również przypomnieć, że nie twierdzę że moje podejście do tego problemu jest najbardziej optymalne jeśli chodzi o użyty sprzęt, zastosowane technologie itp. W projekcie wykorzystałem to co miałem pod ręką oraz technologie, które znam, wiem jak działają i przede wszystkim, które używam na co dzień w swoich projektach. Chciałbym również przytoczyć taki mały cykl życia tworzenia takiego projektu. Wszystko zaczyna się od pomysłu urządzenia które ma rozwiązać jakiś faktyczny problem i tak było w tym przypadku. Na początku stworzyłem pierwszą wersję urządzenia z zestawem ATB, gdyż taki posiadam i nadaje on się świetnie do prototypownia, bo mogłem skupić się na pisaniu kodu, a nie na lutowaniu i doborze poszczególnych komponentów. Prototyp ten był testowane przeze mnie przez dłuższy okres czas i finalnie okazało się, że wszystko działa tak jak powinno, więc mogłem przejść do kolejnego kroku. Gdyby jednak okazało się, że moje podejście do tego problemu jest błędne, to nie poniósłbym żadnych kosztów, bo ten zestaw został właśnie specjalnie zakupiony do tworzenia takich prototypów. W kolejnej iteracji zamieniłem zestaw ATB na Arduino, gdyż jest tanie z mojego punktu widzenia. I oczywiście, jeśli miałoby to być urządzenie, które chciałbym sprzedawać to wtedy zastanowiłbym się na dalszej redukcji kosztów, ale w tym przypadku była to sprawa drugorzędna. Dodatkowo zastosowałem Arduino, a nie jakieś gotowe moduły IR, żeby mieć możliwość dalszego rozwoju projektu. Myślę, że to podsumowanie odpowie na kilka pytań jakie pojawią się podczas czytania tej dyskusji
  2. Jeśli jest taki sam to dlaczego powstają takie dystrybucję jak raspbian? Po drugie zainstalujesz minta na raspberry pi? Btw. Jakie piny GPIO chcesz sterować w PC? GPIO od stacji dyskietek? rozumiem, że masz na myśli kontrolę nad urządzeniami peryferyjnymi, ale to nie jest GPIO z tego co wiem 
  3. @Elvis zgadzam się z Twoją wypowiedzią i miałem kiedyś takie samo zdanie jak Ty dot. Atnel'a. Co do mojego projektu to widzę, że wśród użytkowników czytający ten oraz poprzedni post jest małe niezrozumienie, bo zastosowany przeze mnie komputer to jest zwykły mini PC, nie jest to żaden ARM jak raspberry pi czy coś w tym stylu. Komputer ten psiada zwykły system Linux mint cinnamon x64 taki sam jaki używam na swoim stacjonarnym komputerze i nie ma on nic wspólnego z komputerami jednoukladowymi
  4. Dokładnie, w przemysłowych są takie peryferia, ale w tym nie ma. Odnośnie przejściówki, to sama przejściówka nic nie da, bo trzeba dokupić jeszcze jakiś moduł IR co wiąże się z dodatkowymi kosztami. Ale ogólnie rzecz ujmując to, czy kupowanie gotowych modułów można nazwać czymś rozwojowym i twórczym? Przecież w każdym projekcie chodzi o to, żeby nauczyć się czegoś nowego i jak sama nazwa działu wskazuje (DIY) zrobić coś samemu. Przy produkcji masowej można myśleć o redukowaniu kosztów i wykorzystywaniu gotowych modułów, ale tutaj raczej chodzi o customowe implementacje i swoją wizję rozwiązania danego problemu
  5. Czasy takich portów już dawno odeszły do lamusa tzn. już ich nie ma w nowych komputerach, a tym bardziej w tym. A po drugie, koszty Arduino (dokładnie mówiąc chińskich klonów) i odbiornika IR są tak małe, że nie warto brnąć w takie rozwiązania
  6. Ok, tylko nadal nie wiem jak miałbym odczytywać komendy IR bez użycia zewnętrznego modułu? Przecież ten Zotac to jest zwykły komputer bez dodatkowych pinow GPIO itp.
  7. Proszę rozwiń co masz na myśli pod pojęciem "pozbądź się całkowicie dodatkowego uC"?
  8. Witam wszystkich, To może ja zgłoszę swój ostatni projekt, który jest troszkę inny w stosunku do projektów zgłoszonych przez moich poprzedników Zaczęło się od tego... ...a finalnie zakończyło się na tym
  9. Po analizie sugestii użytkowników jakie pojawiły się pod pierwszą wersję projektu, postanowiłem rozbudować projekt o zewnętrzny moduł IR tym samym zastępując wykorzystany wcześniej zestaw Atnel ATB na Arduino Nano Migracja z zestawu ATB do Arduino Proces migracji z ATB do Arduino był stosunkowo prosty, ponieważ głównym zadaniem tego zewnętrznego modułu jest odczytywanie komend IR z pilota i przesyłanie ich do komputera. Biorąc pod uwagę fakt, że każde Arduino jest wyposażone w układ pozwalający na komunikację UART<->USB, proces developmentu sprowadził się w głównej mierze do doboru bibliotek, których w sieci jest bardzo dużo. Dodatkowa rozbudowa - LCD Podczas tworzenia zewnętrznego modułu IR postanowiłem również zaimplementować wyświetlacz LCD 2x16 ze sterownikiem HD44780 w celu wyświetlania dodatkowych informacji o aktualnie oglądanym programie TV. Niestety nie posiadałem konwertera HD44780<->I2C, który pozwala na sterowanie tym wyświetlaczem przy użyciu 4 przewodów (w tym 2 zasilających). W rezultacie, w środku urządzenia znajduje się dużo przewodów połączeniowych. Hardware Jeśli chodzi o część sprzętową modułu, to składa się ona z Arduino Nano, wyświetlacza LCD HD44780, odbiornika IR TSOP31236 oraz kilku biernych elementów elektronicznych. Do budowy korpusu modułu wykorzystałem niepotrzebne etui na okulary (eco-friendly xD). Poniżej zamieszczam schemat elektryczny oraz połączeniowy modułu, który został stworzony przy użyciu darmowego programu Fritzing. Software Sam program na Arduino jest stosunkowo prosty i łatwy do analizy. W głównej pętli programu wywoływane są funkcje do odczytu/aktualizacji stanu całej aplikacji oraz jednego przerwania, które nakręca softwarowy timer odpowiedzialny za scrollowanie tekstu na wyświetlaczu. W oprogramowanie modułu można wyróżnić cztery główne stany: Odczyt komend z IR i wysłanie ich do komputera. Odczyt danych z komputera dot. aktualnie oglądanego programu TV. Aktualizacja danych do wyświetlenia na wyświetlaczu LCD - aktualizacja bufora. Wyświetlenie informacji na LCD - scrollowanie. Scrollowanie tekstu odbywa się w jednym z dwóch trybów. Pierwszy (no force) wyświetla aktualny tekst z bufora, a sam bufor jest aktualizowany dopiero, gdy cała zawartość zostanie wyświetlona (płynne przejście). Drugi tryb (force) wymusza natychmiastową aktualizację bufora, a proces scrollowania zaczyna się od początku. Tryb ‘force’ jest wykorzystywany w momencie zmiany aktualnie oglądanego kanału, natomiast tryb ‘no force’ podczas aktualizacji informacji o aktualnie oglądanym programie (w głównej mierze chodzi o aktualizację postępu aktualnie oglądanego programu wyrażonego w procentach) /* AVR Ipla TV Box. version: v1.1.0 author: DevTomek.pl */ #include <LiquidCrystal.h> // LiquidCrystal by Arduino, Adafruit version 1.0.7 #include <IRremote.h> // IRremote by shirriff version 2.2.3 // LED const int INFO_LED = 13; // IR const int IR_SENSOR = 2; IRrecv irrecv(IR_SENSOR); decode_results results; // LCD const int SCREEN_WIDTH = 16; const int SCREEN_HEIGHT = 2; const int RS = 7, EN = 8, D4 = 9, D5 = 10, D6 = 11, D7 = 12; LiquidCrystal lcd(RS, EN, D4, D5, D6, D7); // Serial Read const char READ_DATA_SEPARATOR = '|'; const uint8_t READ_BUFFER_SIZE = 255; char readBuffer[READ_BUFFER_SIZE]; boolean hasNewData = false; // Global Variables String line1 = "AVR-Ipla-TV-Box"; String line1Buffer = line1; unsigned int line1Length = 16; String line2 = " DevTomek "; String line2Buffer = line2; int stringStart, stringStop = 0; int scrollCursor = SCREEN_WIDTH; volatile uint8_t timer1 = 0; void setup() { /* Based on: Arduino Timer Interrupts Calculator */ // TIMER 1 for interrupt frequency 100 Hz: cli(); // stop interrupts TCCR1A = 0; // set entire TCCR1A register to 0 TCCR1B = 0; // same for TCCR1B TCNT1 = 0; // initialize counter value to 0 // set compare match register for 100 Hz increments OCR1A = 19999; // = 16000000 / (8 * 100) - 1 (must be <65536) // turn on CTC mode TCCR1B |= (1 << WGM12); // Set CS12, CS11 and CS10 bits for 8 prescaler TCCR1B |= (0 << CS12) | (1 << CS11) | (0 << CS10); // enable timer compare interrupt TIMSK1 |= (1 << OCIE1A); sei(); // allow interrupts Serial.begin(9600); Serial.println("Starting initialization..."); pinMode(INFO_LED , OUTPUT); lcd.begin(SCREEN_WIDTH, SCREEN_HEIGHT); irrecv.enableIRIn(); Serial.println("Initialization done!"); } void loop() { readIRData(); readSerialData(); updateData(); if (timer1 > 25) { scroll(); timer1 = 0; } } ISR(TIMER1_COMPA_vect) { timer1++; } void readIRData() { if (irrecv.decode(&results)) { if (results.value != 0xFFFFFFFF) { digitalWrite(INFO_LED , HIGH); Serial.println(results.value, HEX); digitalWrite(INFO_LED , LOW); } irrecv.resume(); } } void readSerialData() { while (hasNewData == false && Serial.available() > 0) { static uint8_t ndx = 0; char rc = Serial.read(); if (rc != '\n') { readBuffer[ndx] = rc; ndx++; if (ndx >= READ_BUFFER_SIZE) { ndx = READ_BUFFER_SIZE - 1; } } else { readBuffer[ndx] = '\0'; ndx = 0; hasNewData = true; } } } void updateData() { if (hasNewData == true) { // RX frame structure: [LINE_1_DATA|LINE_2_DATA|IS_FORCE_MODE] line1Buffer = getValue(readBuffer, READ_DATA_SEPARATOR, 0); line2Buffer = getValue(readBuffer, READ_DATA_SEPARATOR, 1); boolean isForceMode = getValue(readBuffer, READ_DATA_SEPARATOR, 2) == "true"; if (isForceMode) { updateLcdData(); } hasNewData = false; } } String getValue(String data, char separator, int index) { int found = 0; int strIndex[] = {0, -1}; int maxIndex = data.length() - 1; for (int i = 0; i <= maxIndex && found <= index; i++) { if (data.charAt(i) == separator || i == maxIndex) { found++; strIndex[0] = strIndex[1] + 1; strIndex[1] = (i == maxIndex) ? i + 1 : i; } } return found > index ? data.substring(strIndex[0], strIndex[1]) : ""; } void scroll() { lcd.clear(); lcd.setCursor(scrollCursor, 0); lcd.print(line1.substring(stringStart, stringStop)); lcd.setCursor(0, 1); lcd.print(line2); if (stringStart == 0 && scrollCursor > 0) { scrollCursor--; stringStop++; } else if (stringStart == stringStop) { updateLcdData(); // update the text as the previous one will be displayed } else if (stringStop == line1Length ) { stringStart++; } else if (line1Length < SCREEN_WIDTH && stringStop == (SCREEN_WIDTH + line1Length) ) { stringStart++; stringStop = stringStart; } else { stringStart++; stringStop++; } } void updateLcdData() { stringStart = stringStop = 0; scrollCursor = SCREEN_WIDTH; line1 = line1Buffer; line2 = line2Buffer; line1Length = line1.length(); } Podsumowanie Na koniec chciałbym tylko zaznaczyć, że zastosowany na początku projektu zestaw Atnel ATB, był celowym wyborem, ponieważ projekt był wtedy w fazie rozwoju, więc zastosowanie zestawu uruchomieniowego miało jak najbardziej sens. Po długotrwałych testach okazało się, że cały projekt zakończył się sukcesem i wszystko działa zgodnie z moimi oczekiwaniami, co oznaczało że trzeba przejść do kolejnego etapu, czyli stworzenie finalnej wersji urządzenia i zastąpienie zestawu uruchomieniowego, czymś w rodzaju zewnętrznego modułu IR. Na koniec zamieszczam krótki filmik przedstawiający aktualną wersję mojego urządzenia AVR-IplaTV-Box. Zapraszam również na mojego bloga AVR-IplaTV-Box - zamieniamy zestaw Atnel ATB na Arduino do zapoznania się z wpisem dot. opisanej wyżej migracji.
  10. To może ja spróbuje jako pierwszy, najwyżej Admin usunie ten komentarz jeśli projekt nie będzie kwalifikował się do udziału w konkursie Projekt który zgłaszam to: AVR-IplaTV-Box, czyli Ipla TV na Twoim telewizorze!
  11. Dzięki za opinie Właśnie największy problem jest z "Kanały TV" i pakiet np. "NEWS I ROZRYWKA", bo do korzystania z tej usługi i potrzebna jest nowsza wersja Ipli, czyli nowszy Smart TV
  12. Finalnie (jeśli znajdę chwilkę wolnego czasu) to zestaw ATB zamienię Arduino Nano (które również mi zalega na półce) i wtedy całą płytkę wraz z odbiornikiem IR zamontuję wewnątrz tego komputerka, ponieważ w tej obudowie jest jeszcze trochę miejsca i spokojnie to wszystko się zmieści. Głupotą byłoby zostawić taki zestaw tylko po to żeby odczytywał kody z pilota IR
  13. Masz 100% racji! Zestaw ten zastosowałem tylko do developmentu, bo ma wbudowany odbiornik IR. Finalnie można to zrobić na zwykłym Arduino i pisze o tym podejściu na swoim Blogu
  14. Tak, tylko nie na każdym TV można oglądać. Projekt ten zrobiłem prawie rok temu i wtedy wsparcie dla kanałów TV było znikome. Ipla cały czas poszerza game urządzeń na których można oglądać TV i ostatnia aktualizacja (30.08.2019) spowodowała że na moim TV (Sharp) nie mam w ogóle Ipli (po prostu z dnia na dzień zniknęła). Tutaj można zobaczyć jak to wszystko dynamicznie się zmienia https://pomoc.ipla.tv/pytanie/tabela-dostepnosci-pakietow i ciągle są urządzenia dla których nie ma wsparcia. Jeśli ktoś posiada Smart TV od Samsunga to wsparcie dla tej marki jest największe, pozostałe marki mają gorzej. Uwierz mi jak robiłem research tego tematu jakiś czas temu to nie można było oglądać kanałów TV na żadnym Smart TV, dopiero stopniowo Ipla wprowadziła wsparcie kanałów TV dla różnych modeli Smart TV i proces ten ciągle trwa. Być może za jakiś czas Ipla będzie wspierać wszystkie Smart TV i projekt ten stanie się bezużyteczny, ale obecnie jestem w gronie tych osób które posiadają Smart TV bez wsparcia dla Ipla TV
  15. To widocznie jesteś tym szczęśliwcem, który posiada TV Samsunga na którym można oglądać te kanały, bo u mnie jak i u 99% osób nie jest to możliwe..
×
×
  • Utwórz nowe...