Inhaltsverzeichnis:

Lenkradschlüssel zum Autoradio-Adapter (CAN-Bus -> Key1) - Gunook
Lenkradschlüssel zum Autoradio-Adapter (CAN-Bus -> Key1) - Gunook

Video: Lenkradschlüssel zum Autoradio-Adapter (CAN-Bus -> Key1) - Gunook

Video: Lenkradschlüssel zum Autoradio-Adapter (CAN-Bus -> Key1) - Gunook
Video: CAN-BUS adapter for steering wheel buttons to the new car radio | Video tutorial | ARS24 2024, Juli
Anonim
CAN-Bus-Sniffing
CAN-Bus-Sniffing
Senden von Befehlen an die Stereoanlage
Senden von Befehlen an die Stereoanlage

Ein paar Tage nach dem Kauf eines Gebrauchtwagens habe ich festgestellt, dass ich keine Musik von meinem Handy über das Autoradio abspielen kann. Noch frustrierender war, dass das Auto Bluetooth hatte, aber nur Sprachanrufe erlaubte, keine Musik. Es hatte auch einen Windows Phone USB-Anschluss, aber es würde mit einem iPhone ohne einen 60-Dollar-Dongle nicht funktionieren.

Nachdem ich bei meinen vorherigen Autos die Stereoanlagen ersetzt hatte, bestellte ich ohne viel Nachdenken oder Nachforschen eine 40-Dollar-Ersatzstereoanlage von einer bekannten "billigen" Website. Die Stereoanlage wurde mit einer Rückfahrkamera, Car Play und einer Reihe zusätzlicher Funktionen geliefert, was ein viel besseres Preis-Leistungs-Verhältnis als der teurere Dongle zu sein schien, der nur eine Funktion erfüllt.

Nach dem Kauf und Lackieren einer neuen Frontplatte, dem 3D-Drucken einer Halterung und einer ganzen Menge zusätzlicher Arbeit (die für sich allein anweisbar sein könnte), kam ich zu einer unangenehmen Entdeckung. Die Lenkradtastenbefehle wurden über den CAN-Bus gesendet, aber die Stereoanlage hatte nur einen Key1-Eingang. Da ich nicht aufgeben wollte, bestellte ich einen 60-£-Adapter, der nicht funktionierte. An diesem Punkt habe ich mich entschieden, selbst einen Adapter zu machen.

Ich bin kein Elektroingenieur, ich habe nur rudimentäre Elektronikkenntnisse und dies war für mich ein Lern- und Erkundungsprojekt. Mein Rat wäre, zuerst Ihre Fahrzeugspezifikationen zu überprüfen und ein kompatibles Radio zu bestellen, aber wenn Sie bereits festsitzen (wie ich es war), folgen Sie der Anleitung auf eigene Gefahr.

Lieferungen

Der Adapter (ca. 15$)

  • Arduino Pro Mini 5V (oder ein kompatibles Board)
  • MCP2515 CAN-Bus-Modul
  • 60x80mm Perfboard
  • X9C104 digitales Potentiometer 100K Ohm (abhängig von Ihrer Stereoanlage)
  • DC-DC Abwärtsregler LM2596S 3-40V 3A
  • Kabel Sicherungshalter + Sicherung (100-200 Ohm)
  • Projektbox oder 3D-Drucker zum Drucken
  • Auto-Stereo-Buchsen (männlich + weiblich)
  • Lötzubehör, Drähte usw.

Testhelfer (nicht unbedingt erforderlich, erleichtern aber das Testen)

  • Arduino (jede 5V-Platine reicht)
  • MCP2515 CAN-Bus-Modul
  • Steckbrett + Jumper

Schritt 1: CAN-Bus-Sniffing

Anstatt eine Reihe von Drähten durch das Innere Ihres Autos zu führen, die eine Reihe von Systemen miteinander verbinden, haben einige moderne Fahrzeuge Paare von Drähten, die zu jeder Komponente führen. Über diese Leitungen werden Informationen als digitale Datenpakete gesendet, und alle Systeme können alle Nachrichten lesen. Dies ist das CAN-Bus-Netzwerk (es kann mehrere Netzwerke in Ihrem Auto geben, daher sind möglicherweise nicht alle Informationen sichtbar).

Was wir tun wollen, ist, uns mit dem CAN-Bus-Netzwerk zu verbinden und den Datenverkehr zu "schnüffeln". Auf diese Weise können wir "sehen", wenn eine Lenkradtaste gedrückt wird. Jedes Paket hat eine ID, die das Fahrzeug-Subsystem repräsentiert, das das Paket gesendet hat, und die Daten, die den Systemzustand repräsentieren. In diesem Fall versuchen wir, die ID des Subsystems zu finden, das die Lenkradschlüsselnachrichten sendet, und die Datendarstellung jedes Schlüssels.

Wenn Sie Glück haben, finden Sie die Werte für Ihr Auto vielleicht irgendwo im Internet und können diesen Schritt überspringen.

Dieser Vorgang ist etwas aufwendig und wurde bereits an anderer Stelle erklärt, daher fasse ich ihn nur zusammen:

  • Finden Sie die richtigen Werte für die CAN-Bus-Kommunikation an Ihrem Fahrzeug. Für mein Auto (ein Fiat Idea von 2009) war es eine Baudrate von 50 KBPS und eine Taktrate von 8 MHz.
  • Verbinden Sie sich mit dem CAN-Bus-Netzwerk mit dem CAN-Bus-Modul und einem Arduino in einer "Sniffer" -Konfiguration.
  • Lesen Sie die CAN-Bus-Werte auf Ihrem Laptop mit einem Tool wie https://github.com/alexandreblin/python-can-monito… aus. Ohne wird es sehr schwierig, da viele Nachrichten gesendet werden, auch wenn das Auto nichts tut.
  • Drücken Sie die Lenkradtaste und beachten Sie die Wertänderungen. Dies kann etwas schwierig sein, da viele Nachrichten gesendet werden und es möglicherweise schwierig ist, herauszufinden, welche welche ist.

Hier sind zwei großartige Artikel, die den Prozess ausführlich erklären:

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

Am Ende sollten Sie die Subsystem-ID haben, mit der wir nur auf die CAN-Bus-Nachrichten des Lenkrads hören, und eine Liste mit hexadezimalen Werten für die Tastenbefehle. In meinem Fall sahen die Daten so aus:

ID | ID Sechskant | Byte 0 | Byte 1 | Taste

--------------------------------------------------------- 964 | 3C4 | 00 | 00 | Keine Tasten 964 | 3C4 | 04 | 00 | SRC 964 | 3C4 | 10 | 00 | >> 964 | 3C4 | 08 | 00 | << 964 | 3C4 | 00 | 80 | Telefon 964 | 3C4 | 00 | 08 | Regler 964 | 3C4 | 80 | 00 | + 964 | 3C4 | 40 | 00 | - 964 | 3C4 | 00 | 40 | Gewinn 964 | 3C4 | 00 | 02 | Bis 964 | 3C4 | 00 | 01 | Ab 964 | 3C4 | 00 | 04 | OK

Die Subsystem-ID ist 3C4 (in diesem Fall), was eine hexadezimale Zahl ist, also sollten wir sie wie 0x3C4 in die Arduino-Skizzen schreiben. Uns interessieren auch die Bytes 0 und 1 (in Ihrem Fall könnten es mehr Bytes sein). Dies sind ebenfalls hexadezimale Werte, daher sollten sie auch mit einem führenden 0x geschrieben werden.

Wenn Sie die Werte in Binärwerte konvertieren, werden Sie feststellen, dass sich die Bits nicht überlappen (zum Beispiel + 0b10000000 und - 0b01000000), damit mehrere Tasten gleichzeitig gedrückt werden können.

Ich schlage vor, den Sniffer mit den im Abschnitt "Testhelfer" aufgeführten Materialien zu bauen, damit Sie ihn später wiederverwenden können, um Ihr Auto zu simulieren. So müssen Sie nicht die ganze Zeit im Auto sitzen, während Sie den Adapter bauen und testen. Sie können die bereitgestellte Skizze als Simulator verwenden. Ändern Sie "subsystemId", "data0" und "data1" mit den Werten, die Sie ausspioniert haben.

Schritt 2: Befehle an die Stereoanlage senden

Senden von Befehlen an die Stereoanlage
Senden von Befehlen an die Stereoanlage

Bevor Sie mit dem Bau des Adapters beginnen, testen Sie am besten zuerst, ob die Stereoanlage Befehle empfangen kann.

Ich hatte eine Ersatzautobatterie, also habe ich die Stereoanlage direkt daran angeschlossen. Wenn Sie eine 12-V-Tischstromquelle haben, noch besser. Leider konnte ich online nicht viele Informationen über den Key1-Eingang an meinem Gerät finden, also habe ich auf Experimente zurückgegriffen. Ich war zu diesem Zeitpunkt nicht sonderlich besorgt, die Stereoanlage auszubrennen, da sie relativ billig ist und dies mein letzter Versuch war, sie mit meinem Auto zum Laufen zu bringen.

Die Stereoanlage verfügt über einen Befehlslernbildschirm, auf dem es möglich ist, einen von zwei Widerstandswerten (1K und 3,3K) auszuwählen und den "Spannungswert" (0-255) anzuzeigen. "Spannung" wird zitiert, weil es irreführend ist. Ich habe viel Zeit damit verbracht, erfolglos verschiedene Spannungen an Key1 anzulegen. Ich habe auch versucht, verschiedene Widerstände zu verwenden, um die Spannung ohne Glück anzulegen.

Der Durchbruch kam, als ich versuchte, das Kabel von Key1 mit der Batteriemasse zu berühren, was dazu führte, dass die "Spannung" auf 0 fiel. Dies in Kombination mit verschiedenen Widerständen würde konsistente "Spannungs" -Werte auf dem Lernbildschirm erzeugen.

Nachdem ich nun wusste, wie man Eingänge an die Stereoanlage sendet, brauchte ich eine Möglichkeit, sie von einem Arduino zu senden. Zu diesem Zeitpunkt habe ich noch nichts von Multiplexern gehört, die zusammen mit einigen Widerständen eine schnellere und zuverlässigere Lösung gewesen sein könnten (ich bin mir immer noch nicht sicher, ob dies machbar ist), also habe ich ein digitales Potentiometer verwendet. Zuerst hatte ich Probleme, den digitalen Topf zum Laufen zu bringen, bis ich herausfand, dass ich ihn als Rheostat verdrahten muss, um als variabler Widerstand anstelle eines Spannungsteilers zu fungieren. Grundsätzlich musste ich die RH- und RW-Klemmen verbinden.

Neben dem Widerstand war das Timing entscheidend. Wenn der Widerstandsabfall zu kurz ist, wird der Befehl nicht registriert. Wenn es zu lang ist, wird es möglicherweise mehrmals registriert. Ein Abfall von 240 ms, gefolgt von einer Verzögerung von 240 ms bis zum nächsten Befehl, funktionierte für meine Stereoanlage ziemlich zuverlässig. Das scheint zwar sehr wenig Zeit zu sein, bedeutet aber, dass wir maximal 2 Befehle pro Sekunde senden können, was sich bemerkbar macht, wenn Sie versuchen, die Lautstärke schnell zu erhöhen oder zu verringern. Ich habe versucht, mit verschiedenen Timings und Mustern herumzuspielen, was die Geschwindigkeit erhöhte, aber nicht sehr zuverlässig war. Wenn Sie Verbesserungsvorschläge haben, hinterlassen Sie diese bitte in den Kommentaren.

Bevor Sie fortfahren, empfehle ich Ihnen, einen Prototyp zu erstellen, um zu überprüfen, ob Ihre Stereoanlage dieselbe Art von Eingang akzeptiert. Auch wenn er unterschiedliche Spannungen akzeptiert, sollte der Adapter mit leichten Änderungen an der Verkabelung und der Arduino-Skizze funktionieren.

Schritt 3: Aufbau des Adapters

Aufbau des Adapters
Aufbau des Adapters
Aufbau des Adapters
Aufbau des Adapters
Aufbau des Adapters
Aufbau des Adapters

Nachdem alle Komponenten einzeln getestet und zusammen auf einem Steckbrett ausprobiert wurden, war es an der Zeit, ihnen ein dauerhafteres Zuhause zu geben. Dies dauerte einige Stunden des Auslegens von Komponenten und des Lötens.

Oben links befindet sich der Step-Down-Regler, der 12V von der Autobatterie auf 5V umwandelt, die von den anderen Komponenten verwendet werden können.

Unten links befindet sich das CAN-Bus-Modul, das Werte aus dem CAN-Bus-Netzwerk des Autos ausliest und an den Arduino weiterleitet.

Oben rechts befindet sich das digitale Potentiometer (als Rheostat verdrahtet), das als variabler Widerstand zwischen der Masse und dem Key1-Eingang der Stereoanlage fungiert.

Unten rechts befindet sich das Arduino, das als Gehirn des Adapters fungiert und CAN-Bus-Nachrichten in Widerstände umwandelt, die von der Stereoanlage gelesen werden.

Am 12-V-Eingang befindet sich eine 150-mA-Sicherung, die den Stromkreis höchstwahrscheinlich nicht schützt, aber im Falle eines Kurzschlusses einen Brand verhindern soll.

Schritt 4: Die Software

Die Software
Die Software

Legen Sie nach dem Herunterladen alle drei.ino-Dateien in einem einzigen Ordner ab. Auf diese Weise werden alle Teil derselben Skizze und werden gemeinsam auf dem Arudino eingesetzt.

Sie müssen auch die erforderlichen Bibliotheken zur Arduino-IDE hinzufügen. Laden Sie dazu die folgenden Dateien herunter:

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

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

Fügen Sie dann beide hinzu, indem Sie zu Skizze> Bibliothek einschließen>. Zip-Bibliothek hinzufügen …

CanBusStereoAdapter.ino

In dieser Datei wird die grundlegende Einrichtung durchgeführt.

Oben werden die CAN-Bus-Werte für Tastenbefehle definiert. Wenn Sie nicht das gleiche Auto wie ich haben, müssen Sie höchstwahrscheinlich Ihre eigenen Werte eingeben. Sie können die hexadezimalen Werte aus dem Sniffer verwenden, ich habe binär verwendet, damit es leichter zu erkennen ist, dass es keine versehentlichen Überschneidungen in den Bits gibt.

Nicht alle Autos haben die gleichen Lenkradbefehle. Sie können die definierten Werte also gerne entfernen, hinzufügen oder bearbeiten.

Vergessen Sie nicht, Ihre Subsystem-ID in "STEERING_ID" zu ersetzen.

CanBus.ino

Diese Datei richtet den CAN-Bus-Listener ein, interpretiert die Pakete und legt die Widerstandswerte in einen Ringpuffer.

Passen Sie die CAN-Bus-Konfiguration in der Funktion „setupCanBus“an Ihr Fahrzeug an.

Wir verwenden einen Ringpuffer, da, wie bereits erwähnt, die Eingabe von Lenkradbefehlen viel schneller ist als die Stereoeingabe. Auf diese Weise verpassen wir keine Befehle, während das digitale Potentiometer seine Arbeit verrichtet. Wenn wir zu viele Befehle eingeben, werden die ältesten zuerst verworfen, da sie die unwichtigsten sind. Damit können wir auch den Fall des mehrfachen Tastendrucks handhaben, da der Stereoeingang jeweils nur einen einzigen Wert akzeptiert.

Wenn Sie eine der Befehlsdefinitionen in "CanBusStereoAdapter.ino" geändert haben, müssen Sie diese auch in der Funktion "handleMessageData" aktualisieren. "handleMessageData" prüft durch eine bitweise UND-Verknüpfung, ob die bereitgestellten CAN-Bus-Datenrahmen irgendwelche der bekannten Befehle enthalten.

Wenn ich zum Beispiel >> und + gleichzeitig gedrückt habe, erhalten wir einen Datenrahmen mit dem Wert 0b10010000. >> (für mein Auto) ist 0b00010000 in Binärform und + ist 0b10000000.

-------------- >> -------------- + ------------- << --- -- Daten0 | 0b10010000 | 0b10010000 | 0b10010000 Befehl | UND 0b00010000 | UND 0b10000000 | UND 0b00001000 Ergebnis | = 0b00010000 | = 0b10000000 | = 0b00000000

Hier sehen wir, dass das Ergebnis der UND-Verknüpfung größer als 0 ist, wenn der Befehl im Datenrahmen vorhanden ist. Wir müssen also nur für jeden von uns definierten Befehl auf {Datenrahmen} & {Befehlswert} > 0 prüfen.

Denken Sie daran, dass jeder Datenrahmen unterschiedliche Befehle enthält, daher ist es in Ordnung, wenn die Befehlswerte gleich sind, da wir sie mit ihren eigenen Frames vergleichen. In meinem Beispiel haben sowohl << als auch ESC den gleichen Wert 0b00001000 (0x08), aber << ist in data0 und ESC in data1.

Nachdem wir festgestellt haben, dass ein Befehl in einem Frame vorhanden ist, fügen wir dem Ringpuffer einen digitalen Pot-Wert hinzu. Die Werte reichen von 0 bis 99, aber ich habe festgestellt, dass die von der Stereoanlage gelesene "Spannung" nicht linear ist, also testen Sie die Werte selbst.

DigitalPot.ino

Diese Datei holt Werte aus dem Ringpuffer und sendet sie zur Ausführung an das digitale Poti. In meinem Fall "pot.setPotMin(false);" erhöht den Widerstand auf das Maximum, was die Stereoanlage als maximale "Spannung" liest. Ihre Stereoanlage erfordert möglicherweise, dass Sie das digitale Poti auf das Minimum stellen, also testen Sie es.

Schritt 5: Das Projektgehäuse

Die Projektanlage
Die Projektanlage

Ich habe einen 3D-Drucker und beschloss, ein zweiteiliges Gehäuse für meinen Adapter zu drucken. Ich habe eine Fusion 360-Datei hinzugefügt, die Sie bearbeiten können, und Gcode-Dateien, die auf ein 60 x 80 mm Perfboard passen.

Wenn Sie keinen Zugang zu einem 3D-Drucker haben, können Sie ein fertiges Projektgehäuse oder einen stabilen Behälter verwenden.

Schritt 6: Abschließende Gedanken

Ich hatte ursprünglich geplant, dass der Adapter an Dauerstrom angeschlossen wird und bei bestimmten CAN-Bus-Botschaften aufwacht, da mein Auto kein Zündkabel im Stereofach hat. Ich habe mich später dagegen entschieden, da ich nicht riskieren wollte, den Akku zu entladen und mir Sorgen um den Adapter zu machen, während ich nicht im Auto bin. Ich habe einen Kfz-Sicherungskasten-Splitter verwendet, um ein Zündkabel zu verlegen und den Adapter nicht weiter zu komplizieren.

Aus meinen Tests ist der Stromverbrauch 20-30 mA. Ich habe es im Schlafmodus auf 10 mA heruntergefahren und könnte noch tiefer gehen, indem ich die LEDs von den Komponenten entfernt habe, aber ich habe mich entschieden, mich nicht damit zu beschäftigen, da es nur läuft, während das Auto läuft.

Mit dem Endergebnis bin ich ziemlich zufrieden. Die Reaktionszeit ist angemessen und es werden selten Befehle verpasst.

Auch wenn meine Zeitinvestition weitaus höher war als die Kosten für den handelsüblichen Adapter (der nicht funktionierte), ist das gewonnene Wissen von unschätzbarem Wert.

Empfohlen: