Ein wenig CAN-Bus-Bastelei für ein Fremdradio

  • Der Einbau eines handelsüblichen Radios anstelle des Original Business-Radios ist kein sonderlich großes Problem. Als Basis dient der mechanische Halter mit den Adaptern für Strom, Lautsprecher und Antenne. Das echte Dauerplus hatte ich auf dem Sicherungsträger gefunden (siehe Erfahrung zu Dauerplus für Radio etc. ) und die UKW-Antenne benötigt keine Phantomspeisung wie es wohl einmal üblich war.


    Nun beschreibe ich einen Teil für versierte Elektronikbastler, die über Kenntnisse in Sachen Microcontroller verfügen.


    Da mein Blaupunkt Stockholm 230 DAB über einen Eingang für Fernbedienfunktionen hat war es klar dass ich diesen Teil noch ergänzen wollte. Als käuflich zu erwerbenden Adapter fand ich nur den von Dietz, der aus der distanzierten Sicht auf die spärlichen Prospektdaten allerdings folgende Nachteile hat: das Signal für den Rückwärtsgang brauche ich nicht, da ich kein 2-DIN Gerät mit Bildschirm für eine Kamera habe. Mit dem Frequenzsignal für die Steuerung der Lautstärke in Abhängigkeit von der Geschwindigkeit kann das Blaupunkt auch nichts anfangen. Vor der Zeit des CAN-Busses war das wohl eine übliche Technik bei Radios vom PKW-Hersteller. Lediglich die Tasten vom Multifunktionslenkrad für Lautstärke, Quelle und Auswahl sowie ein 15-Signal wären übrig geblieben. Außerdem besteht bei einem Eigenbau eine Chance die zusätzlichen Tasten zu nutzen, die für die Telefonansteuerung vorgesehen sind. Auf jeden Fall beinhaltet der Eigenbau einen Lerneffekt und besondere Erfolgserlebnisse.


    Da ich noch keine Erfahrungen mit dem CAN-Bus hatte entschloss ich mich das zu ändern. Schnell waren zwei Microcontroller von Microchip (18F448 ) und die erforderliche Peripherie (MCP2551) besorgt und die Datenblätter sowie Application Notes studiert. Im Grunde genommen ist es recht einfach sich an den CAN-Bus einzuhängen, sobald die erforderliche Konfiguration im Controller steht. Mit einem Oszilloskop ermittelte ich die Datenrate von 100 kbit/s.
    Dann habe ich mir eine Möglichkeit geschaffen die Signale aufzuzeichnen und zu analysieren. Dazu realisierte ich zunächst einen Konverter CAN->RS232 und leitete die Informationen einfach 1:1 weiter. Für die Aufzeichnung der seriellen Signale verwendete ich ein Laptop. Wegen des hohen Datendurchsatzes musste es eine Baudrate von 115200 Baud sein, was der Controller nur mit einer Taktfrequenz von 16MHz schafft (die endgültige Version braucht das nicht und begnügt sich mit 4MHz). Damit fing ich erst einmal mehrere verschiedene Sequenzen ein, auch eine während der Fahrt. Erleichternd ist die Tatsache dass nur Nachrichten mit Standard-Identifier vorkommen.


    Eigentlich hatte ich erwartet dass ich die geschwindigkeitsabhängige Lautstärkeanpassung zuletzt realisiere, aber es kam anders. Die Daten für die Geschwindigkeit hatte ich nämlich als erstes gefunden, mit dem Identifier '0CE' (rechtsbündig). Die Daten erscheinen 10 Mal pro Sekunde und enthalten 4 16-Bit Werte für die 4 Räder. Man kann schön erkennen wenn eine Kurve gefahren wird. Wenn man von den einzelnen Werten die unteren 4 Bit ignoriert erhält man die Geschwindigkeit in km/h. Die Zehnerstelle der Geschwindigkeit habe ich bei meinem Prototyp mit einer 7-Segmentanzeige sichtbar gemacht. Der nächste Schritt war die Umrechnung in einen Offset für die Lautstärkestufen und eine entsprechende Kennlinie. Das war keine schwere Sache. Bei einer Änderung dieses Offsets erzeuge ich einen Impuls für 'Lautstärke +' bzw. 'Lautstärke -', je nachdem ob die Geschwindigkeit zu- oder abnimmt.


    Nebenbei ist mir noch das Datenpaket für Datum und Uhrzeit aufgefallen, mit dem Identifier '2F8'.


    Als Zweites habe ich mich auf die Suche nach einem passenden Signal für die Steuerung der '15' gemacht, also das Signal was das Radio ein- und ausschaltet. Der Abgriff an der Steckdose im Beifahrer-Fußraum ist nicht optimal, da das Radio dabei auch dann ausgeht, wenn die Start-Stopp-Automatik zugeschlagen hat und die Fahrertür geöffnet wird. Das scheint für die Fahrzeugsteuerung schon das Ende der 'eingeschalteten Zündung' zu sein. Besser geeignet erscheint mir ein Zustand der sich am gesteckten Zündschlüssel orientiert. Die Nachricht mit dem Identifier '0D7' schien mir der richtige Ansatzpunkt. Diese wird 5 Mal pro Sekunde mit 2 Datenbytes gesendet und hat wegen einem fortlaufenden Zähler in den Daten offensichtlich im wesentlichen nur eine Signalfunktion.


    Der härteste Brocken waren die Tasten am Multifunktionslenkrad. Nach dem Ausbau des Business-Radios musste ich feststellen dass der Taster für die Steuerung der Umluft nicht mehr funktioniert. Da keine besondere Stromversorgung vom Radio abgeht könnte das darauf hin deuten dass ein Controller im Lenkrad von außen aufgeweckt werden muss, schlimmstenfalls vom Original-Radio. Trotzdem habe ich mich direkt gezielt auf die Suche gemacht und habe bei den Identifiern mit niedriger Priorität (hohe Nummer) angefangen. Dabei konnte ich mich auf die Identifier beschränken die bei der Kommunikation mit dem Business-Radio zu finden sind. Trotzdem hat es gut 50 Versuche gebraucht bis ich bei den Datenpaketen mit dem Identifier '1D6' fündig wurde. Anders herum wäre es tatsächlich schneller gegangen. Die zwei Datenbytes beinhalten einen Code für die jeweilige Taste und werden bei gedrückter Taste 10 Mal pro Sekunde gesendet (jeweils Byte 0 und 1):


    C8 0C = Vol +
    C4 0C = Vol -
    C0 0D = Sprechen
    C1 0C = Hörer
    C0 4C = Source
    C0 1C = Umluft
    E0 0C = Skip +
    D0 0C = Skip -


    Beim Lösen einer Taste folgt einmalig ein Datenpaket mit den Daten 'C0 0C'. Damit war dieser Teil gefunden und konnte umgesetzt werden. Ein 'Aktivieren' des Controllers im Lenkrad ist zum Glück nicht erforderlich. Warum aber niemand mehr auf die Umluft-Taste reagiert muss ich noch klären.


    Die Elektronik habe ich auf zwei Platinen verteilt, eine mit dem Controller samt Stromversorgung und Peripherie und eine mit den Relais für die Ansteuerung des Radios. Jede der Platinen verfügt über einen kleinen Steckverbinder. Die Controller-Platine wird 5polig mit Strom und CAN-Bus versorgt, die Relaisplatine hat einen 3poligen Anschluss für die SWC-Eingänge des Radios. Das fertig montierte Paket passt in ein Gehäuse 'Bopla ET-208' (98/64/38 mm) und lässt sich gut hinter dem Bedienteil der Heizung und Lüftung unterbringen.


    Die Stromversorgung von Radio und CAN-Adapter ist nun wie folgt realisiert:
    - Dauer-Plus (30) für das Radio direkt ab dem Steckplatz der nicht bestückten Sicherung F83, über eine fliegende Flachstecksicherung zum Radio.
    - Stromversorgung (30G) über F14 für den CAN-Adapter, abgegriffen am Quadlock-ISO-Adapter
    - Zündung (15) vom Can-Adapter direkt an das Radio


    Mit diesem Ansatz lassen sich auch andere Informationen vom CAN-Bus direkt visualisieren. Geschwindigkeit und Uhrzeit habe ich hier schon ermittelt, weitere sollten ebenfalls mehr oder weniger leicht zu finden sein.

  • Für die Klemme 15 solltest du mal einen Blick auf die 12F werfen. Ich hab mir für meinen E91 einen Adapter mit PIC18F gebaut, um ein NBT dort zu betreiben, da habsch die Signale auch alle gebraucht. Und noch einen ganzen Sack mehr :)



    Warum hast du das so riesig gebaut? Und warum will man ein anderes Radio als die Serien-Headunit?


    Wie machst du's mit dem Einpennen, wenn das Fahrzeug schlafen geht?

  • Hmmm, die 12F finde ich in meinen Datenprotokollen nicht. Für den PIC sollte dann 25E programmiert werden weil der den Identifier linksbündig nimmt. In dieser Schreibweise ist 150 der niedrigste Identifier den ich gefunden habe.
    Warum ein anderes Radio als das Business? Das ist nicht die Frage, das kommt ja schon gegenüber dem Professional in die Kritik. DAB, SD-Karte, USB und Bluetooth gibt es zwar auch in Original, aber dafür reicht dann kein dreistelliger Euro-Betrag mehr aus. Das Preis-Leistungsverhältnis ist einfach unschlagbar. Aber das ist wie alles Ansichtssache. Ich habe und brauche kein PDC und vermisse die sonstigen Warntöne überhaupt nicht.
    Das Radio ist noch nicht so lange in Betrieb dass ich bei gestecktem Schlüssel die 20 Minuten abgewartet habe, nach denen sich das Fahrzeug schlafen legt. Dazu kann ich noch nichts sagen. Im Moment geht das Radio beim Abziehen des Schlüssels automatisch aus.

  • Ich bin jetzt seit knapp fünf Jahren auf dem PIC18 unterwegs, aber ich höre zum ersten mal dass man die CAN IDs umrechnen muss. Benutzt du das Microchip-eigene ECAN Modul?


    Bei der 0x12F bin ich mir 100% sicher, weil nur damit meine Headunit korrekt ansprang. Der alte 100kBit hat die mit Sicherheit auch.


    Btw, ein praktisches Tool ist Busmaster. Das kommt mit allen gängigen Hardware-Adaptern klar und ist ziemlich mächtig, selbst im Vergleich zum sauteuren Vector CANoe.
    Als Hardware-Pendant ist der PCAN von Peak zu empfehlen. Der kann zwar nur den Highspeed-CAN, aber es gibt Pegelwandler für den alten Lowspeed-CAN mit 100kBit.

  • Der 18F448 hat wohl das CAN-Modul. ECAN sieht auf den ersten Blick nach etwas mehr aus aber kompatibel.
    Mit 'Umrechnung' meine ich folgendes: der Standard-Identifier ist 11 bit lang und wird in den Registern des PIC linksbündig eingetragen (SID10..SID3 und SID2..SID0. Da es kein 12. Bit gibt (SID11) habe ich hier im Beitrag die Identifier rechtsbündig notiert da für die Beschreibung die konkrete Realisierung im PIC uninteressant ist. Für Uhrzeit/Datum zum Beispiel lese ich in den Registern des PIC die Werte 5F und 00, aber die einzelnen Bits des SID ergeben eben nicht 5F0 sondern 2F8. Ich weiss, das mag verwirrend erscheinen.


    És sollte beim ECAN-Modul wegen der Kompatibilität nicht anders sein, die SID 0x12F würde ich z.B. in die Filterregister RXFnSIDH und RXFnSIDL als 0x25 und 0xE0 schreiben um auf diese Nachricht zu reagieren. Hast du das auch so gemacht oder doch anders?

  • Ja und nein. Ich benutze zum Setzen der Filter ein Makro aus dem ECAN Modul, ECANSetRXF0Value(nID, ECAN_MSG_STD);


    Das führt zu:



    RXFCON0_RXF0EN = 1;
    _CANIDToRegs((BYTE*)&RXF0SIDH, val, type);


    Mit Extended IDs müssen wir uns zum Glück ned rumschlagen. Die sind nochmal n Stückchen länger...