logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Rozwiązano] Przechwycanie ramki pilota bez standardu nadawania IR poprzez Arduino

DJCheester 06 Lis 2023 15:30 1605 46
Najlepsze odpowiedzi

Jak odczytać na Arduino ramkę z pilota IR, który nie używa popularnego standardu nadawania, i zapisać jej impulsy do tablicy mimo że `pulseIn()` pomija część sygnałów?

Trzeba zrezygnować z `pulseIn()` jako głównej metody pomiaru i napisać własny odbiornik oparty o prostą maszynę stanów, który rozpoznaje lead-in, kolejne bity oraz lead-out na podstawie progów czasowych i restartuje odczyt przy błędzie [#20803213] W Twoim przypadku sygnał odpowiada kodowaniu ITT, więc biblioteka IRremote nie rozpoznaje go poprawnie; trzeba dopasować dekodowanie do rzeczywistych czasów impulsów z analizatora, a nie do „uniwersalnego” standardu [#20802924][#20805595] W czasie odczytu nie wolno wykonywać `Serial.print()` w krytycznych miejscach, bo wydłuża to obsługę i gubi impulsy; jeśli już debugujesz, użyj jak najszybszego `Serial.begin()` i ewentualnie dodatkowych pinów debugowych do śledzenia stanów [#20803213][#20804743] Pomogło też zawężenie progów czasowych do realnych danych z Twojego pilota, bo czasy nie były idealnie zgodne ze specyfikacją ITT, a dopiero po korekcie okazało się, że odczyt jest stabilny i powtarzalny [#20805595][#20806648] Ostatecznie poprawny odbiór uzyskano właśnie przez własny kod z progami dla impulsów „0” i „1” oraz rozpoznawaniem całej ramki, zamiast prób mierzenia wszystkich czasów pojedynczymi wywołaniami `pulseIn()` [#20803213][#20806648]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
  • #1 20802348
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Witam wszystkich mam problem z Arduino i pilotem IR.

    A mianowicie mam pilota od starego sprzętu audio teraz buduję do tego sprzętu retro odtwarzacz CD i chciałbym sterować go oryginalnym pilotem.

    Przechwycanie ramki pilota bez standardu nadawania IR poprzez Arduino

    Problem w tym że ten pilot nie nadaje w żadnym znanym standardzie obsługiwanych transmisji, biblioteka IRremote w Arduino nie wykrywa danych.

    Zgrałem wszystkie dostępne biblioteki z Arduino i na jednej odczytuje takie coś.

    Kod: Text
    Zaloguj się, aby zobaczyć kod


    Jak widać 6x nacisnąłem ten sam przycisk raz błędnie pokazało, jednak problem polega na tym że dwa inne przyciski mają taki sam odzew w monitorze portu szeregowego.

    Więc szybko zrozumiałem że to nie tędy droga.

    Spróbowałem na piechotę, jako że w sprzęcie jest odbiornik podczerwieni jako metalowa puszka dosyć duża w środku pewnie elementy wzmacniacza sygnału na tranzystorach.

    Z odbiornika wychodzą trzy przewody zasilanie wyjście i masa, odbiornik zasilany jest napięciem 12V i wyjście linia out też jest na logice 12V.

    Podpatrzyłem jak to jest zrobione w oryginale np przy magnetofonie i skopiowałem układ formowania impulsów dla moich potrzeb. Oto schemat.

    Przechwycanie ramki pilota bez standardu nadawania IR poprzez Arduino

    Jak widać szyna resetu jest dwukierunkowa odbiór pilota jest na rysunku na pinie 9 Arduino i jest to zanegowany sygnał więc na szynie resetu po lewej stronie normalnie panuje 0V czyli stan niski, po stronie Arduino jest to za tranzystorem BC238 użytym jako negator panuje stan wysoki 5V pin podciągnięty zewnętrznym rezystorem 2.2k do zasilania Arduino 5V - to jest stan normalny.

    Teraz gdy naciskamy pilota na szynie resetu pojawiają się szpilki 12V ale to mnie mniej interesuje, bardziej interesuje mnie to co dzieje się na pinie Arduino. Podłączyłem zatem analizator stanów logicznych i przechwytuję, no i są ramki na logice 5V. Poniżej screen.

    Przechwycanie ramki pilota bez standardu nadawania IR poprzez Arduino

    Jak się przyjrzeć temu to widać krótkie impulsy logiczne 0V oraz długi inicjujący początek transmisji potem dane oraz długi kończący transmisję.

    Czasy tych stanów poniżej.

    Przechwycanie ramki pilota bez standardu nadawania IR poprzez Arduino Przechwycanie ramki pilota bez standardu nadawania IR poprzez Arduino Przechwycanie ramki pilota bez standardu nadawania IR poprzez Arduino

    No to teraz odpaliłem Arduino i chcę pomierzyć czasy trwania tych sygnałów na pinie użyłem funkcji pulseIn podobno działa ona od 10us więc powinno działać no i napisałem taki prosty kod.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Chciałem aby na początek pomierzył czasy i wyświetlił mi je na serial monitorze.

    Ku mojemu zdziwieniu wyświetlił tylko 6 czasów trzy długie i trzy krótki po przejściu całej ramki.

    Czyli otrzymałem to

    39 - Krotki
    80 - Dlugi
    30 - Krotki
    201 - Dlugi
    32 - Krotki
    83 - Dlugi
    32 - Krotki

    Czasy te w żaden sposób nie odpowiadają ramce, pytanie do Was. Gdzie jest problem jak odczytać poprawnie ramkę z tego pilota i zapisać np do tabeli.

    Patrząc na powyższą ramkę można by długim sygnałem wyszukiwać ciągu po odnalezieniu długiego około 340us sygnału logicznego 1 spisywać do tabeli kolejne sygnały z przedziału około 100us jako 0 i z przedziału 200us jako 1 taki ciąg sygnałów potem już bez problemu można by było wykorzystywać do sterowania funkcjami programu.

    Pytanie jest zasadnicze czemu wszystkie czasy mi nie wyświetla na serial monitorze.

    Może ktoś by mi pomógł i napisał prosty programik aby przechwycał dane w powyższy opisany sposób ?

    Myślałem i do głowy mi jeszcze przyszło że realny przebieg może być zniekształcony analizator sobie z tym radzi a Arduino nie więc zapiąłem oscyloskop, przebieg złapany Triggerem wygląda ładnie lekko nachylone zbocza ale poza tym jest ładny nie powinien to być problem zobaczcie sami.

    Przechwycanie ramki pilota bez standardu nadawania IR poprzez Arduino

    Do tej pory z biblioteką IRremote sobie radziłem, czytałem że można zrobić to na przerwaniach ale ja tego nie umiem napisać dlatego proszę Was o pomoc lub chociaż wskazówki jak do tego podejść.

    Z góry dziękuję za pomoc.

    Pozdrawiam...
  • #2 20802404
    waltersalata
    Poziom 25  
    Posty: 727
    Pomógł: 66
    Ocena: 290
    Zlap oscyloskopem cala ramke bo moze czestosc nosna jest nietypowa albo wysoka albo jakies nietypowe modulowanie.
  • #3 20802428
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Jutro z rana zrobię zdjęcie całej teraz mam tylko takie jeszcze.

    Oscyloskop Tektronix TDS 220 pokazujący przebieg sygnału.

    A tak zapytam co ma nośna do tego skoro odbiornik wypluwa sygnał zero-jedynkowy o znanych mi czasach trwania, czasy te są stabilne różnią się najwięcej kilka us.

    Zastanawia mnie czemu Arduino tego poprawnie nie rozpoznaje, gdyby coś siało byłoby to widać na oscyloskopie ?

    Pozdrawiam...
  • #4 20802601
    waltersalata
    Poziom 25  
    Posty: 727
    Pomógł: 66
    Ocena: 290
    DJCheester napisał:
    Jutro z rana zrobię zdjęcie całej teraz mam tylko takie jeszcze.

    A tak zapytam co ma nośna do tego skoro odbiornik wypluwa sygnał zero-jedynkowy o znanych mi czasach trwania, czasy te są stabilne różnią się najwięcej kilka us.

    Zastanawia mnie czemu Arduino tego poprawnie nie rozpoznaje, gdyby coś siało byłoby to widać na oscyloskopie ?

    Pozdrawiam...


    A czy odbiornik formuje tylko impulsy odebrane przez fotodiode czy dekoduje sygnal nalozony na nosna? Czy biblioteka ktora probujesz uzyc oczekuje nosnej z nalozonymi impulsami czy juz samych impulsow? Czy jesli nosnej to czy nosna jest w zakresie mozliwego pomiaru?
  • #5 20802612
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Gdyby odbiornik przepuszczał nośną była by widoczna ma oscyloskopie jest do 100Mhz a tam nic nie widać tylko impulsy o określonych czasach us.

    Co do bibliotek aż tak bardzo nie analizowałem w jaki sposób one odbierają impulsy ale program oparty tylko na funkcji pulseIn nie używa żadnej biblioteki z serii remote a też nieprawidłowo pokazuje..

    Nie rozbierałem tego odbiornika, ale wydaje się być z układem który formuje gotowe impulsy o znanych czasach co widać na oscyloskopie i analizatorze.

    Pytanie czemu pulseIn ich nie widzi wszystkich ? Omijając już biblioteki z serii remote.

    Pozdrawiam...
  • #7 20803027
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    O widzisz wreszcie konkret 😀

    Tak ale czy da się je przechwycić poprzez Arduino.

    PulseIn wychwytuje podobno od 10us tak piszą na stronie Arduino

    https://www.arduino.cc/reference/en/language/functions/advanced-io/pulsein/

    Pilot to ja mam więc nadajnik posiadam tylko teraz chodzi o to by procesor rozróżniał złapane sygnały.

    U mnie przebieg jest zanegowany więc krótkie sygnały zerowe mnie aż tak bardzo nie interesują, tzn nie muszę ich mierzyć. Ważne aby Arduino łapało wartości 300us 200us i 100us zboczem narastającym i je rozróżniało.

    Jeśli bym miał tablicę zadeklarowaną powiedzmy 15 znaków i kolejno przy wykryciu czasu high od 300us do 380us ten długi to wtedy kolejne złapane sygnały by rozpatrywało w granicach 180us do 240us i zapisywało do tabeli wartość 1 a gdy napotka sygnał o długości od 80us do 120us to by zapisywało do tabeli wartość 0.

    Wtedy bym za każdym wciśnięciem otrzymywał na serial monitorze ciąg 15 bitów zerojedynkowych co można by spisać do instrukcji switchcase i badać jeśli odbiornik napotka znany ciąg uruchamia powiedzmy przekaźnik w Arduino czyli wystawia stan wysoki na pin.

    Wiesz o co chodzi, chcę tego pilota użyć do sterowania gdzie odbiornikiem ma być Arduino. Problem na razie w tym że funkcja pulseIn nie wyłapuje wszystkich sygnałów z ramki i pytanie czy za pomocą przerwań mikrokontrolera można by było dokładniej zrobić pomiar tak aby wszystkie sygnały były złapane do tabeli.

    Pozdrawiam...
  • Pomocny post
    #8 20803213
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    Spróbuj poniższego kodu.
    Co prawda napisałem go "na kolanie", sprawdziłem tylko czy się kompiluje, ale zapewne zawiera kupę błędów.
    Idea jest taka, że wywołujesz wielokrotnie funkcję IrReceive(), aby odczytać pojedynczy bit z IR. Funkcja zwróci true, gdy odczyta pełne 11 bitów (również bit startowy w pozycji LSB; musisz sam sprawdzić, czy bit startowy ma wartość 0). W przypadku zbyt długich lub zbyt krótkich impulsów, odczyt kodu IR jest restartowany (rozpocznie odczyt po odebraniu impulsu lead-in).
    Zmienna currentBitNo przechowuje numer bitu (0-10), na który czekamy w danym momencie. Wartość 12 oznacza, że czekamy na początek transmisji (lead-in), a wartość 11 oznacza, że czekamy na zakończenie transmisji (lead-out).
    Margines błędu (w mikrosekundach) dla szerokości odebranych impulsów określa stała THRESHOLD.

    Funkcja zapewne nie będzie działać poprawnie z wywołaniami (Serial.print..()), ze względu na to, że wywołanie takiej funkcji zajmuje dużo czasu i zakłóci odczyty długości impulsów IR. Po fazie testów należy usunąć wywołania Serial.print..() z programu.

    Dodatkowo użyj najszybszą możliwą prędkość transmisji Serial, aby wprowadzać jak najmniejsze zakłócenia (opóźnienia) odczytu IR w fazie testów, np.
    Serial.begin(250000);
    Sprawdź najpierw jaka maksymalna prędkość jest możliwa dla Twojego Arduino i nie zapomnij zmienić bitrate również w terminalu na komputerze.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 20803472
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Witam kod wgrany i niestety wyświetla w serial monitor 6x

    LOW pulse is too long
    LOW pulse is too long
    LOW pulse is too long
    LOW pulse is too long
    LOW pulse is too long
    LOW pulse is too long

    Zmieniłem transmisje po RS jak najszybciej, i niestety nawet nie zaczyna ramki czytać tej leadin
    Jak pozbędę się serialmonitora z kodu to w jaki sposób dowiem się że poprawnie ramka została przechwycona ??

    Dziękuję Ci za pomoc dotychczasową może jakoś uda się Arduinem opanować tego pilota ??

    Pozdrawiam ...

    Dodano po 1 [godziny] 12 [minuty]:

    Pobawiłem się trochę czasami i na serial monitorze pojawiają się zmierzone czasy

    received pulse:322
    received pulse:166
    received pulse:66
    received pulse:171
    received pulse:268
    received pulse:325
    received pulse:70
    received pulse:176
    received pulse:172
    LOW pulse is too long
    received pulse:326
    received pulse:62
    received pulse:177
    received pulse:169
    LOW pulse is too long
    received pulse:325
    received pulse:70
    received pulse:175
    received pulse:171
    LOW pulse is too long
    received pulse:319
    received pulse:68
    received pulse:177
    received pulse:170
    LOW pulse is too long

    Jednak nie mierzy wszystkich bitów przy pojedynczym kliknięciu mam 4, 5 lub 6 resztę pomija tak jakby się nie wyrabiał.

    Na upartego to co wyświetla mogłoby wystarczyć ale niestety poprawnie nie odczytuje czasami przycisk dwa razy wciśnięty potrafi różnie odczytać i do tego te dane przy niektórych przyciskach wychodzą tak samo.

    Masz jakieś pomysły ?

    Pozdrawiam ...

    Dodano po 2 [godziny] 51 [minuty]:

    Załączam kod przeze mnie zmodyfikowany

    Może rzuci nowe światło na sprawę czemu tak jest.

    Kod: Arduino
    Zaloguj się, aby zobaczyć kod


    Wykonałem też pomiary innym analizatorem stanów logicznych firmy Kingst i tu czasy ku mojemu zaskoczeniu się różnią, zerknij.

    Analiza przebiegu sygnałów logicznych na ekranie komputera Wykres sygnału z analizatora logicznego przedstawiający przebiegi na różnych kanałach. Zrzut ekranu z oprogramowania logicznego analizatora sygnałów. Diagram czasowy sygnału na kilku kanałach analizatora logicznego. Zrzut ekranu z programu analizatora logicznego pokazujący różne kanały sygnału.

    Kumpel mi kiedyś mówił o możliwości wykorzystania przerwań aby zwiększyć dokładność pomiaru, bo powiem Ci że mam wrażenie jakby ATmega się nie wyrabiała przy tej opcji pulseIn.

    Podpowiedź coś.

    Pozdrawiam...
  • Pomocny post
    #10 20804743
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    Przeanalizowałem dokładniej Twoje posty. Wygląda na to, że sygnał wychodzący z odbiornika IR jest precyzyjny (wskazują na to wykresy analizatora logicznego i oscyloskopu w #1).
    Biblioteka, której użyłeś w #1 pogubiła się w odczycie kodu Twojego pilota. Dane wskazują na częściowo poprawne rozpoznanie sygnału.
    rawData[18]: 
     -3276750 - czas w us przed rozpoczęciem transmisji ramki IR
     +  50,- 300 - wartości dodatnie, to czas stanu wysokiego, ujemne niskiego; tu jest OK
     +  50,- 200 +  50,- 200 +  50,-  50 +  50,- 200 - tu jest częściowo OK; -50 nie powinno się pojawić
     +  50,- 700 +  50,- 200 +  50,- 300 +  50 - tu jest częściowo OK; -700 nie powinno się pojawić
    Sum: 2600

    Możliwe jest, że Twoje Arduino wraz z sygnałem IR dostaje zakłócenia. Będziesz musiał to zweryfikować.

    Aby coś więcej pomóc potrzebowałem mieć dostęp do jakiegoś środowiska testowego.
    Zrobiłem generator impulsów zgodnych z tym, co przedstawiłeś na ekranach analizatora logicznego.
    Okazało się, że:
    - uruchomienie funkcji pulseIn() powoduje zbyt duży narzut czasowy i nie działa do końca tak, jakbym potrzebował. Zmodyfikowałem ją nieco (funkcja myPulseIn()).
    - zapewne czeka Cię dalsze debugowanie, więc usunąłem Serial.print() w miejscach krytycznych czasowo i dodałem sygnały debugowe na pinach 5, 6 i 7 płytki Arduino, które możesz śledzić w analizatorze równolegle z nadawanym sygnałem IR. Znaczenie sygnałów jest następujące:
    * sygnał na pinie 5 ma stan wysoki w trakcie rozpoznawania kolejnych bitów kodu IR
    * sygnał na pinie 6 daje krótki impuls stanu wysokiego, gdy rozpozna poprawnie bit 0 lub 1, lead-in lub lead-out w kodzie IR
    * sygnał na pinie 7 daje krótki impuls stanu wysokiego, gdy rozpozna nieprawidłowość w odczycie bitów kodu IR (następuje wtedy restart maszyny stanów i oczekiwanie na początek kolejnej transmisji IR)
    Wykres oscyloskopu pokazujący sygnał IR oraz stany pinów 5, 6 i 7.
    - dodałem tablicę przechowującą odczytane przy pomocy funkcji pulseIn() czasy w mikrosekundach. Tablica wyświetlana jest po poprawnym (lub niepoprawnym) odczycie ramki IR. Tu widać niedokładność pomiaru czasu.
    Wyświetlone dane debugowania z odczytu sygnału IR na Arduino.

    Użycie pulseIn() blokuje mikrokontroler na czas odczytu kodu IR. Z tym kodem dużo więcej niż włączenie/wyłączenie przekaźnika nie zrobisz. Kod ten może być jednak potwierdzeniem, czy da się poprawnie odczytać kody IR z Twojego pilota za pomocą Arduino.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Po zdebugowaniu wszystko, co ma komentarz DEBUG będzie można usunąć z programu.

    Uruchamiałem na Arduino z Atmega328 16MHz. Jaki mikrokontroler i częstotliwość taktowania masz w swoim Arduino?
  • #11 20804922
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Witam, dziękuję że się angażujesz w pomoc dla mnie.

    W tej chwili mam Arduino UNO Atmega328 16Mhz.

    Program wgram dam znać jak to zadziała zrobię zrzut ekranu z analizatora sygnałów wraz z sygnałami pomocniczymi.

    Co do odczytu pilota jeśli nie uda się dopiąć tego kodu do innego programu bo jak piszesz nie wyrobi całość pozostanie zrobić odczyt i tylko odczyt pilota na jakimś małym Arduino tak aby tylko ono zajmowało się odbiorem i gdy odbierze poprawnie przekazywało sygnał do układu a ten po wykrycie sygnału wysokiego bądź niskiego uruchamiałby wtedy funkcjé na drugim Arduino.

    Mniej ważne, ważne aby teraz odczytać pilota i aby była powtarzalność.

    Dzięki póki co, dam znać jak podłączę i wgram kod...

    Pozdrawiam...

    Dodano po 2 [godziny] 6 [minuty]:

    No jestem już po testach serial monitor transmisję zmieniłem na 250000 wygląda to dużo lepiej - jest progres.

    W serial monitorze wyświetla się więcej czasów - przy pojedynczym kliknięciu

    HIGH pulse is too long
    Times[28]={-78,322,-54,54,-29,61,-27,70,-23,75,-20,79,-18,217,-20,81,-16,213,-18,220,-18,82,-16,221,-16,350,-23,0}


    No i w tym czasie screeny z analizatora z podpiętymi pinami 5 6 7 4 (signal) odpowiednio od góry ch0 ch1 ch2 o signal ch4

    Widok ekranu analizatora sygnałów z różnymi kanałami.

    Zrzut ekranu z analizatora logicznego pokazujący sygnały na różnych kanałach. Zrzut ekranu z analizatora logicznego z wieloma kanałami sygnału. Zrzut ekranu z analizatora logicznego z sygnałami na różnych kanałach. Zrzut ekranu z programu analizatora logicznego Saleae przedstawiający sygnały z kilku kanałów. Zrzut ekranu z oprogramowania analizatora logicznego pokazujący sygnały na kilku kanałach. Zrzut ekranu z analizatora logicznego pokazujący różne sygnały na kilku kanałach.

    Przy kilkukrotnym naciśnięciu tego samego przycisku wyniki są stabilne nie jak poprzednio.

    Kod: Text
    Zaloguj się, aby zobaczyć kod


    W załączniku pliki sal zapis z analizatora jakbyś miał program salea logic to możesz przejrzeć.

    Widzę że coś z tego będzie - dziękuję raz jeszcze.

    Pozdrawiam ....
    Załączniki:
    • Archive.zip (14.09 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #12 20805595
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    Zrzut danych z analizatora pokazał ciekawe własności sygnału. Zrobiłem statystyki i dzięki analizie jesteśmy w stanie oszacować, czego można się spodziewać na wejściu Arduino:
    (podane czasy w mikrosekundach)
    Tabela z minimalnymi, maksymalnymi, średnimi i odchyleniami standardowymi czasów w mikrosekundach dla różnych sygnałów.
    Pokazuje, że czasy nie do końca są zgodne ze specyfikacją standardu ITT.
    Dopasujmy zatem analizator do rzeczywistych danych (z #11) odebranych przez program uruchomiony u Autora, bo to jest celem tego wątku.
    (podane czasy w mikrosekundach)
    Tabela z czasami sygnałów IR i ich statystykami.

    Minimalne i maksymalne czasy akceptowane przez program są teraz konfigurowalne za pomocą stałych zdefiniowanych na początku programu. Można je będzie korygować w trakcie uruchamiania programu.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #13 20805609
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Witam, wgram kod jutro do południa i dam znać.

    Myślałem i myślałem czemu na początkowych screenach czas stanów niskich był 30us a przy drugim analizatorze Kingsta był 70us.

    Dziś znów podłączyłem pierwszy analizator i okazało się że czas ten również wynosi 70us - do tej pory myślałem że analizator może być taki niedokładny bo to jest najtańszy na rynku.

    Ale dziś mnie oświeciło ponieważ czas ten nie zmienił się sam, w międzyczasie pozbyłem się kondensatora 680pf który był na szynie resetu na schemacie w pierwszym poście.

    Teoretycznie teraz układ podatny jest bardziej na zakłócenia ale czas stanu niskiego wydłużył się co pozytywnie (tak myślę) wpłynie na wykrywanie impulsów. Jeśli nie będzie to przeszkadzać to tak zostawię a jeśli będzie to założy się mniejszy by aż tak nie zmniejszać czasu szpilek sygnału logicznego zero.

    Dziękuję za poświęcony czas jutro po testach się odezwę.

    Tak więc zagadka tajemniczej różnicy rozwiązana.

    Pozdrawiam...
  • #14 20805664
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    No to ciekawe, jak teraz będzie się zachowywał program Arduino. Jeśli możesz, to śledź podczas testów linię wskazującą na błędy odczytu (u Ciebie był to kanał 2). W poprawnie działającym układzie błędy na tej linii nie powinny nigdy wystąpić.

    Dodam jeszcze, że teraz w programie odebrany kod IR jest zlepkiem adresu, komendy i bitu startowego:
    najstarszy bit [ CTRL0, CTRL1, CTRL2, CTRL3, CTRL4, CTRL5, ADR0, ADR1, ADR2, ADR3, BIT_STARTU ] najmłodszy bit
    czyli prawdopodobnie odwrotnie do specyfikacji. Jeśli to problem, to możemy to zmienić w programie.
    BIT_STARTU - jeśli inny niż 0, to powinieneś zignorować komendę
    Zatem możliwe odebrane kody, to liczby z przedziału 0..2047, z czego tylko liczby parzyste są poprawnie odebranymi kodami.
    Jeśli dobrze odczytałem specyfikację, to przyciski generują te same wartości CTRL, natomiast ADR będzie różne dla różnych pozycji Audio i Video (pilot ze zdjęcia w #1).
  • #15 20805676
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Witaj mam zgrane zrzutu z analizatora przycisków np Play z opcji audio i video.

    Zrzut ekranu sygnałów z analizatora logicznego. Zrzut ekranu z analizatora logicznego pokazujący przebiegi sygnałów kilku kanałów.

    Z tym że to są zrzutu bezpośrednio z linii 12V czyli przed negacja ale porównać można. To jest Play Video na pierwszym oraz Play Audio na drugim.

    Zamysł jest taki że przyciski transportu w opcji Audio działają z magnetofonem szufladą a w wersji video były pod magnetowid i właśnie tu można użyć ich do CD.

    Reszta przycisków np volume działa i w jednej i w drugiej pozycji co idealnie pasuje 😀

    Pozdrawiam...

    Dodano po 32 [minuty]:

    Acha co do kolejności bitów nie będzie mi przeszkadzać że będą odwrotnie zapisane, to nie jest problem, zależy aby była powtarzalność i rozróżnienie między odczytami poszczególnych przycisków, bo do tej pory jak miałem kilka czasów a nie wszystkie to głupoty pokazywało i nie zawsze tak samo.

    Pozdrawiam...
  • #16 20806648
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Witam już po testach - GRATULACJE ;)

    Jesteś Kolego genialny ;)

    Wielkie dzięki wszystko teraz śmiga jak trzeba - to jest to.

    Zrzut analizatora

    Ekran z analizatorem logicznym z ośmioma kanałami sygnałów.

    Powtarzalność jest 100% przy tych samych przyciskach ;)

    Kod: Text
    Zaloguj się, aby zobaczyć kod


    No i co najważniejsze rozróżnia wszystkie przyciski - te 6 które ja chcę użyć jak i wszystkie z całego pilota ;)

    Rewelacja ;)

    Kod: Text
    Zaloguj się, aby zobaczyć kod


    Tematu jeszcze nie zamykam bo kombinuję dalej a mianowicie linia resetu po której lata sygnał pilota jest dwukierunkowa co prawda sygnał pilota leci tylko w jednym kierunku od odbiornika poprzez szynę do wszystkich klocków tego sprzętu czyli tunera, magnetofonu i teraz też będzie do CD dzięki uprzejmości koledze który zaangażował się w pomoc ;)

    Muszę teraz trochę pomyśleć i zaraz opiszę ciąg dalszy....

    Pozdrawiam...

    Dodano po 2 [godziny] 49 [minuty]:

    No to teraz dalej, a może właściwie od początku.

    Sprzęt audio retro to wieża z 84 roku Schneider DCS8070.

    Jest to najwyższy model z tej serii, w czasach kiedy to w Polsce królowała UNITRA lubartów Kasprzaka, tam mieli takie już cudeńka.

    Ja miałem ten model z Niemiec gdzieś na początku lat 90-tych może max '95 wtedy to był kosmos.

    Wieża audio Schneider DCS8070 z lat 80.

    Wygląd kanciasty co niektórym może się nie podobać dla mnie jest śliczny.

    Zestaw audio Schneider DCS8070 z lat 80-tych. Wieża audio retro Schneider DCS8070 z magnetofonem i płytką prototypową

    Wyjątkowość zestawu poleca na sposobie łączenia klocków bez kabli można montować poziomo jak i pionowo, zawsze działa a to za sprawą specjalnego złącza DCS które dostępne jest z każdej strony klocka.

    Wieża stereo Schneider DCS8070 z klockami audio Płyta główna z komponentami elektronicznymi obok części wieży audio Fragment retro sprzętu audio z widocznym złączem DCS na krawędzi.

    Podobało mi się takie rozwiązanie a i jakość dźwięku z tego sprzętu też była na wysokim poziomie jak na tamte czasy.

    No i ostatnio rok temu zatęskniłem za tym sprzętem, odkurzyłem, jeszcze grał jak włączyłem, ale wymagał gruntownej renowacji, od poprawy lutów, wymiany kondensatorów, kilka zębatek wymagało naprawy i inne elementy mechaniczne również, renowacja trwała około 1 roku zanim sprzęt zagrał jak kiedyś.

    Do tego celu musiałem dokupić dwa niesprawne zestawy na potrzeby części ale udało się.

    Jako że sporo części pozostało zrodził się pomysł budowy CD z klocka od magnetofonu.

    Zestaw ma spore trafo toroid w equalizerze więc mocy starczy dla dodatkowego klocka.

    Schemat złącza DCS z numerami pinów i opisami.

    To jest opis pinów tego złącza DCS.

    Jak widać idzie zasilanie, sygnał audio master L+R, sygnał audio slave L+R (sygnał z pętli magnetofonowej- nie istotny dla naszego przojektu), reset i na tą chwilę wszystko reszta sygnałów jest zbędna bo tyczy się tunera telewizyjnego i monitora bo to był zestaw audio-video swego czasu.

    Tak to prezentował katalog Schneidera z tamtych lat

    https://www.hifi-archiv.info/Schneider%20HiFi...ge/1983-84%20Schneider%20HiFi/schneider01.jpg

    No i pomysł jest pora na realizację. Wybebeszyłem jeden klocek szufladę bo i tak sporo x niej brałem by uruchomić moją.

    Widok wnętrza wieży stereo z odsłoniętą płytą główną na dywanie.

    Tutaj tylko dolna obudowa z oryginalną płytą od magnetofonu.

    Płyta główna z napędem DVD-RW w wieży stereo Schneider DCS8070 Wnętrze obudowy sprzętu audio z płytą obwodu drukowanego. Otwarta obudowa retro wieży audio Schneider DCS8070 z widoczną płytą główną i przewodami.

    To tego celu została zaprojektowana nowa płyta główna pod wymiar na której znalazła się ATmega oraz expandery portów PCF do obsługi ATA ATAPI bo w roli czytnika znajdzie się nagrywarka CD-RW.

    Oprócz tego układ z tranzystorami który jest na początku tematu. Oraz przekaźnik do załączania audio.

    Stary zestaw audio Schneider z dodanym napędem DVD/CD. Retro wieża audio z otwartą szufladą CD i układem elektronicznym

    To tak po krótce historia, następnie opiszę co mi jeszcze będzie potrzebne aby wszystko działało.

    CD-Rom z Arduino już uruchomiłem uzywając kodu z tej strony.

    http://singlevalve.web.fc2.com/Atapiduino/atapiduino.htm

    Teraz to wszystko zgrać razem i można będzie się zabierać za wpychanie wszystkiego do obudowy tak aby zachować jak najwięcej oryginału.

    Jeszcze raz dziękuję za pomoc...

    Dodano po 6 [godziny] 54 [minuty]:

    Witam po przerwie ;)

    Jeszcze raz załączam schemat z pierwszego postu

    Schemat układu z tranzystorami BC558 i BC238B oraz złączem Reset in/out.

    Jak już pisałem wyżej linia resetu jest na logice 12V a sygnały wysyłane odbierane są w logice 5V.

    T310 ze schematu już omawiałem - służy do odczytywania sygnałów z linii resetu (m.in pilota którego już udało się odczytać). Oprócz sygnału pilota Arduino musi umieć odczytać jeszcze jeden sygnał jest to sygnał o stanie niskim i czasie trwania więcej niż np. 10ms (dobrze by było aby można było zmienić wartość w czasie testów) - czyli dużo dłuższy niż te szpilki od pilota.

    T311 i T309 - dwa tranzystory na górze służą do nadawania sygnału na linię resetu logiczne zero od strony Arduino wystawi na linię resetu 12V poprzez właśnie te dwa tranzystory.

    A potrzebne jest to do tego że jak zauważycie na zdjęciu wieży mamy żółte przyciski po lewej stronie na każdym klocku są to przyciski wyboru źródła w selektorze wejść (ten znajduje się w equalizerze na dole razem z zasilaczem dla wszystkiego). Na equalizerze mamy dwa żółte przyciski są to dodatkowe wejścia z tyłu sprzętu na gniazdach ale zasada działania obowiązuje wszystkie wejścia taka sama.

    Mianowicie mamy na gnieździe DCS tym głównym pierwszy i trzeci pin tor audio L+R który to jest wspólny dla wszystkich klocków i jest to jednocześnie wejście equalizera. Wszystkie klocki puszczają tam sygnał audio poprzez przekaźniki.

    I tymi przekaźnikami steruje też linia reset nie pozwalająca aby dwa przekaźniki na raz zostały załączone.

    Tak więc teraz do Arduino mamy podłączony przycisk S1 pod dowolny pin niech będzie 10 oraz pod pin 11 podłączony jest poprzez tranzystor przekaźnik ten co załącza audio na główną szynę audio L+R.

    Działa to tak że gdy wciśniemy obojętnie który przycisk żółty na obojętnie którym klocku - ten klocek wystawia na czas trzymania przycisku stan wysoki na linii reset czyli 12V wtedy inne klocki odbierają ten stan i wyłączają przekaźniki wszystkie - zostaje tylko ten włączony na którym klocku akurat został wciśnięty. Proste i logiczne.

    I teraz aby całość współgrała z resztą i w moim przypadku po wciśnięciu przycisku S1 (pin10 - stan niski) następuje stan wysoki na pinie 6 Arduino (patrz schemat) tak długo jak trzymany jest przycisk S1 tak długo na pinie 6 jest stan niski co powiduje wystawienie na szynę reset 12V poprzez T309 i T311. Dla reszty klocków to informacja że należy wyłączyć wszystkie przekaźniki z lini audio L+R i tak też się dzieje, gdy puścimy przycisk S1 w naszym Arduino ma wystąpić stan wysoki na pinie 11 i trwać tak długo dopóki nie zostanie wysłany długi sygnał 12V na linii resetu czyli po stronie Arduino odbierze długi sygnał o poziomie zera logicznego.

    Ogólnie sprawa jest prosta ale nie chcę sam kombinować bo boję się że czasy odbioru pilota znów mi się rozjadą, proszę zatem kolegę @gps79 o pomoc w tej sprawie.

    Będę wdzięczny za tą modyfikację ...

    Jutro doślę screeny z analizatora stanów podczas przełączania wejść - będzie wtedy widać jak się to ma zachowywać. Pozdrawiam ....
  • #17 20808433
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    Czy sygnał reset (nadawany przez Arduino) ma trwać tyle, ile trwa stan niski na S1, czy jakieś minimalne/maksymalne ograniczenia tutaj są?
    Dodatkowo, co w sytuacji, gdy S1 został wciśnięty, a aktualny deck jest aktywny? Czy procedura wysłania sygnału reset ma się powtórzyć, czy ma zostać zignorowana?
    Przy okazji, przygotuj elektronikę tak, aby S1 miał dołączony kondensator (ok. 100nF) niwelujący iskrzenie styków (tzw. debouncing).
  • #18 20808456
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    No to po kolei.

    Tak sygnał niski może trwać tyle co przyciśnięcie przycisku S1, zaraz doślę zrzuty z analizatora gdy przełączam wejścia.

    Z tego co się orientuję to ograniczeń nie ma bo to uzależnione jest tylko od długości trzymania przycisków na innych klockach.

    Jeśli S1 jest wciśnięty gdy będzie już wybrany deck nic się nie dzieje czyli nie wysyła ponownego sygnału na linię reset tak więc gdy drugi raz wcisnę ten sam deck nic się nie dzieje.

    Co do S1 nie ma problemy dołoże kondensator 100nf.

    Już robię screeny z analizatora.

    Pozdrawiam...

    Dodano po 32 [minuty]:

    Już po testach - screeny z analizatora podczas przyłączania wejść.

    Czas uzależniony jest od długości trzymania przycisku i mi udało się najkrótszy złapać 0.13s a najdłuższego nie ma tzn jak trzymasz sekundę to trwa sekundę jak dłużej to dłużej.

    Zrzut ekranu z analizatora logicznego pokazujący sygnały na różnych kanałach układu elektronicznego. Zrzut ekranu z analizatora logicznego pokazujący sygnały na różnych kanałach.

    Zaraz jeszcze zerknę czy dzieje się coś jak przy aktywnym decku się wciska guzik od niego - dam znać...

    Acha sygnał z kanału ch4 to tam gdzie nasłuchiwaliśmy pilota a ch2 to sygnał kontrolny jak poprzednio nie rozłączałem układu od tamtej pory...

    Dodano po 7 [minuty]:

    Mała korekta - przy wciskaniu kilka razy tego samego przycisku gdy aktywny jest już ten deck skutkuje sygnałami na linii reset 12V czyli zerami u mnie na ch4 - wszystkie przekaźniki w innych deckach są już wyłączone więc tu się nic nie dzieje, cały czas ma tylko trzymać przekaźnik z tego CD.

    Czyli jakby to powiedzieć gdy Arduino będzie odczytywało że na linii reset jest 12V a nie będzie to spowodowane przyciskiem S1 to ma wtedy wyłączyć przekaźnik, w przypadku gdy wywołanie stanu 12V następuje z Arduino z przycisku S1 to przekaźnik ma się załączyć lub pozostać załączony gdy to jest ponowne naciskanie S1.

    Patrz screeny z analizatora...

    Zrzut ekranu z analizatora logicznego pokazujący sygnały na kilku kanałach.

    Pozdrawiam ....
  • #19 20809004
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    Spróbuj tego kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Przy okazji ciekaw jestem, jak zachowa się cały system, gdy w dwóch deckach zostanie wciśnięty żółty przycisk selekcji, bo widzę, że jest ryzyko włączenia przekaźników sygnału audio z obu źródeł (a przynajmniej tak zachowa się kod Arduino).
  • #20 20809014
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Witam, jutro sprawdzę kod i dam znać, to o czy piszesz już sprawdziłem, jak dwa na raz wciśniesz dwa decki włączą przekaźniki i na wejściu equalizera jest zmiksowany sygnał. Nie wiem czy to niedopracowany na tamte czasy system czy takie było założenie. W każdym razie ja nie będę kombinował tak aby po dwa przyciski na raz nie naciskać.

    Pozdrawiam...
  • #21 20809756
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    Kod po przetestowaniu i drobnych poprawkach:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Powinno działać wg tego schematu:
    Schemat czasowy przedstawiający sygnały dla Reset D6, DM1 i Reset/IR w funkcji czasu.
  • #22 20810088
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Witam już po testach.

    Wgrałem zmodyfikowany ostatni program który udostępniłeś.

    Działa ;)

    I tak kanały analizatora jak poprzednio tylko dodałem nowe sygnały

    Ch0 - DEBUG; receiving IR code
    Ch1 - DEBUG; correct pulse received
    Ch2 - DEBUG; error occurred
    Ch4 - InfraRedInPin = 4;

    Dodane:

    Ch3 - ResetOutPin = 6;
    Ch5 - RelayOutPin = 11;
    Ch6 - Switch1InPin = 10;

    I tak układ zachowuje się gdy zmieniam wejścia na innych deckach

    Zrzut ekranu przedstawiający analizator logiczny z kanałami sygnałów.

    Czas uzależniony od długości trzymania przycisku

    Teraz wciskam przycisk od CD- czyli Switch S1 kilka razy

    Widok sygnałów na analizatorze logicznym z różnych kanałów.

    Układ zareagował poprawnie czyli wysłał sygnał na magistralę i sprzęt tak jak zakładałem wyłączył wszystkie przekaźniki, a załączył się ten z Arduino - prawidłowo.

    Teraz wybrałem już inny klocek czyli na innym wcisnąłem przycisk

    Diagram sygnałów logicznych z kanałami debugowania.

    Znów dobrze układ się zachował, odebrał sygnał z linii reset i wyłączył przekaźnik i przy ponownym wciśnięciu S1 od naszego CD wystawił 12V na magistralę reset oraz załączył przekaźnik.

    I jeszcze w powiększeniu sygnał odebrany z pilota

    Analiza sygnałów z kanałów w programie logicznym.

    Z pilotem też jest OK rozróżnia sygnały co najważniejsze.

    Jeszcze serial monitor przy odbieraniu pilota

    Kod: Text
    Zaloguj się, aby zobaczyć kod


    Oraz przy wciskaniu przycisków na innych deckach czyli zmiana z magnetofonu na tuner i odwrotnie

    Kod: Text
    Zaloguj się, aby zobaczyć kod


    No i przy naciskaniu naszego S1

    Kod: Text
    Zaloguj się, aby zobaczyć kod


    Dziękuje Ci kolego że mi pomagasz.

    Można by rzec że 2/3 krok wykonany ;)

    Teraz już na koniec przydało by się podczepić ten przycisk

    Received IR command:96
    Times[26]={-31,363,-4,90,-7,92,-6,95,-1,92,-2,99,-1,234,-2,232,-3,95,-3,98,-2,91,-2,99,-1,373}

    To jest żółty na pilocie tak aby działał jak wciśnięcie S1 - czyli aby można było zdalnie wybrać źródło CD, bo wybierając powiedzmy PLAY w sekcji audio zacznie grać magnetofon i przełączy się wejście na niego, teraz aby wrócić do CD trzeba by jakoś ten przycisk podczepić aby po wybraniu jako wejście pojawił się nasz CD.

    No i ostatnia już rzecz gdyby to wszystko dało się podczepić pod program z tej strony do obsługi CD-Romu

    http://singlevalve.web.fc2.com/Atapiduino/atapiduino.htm

    Zaraz podeślę wersję kodu który uruchomiłem na oddzielnym Arduino.
    Zerknij, bajka by była jakby się dało ten układ obsługuje tylko przyciski i expander portów tak aby wystawiać stany na złącze CD-Rom.

    Może by dało się to zrobić na jednym Arduino (tak mam w projekcie PCB bo nie sądziłem że będą z tym pilotem takie problemy.

    Zaraz doślę kod od CD-Romu.

    Jak już to osiągniemy to będzie wszystko jeśli chodzi o soft, później tylko zostaje zabrać się do pracy aby wszystko zmieścić w obudowie i aby to ładnie wyglądało.

    Acha to nie powinien być problem, ale jeszcze teraz przypomniało mi się że guziki wejść podświetlane są żaróweczkami 12V mam zaprojektowane na PCB poprzez tranzystor - chodzi o to by powielić wyjście przekaźnikowe na jeszcze jednym pinie.

    Dziękuję jeszcze raz i pozdrawiam ...

    Dodano po 2 [godziny] 41 [minuty]:

    Przesyłam działający i uruchomiony kod z powyższej strony.

    Całość sterowania ATAPI CD-ROM jest poprzez PCFy a te są podłączone pod SDA SCL czyli sterowane poprze magistralę I2C.

    Oczywiście napisy na LCD to tam sobie pozmieniam w końcowej fazie testów na gotowo gdy wszystko będzie podłączone.

    Jeśli nie da się uruchomić tego na jednym procesorze Atmega328 to trzeba będzie na dwóch procesorach, jeden wtedy skupi się na obsłudze pilota i wejść. Wejścia już ogarnia jak trzeba. Jeśli coś to trzeba będzie się komunikować między dwoma procesorami - myślę najprościej jak się da czyli dać 5 pinów out w tym co teraz Kolega pisał i wystawiać na nich stan wysoki lub niski i drugim procesorem tym z programem do CD odczytywać i wykonywać operacje obsługi CD - play >> << stop pause.

    Pozdrawiam ...

    Pozdrawiam ...
    Załączniki:
    • CD_Player_Schneider.zip (7.31 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #23 20810627
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    Możesz podesłać szczegółowy schemat połączeń wszystkiego do płytki Arduino (lcd, ATAPI, reset, S1, przyciski CD, itd.) zakładając, że uda się wszystko podłączyć do jednego Arduino?
    Zakładam też, że jakieś funkcje CD będziesz chciał uruchamiać pilotem. Podeślij też proszę listę mapującą kody do funkcji CD.
    Spróbuję do jakoś "pożenić".
  • #24 20810742
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Jasne. Dziś po południu narysuję.

    Co do uruchamiania funkcji z pilota to tylko te

    Source, Play, << >> Stop Pause.

    Więcej nic nie będę wymyślał. Pozdrawiam...

    Dodano po 6 [godziny] 40 [minuty]:

    Witam ponownie. posiedziałem i narysowałem schemat podłączenia.

    Schemat obwodu elektronicznego z procesorem Atmega328, gniazdami do podłączenia CD-ROM i wyświetlacza LCD, oraz przyciskami sterującymi.

    Opis Gniazd:

    LCD-I2C - Goldpin do podłączenia wyświetlacza LCD 2x16 I2C (+5V, SCL, SDA, GND)
    ZASILANIE CD-ROM - Złącze Ark śrubowe do zasilania CD-ROMU (+5V, GND, GND, +12V)
    CD-ROM IN-AUDIO - Goldpin do podłączenia audio out z CD-ROMu (Aud-L, GND, Aud-R)
    SCHNEIDER DCS - Złącze od zestawu opisy pinów na schemacie. Reszta niepodłączona - niewykorzystywane w moim projekcie.

    Takie podłączenia mam zaprojektowane na PCB (piny Arduino)


    Klawiatura z czterema przyciskami <<, PLAY, STOP, >> - A3,A2,A1,A0
    Pin 13 - przycisk EJECT
    Pin 12 - przycisk S1 (do wyboru źródła CD Playera
    Pin 9 - Uruchamianie przekaźnika dla potrzeb Audio
    Pin 8 - Żarówka podświetlająca żółty przycisk wyboru źródła S1 (działa wtedy gdy przekaźnik PK1)
    Pin 3 - Odczyt pilota z magistrali RESET
    Pin 2 - Nadawanie na magistralę RESET sygnału resetu pozostałych przekaźników.

    Póki co CD-ROM uruchomiony na oddzielnej płytce i piny w programie który Ci wysłałem ostatnio są pod tamten układ - natomiast docelowo chciałbym aby wejścia były zgodnie z tym co napisałem wyzej.

    Acha na schemacie Arduino wewnątrz klocka są numery pinów a na zewnątrz są fizyczne piny procesora Atmega328 - tak dla ułatwienia dla mnie jak projektuje się PCB z Atmegą na pokładzie.

    A tu wzór PCB - na płytce jest zawarty bezpośrednio procesor Atmega328, rezystor podciągający R3 do resetu, oraz kwarc 16Mhz i dwa kondensatory 22pF dla poprawnej pracy procesora.

    Schemat PCB z procesorem Atmega328, wyświetlaczem OLED i złączami.

    Zobacz co da się zrobić w temacie połączenia tych softów aby można było na tej PCB uruchomić wszystko na jednym procesorze.

    A i jeszcze jedna sprawa tutaj w programie od CD-Romu

    Kod: Arduino
    Zaloguj się, aby zobaczyć kod


    I gdyby się dało coś wykombinować w tym temacie. W programie od CD-Romu są komendy idx które program ustawia na złączu ATAPI i tym samym obsługuje CD-ROM. Z tym że program do obsługi CD-ROMu działa tak że wciskasz PLAY i jeszcze raz PLAY to jest wtedy PAUSE a kolejny raz PLAY to jest resume i gra dalej.

    Kod: Arduino
    Zaloguj się, aby zobaczyć kod


    I tu jest zapisane to sterowanie.

    A na przyciskach na pilocie jest osobno PLAY i osobno PAUSE więc trzeba wybrać PLAY aby grało i kolejne naciśnięcie PLAY nic nie robi, dopiero wciśnięcie PAUSE pauzuje utwór i kolejne naciśnięcie PAUSE nic nie robi, teraz aby wznowić odtwarzanie trzeba znów PLAY nacisnąć.

    Tak by było lepiej ale jak się nie da to pomyślałem żeby PLAY i PAUSE (przyciski z pilota) podczepić pod tą funkcję void PLAY w programie i też będzie dobrze.

    Acha i jeszcze taki myk, w pilocie nie ma przycisku do zmiany źródeł, czyli przełączanie z tunera na magnetofon i inne wejścia. Realizowane jest tak że jak gra magnetofon a wciskamy przyciski od 1-9 to automatycznie przełącza się na tuner i gra radio, a gdy gra radio i włączamy przycisk PLAY (w sekcji audio) to samo przełącza się na magnetofon.

    W naszym CD można by też tak zaimplementować aby przycisk żółty na pilocie działał jak S1 (wybór CD-Playera) oraz podczepić dodatkowo przycisk PLAY (w sekcji video) gdy naciśniemy play na CD aby przełączyło się z tunera bądź magnetofonu.

    Mam nadzieję że da się to jakoś ogarnąć.

    Dziękuję za dotychczasową pomoc ...

    Pozdrawiam ...[/tr]
  • #25 20812034
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    Dzięki za szczegółowe informacje. Zastanawiałem się nad przyciskiem pause, ale wszystko wyjaśniłeś. Zalecałbym kondensatory 100nF na wszystkich przyciskach "skanowanych" przez mikrokontroler. Ustrzeże od nieprzyjemności związanych ze spontanicznym wielokrotnym wciskaniem przycisku przy naciskaniu lub puszczaniu fizycznego guzika.
    Brakuje mi jeszcze kodów IR dla funkcji: select, prev, next, play, pause, stop, select (żółty), play(video)

    Funkcje z pilota są do ogarnięcia. Jedynie tego nie do końca rozumiem:
    DJCheester napisał:
    podczepić dodatkowo przycisk PLAY (w sekcji video) gdy naciśniemy play na CD aby przełączyło się z tunera bądź magnetofonu.

    Czy to oznacza, że:
    1. po wciśnięciu PLAY na decku CD wykona Select CD (reset), a po tym procedura Play CD?
    2. po wciśnięciu PLAY(video) na pilocie, CD wykona Select CD (reset), a po tym procedura Play CD?

    Kod wstępnie udało się skompilować. Muszę jeszcze połączyć funkcjonalności obu programów w jedną całość. Sam jestem ciekaw, czy to ruszy.
  • #26 20812107
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Witaj właśnie sprawdziłem komendy i tak mamy po kolei :

    << (PREV)
    Received IR command:1440
    Times[26]={-71,323,-44,58,-25,70,-22,77,-18,81,-15,85,-6,224,-11,86,-11,225,-10,224,-10,86,-11,220,-8,360}

    >> (NEXT)
    Received IR command:1408
    Times[26]={-71,326,-44,60,-25,71,-22,78,-18,75,-15,86,-11,90,-10,91,-8,230,-7,229,-8,82,-10,230,-7,365}

    STOP
    Received IR command:1504
    Times[26]={-65,330,-40,62,-25,66,-20,81,-16,85,-12,88,-10,229,-11,225,-12,218,-12,224,-12,86,-12,228,-10,358}

    PAUSE
    Received IR command:1472
    Times[26]={-70,323,-40,60,-27,70,-20,78,-16,83,-14,79,-10,88,-10,226,-8,225,-10,222,-11,78,-11,225,-8,360}

    START
    Received IR command:1376
    Times[26]={-74,316,-44,58,-25,70,-22,77,-18,81,-15,85,-11,224,-12,214,-12,85,-11,225,-10,86,-10,226,-8,354}

    IDEAL (ŻÓŁTY NA PILOCIE) - ŹRÓDŁO CD
    Received IR command:96
    Times[26]={-67,321,-37,62,-25,73,-19,79,-15,83,-12,87,-10,226,-10,216,-11,86,-11,88,-8,91,-7,92,-6,360}

    Zaraz na spokojnie doczytam i odpiszę na Twoje pytania.

    Jeszcze jest

    RECORD
    Received IR command:1344
    Times[26]={-54,343,-22,74,-19,81,-14,86,-3,90,-7,92,-6,94,-4,230,-6,91,-6,230,-6,85,-6,230,-4,364}

    Zastanawiam się czy by nie zrobić czegoś pod tym przyciskiem w sensie napisów na wyświetlaczu typu Model DCS8070CD Rev.01 SN.0001 DIY Schneider Projekt CD lub coś podobnego. Tak aby trwało z 10 - 20 sekund. Potem wyświetlało by to co powinno.

    Oczywiście to jako dodatek który wyświetlałby się po wciśnięciu RECORD na pilocie lub ewentualnie jeszcze jeden przycisk do tego wykorzystać (Jest na panelu przednim też ten przycisk) przy wolnym pinie Arduino ale to jako dodatek.

    Zaraz dopiszę dalej...

    Pozdrawiam ...

    Dodano po 26 [minuty]:

    Acha co do przycisków kondensatory 100nF się równolegle dostawi, jedynie fizycznie nie ma kondensatora 680pF na magistrali RESET dzięki temu uzyskaliśmy większe przerwy na ujemnych czasach trwania impulsów przy zczytywaniu pilota. Reszta jest jak na schemacie.

    A co do Twojego pytania

    Czy to oznacza, że:
    1. po wciśnięciu PLAY na decku CD wykona Select CD (reset), a po tym procedura Play CD?
    2. po wciśnięciu PLAY(video) na pilocie, CD wykona Select CD (reset), a po tym procedura Play CD?

    Dobrze by było aby w jednym i drugim przypadku tak się stało bo tak działa przy magnetofonie gdy gra tuner to wciśnięcie PLAY na decku powoduje przełączenie na magnetofon i odtwarza kasetę, jak i za równo gdy gra radio a na pilocie wciśniemy PLAY (sekcja audio) przełącza na kasetę i odtwarza.

    Tak samo chciałbym z deckiem CD zarówno jakby wcisnął PLAY na decku aby przełączało źródło i uruchamiało PLAY CD. Z pilota również gdy gra tuner a wciśniemy PLAY (sekcja video) aby przełączało źródło na CD i uruchamiało PLAY CD.

    Acha te kody co wysłałem wcześniej PLAY odnosi się oczywiście do sekcji video, sekcję audio tutaj nie potrzebujemy 😀

    Jeśli co było by dużym problemem aby to wprowadzić w sensie np przycisk RECORD jako wyświetlanie informacji o decku to możemy z tego zrezygnować. Nie będzie tragedii. I tak już jest pięknie 😀

    Tak samo również w kwestii tego PLAY PAUSE na dwóch przyciskach, jeśli byłby problem można zawsze dwa przyciski PLAY I PAUSE podczepić pod tą funkcję PLAY VOID w kodzie.

    Jeszcze raz dziękuję, też ogromnie jestem ciekaw co z tego wyjdzie, jeśli będzie problem uruchomić to na jednym procki gotów jestem zabudować dodatkowe Arduino np Nano aby ogarniało połowę funkcji, jestem już zdeterminowany aby uruchomić ten CD. I obiecuję Wam jak wszystko zakończę piękny temat na elektrodzie łącznie ze zdjęciami przy budowie i renowacji tego pięknego sprzętu.

    Pozdrawiam....
  • #27 20815393
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    No dobra. Połączone. Dodałem chyba wszystko, o czym było wspominane w wątku.
    Pozmieniałem trochę nazewnictwo, aby utrzymać jakąś spójność w kodzie.
    Zobaczmy, na czym się "wyłoży".
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #28 20815481
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    No Kolego chylę czoła za ten kod, mnie to przerosło już na starcie, jutro z rana testy, może na niczym się nie wyłoży 😀
    Bądzmy dobrej myśli, dam znać oczywiście i załączę zrzuty z analizatora jak zawsze. Odpalę chyba teraz 16-kanałowy analizator bo w 8ch brakuje kanałów. Póki co dziękuję 😀

    Pozdrawiam...
  • #29 20815997
    DJCheester
    Poziom 28  
    Posty: 2089
    Pomógł: 75
    Ocena: 958
    Witam już po testach, no niestety jak przewidywałeś wykłada się.

    No i po kolei na serial monitorze nic niestety się nie wyświetla (brak jakichkolwiek danych zwrotnych)

    Na LCD początek fajnie aż do momentu:

    CD PLAYER: to jest tu w kodzie.

    lcd.print(" CD PLAYER:");

    Czyli sam początek initializacji CD-ROM.

    Podpinane na początek bez klawiatury od CD.

    CD-Rom ten sam co wtedy.

    Brak reakcji na pilota i na przycisk S1

    Zaraz dorzucę screeny z analizatora.

    Pozdrawiam ...[/quote]

    Dodano po 5 [minuty]:

    Przy przełączaniu wejść na innych deckach

    Zrzut ekranu z analizatora stanów logicznych przedstawiający sygnały na różnych kanałach.

    No i przy obieraniu pilota

    Zrzut ekranu z analizatora logicznego z różnymi sygnałami na kanałach D0-D7.

    Przy próbie bez podłączonego CD-Romu wisi na Schmeider DCS8070CD nie idzie dalej.

    Coś przychodzi Ci do głowy dlaczego może tak się dziać ?

    Pozdrawiam...
  • #30 20816927
    gps79
    Poziom 37  
    Posty: 2211
    Pomógł: 495
    Ocena: 797
    Trzeba sprawdzić, na czym się zatrzymuje. Dodałem do kodu trochę informacji, które pojawią się na konsoli i pozwolą na określenie miejsca zawieszenia programu.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

✨ Dyskusja dotyczy problemu przechwycenia i dekodowania sygnału z pilota IR starego sprzętu audio, który nie korzysta z powszechnie obsługiwanych standardów transmisji IR. Standardowe biblioteki Arduino IRremote nie rozpoznają sygnału, który okazał się kodowany w protokole ITT z krótkimi ramkami danych i niestandardowymi czasami impulsów. Użytkownik wraz z pomocą innych uczestników analizował sygnał za pomocą oscyloskopu i analizatora logicznego, potwierdzając stabilność i precyzję impulsów, lecz z problemami w ich poprawnym odczycie przez Arduino. Zaproponowano napisanie dedykowanego kodu Arduino, który mierzy czasy impulsów i rozróżnia bity na podstawie ich długości, z uwzględnieniem marginesów błędu i specyficznych czasów dla bitów 0, 1 oraz sygnału startowego (lead-in). W trakcie testów kod był modyfikowany i debugowany, a do odczytu i sterowania wykorzystano dwa Arduino – jedno do odbioru sygnału IR i generowania sygnałów sterujących, drugie do obsługi napędu CD. Użytkownik udostępnił szczegółowe schematy połączeń, mapowanie kodów IR do funkcji (np. Play, Stop, Pause, Source), a także zrzuty z analizatora sygnałów. Problemy z niestabilnością kodu Atapiduino do obsługi napędu IDE/ATAPI zostały zidentyfikowane, co skłoniło do rozdzielenia funkcji na dwa mikrokontrolery. W końcowej fazie projekt działa stabilnie, z poprawnym odczytem sygnałów pilota i sterowaniem odtwarzaczem CD w zestawie retro audio Schneider. Projekt jest planowany do publikacji wraz z dokumentacją i zdjęciami sprzętu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA