Geschwindigkeitsbegrenzer (KMH-Begrenzer) mit Arduino, bitte um Hilfe

Hallo,

ich bin neu hier im Forum. Ich habe als Hobby Buggy-fahren.
Da ich meine Buggy´s auch öfter mal verleihe und sie im Gelände fahren möchte ich die Geschwindigkeit begrenzen ohne Lesitungsverlust, als kein klassischen Drehzahlbegrenzer.

Leider gibt es dazu nichts Standardmässig zu kaufen.
Da bin ich auf den Arduino gestossen mit dem dies , so denke ich, rel. leicht zu realisieren wäre.

Ich möchte mit Magneten am Vorderrad und einem Tachoimpuls die Geschwindkeit erfassen und dann soll der Arduino bei einer von mir frei einstellbaren Geschwindigkeit einfach ein 12Volt relais schalten, mit der ich dann die Einspritzung unterbreche, da Bitte ich um Hilfe , da ich Arduino Neuling bin.

Meine Buggy´s haben Standard PKW Motor mit 4-6 Zylinder Einspritzer.

Könntet Ihr mir dabei helfen oder hat sogar jemmand Lust soetwas für mich zu bauen, natürlich gegen Bezahlung.

Im "Attach" ein Bild was ich mir so vorgestellt habe.

Danke

ohne Lesitungsverlust,

Ohne Leistungsverlust eine Geschwindigkeit begrenzen?
Einspritzanlage abschalten und dabei kein Leistungsverlust?

Nein!
Der Leistungsverlust ist doch der Zweck der Übung!

Mein Vorschlag:
Bau eine geschwindigkeitsabhängige Gaspedalübersetzung/Gaswegbegrenzung ein.
Das gibt eine sanfte Begrenzung.
Vielleicht noch durch Signalhorn und Leuchtmelder unterstützt.
bzw. um den Fahrer vorzuwarnen

Genau. Evtl. hast du fa bereits ein elektronisches Gaspedal in deinen Buggys

Leistungsbegrenzung bringt nichts da die Teile im Gelände gefahren werden. Selbst mit halber Leistung wird die Geschwindigkeit bergab erreicht und wenn es dann mal steil bergauf geht fehlt die Leistung.
Eine klassische Drehzahlbegrenzung für die höchsten Gänge wäre da besser. Ich würde aber sporadisch die Zündung unterbrechen und nicht die Einspritzung. Das hat auch evtl schöne Nebeneffekte 8)

Da Du von verschiedenen Motoren schreibst, ist wohlmöglich eine mechanische Lösung die sinnvollste.
Eine Einspritzung lässt zwar auf ein Motorsteuergerät schließen, welches man auslesen und manipulieren könnte. Das würde aber schlimmstenfalls für jeden Buggy-Typ eine eigene Lösung erfordern.

Bzw. kann man ggf. auch an die Versorgungsspannung der Drosselklappe gehen. Da sollte man aber schon Ahnung haben was man da tut.

Da klingt für mich die geschwindigkeitsabhängige Gaswegsbegrenzung schon am Sinnvollsten. Auch wenn ich technisch keine Ahnung habe, wie man das machen sollte, wenn das Pedal nicht per "Drive by wire" angesteuert ist. Dynamisches längen des Gaszuges? :o

PS: combie hat es ein bisschen zu genau genommen. Natürlich wird keine Leistung beschnitten, bis die magische Geschwindigkeit erreicht wurde. Aber dann wird diese natürlich gedrosselt, was ja Zweck dieser Übung darstellt.

wie man das machen sollte, wenn das Pedal nicht per "Drive by wire" angesteuert ist.

Unter/Hinter dem Gaspedal einen elektrisch verstellbaren Anschlag.
Welcher sich gnadenlos, gegen die Kraft des Fahrers, hochschraubt.

Dazu sind keine Eingriffe in die Motorelektrik nötig.
Der Fahrer bekommt Rückmeldung(über den Fuß ins Nervensystem)

combie:
Unter/Hinter dem Gaspedal einen elektrisch verstellbaren Anschlag.
Welcher sich gnadenlos, gegen die Kraft des Fahrers, hochschraubt.

Dazu sind keine Eingriffe in die Motorelektrik nötig.
Der Fahrer bekommt Rückmeldung(über den Fuß ins Nervensystem)

Das ist viel zu langsam. Dann doch eher einen mechanischen Gaszugverlängerer mit einem starken Servo.

Erst mal Danke für Eure Antworten.
Ich wollte keine Diskusion über "Sinn-Unsinn" bzw. wie man es anders machen sollte.
Sondern eine Lösung wie ich mit dem Arduino eine "Drehzahll/Geschwindigkeit" abgreife und damit ein Relais schalte.

Ich habe schon einiges getestet und wenn ich ein Elektronische Gaspedal hätte dann könnte ich mir was für LKW´s kaufen.

Ich möchte einfach bei einer bestimmten Geschwindigkeit die Kraftstoffzufuhr unterbrechen, denn das ist das was SOFORT anspricht und simpel zu realisieren ist.
Zündung unterbrechen ist mist denn es wird weiter Kraftstoff zugeführt und man hat dann beim einsetzen der Zündung schönen Knall im Auspuff.

Ich habe es schon getestet mit einem "Kill" Schalter der die Kraftstoff Einspritzung unterbricht, das ist am saubersten. Audi mach es ähnlich bei Ihrer 250Km/h Begrenzung.

Ist es denn so schwierig einen Arduino so etwas beizubringen?

combie:
Ohne Leistungsverlust eine Geschwindigkeit begrenzen?
Einspritzanlage abschalten und dabei kein Leistungsverlust?

Nein!
Der Leistungsverlust ist doch der Zweck der Übung!

Sorry, ich denke Du hast mich nicht verstanden.

Natürlich Ohne Leistungverlust, da es ein Geschwindigkeitsbegrenzer sein soll der erst tätig wird wenn man die Km/h erreicht hat.....dann natürlich Leistungsabschaltung und beim unterschreiten der km/h wieder volle Power

Ähnlich wie bei vielen PKW´s die bei 250km/h auch abschalten bzw. abriegeln, nur so kompliziert brauch ich das nicht. Mir reicht eine Unterbrechung der Kraftstoffeinspritzung.

Es gibt hier einige Threads zum Thema "Drehzahlmessung" oder "Fahrradtacho", da solltest du beginnen und erst mal eine digitalen Tacho realisieren. Die Abschaltung der Kraftstoffzufuhr sollte nicht so schwierig sein, irgendwas "elektrisches" zum simplen Unterbrechen sollte zu finden sein (Kraftstoffpumpe oder Einspritzventile)

Laut Wikipedia ist das auch die gängige Herangehensweise bei aktuellen Fahrzeugen.
Nur dass dort natürlich das Steuergerät die Drosselung der Kraftstoffzufuhr steuert.

Manipulierst Du "einfach" daran herum, wirst Du mindestens einen Fehler im Steuergerät erzeugen und im Fehlerspeicher ablegen. Schlimmstenfalls geht die Motorkontrollleuchte an.

Falls die Motoren durchgängig über eine Diagnoseschnittstelle verfügen würden, wäre das immer noch der sauberste Weg. Per OBD II kommst Du an die Geschwindigkeit und kannst die Werte des Throttle Position Sensor´s manipulieren. Damit denkt der Motor die Drosselklappe ist weiter geschlossen und verringert die Einspritzmenge.
Habe gerade mal den Herrn Google gefragt: Es gibt schon fertige Module die genau das machen. Wie gesagt, OBD II Diagnose Stecker vorausgesetzt. Oder direkt an den CAN Bus.

@Trip
das hört sich interessant an.
Die OBD2 Schnittstelle anzuschließen ist kein Problem. Das , dass Steuergerät einen "Fehler" ablegt auch nicht schlimm, die werden automatisch nach gewissen Zyklen gelöscht, oder auch nicht, stört nicht. Die MIL (Motorkontrollleuchte) habe ich nicht angeschlossen.

Hast Du da mal eine Link? ich habe googel auch gefragt und nichts gefunden.

olf2012:
Es gibt hier einige Threads zum Thema "Drehzahlmessung" oder "Fahrradtacho", ...

Zum Beispiel: Drehzahlregelung Verbrennungsmotor

Danke, das hilft ...... :slight_smile:

Hallo Jürgen,

die Geschwindigkeit abzurufen ist einfach. Dazu kann man per OBD II simpel eine Anfrage absenden und erhält den Wert zurück.
Bei der Manipulation von Werten kommt es auf den Hersteller an. Manche unterstützen das Unified Diagnostic Service-Protokoll. Dann kann man per "WriteByLocalIdentifier" Werte manipulieren.

Ist das nicht unterstützt, kann man per CAN-Bus direkt mit den entsprechenden Steuergeräten/Sensoren kommunizieren. Das funktioniert über den selben Stecker, verwendet aber andere Pins.
Man kann entweder fertige Shields kaufen, oder baut sich selber was mit einem CAN Controller bauen.

Tutorials dazu gibt es wie Sand am Meer :slight_smile:

Habe selbst aber nur einiges mit OBD ähnlichen Protokollen gemacht und noch nicht am CAN-Bus herumgespielt.
Mein Motorrad hat ein älteres System, damit kann ich die Werte direkt manipulieren und z.B. die Temperatur hochsetzen, damit der Lüfter angeht.

@Trip
Danke für den interessanten Link.
Ich kenne mich leider noch nicht so mit der "Materie" aus und englisch ist nicht meine Muttersprache ( kann mich aber einigermaßen unterhalten :slight_smile: darum steh ich da noch völlig auf dem Schlauch.... :o

Ich bin nun ein ganzes Stück weiter.
Ich kann mir jetzt die Drehzahl auf einem 16/2 Display anzeigen lassen.
Ich habe nach viel lesen mir aus verschiedenen Codes was zusammengebastelt, funktioniert schon mal ist aber sicher noch viel "Müll" drin.

Jetzt möchte ich die Drehzahl in km/h umrechnen und anzeigen und bei z.B. 100Km/h ein Relais schalten.

Über Tips wäre ich dankbar. Auch was an dem Code "Müll" ist oder man besser schreiben könnte, so langsam verstehe ich die Logig

Anhang :

Verdrahtung
Code
Video das ich gemacht habe

Video

der Code (bitte um "Rücksicht" ist mein erster als Maschinen-Mensch und kein Elektroniker


#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 1);
int NbTopsFan; int Calc;
int hallsensor = 2; typedef struct{
char fantype;
unsigned int fandiv; }fanspec;
fanspec fanspace[3]={{0,1},{1,2},{2,8}}; char fan = 1;

void rpm ()
//This is the function that the interupt calls
{ NbTopsFan++; }

void setup()
{
lcd.begin(16, 2);
pinMode(hallsensor, INPUT);
attachInterrupt(0, rpm, RISING); }

void loop ()
{
lcd.setCursor(0, 0);
{ NbTopsFan = 0;
sei();
delay (1000);
cli();
Calc = ((NbTopsFan * 60)/fanspace[fan].fandiv);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TACHOMETER");
lcd.setCursor(0,1);
lcd.print("RPM ");
delay(1000);
lcd.setCursor(6,2);
delay(500);
lcd.print(Calc, DEC);
}
}

Code </> Tags könntest du aber benutzen, auch als Nicht-Programmierer :wink:

NbTopsFan = 0;

sei();
delay (1000);
cli();
Calc = ((NbTopsFan * 60)/fanspace[fan].fandiv);
... // lcd - Anzeige
delay(1000);
...

Tipps:

1.sei()oder in "Arduino-Sprache" interrupts(); ist der Normalfall,cli()( noInterrupts() ) die Ausnahme: keine Unterbrechung zulassen. Du machst es umgekehrt.
2. Wenn keine interrupts zugelassen sind, steht auch die Zeitzählung still und das zweite delay kann dann nicht funktionieren.
3. Da NbTopsFanin einer Interrupt-Routine gezählt wird, solltest du es als [b]volatile[/b] int deklarieren.
4. Damit es dein Code wird, solltest du auch verbergen, dass du das Ganze von einer seltsamen Ventilator-Überwachung für mehrere Lüfter geklaut hast :wink:

  1. Drehzahl in Geschwindigkeit umrechnen geht leicht, wenn du keine Motor-Drehzahl sondern eine Rad-Drehzahl hast und weisst wie groß das Rad ist.

Zum Punkt 1:

volatile unsigned int pulse;
unsigned long prevtime;
unsigned int tpp; // time per puls

void rpm () { pulse++; }  // Interrupt-Routine

void loop() {

cli(); // Interrupts zu
  if (pulse > 0) {
    tpp = (millis() - prevtime)/pulse;
    pulse = 0; 
    prevtime = millis();
  }
sei(); // Interrupts wieder auf
 // jetzt kannst du aus tpp (der Zeit millisek / Radumdrehung ) deine Geschwindigkeit ausrechnen
 // und beliebig lange delays machen, damit die Anzeige nicht flackert und zwecks Genauigkeit 
 // ein paar millis und pulse zusammenkommen.
}

LiquidCrystal lcd(12, 11, 5, 4, 3, 1);

D0 und D1 werden für USB benötigt, besser frei lassen.

Juergen-BWH:
Jetzt möchte ich die Drehzahl in km/h umrechnen ...

Fahre 100 km/h, merke Dir die dabei angezeigte Drehzahl (sagen wir 5000 U/min). Dann schaltest Du bei 5000 U/min ab. Für die Anzeige der Geschwindigkeit:

Geschwindigkeit = (Umdrehungen/min) * 100 km/h / (5000 U/min) = Umdrehungen/50 km/h

Ohne Gewähr, sollte Dich die Polizei blitzen :slight_smile:

EDIT1: Die Einheit für Umdrehungen ist nicht U/min sondern 1/min
EDIT2: So 800 1/min sind wohl realistischer als 5000 1/min

@agmue: Das funktioniert aber nur, wenn es nur einen Gang gibt. Sobald ein Schaltgetriebe im Spiel ist, stimmt die Rechnung nicht mehr.
Besser ist da schon, das von michael_x vorgeschlagene, zählen der Radumdrehungen. Mit dem Radumfang lässt sich dann schon relativ genau die Geschwindigkeit berechnen.
GPS wäre noch eine Möglichkeit, ist aber möglicherweise in Waldgebieten nicht so geeignet.