Spisu treści:

Klucze z kierownicy do samochodowego adaptera stereo (magistrala CAN -> Key1): 6 kroków
Klucze z kierownicy do samochodowego adaptera stereo (magistrala CAN -> Key1): 6 kroków

Wideo: Klucze z kierownicy do samochodowego adaptera stereo (magistrala CAN -> Key1): 6 kroków

Wideo: Klucze z kierownicy do samochodowego adaptera stereo (magistrala CAN -> Key1): 6 kroków
Wideo: Opel Vectra C Montaż radia android EUNAVI 2024, Listopad
Anonim
Wąchanie magistrali CAN
Wąchanie magistrali CAN
Wysyłanie poleceń do stereo
Wysyłanie poleceń do stereo

Kilka dni po zakupie używanego samochodu odkryłem, że nie mogę odtwarzać muzyki z telefonu przez radio samochodowe. Jeszcze bardziej frustrujące było to, że samochód miał bluetooth, ale zezwalał tylko na połączenia głosowe, a nie na muzykę. Miał też port USB Windows Phone, ale nie działałby z iPhonem bez klucza sprzętowego za 60 $.

Po wymianie zestawów stereo w moich poprzednich samochodach, bez większego namysłu i badań, zamówiłem zamienny zestaw stereo za 40 $ ze znanej "taniej" strony internetowej. Zestaw stereo był wyposażony w kamerę cofania, Car Play i kilka dodatkowych funkcji, które wydawały się znacznie lepszą wartością niż droższy klucz sprzętowy, który robi tylko jedną rzecz.

Po zakupie i pomalowaniu nowej płyty czołowej, wydrukowaniu 3D uchwytu i całej mnóstwa dodatkowej pracy (która sama w sobie może być instruktażem), doszłam do nieprzyjemnego odkrycia. Polecenia klawiszy kierownicy były wysyłane przez magistralę CAN, ale stereo miało tylko wejście Key1. Nie poddając się w połowie, zamówiłem przejściówkę za 60 funtów, która okazała się nie działać. W tym momencie postanowiłem sam zrobić adapter.

Nie jestem inżynierem elektrykiem, mam tylko podstawową wiedzę z zakresu elektroniki i był to dla mnie projekt edukacyjny i eksploracyjny. Radzę najpierw sprawdzić specyfikacje pojazdu i zamówić kompatybilne radio, ale jeśli już utknąłeś (tak jak ja), postępuj zgodnie z instrukcjami na własne ryzyko.

Kieszonkowe dzieci

Adapter (ok. 15$)

  • Arduino Pro Mini 5V (lub kompatybilna płytka)
  • Moduł magistrali CAN MCP2515
  • Płyta perforowana 60x80mm
  • Potencjometr cyfrowy X9C104 100K Ohm (w zależności od posiadanego zestawu stereo)
  • Regulator obniżania napięcia DC-DC LM2596S 3-40V 3A
  • Uchwyt bezpiecznika kablowego + bezpiecznik (100-200 Ohm)
  • Projektuj pudełko lub drukarkę 3D do wydrukowania
  • Gniazda samochodowe stereo (męskie + żeńskie)
  • Materiały lutownicze, przewody itp.

Pomocnicy testowi (niekoniecznie potrzebni, ale znacznie ułatwią testowanie)

  • Arduino (dowolna płytka 5V wystarczy)
  • Moduł magistrali CAN MCP2515
  • Deska do krojenia chleba + swetry

Krok 1: Wąchanie magistrali CAN

Zamiast wiązek przewodów biegnących po wnętrzu samochodu łączących kilka systemów, niektóre nowoczesne pojazdy mają pary przewodów biegnących do każdego elementu. Informacje są przesyłane w postaci cyfrowych pakietów danych za pośrednictwem tych przewodów, a wszystkie systemy mogą odczytywać wszystkie wiadomości. To jest magistrala CAN (w samochodzie może być wiele sieci, więc wszystkie informacje mogą być niewidoczne).

To, co chcemy zrobić, to podłączyć się do sieci magistrali CAN i „podsłuchiwać” ruch danych. W ten sposób możemy „zobaczyć”, kiedy wciśnięty jest klawisz na kierownicy. Każdy pakiet ma identyfikator, który reprezentuje podsystem pojazdu, który wysłał pakiet, oraz dane reprezentujące stan systemu. W tym przypadku próbujemy znaleźć identyfikator podsystemu, który wysyła komunikaty o klawiszach z kierownicy, oraz reprezentację danych każdego klawisza.

Jeśli masz szczęście, możesz znaleźć wartości dla swojego samochodu gdzieś w Internecie i możesz pominąć ten krok.

Ten proces jest nieco skomplikowany i został już wyjaśniony w innych miejscach, więc po prostu go podsumuję:

  • Znajdź prawidłowe wartości dla komunikacji magistrali CAN w swoim pojeździe. Dla mojego samochodu (Fiat Idea 2009) była to prędkość transmisji 50KBPS i zegar 8MHz.
  • Połącz się z siecią CAN bus za pomocą modułu CAN bus i Arduino w konfiguracji „sniffer”.
  • Odczytaj wartości magistrali CAN na swoim laptopie za pomocą narzędzia takiego jak https://github.com/alexandreblin/python-can-monito…. Bez niego będzie to bardzo trudne, ponieważ wiele wiadomości jest wysyłanych nawet wtedy, gdy samochód nic nie robi.
  • Naciśnij przycisk na kierownicy i zanotuj zmiany wartości. Może to być nieco skomplikowane, ponieważ wysyłanych jest wiele wiadomości i może być trudno ustalić, która jest która.

Oto dwa świetne artykuły szczegółowo wyjaśniające ten proces:

  • https://medium.com/@alexandreblin/can-bus-reverse-…
  • https://www.instructables.com/id/CAN-Bus-Sniffing-…

Na koniec powinieneś mieć identyfikator podsystemu, którego użyjemy do nasłuchiwania tylko komunikatów magistrali CAN kierownicy i listę wartości szesnastkowych dla poleceń klawiszy. W moim przypadku dane wyglądały tak:

ID | Identyfikator szesnastkowy | Bajt 0 | Bajt 1 | Przycisk

---------------------------------------------- 964 | 3C4 | 00 | 00 | Brak przycisków 964 | 3C4 | 04 | 00 | SRC 964 | 3C4 | 10 | 00 | >> 964 | 3C4 | 08 | 00 | << 964 | 3C4 | 00 | 80 | Telefon 964 | 3C4 | 00 | 08 | ESC 964 | 3C4 | 80 | 00 | + 964 | 3C4 | 40 | 00 | - 964 | 3C4 | 00 | 40 | Wygraj 964 | 3C4 | 00 | 02 | W górę 964 | 3C4 | 00 | 01 | W dół 964 | 3C4 | 00 | 04 | ok

Identyfikator podsystemu to 3C4 (w tym przypadku), który jest liczbą szesnastkową, więc w szkicach Arduino powinniśmy zapisać go tak jak 0x3C4. Interesują nas również bajty 0 i 1 (w Twoim przypadku może być więcej bajtów). Są to również wartości szesnastkowe, więc powinny być również zapisywane z wiodącym 0x.

Jeśli przekonwertujesz wartości na binarne, zauważysz, że bity się nie nakładają (na przykład + 0b10000000 i - 0b0100000000), dzięki czemu można jednocześnie nacisnąć wiele klawiszy.

Sugeruję zbudowanie sniffera z materiałów wymienionych w sekcji „pomocnik testowy”, dzięki czemu można go później wykorzystać do symulacji samochodu. Pozwoliłoby to uniknąć konieczności siedzenia w samochodzie podczas budowania i testowania adaptera. Możesz użyć dostarczonego szkicu, aby działać jako symulator. Zmodyfikuj "subsystemId", "data0" i "data1" wartościami, które wywęszyłeś.

Krok 2: Wysyłanie poleceń do stereo

Wysyłanie poleceń do stereo
Wysyłanie poleceń do stereo

Przed rozpoczęciem budowy adaptera najlepiej najpierw sprawdzić, czy zestaw stereo może odbierać polecenia.

Miałem zapasowy akumulator samochodowy, więc bezpośrednio do niego podłączyłem stereo. Jeśli masz stacjonarne źródło zasilania 12 V, jeszcze lepiej. Niestety nie mogłem znaleźć wielu informacji w Internecie na temat wejścia Key1 w moim urządzeniu, więc uciekłem się do eksperymentów. W tym momencie nie martwiłem się zbytnio spaleniem zestawu stereo, ponieważ jest on stosunkowo tani, a to była moja ostatnia próba zmuszenia go do pracy z moim samochodem.

Zestaw stereo posiada ekran nauki poleceń, gdzie można wybrać jedną z dwóch wartości rezystancji (1K i 3,3K) oraz zobaczyć wartość „napięcia” (0-255). „Napięcie” jest cytowane, ponieważ wprowadza w błąd. Spędziłem dużo czasu stosując różne napięcia do Key1 bez powodzenia. Próbowałem też użyć różnych rezystorów do przyłożenia napięcia bez powodzenia.

Przełom nastąpił, gdy próbowałem dotknąć przewodu Key1 do masy akumulatora, co spowodowało spadek „napięcia” do 0. To w połączeniu z różnymi rezystorami dałoby spójne wartości „napięcia” na ekranie uczenia.

Teraz, gdy wiedziałem, jak wysyłać wejścia do stereo, potrzebowałem sposobu, aby wysłać je z Arduino. W tym momencie nie słyszałem o multiplekserach, które wraz z niektórymi rezystorami mogłyby być szybszym i bardziej niezawodnym rozwiązaniem (wciąż nie jestem pewien, czy jest to wykonalne), więc zastosowałem potencjometr cyfrowy. Na początku miałem problemy z uruchomieniem cyfrowego potencjometru, dopóki nie zorientowałem się, że muszę go podłączyć jako reostat, aby działał jako zmienny rezystor zamiast dzielnika napięcia. Zasadniczo musiałem podłączyć zaciski RH i RW.

Oprócz oporu decydujący był czas. Jeżeli spadek rezystancji będzie zbyt krótki, polecenie nie zostanie zarejestrowane. Jeśli jest zbyt długi, może zostać zarejestrowany wiele razy. Spadek o 240 ms, po którym następuje 240 ms opóźnienie do następnego polecenia, działało dość niezawodnie w moim stereo. Chociaż wydaje się to bardzo mało czasu, oznacza to, że możemy wysłać maksymalnie 2 polecenia na sekundę, co jest zauważalne, jeśli próbujesz szybko zwiększyć lub zmniejszyć głośność. Próbowałem bawić się różnymi czasami i wzorami, co zwiększało prędkość, ale nie było zbyt niezawodne. Jeśli masz jakieś pomysły, jak to ulepszyć, zostaw je w komentarzach.

Zanim przejdziemy dalej, sugeruję zbudowanie prototypu, aby sprawdzić, czy twoje stereo akceptuje ten sam rodzaj sygnału wejściowego. Nawet jeśli akceptuje różne napięcia, adapter powinien działać z niewielkimi zmianami w okablowaniu i szkicu Arduino.

Krok 3: Budowanie adaptera

Budowanie adaptera
Budowanie adaptera
Budowanie adaptera
Budowanie adaptera
Budowanie adaptera
Budowanie adaptera

Po przetestowaniu wszystkich komponentów osobno i wypróbowaniu ich razem na płytce prototypowej, nadszedł czas, aby zapewnić im bardziej trwały dom. Zajęło to kilka godzin układania komponentów i lutowania.

W lewym górnym rogu znajduje się regulator obniżania napięcia, który przekształca napięcie 12 V z akumulatora samochodowego na 5 V, z którego mogą korzystać inne komponenty.

W lewym dolnym rogu znajduje się moduł magistrali CAN, który odczytuje wartości z sieci magistrali CAN samochodu i przekazuje je do Arduino.

W prawym górnym rogu znajduje się potencjometr cyfrowy (podłączony jako reostat), który działa jako rezystor zmienny między masą a wejściem Key1 zestawu stereo.

W prawym dolnym rogu znajduje się Arduino, które działa jak mózg adaptera, przekształcając komunikaty magistrali CAN w rezystancje, które są odczytywane przez stereo.

Na wejściu 12V znajduje się bezpiecznik 150mA, który najprawdopodobniej nie zabezpieczy obwodu, ale ma zapobiec pożarowi w przypadku zwarcia.

Krok 4: Oprogramowanie

Oprogramowanie
Oprogramowanie

Po pobraniu umieść wszystkie trzy pliki.ino w jednym folderze. W ten sposób wszyscy będą częścią tego samego szkicu i zostaną razem wdrożeni w Arudino.

Musisz również dodać wymagane biblioteki do Arduino IDE. Aby to zrobić, pobierz następujące pliki:

github.com/autowp/arduino-mcp2515/archive/…

github.com/philbowles/Arduino-X9C/archive/…

następnie dodaj oba, przechodząc do Szkic> Dołącz bibliotekę> Dodaj bibliotekę. Zip…

CanBusStereoAdapter.ino

W tym pliku przeprowadzana jest konfiguracja podstawowa.

Na górze są zdefiniowane wartości poleceń z magistrali CAN. Jeśli nie masz tego samego samochodu co ja, najprawdopodobniej będziesz musiał wprowadzić własne wartości. Możesz użyć wartości szesnastkowych z sniffera, ja użyłem binarnych, aby łatwiej było zobaczyć, że nie ma przypadkowych nakładek w bitach.

Wszystkie samochody nie mają tych samych poleceń na kierownicy, więc możesz swobodnie usuwać, dodawać lub edytować zdefiniowane wartości.

Nie zapomnij zastąpić identyfikatora podsystemu w „STEERING_ID”.

CanBus.ino

Ten plik konfiguruje odbiornik magistrali CAN, interpretuje pakiety i umieszcza wartości rezystancji w buforze okrężnym.

Dostosuj konfigurację magistrali CAN w funkcji „setupCanBus” do swojego samochodu.

Używamy bufora kołowego, ponieważ, jak wspomniano wcześniej, wejście poleceń z kierownicy jest znacznie szybsze niż wejście stereo. W ten sposób nie tracimy żadnych poleceń, gdy cyfrowy potencjometr robi swoje. Jeśli wprowadzimy zbyt wiele poleceń, najstarsze zostaną odrzucone jako pierwsze, ponieważ są najmniej ważne. Pozwala nam to również poradzić sobie z przypadkiem naciśnięcia wielu przycisków, ponieważ wejście stereo akceptuje tylko jedną wartość na raz.

Jeśli zmieniłeś jakiekolwiek definicje poleceń w „CanBusStereoAdapter.ino”, musisz je również zaktualizować w funkcji „handleMessageData”. "handleMessageData" sprawdza, czy dostarczone ramki danych magistrali CAN zawierają którekolwiek ze znanych poleceń, używając operacji bitowej AND.

Na przykład, jeśli nacisnę jednocześnie >> i +, co da nam ramkę danych o wartości 0b10010000. >> (dla mojego samochodu) to 0b00010000 w postaci binarnej, a + to 0b10000000.

--------------- >> -------------- + ------------- << --- -- dane0 | 0b10010000 | 0b10010000 | 0b10010000 polecenie | I 0b00010000 | I 0b10000000 | AND 0b00001000 wynik | = 0b00010000 | = 0b10000000 | = 0b00000000

Tutaj widzimy, że wynik operacji AND będzie większy niż 0, jeśli polecenie jest obecne w ramce danych. Więc wszystko, co musimy zrobić, to sprawdzić, czy {ramka danych} i {wartość polecenia} > 0 dla każdego zdefiniowanego polecenia.

Należy pamiętać, że każda ramka danych zawiera różne polecenia, więc jest w porządku, jeśli wartości poleceń są takie same, ponieważ porównujemy je z ich własnymi ramkami. W moim przykładzie zarówno <<, jak i ESC mają tę samą wartość 0b00001000 (0x08), ale << jest w data0, a ESC w data1.

Po ustaleniu, że w ramce znajduje się polecenie, dodajemy cyfrową wartość potencjometru do okrągłego bufora. Wartości mieszczą się w zakresie od 0 do 99, ale zauważyłem, że „napięcie” odczytywane przez stereo nie jest liniowe, więc sam przetestuj wartości.

DigitalPot.ino

Ten plik usuwa wartości z okrągłego bufora i wysyła je do cyfrowego potencjometru w celu wykonania. W moim przypadku "pot.setPotMin(false);" zwiększy rezystancję do maksimum, co stereo odczyta jako maksymalne „napięcie”. Twoje stereo może wymagać ustawienia cyfrowego potencjometru na minimum, więc przetestuj go.

Krok 5: Załącznik projektu

Załącznik projektu
Załącznik projektu

Mam drukarkę 3D, więc postanowiłem wydrukować dwuczęściową obudowę do mojego adaptera. Dołączyłem plik Fusion 360, który możesz edytować, oraz pliki gcode, które zmieszczą się na płycie perforowanej 60x80mm.

Jeśli nie masz dostępu do drukarki 3D, możesz skorzystać z gotowej obudowy projektowej lub solidnego pojemnika.

Krok 6: Końcowe myśli

Początkowo planowałem podłączenie zasilacza do stałego zasilania i wybudzanie się na pewne komunikaty magistrali CAN, ponieważ mój samochód nie ma przewodu zapłonowego w komorze stereo. Później zrezygnowałem z tego, ponieważ nie chciałem ryzykować rozładowania akumulatora i martwienia się o zasilacz, gdy jestem z dala od samochodu. Użyłem rozgałęźnika do skrzynki bezpieczników samochodowych, aby uruchomić przewód zapłonowy i nie muszę dalej komplikować adaptera.

Z moich testów pobór prądu wynosi 20-30 mA. W trybie uśpienia obniżyłem go do 10 mA i mógłbym zejść jeszcze niżej, usuwając diody LED z komponentów, ale postanowiłem nie zawracać sobie tym głowy, ponieważ będzie działał tylko podczas jazdy samochodu.

Jestem bardzo zadowolony z efektu końcowego. Czas odpowiedzi jest rozsądny i rzadko pomija polecenia.

Mimo że moja inwestycja czasowa była znacznie większa niż koszt dostępnego na rynku adaptera (który nie działał), wiedza, którą zdobyłem, jest bezcenna.

Zalecana: