Wustis Blog

Der Blog über Tobias Wust und seine Reise

Multifunktionslenkrad mit Arduino auslesen – Der Quelltext

| Keine Kommentare

Wie jeder weiß benutze ich mein Nexus 7 Tablet als Autoradio und verwende mein Multifunktionslenkrad mit einem Arduino, um es zu steuern. In meinem Blogartikel zu dem Thema geht deutlich mehr die Post ab, als ich es je erwartet habe und die Nachfrage ist groß. Aus diesem Anlass möchte ich nun den Quelltext zur Verfügung stellen, den ich auf meinem Arduino habe, um das Lenkrad auszulesen und das Tablet zu steuern.

Eigentlich ist es ganz einfach. Ich verwende fertige Bibliotheken für den Can-Shield und für den RN42. Ganz am Ende lege ich nochmal einen Downloadlink zu meinem kompletten Quelltext inklusive verwendeter Bibliotheken ab.

Der Quelltext ist schnell erklärt. Zuerst werden ein paar Variablen definiert. Danach wird Bluetooth und Canmodul initialisiert und das Bluetooth reconnectet. An der Stelle ein kleiner Verbesserungsvorschlag: es wäre nicht verkehrt im laufenden Betrieb auch mal zu schauen, ob die Verbindung besteht und wenn nicht, dann nochmal einen reconnect zu machen. Ich hatte bisher nur nie Lust meinen Arduino nochmal auszubauen, um das zu ändern. Wenn ich so mal keine Bluetooth Verbindung habe, weil beim Tablet noch kein Bluetooth an war oder so, dann muss ich den Arduino kurz vom Strom trennen, damit er den Reconnect durchführt.

In der Programmschleife wird auf ein Can Signal mit der Can ID 5C1 gewartet. Das ist bei meinem Auto die ID für das Multifunktionslenkrad. Ich habe einen Seat Altea, der quasi Baugleich mit einem Golf Plus ist. Es kann gut sein, dass VW diese ID auch bei anderen Modellen für das Lenkrad nimmt. Die ID habe ich herausgefunden, indem ich mit dem Arduino ein Programm geschrieben habe, mit dem ich den vollen Can Bus analysieren konnte. Man stelle sich das so vor: Auto einschalten, eine Weile laufen lassen, ein paar Knöpfe drücken und alles was auf dem Can Bus liegt abspeichern. Danach Zündung an, schnell einen Knopf auf dem Lenkrad drücken und Zündung aus. Dann zieht man alle Can IDs vom ersten durchlauf vom zweiten ab und übrig bleiben sollte die vom Lenkrad. Unter Umständen muss man es ein paar mal probieren und sich annähern.

Als ich die Can ID hatte, habe ich mir wieder ein Programm mit dem Arduino geschrieben, das mir gefiltert den Inhalt dieser Can ID ausgegeben hat. So konnte ich sehe, welche Zahl beim drücken welchen Knopfes gesendet wird. Mit diesem wissen brauchte ich dann nur noch den einzelnen Zahlen ihre Bluetooth befehle zuordnen.

Dann musste ich ein bisschen mit delays probieren, damit ein Tastendruck nicht zwei mal den Bluetooth Befehl abschickt oder gar keiner bei rum kommt. Bei mir haben sich 300ms als passend bewährt. Das kann abhängig von euren “Drückgewohnheiten” aber vielleicht zu lang oder kurz sein.

Und nun viel Spaß mit dem Quelltext.

#include <SPI.h>
#include "mcp_can.h"
#include <BPLib.h>


INT32U canId = 0x000;
unsigned char len = 0;
unsigned char buf[8];
char str[20];


MCP_CAN CAN(10);
BPLib BPMod;

void setup()
{
  BPMod.begin(BP_MODE_HID, BP_HID_COMBO);

START_INIT:

  if (CAN_OK == CAN.begin(CAN_100KBPS))
  {
  }
  
  BPMod.sendCmd(BP_RECONNECT);
}
void loop()
{
  if (CAN_MSGAVAIL == CAN.checkReceive())
  {
    CAN.readMsgBuf(&len, buf);
    canId = CAN.getCanId();

    if (canId == 0x5C1)
    {
      switch (buf[0]) {
        case 1:
          BPMod.playPause();
          delay(300);
          break;
        case 6:
          BPMod.volumeUp();
          delay(300);
          break;
        case 7:
          BPMod.volumeDown();
          delay(300);
          break;
        case 2:
          BPMod.fastForwardAudio();
          delay(300);
          break;
        case 3:
          BPMod.rewindAudio();
          delay(300);
          break;
        case 43:
          BPMod.muteAudio();
          delay(300);
          break;
        case 4:
          BPMod.nextTrack();
          delay(300);
          break;
        case 5:
          BPMod.prevTrack();
          delay(300);
          break;
        case 0:
          BPMod.keyRelease();
          delay(300);
          break;
      }
    }
  }
}

Quelltext inklusive Bibliotheken zum Download

Hat euch mein Quelltext geholfen? Was hättet ihr anders gemacht?

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert.