Arduino hängt sich auf

Hallo zusammen,

mit Elektronik und Programmierung hatte ich bislang nur wenig Berührung. Das störte mich schon eine Weile, denn es ist einfach kein Thema, dem man sich heutzutage verschließen sollte. Um mich damit zu beschäftigen war aber ein Projekt nötig, das mir etwas Antrieb und ein Ziel gibt. Ich fand eines in meinem Rennwagen.

Der Wagen besitzt einen Öldruckspeicher. Wenn der Motor einen hohen Öldruck erreicht, speichert er Öl gegen ein Luftpolster in diesem Speicher. Wenn der Motor bei hoher Querbeschleunigung das Öl nicht mehr sicher ansaugt, schiebt der Druckspeicher Öl nach. Ein Trockensumpf für Arme. Zwischen dem Speicher und dem Motor befindet sich ein elektromagnetisches Ventil. Das Ventil wiederrum wurde von einem Druckschalter angesteuert. Dieser Schaltet unter 1,4 bar (Motor benötigt Öl) und über 2,4 bar (Motor hat ausreichend Öl um etwas zu speichern) durch.

Das klingt soweit eigentlich gut, allerdings hatte der Druckschalter eine große Hysterese, die Schaltpunkte lagen zu dicht beieinander und er reagiert so schnell auf den Druckanstieg im Anschlussschlauch, dass am Motor noch keine Steigerung des Öldrucks messbar ist. So habe ich die Steuerung mit einem Arduino übernommen.

Zum Aufbau:
Der Öldrucksensor ist ein veränderlicher Widerstand. Über einen Spannungsteiler erhalte ich statt dem Wiederstand eine Spannung, die ich mit dem analogen Eingang A5 lesen kann. Diese wird in einen Widerstand und schließlich in einen Druck umgerechnet.
Je nach Druck wird des elektromagnetische Ventil und drei Leds angesteuert. Außerdem steuere ich das alte Analoge Instrument über zwei PWM Kanäle an. Vielleicht etwas unkonventionell, aber es geht.

Zum Schaltplan:
Ich hatte nicht alle richtigen Symbole zur Verfügung. Die 9V Batterie ist natürlich eine 12V Batterie. Der DC/DC Wandler ist ein USB Lader für den Zigarettenanzünder vom Aldi. Der Motor ist mein Magnetventil. Das riesige Relais stellt das analoge Instrument dar.#

Zum Problem:
Das Ganze ist bereits im Auto eingebaut und funktioniert wie es soll, zumindest eine Zeitlang. Es geschieht aber immer wieder, dass sich das Arduino offenbar aufhängt. Die analoge Anzeige sagt etwa 4,5bar, die grüne LED leuchtet. Im Leerlauf bleiben diese Werte, was einfach nicht sein kann. Hängt der Sensor? Nein, sobald ich den Motor ausmache und gleich wieder starte habe ich sinnvolle Werte.

Wo könnte der Fehler liegen? Im Programm? Im Arduino Nano selbst? In der Schaltung?

Für eure Ideen bin ich sehr dankbar.

Grüße
Lars

AccuSumpSteuerung_V3_Reduziert.ino (1.91 KB)

lars83:
Wo könnte der Fehler liegen? Im Programm? Im Arduino Nano selbst? In der Schaltung?

Für eure Ideen bin ich sehr dankbar.

Schöne Beschreibung.

Du bist in einer KFZ-Umgebung.
Das Bordnetz ist hochgradig verschmutzt und liefert nicht immer das, was man will.

Alle Steuergeräte im Fahrzeug sind vollständig geschlossen und die Versorgung ist dort eines der aufwändigsten Baugruppen:

Wir hatten gearde gestern die Versorgung irgendwo am Ende des Threads.

Du könntest versuchen einen Watchdog zu implemetieren, der einen Neustart auslöst, wenn der Arduino vermeintlich hängt. DAS ist aber nicht die Lösung Deines Problems!

Hi

Die FETs sind als P-FET gezeichnet, hängen aber an GND - sollten also N-FETs sein.
Dann ergeben Q2 und Q3 nicht wirklich Sinn, oder?

MfG

@TO: Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Mann, Mann, Mann, ihr seit ja auf Zack :slight_smile:

Die FETs sind als P-FET gezeichnet, hängen aber an GND - sollten also N-FETs sein.
Dann ergeben Q2 und Q3 nicht wirklich Sinn, oder?

Ich bin echt Anfänger in der Elektrotechnik. Es sind drei Mosfets vom TYp IRLZ34N verbaut. Im Schaltplan habe ich etwas verwendet, was so aussieht. :cold_sweat:

Hier noch der Code:

float Quellspannung=5.0;
int AnalogPin=5;
int R1=110.29; //Wert des bekannten Widerstands 
long Messwert;
float SpannungR2; //Spannung �ber dem zu messenden Widerstand
float Widerstand;
float Oeldruck;
int Sens; // Einschaltdauer Sensorsignal Analoges Instrument

void setup()
{
  pinMode (6,OUTPUT);
  pinMode (7,OUTPUT);
  pinMode (8,OUTPUT);
  pinMode (9,OUTPUT);
  pinMode (10,OUTPUT);
}

void loop()
{
  //5 Messungen machen und Mittelwert bilden
  Messwert=0;
  for(int i=0;i<5;i++){
    Messwert+=analogRead(AnalogPin);
  }
  Messwert=trunc(Messwert/5);
  
  //Spannung berechnen
  SpannungR2=(Quellspannung/1023.0)*Messwert;

  Widerstand=R1*(SpannungR2/(Quellspannung-SpannungR2));

  Oeldruck=(Widerstand-16)/18;//Geradengleichung in Ann�herung an VDO Kennlinie 10bar Sensor

  // Steuerung des Ventils und der LEDs

  if (Oeldruck < 2.0 || Oeldruck > 4.5){
    // �ffnen des Ventils unter 2bar und �ber 4,5bar)
  digitalWrite (6, HIGH);
  }else
  digitalWrite (6, LOW);

    if (Oeldruck < 2.0 && Oeldruck >= 1.5){
      //Steuerung der roten LED f�r niedrigen �ldruck, leuchten zwischen 2 und 1,5bar
  digitalWrite (7, HIGH);
  }else if (Oeldruck < 1.5){
    // flashen der LED unter 1,5bar
  digitalWrite (7, LOW);
  delay (150);
  digitalWrite (7, HIGH);
  delay (150);
  }else if (Oeldruck >= 2.0){
    digitalWrite (7, LOW);
    // LED aus �ber 2 bar
  }
  if (Oeldruck >= 2.0 && Oeldruck < 4.5){
    // Steuerung der gr�nen LED f�r �ldruck im Normbereich
    digitalWrite (8, HIGH);
  }else {
  digitalWrite (8, LOW); 
  }
    if (Oeldruck >= 4.5){
      // Steuerung der blauen LED als Anzeige f�r Laden bei hohem �ldruck
      
    digitalWrite (9, HIGH);
  }else {
  digitalWrite (9, LOW); 
  }
  // Ansteueren der Analogen Anzeige
  Sens = 15*Oeldruck+50; //Geradengleichung ermittelt aus Wert bei 2 und bei 5bar
  analogWrite(10, Sens);
  analogWrite(13, 255-0.75*Sens);
  }

Du könntest versuchen einen Watchdog zu implemetieren, der einen Neustart auslöst, wenn der Arduino vermeintlich hängt.

Watchdog? Das ist ein entsprechender Programcode?

Die Versorgung des Arduino erfolgt über den 5V eingang durch den Aldi USB Lader. Irgendwo habe ich gelesen, dass 5V an der unteren Grenze sind. Kann dies das Problem sein? Ich hätte noch eine TRACO DCDC Wandler hier liegen TEN 6-2412WIN, der würde stabile 12V ausgeben…

lars83:
... allerdings hatte der Druckschalter eine große Hysterese, die Schaltpunkte lagen zu dicht beieinander ...

Wenn sich die Schaltpunkte zu dicht beieinander befinden, ist die Hysterese zu klein.

Ich würde es zunächst mit einem Kondensator zur Spannungsstabilisierung probieren (nach dem Zigarettenanzünderding). Das ist vermutlich schneller erledigt als ein Watchdog-Gefummel im Code.

Gruß

Gregor

Meiner Ansicht hat es wenig sinn von den gemessenen ADC auf den Öldruck zu rechnen, sondern gleich mit den ADC Werten zu arbeien. Das ist zwar im Sketch weniger leserlich aber das muß es auch nicht sein.

Zu Deinem Resetproblem. Versuchs mal Probeweise mit einer USB-Powerpack ohne DCWander.. Die Masse muß verbinden werden.
Grüße Uwe

Vielen Dank für eure Antworten.

Ich zähle drei mal Spannungsversorgung und werde dies zu erst angehen. Ein Power Bank habe ich nicht zur Hand und werde am Wochenende wohl den Traco Wandler einsetzen und über VIN anstatt 5V versorgen.

Meiner Ansicht hat es wenig sinn von den gemessenen ADC auf den Öldruck zu rechnen, sondern gleich mit den ADC Werten zu arbeien. Das ist zwar im Sketch weniger leserlich aber das muß es auch nicht sein.

Wo siehst du darin das Problem?

Für mich ist das leserliche sinnvoll. Das schöne am Arduino ist, dass ich auf die Schnelle wichtige Parameter, wie die Schaltpunkte, ändern kann. Das geschieht am ehesten im Stress, Hitze und Umgebungslärm an der Rennstrecke. Human Factor lässt grüßen, es muss einfach und übersichtlich zu ändern sein, ohne noch den Taschenrechner zu bemühen.

Hi

Das ist aber eine Interaktion mit der Außenwelt - DIE darf ja durchaus 'menschenlesbares Zeugs erzeugen'.
Das interne Rechnen sollte aber 'arduinotauglich' geschehen.

Oder denkst Du, die Uhr auf Deinem Handy zählt in Stunden, Minuten und Sekunden?
( ... ok, blödes Beispiel ... seit BWL wäre sogar Das denkbar ...)

MfG

Die Schaltung arbeitet nun wie gewünscht. Eine kurze Rückmeldung bin ich euch schuldig. Mit dem Traco DC/DC Wandler und 12V auf dem Vin Eingang ging gar nichts mehr. Das Nano wurde warm. Mir kam in Erinnerung, des es beim Schaltungsaufbau mal einen Kurzen gab, der scheinbar folgenlos war. Scheinbar…

Am Traco Wandler störte mich, dass die Eingangs- und Ausgangsmasse entkoppelt zu sein scheint. Für die Messung dürfte das ein Problem sein.

Ich baute eine neue Schaltung mit neuem Nano und einer Spannungsversorgung ähnlich des Bildes unten. Auf den Spannungsregler habe ich verzichtet, schließlich ist einer auf dem Nano drauf.

Wie schon beschrieben, jetzt läufts! Ob das beschädigte Nano das Problem war, oder eine gelegentliche Unterversorgung über den Aldi USB Lader kann ich leider nicht sagen.

Es war auf jeden Fall ein spannendes Projekt und der Öldrück war in Hockenheim immer im grünen Bereich. :wink:


Ein Z-Diode ohne Vorwiderstand? Das funktioniert nicht.
Grüße Uwe