Smart 450 CityCoupe mit Startknopf ausrüsten

Ja, ich habe es wieder getan. In meinem Smart steckt wieder ein Startknopf.

IMG_20150416_193513032

Doch diesmal habe ich mich gegen eine “analoge” Variante entschieden und das Ganze mit einem Mikrocontroller verbunden. Hier seht Ihr den Prototyp:

IMG_20150327_201120128

In dem Taster ist auch ein LED-Ring (5V) – dieser zeigt die unterschiedlichen Funktionszustände an. Eine grobe Übersicht über meinen Aufbau habe ich hier mit Fritzing dargestellt:

auto_eingebaut_Steckplatine

Der Schaltplan sieht wie folgt aus:

auto_eingebaut_Schaltplan

Zu beachten ist hierbei, dass Taster und LED getrennt (also Symbolisch) vorhanden sind. Die Relais steuern die beiden Pole an, die ich hier beschreibe.

Den Quellcode für den Mikrocontroller gibt es auch noch:

const int zuendung_relay = 4; //Zündungs-Relay-PIN
const int starten_relay = 5; //Start-Relay-PIN
const int led_pwm = 6; //Taster-LED per PWM
int count = 0;
int scount = 0;
const int taster = 7;
boolean zuendung = false; //TRUE=EIN / FALSE=AUS
boolean starten = false; //TRUE=Startet gerade / FALSE=wurde gestartet oder ist aus
boolean gestartet = false; //TRUE=Motor läuft / FALSE=MOTOR AUS
boolean ladespannung = false; //TRRUE=größergleich 13,5V / FALSE=unter 13,5V
boolean halten = false; //
boolean countreset = false;
boolean startprozess = false;
#include 
elapsedMillis tasterdruck = 0;
elapsedMillis startwait = 0;
elapsedMillis serialsend = 0;
elapsedMillis blinker_standby = 0;
elapsedMillis fader_starten = 0;
elapsedMillis warten_befehl = 0;
void setup() {
 pinMode(zuendung_relay, OUTPUT);
 pinMode(starten_relay, OUTPUT);
 
 pinMode(taster, INPUT_PULLUP); //WICHTIG
 Serial.begin(9600);
}
void loop() {
//Taster-halten-Zeit messen
 if (digitalRead(taster)==LOW && halten==false) {
 tasterdruck=0;
 halten = true;
 } 
 //Taster-halten zurücksetzen
 if (digitalRead(taster)==HIGH && halten==true && tasterdruck > 10) { //&& tasterdruck < 500  halten = false;  tasterdruck=0;  count = count + 1;  }    //Zähler Zurücksetzen & Schieben  if (tasterdruck > 2000) { //zeit seit letzten tasterdruck > 2s
 if (count!=0) { //wenn da ist eine zahl...
 scount = count; //schieben & nullen
 }
 count = 0; //sonst 0 bleiben 
 } 
 //Zündung
 if ((scount==1 && zuendung==false)/* || (do_befehl1==true && zuendung==false)*/ ) {
 zuendung = true;
 Serial.println("Zuendung AN");
 scount=0;
 do_befehl1=false;
 checksummeok=false;
 }
 //Zündung und Start
 if (scount==2 && zuendung == false) {
 zuendung = true;
 startwait = 0;
 startprozess = true;
 scount=0;
 Serial.println("Zuendung AN");
 }
 if (scount==2 && zuendung == true) {
 startwait = 0;
 startprozess = true;
 scount=0;
 Serial.println("Zuendung AN");
 }
 if (startwait > 1000 && startprozess < 2000 && startprozess == true) {  starten = true;  Serial.println("Starten AN");  }  if (startwait > 2000 && startprozess == true) {
 startprozess = false;
 starten = false;
 Serial.println("Starten AUS");
 }
//Ausschalten
 if ((scount==3 && zuendung == true) /*|| (do_befehl3==true && zuendung == true)*/) {
 zuendung = false;
 Serial.println("Zuendung AUS");
 scount=0;
 analogWrite(led_pwm, 0);
 do_befehl3=false;
 checksummeok=false;
 send_off=true;
 } 
 /* RELAY-BEREICH */
 //Zündungs-Relay-Einschalten
 if (zuendung==true) {
 digitalWrite(zuendung_relay, LOW);
 }
//Zündungs-Relay-Ausschalten
 if (zuendung==false) {
 digitalWrite(zuendung_relay, HIGH);
 }
 //Start-Relay-Einschalten
 if (starten==true) {
 digitalWrite(starten_relay, LOW);
 }
 //Start-Relay-Ausschaten
 if (starten==false) {
 digitalWrite(starten_relay, HIGH);
 } 
 /* DIAGNOSE-BEREICH */
 if (serialsend > 1000) {
 Serial.print(count);Serial.print(" ");Serial.println(scount);
 serialsend = 0;
 }
 /* LED-BEREICH */
 if (blinker_standby > 9800 && blinker_standby < 10000 && zuendung == false) {  analogWrite(led_pwm, 10);  }  if (blinker_standby > 10000 && zuendung == false) {
 analogWrite(led_pwm, 0);
 blinker_standby = 0;
 }
 if (zuendung == true && starten == false) {
 analogWrite(led_pwm, 255);
 }
 if (starten == true) {
 for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { 
 analogWrite(led_pwm, fadeValue); 
 delay(10); 
 }
 for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=10) { 
 analogWrite(led_pwm, fadeValue); 
 delay(10); 
 } 
 }
}

Und nun noch den Prototyp als Video:

Nun noch einen rechtlichen Hinweis:

Das hier vorgestellte hat, wenn es von euch gebaut wird, keine E-Nummer und ist nicht in der STVO zugelassen. Durch eine Einzelabnahme des TÜV könnt ihr dies ändern. Eventuelle Schänden oder getötete Kätzchen habt ihr zu verantworten, ich übernehme weder Garantie oder Haftung.

10 Kommentare

  1. Hi.
    Wie machst du das mit der Ladespannung?
    Ich würde auch gerne die Blinker in den Arduino einbinden.
    Jedoch werden diese mit 12V angesteuert und der MC verträgt nur 5V.

    Evtl. kann man das auch über OBD abfragen?

    Gruss Daniel

    1. Also wenn du die Blinker auslesen willst, ist der einfachste Weg ein Spannungsteiler (Einfach googlen). Möchtest du die Blinker ansteuern (wovon ich abrate), musst du Relais oder Transistoren oder MOSFETs nehmen.

      Beachte bitte: Ein Auto hat in den seltensten Fällen wirklich 12V. Bei fahren sind es gern 14,X V, im Winter beim Start auch mal nur 10V.

  2. Fehler beim überprüfen/Kompilieren des Sketch

    sketch_jan16d:46: error: ‘do_befehl1’ was not declared in this scope

    do_befehl1=false;

    ^

    sketch_jan16d:47: error: ‘checksummeok’ was not declared in this scope

    checksummeok = false;

    ^

    sketch_jan16d:74: error: ‘do_befehl3’ was not declared in this scope

    do_befehl3=false;

    ^

    sketch_jan16d:75: error: ‘checksummeok’ was not declared in this scope

    checksummeok=false;

    ^

    sketch_jan16d:76: error: ‘send_off’ was not declared in this scope

    send_off=true;

    ^

    exit status 1
    ‘do_befehl1’ was not declared in this scope

  3. Grüße aus Köln!
    ich habe eine kleine aber dennoch wichtige Frage an dich.
    Habe deinen Code per Copy Paste durchspielen lassen für meien Smart 450 allerdings zeigt das Arduino-Programm mir einige Fehler an.
    Könntest du mir ggf. den Code nochmal (Überarbeitet) zusenden?
    Wäre dir Mega Dankbar dafür!!!

    1. Hallo Mark,

      vielleicht postest du mal die Fehler, die angezeigt werden. Dann kann ich nachvollziehen, wo das Problem liegt.

      Gruß

      Pascal

      1. Danke vorab für die schnelle Rückmeldung.

        Also erstmal zur Ausgangssituation:
        Wenn ich deinen Code 1:1 so kopiere und das Arduino-Programm durchspielen lasse zeigt er zunächst folgenden Fehler an:

        #include expects “FILENAME” oder

        Dann füge ich (Beispielshalber, damit er weiter prüft) hinter #include ein “stdio.h” ein. Dann lasse ich es nochmal abspielen und die nächste Fehlermeldung ist dann folgende:

        ‘elapsedMillis’ does not name a type.

        und so ziehen sich die Fehlermeldungen durch den ganzen Code.
        Leider habe ich zuvor keine berührungspunkte mit Arduino oder Codes schreiben, daher wäre ich dir dankbar wenn du den Code mir “fehlerfrei” zukommen lassen könntest. Somit könnte ich es einmal durchspielen lassen und sofern korrekt, dann in mein Arduiono einspielen.

        Mein Ziel ist es meinen Smart 450 so wie deinen mit einen Starknopf auszustatten.

          1. Hallo Pascal,

            Nach der Einbindung von elapsedMillis in die Bilbiothek hat dein Code wunderbar geklappt! Besten Dank dafür!

            Wie genau schließe ich die 3 Leitungen (2x dick Rot, 1x Blaues) nun an? Anhand deines Videos bzw. des Schaltplans ist das für mich schwer nachzuvollziehen.
            Könntest du mir das ausfühlich erklären? oder Zeichnen? 🙂

            Beste Grüße
            Mark

          2. “2 dicke rote, und ein kleines (oft blaues) Kabel. Mit den beiden roten schaltet man die Zündung ein, mit dem kleinen startet man den Motor”

            Eines der Roten ist das Dauerplus, das andere das geschaltete Plus. Bitte aber unbedingt selber messen oder wenn du nciht weiter weißt an einen Fachmann wenden! Wir wollen nicht, dass irgendwer zu schaden kommt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.