Arduino Uno und CAN BUS im Auto für CAR PC (HILFE)

Hallo erstmal,

es geht um die [u]Multifunktionstasten am Lenkrad[/u] im Auto. Der Code https://dl.dropboxusercontent.com/u/6833262/bmwinterface_cr_v1.0.zip hört den CANBUS ab, wandelt dann die Signale (die man braucht) in Tastaturtasten wie z.b. "F1" um. Diese werden vom Tablet erkannt und dazu genutzt um evntl. ein Lied weiter zu schalten.

Das einzige Problem welches ich habe ist, dass wenn ich ins Auto einsteige und den Schlüssel reinstecke dann kriegt das Tablet, Arduino & CAN Bus Shield Strom. Mit dem Tablet ist alles in Ordnung läuft so wie es soll, nur der Arduino und das Shield will nicht so richtig.

Es hat den Anschein als starten die Beiden viel schneller als der CAN Bus selbst und somit schmeisst sich das Shield in eine nicht endende Warteschleife. Diese wird nur dann durchgebrochen, wenn ich das Shield und den Arduino kurz vom Strom nehme während der Bus bereits Signale sendet, dann klappt alles Einwandfrei. Ist halt schon blöd jedesmal wenn man ins Auto einsteigt, muss man erstmal an dem Arduino rumfummeln.

Kann mir einer sagen wie ich den Scetch anpassen muss damit die Initiallisierung erfolgreich verläuft?

Mit "start_init" usw. habe ich zwar schon versucht, hat mir aber keine Erfolg gebracht. Vielleicht ist der Scetch auch nicht richtig aufgebaut. Er ist nicht von mir, hat aber bei anderen funktioniert.

bin für jeden Gedanken, dankbar ;)

Wie hast du den Arduino am Strom angeschlossen?

delay(x) zu Beginn der Setup-Funktion einfügen

Der Arduino wird direkt von einem netzteil versorgt. Hab das USB Kabel aufgeschnitten und die Leitungen geteilt. Die für Strom gehen ans Netzteil und die für Daten gehen ans Tablet.

// Initialisierung
void setup()
{
  delay(4000); <----------------------------------------------------------------------------------

  for (int i=0;i<NUM_KEYS;i++) key_status[i]=0;

  pinMode(STATUS_LED, OUTPUT);
  
  pinMode(SIGNAL_REVERSE, OUTPUT);
  pinMode(SIGNAL_IGNITION, OUTPUT);
  pinMode(SIGNAL_KEY, OUTPUT);
  pinMode(SIGNAL_LIGHT, OUTPUT);

  #ifdef SERIAL_DEBUG
    Serial.begin(115200); 
    while(!Serial);
    Serial.println("Go...");
  #else
    keyboard.begin();
  #endif

 delay(4000);<------------------------------------------------------------------------------------

  // SPI Init
  SPI.setClockDivider(SPI_CLOCK_DIV8);

  // CAN Init
  if(can.initCAN(CAN_BAUD_100K) == 0) can_error();
  if(can.setCANNormalMode(LOW) == 0) can_error(); 
}

// Status-LED kurz blinken lassen.
void led_keypress() {
  status = CanSignal;
  digitalWrite(STATUS_LED, HIGH);
  status_timer=0;
}

// Periodic 1ms timer function
void process_timer()
{
  // Heartbeat solange auf den Bus gewartet wird.
  if (status == WaitForCan) {
    heartbeat_counter++;
    if (heartbeat_counter==1000) {
      heartbeat_counter=0;
      heartbeat = !heartbeat;
      if (heartbeat) digitalWrite(STATUS_LED, HIGH); else digitalWrite(STATUS_LED, LOW);
    }

Soll es gleich am Anfang stehen oder etwas weiter unten??

Nur wichtig vor der CAN-Bus Initialisierung