4 września 2023

[Caraudio] Opel CAN-BOX TV-OUT


Odkąd radioodbiorniki zagościły w samochodach pewien problem stanowiło podłączenie ich do instalacji samochodowej - nie było bowiem jednolitego sposobu. Dopiero w latach 90-tych opracowano standard złącz tzw. kostki ISO oraz rozmiar radioodbiornika tzw. DIN. Co prawda producenci aut często go ignorowali stosując własne rozwiązania ale dostępne były przejściówki umożliwiające podłączenie innego radia w miejsce firmowego. Problem pojawił się dekadę później kiedy do łączności z radiem użyto magistrali CAN-BUS a radioodbiorniki zaczęły być silnie zintegrowane z deską pojazdu i niekompatybilne wymiarowo.


W samochodach Opel Astra H (Corsa D, Zafira B) fabrycznie montowano radioodbiorniki o rozmiarze 2-DIN (z nietypowym - trapezowym frontem). Jednak funkcjonalność firmowego radioodbiornika jest dość uboga jak na obecne czasy (chociażby brak w nim odtwarzacza plików czy Bluetooth). Aż prosi się aby zmienić go na coś nowocześniejszego. Niestety zadanie jest utrudnione z uwagi na wspomnianą magistralę CAN. Trzeba się zatem liczyć z ograniczeniem funkcjonalności nowego radia albo dokupić specjalne urządzenie odczytujące dane z w/w magistrali i udostępniające je na złączu ISO czyli tzw. CAN-BOX. Jednak CAN-BOX to wydatek kilkuset PLN i nie ma pewności czy będzie do końca kompatybilny z radioodbiornikiem...




Z uwagi na to iż mój fabryczny radioodbiornik niedomagał postanowiłem go wymienić na tanie, chińskie radyjko samochodowe z Windows CE. Zakupiłem zatem tylko niezbędne okablowanie oraz ramki dopasowujące radio do trapezowatego otworu w Oplu, a adapter CAN-BOX postanowiłem zbudować samodzielnie. Powstało urządzenie, które umożliwia to samo co fabryczny adapter CAN-BOX czyli:
  • odczytuje z magistrali CAN informacje o przekręconym kluczyku stacyjki i ustawia ten stan na pinie ACC kostki ISO radia,
  • odczytuje z magistrali CAN informacje o włączonych światłach i ustawia ten stan na pinie ILL kostki ISO radia,
  • odczytuje z kierownicy informacje o naciśniętych przyciskach i ustawia odpowiednią rezystancję na złączu KEY kostki ISO radia.

Ponadto moje urządzenie umożliwia też:
  • włączenie radia bez kluczyka (dodatkowym przyciskiem),
  • reset radia (które sporadycznie potrafi się zawiesić) oraz adaptera (dłuższe przytrzymania w/w przycisku),
  • wywołanie ekranu ustawień komputera samochodu przyciskiem na kierownicy (oryginalnie wywołanie tej funkcji odbywało się tylko z poziomu fabrycznego radioodbiornika),
  • szybki powrót do głównego ekranu komputera przyciskiem na kierownicy (oryginalnie wywołanie tej funkcji było możliwe z poziomu fabrycznego radioodbiornika),
  • odczyt napięcia akumulatora oraz temperatury silnika z magistrali CAN i prezentacja tych informacji na planszy wyświetlanej na ekranie radioodbiornika z pomocą wejścia TV-AUX. To extra funkcja - nie spotykałem się z takim wykorzystaniem wejścia TV w radioodbiorniku!
(Oryginalnie w samochodzie nie ma wskaźnika temperatury. Za pomocą klawiszologii oryginalnego radia jest możliwe wywołanie nieprzejrzystej planszy - tzw. trybu diagnostycznego, gdzie informacje te są obecne).

Jak to działa?

W wiązce kablowej oryginalnego radioodbiornika występują sygnały czterech głośników auta, permanentny plus akumulatora (B+), masa oraz dwie linie magistrali CAN (L i H). Można zakupić gotową przejściówkę ze złącza OPEL do ISO wraz z niezbędnym separatorem instalacji antenowej. Niestety podłączenie innego radia utrudnia brak sygnału kluczyka stacyjki ACC (tzw. accessory), który jest wymagany przez radioodbiornik z kostką ISO. Podłączenie tej linii do B+ skutkuje zwiększonym poborem prądu na postoju i szybkim rozładowaniem akumulatora. Należy zatem użyć dodatkowego wyłącznika. Najkorzystniej podłączyć go jednak nie do B+ a do... lampki podświetlenia schowka. Napięcie tam pojawia się tuż po otwarciu drzwi i zanika po 20 minutach (lub 20 minutach po zgaszeniu silnika). Dzięki temu radio samo wyłączy się i nie będzie pobierać prądu na postoju. Do zasilania mojego urządzenia również użyłem napięcia z lampki schowka, dzięki czemu nie musiałem implementować trybów zmniejszonego poboru prądu (usypianie) oraz kłopotliwego wybudzania.


W konstrukcji urządzenia wykorzystałem dwa gotowe moduły. Pierwszym jest - znany wszystkim - Arduino Nano. Zwykle w swoich urządzeniach unikałem stosowania Arduino, tym razem zbudowałem w pająku prototyp i a że oprogramowanie działało sprawnie postanowiłem pozostać z tą platformą. Drugim modułem jest MCP2515 CANBUS i wymaga on osobnego omówienia.

Magistrala CAN jest specjalnym rodzajem interfejsu odpornego na zakłócenia i cechującego się dużą niezawodnością. Od strony fizycznej jest to dwuprzewodowa skrętka z liniami oznaczanymi LOW i HIGH zakończona terminatorami 120R - transmisja jest różnicowa. CAN jest interfejsem szeregowym i ma charakter rozgłoszeniowy. Każda ramka danych rozpoczyna się identyfikatorem nadawcy - w jednej magistrali nie powinny się znajdować dwa urządzenia nadające z tym samym identyfikatorem. Magistrala CAN od lat 90-tych jest stosowana w motoryzacji do łączenia poszczególnych podzespołów elektronicznych auta.

W samochodach Opel Astra H (oraz Zafira B i Corsa D) produkowanych w latach 2004-2014 zastosowano 3 równoległe, niezależne magistrale CAN pracujące z różnymi prędkościami i mające różne zastosowania:
  • SW-CAN (SingleWire) 33.3 kbps - steruje światłami, centralnym zamkiem, szybami, lusterkami itp.
  • MS-CAN (MidSpeed) 95.0 kbps - nawiewy, klimatyzacja, komputer pokładowy, radioodbiornik, wyświetlacz itd.
  • HS-CAN (HighSpeed) 500 kbps - moduł sterowania silnikiem, zespół wskaźników, ABS itp.
Na złączu radioodbiornika występuje tylko magistrala MS-CAN. Dostęp do wszystkich trzech magistral jest możliwy poprzez gniazdo diagnostyczne OBD2 (wykorzystywałem je w wersji prototypowej).

Głównymi elementami modułu MCP2515 CANBUS są dwa układy scalone. Pierwszy TJA1050 jest odbiornikiem/nadajnikiem CAN zamieniającym poziomy sygnałów z różnicowego panującego w magistrali CAN na klasyczne TX i RX z poziomem TTL. Drugi z chipów MCP2515 (tak jak nazwa modułu) to sprzętowy dekoder magistrali CAN, który dekoduje pełne ramki i odrzuca te niewłaściwe. Z mikrokontrolerem porozumiewa się on za pomocą sprzętowej magistrali SPI. Układ MCP2515 potrafi także filtrować identyfikatory - o wystąpieniu oczekiwanego komunikatu procesor jest informowany za pomocą osobnej linii przerwania INT. Moduł fabrycznie miał wlutowany kwarc 8MHz - niestety nie udało mi się go skonfigurować do pracy z nietypową prędkością 95kbps jaka obowiązuje na linii MS-CAN w Oplu. Stało się to możliwe dopiero po wymianie kwarcu na 16MHz.


Oprócz obu wymienionych modułów (Arduino i MCP2515) mój układ CAN-BOX zawiera jeszcze kilka bloków funkcjonalnych:

Zasilacz

Napięcie zasilania może dochodzić do 14V a stabilizator Arduino ma podany zakres napięć 9-12V. Dlatego zastosowałem własny zasilacz oparty o scaloną przetwornicę MC34063 (US1), która wraz z elementami towarzyszącymi R1-R3, C1-C3, L1 i D1 wytwarza napięcie 5V do zasilania modułów Arduino i MCP2515.

Układy wyjściowe IGN i LIG

Ich zadaniem jest wystawianie napięcia 12V na piny złacza ISO radioodbiornika. Służą do tego tranzystory MOSFET-P (T2,T4) wraz z driverami (T1,T3) i elementami towarzyszącymi R4-R7.

Układ wyjściowy KEY

Układ symuluje działanie klawiatury rezystancyjnej. Obciążenie to realizowane jest przez kombinację 3 rezystorów (R13-R15) połączonych szeregowo z R16 oraz tranzystory sterujące T5-T7 za pośrednictwem rezystorów R10-R12.

Układ pomiaru napięcia

Układ ten stanowi dzielnik napięcia R17/R18 oraz zabezpieczająca dioda Zenera D2.

Złącze przycisku dodatkowego BTN

Opcjonalny przycisk (4->3) umożliwia załączenie radioodbiornika bez kluczyka w stacyjce oraz reset układu. Rezystor R19 zasila informacyjną diodę LED przycisku (2->1)



Złącze TV-OUT

Jest to dodatkowa funkcjonalność mojego modułu CAN-BOX. Dzięki wejściu TV-AUX radioodbiornika możliwe jest wyświetlenie na jego ekranie planszy prezentującej napięcie akumulatora oraz temperaturę silnika. Analogowy sygnał video ma tutaj tylko 3 stany - biały (ok. 1V) / czarny (ok. 0,3V) oraz impuls synchronizacji (OV). Poziomy sygnału są generowane przy pomocy dzielników jakie stanowią rezystory R8 i R9 z wewnętrzną rezystancją wejścia TV-IN radioodbiornika. Rozdzielczość i stabilność tak generowanego obrazu jest ograniczona osiągami procesora ale w tym zastosowaniu jest wystarczająca.


Płytkę drukowaną wykonano metodą termotransferu. Po wytrawieniu ścieżki zostały pocynowane metodą bezprądową a po zlutowaniu zabezpieczone lakierem bezbarwnym. W konstrukcji urządzenia zastosowano elementy SMD, które znajdują sie na spodniej stronie płytki drukowanej (druku). Na wierzchniej stronie znajdują się nieliczne elementy przewlekane oraz gniazda przyłączeniowe: CAN, ISO oraz BTN. Płytka ta stanowi również bazę (płytę główną) dla osadzonych na niej w gniazdach pinhead modułów: Arduino oraz MCP2515.


Płytka została zaprojektowana tak aby się zmieścić w obudowie KM-82. Aby się w niej zmieścić moduł MCP2515 został w narożach przyszlifowany (znajdowały się tam tylko otwory montażowe. Wymontowano z niego również zbędne gniazda jumpera terminatora oraz śrubowe zaciski magistrali CAN (wykorzystano alternatywne złącze pinhead). Moduł Arduino został pozbawiony złącza ISP dzięki czemu jest niższy. W wieczku obudowy umieszczono gąbkę, dzięki czemu po skręceniu moduły są dociskane do płytki. Do podłączenia wiązki kablowej (ISO i CAN) wykorzystano złącza tzw. terminal blocks.


Oprogramowanie

Program napisano oczywiście w środowisku Arduino wykorzystując dwie zewnętrzne biblioteki:
  • mcp_can - do obsługi modułu MCP2515 CANBUS,
  • TVout - do generowania analogowego sygnału VIDEO.
Dzięki ustawieniu filtrów układu MCP2515 procesor Arduino ma wystarczającą wydajność do ciągłego generowania obrazu (zdarzają jedynie sporadyczne szarpnięcia, które dodają specyficznego uroku). O nadejściu interesujących komunikatów moduł MCP2515 informuje osobną linią przerwania. Dla funkcjonowania układu niezbędny jest odczyt jedynie 3 komunikatów z magistrali CAN:
  • 405# - informujący o pozycji kluczyka stacyjki oraz poziomie oświetlenia,
  • 206# - informujący o naciśnięciu przycisków na kierownicy,
  • 4EC# - informujący o bieżącej temperaturze silnika.
Ponadto do magistrali CAN wysyłam dwa komunikaty, które wysyłało oryginalne radio. Używam w tym celu jeden z przycisków kierownicy (odpowiednio krótkie i długie naciśnięcie):
  • 201#01FF00 - wywołanie menu ustawień komputera pokładowego,
  • 201#01C000 - powrót do ekranu głównego komputera pokładowego.
Oryginalnie przycisk ten obsługiwał moduł BT samochodu, który wyłączyłem z racji na BT wbudowany w nowy radioodbiornik.

Specyfikacja komunikatów nie jest oficjalnie dostępna, ale w sieci (również na forum elektroda.pl) jest sporo informacji na ich temat zdobytych przez hobbystów metodą "reverse engineering". Część komunikatów jest opisana w repozytorium na stronie: Car-CAN-Message-DB


Podczas uruchamiania finalnej wersji napotkałem dwa problemy. Pierwszy to niewłaściwie działający watchdog na płytce Arduino NANO- rozwiązałem go wgrywając bootloader od wersji UNO. Drugi poważniejszy problem wymusił zmiany na płytce. W pierwotnej wersji bowiem do symulacji klawiszy chciałem użyć PWM - AnalogWrite(). Niestety radioodbiornik miał problemy z rozróżnieniem przycisków dlatego zastosowałem płytkę pomocniczą z dodatkowymi 6 elementami.

Zamiast opisywać działanie układu CAN-BOX pozwolę sobie wkleić krótką prezentację filmową:


Do pobrania:
Na temat tej konstrukcji rozpocząłem wątek na forum DIY portalu elektroda.pl