Elektronische Heberegulierung (EHR) für Traktor mit Arduino aufbauen

Einen wunderschönen guten Tag an die Community! Ich bin neu hier und grade dabei das Programmiern zu lernen. Ich bin begeisterter Hobbyelektronker und habe einen Arduino Uno R3 mit dem ich begonnen habe, mir die ersten Grundlagen zu erarbeiten.
Als 1 Projekt habe ich vor die Heckhydraulik eins Traktors zu modifizieren.
Es soll mittels Linearantrieb und einem PWM Treiber der Handhebel bewegt werden. Mittels eines Schiebepotis wird die Position an den Arduino durchgegeben werden. 2 potis sollen die Endpositonen vorgeben (oben und unten)
Die Steuerung selbst sollen 2 Tasten übernehmen. Optional soll ein Weiterer Poti (besser ein Inkrementalgeber) Die Position vorgeben.
Und jetzt meine Anfängerfrage dazu:
Welche Programmstruktur würdet ihr wählen, bzw. Welche Befehle sind da im Bezug auf das Multitasking empfehlenswert, welche sind schlecht?
Vieleicht mag mir ja irgendjemanden weiterhelfen.
Vielen Dank im Voraus!

delay()
while(true) ohne Abbruchfunktion. (Gilt für alle Schleifenfunktionen, die Dir den Code blockieren.)

Ich versteh noch nicht ganz, was Deine ganzen Potis da machen sollen....
Mit einem möchtest Du den Antrieb steuern.
Aber die Endpositionen verschieben sich doch nicht...

Danke für die Antwort.
Endposition ist vieleich der falsche Begriff.
Es soll eingestellt werden, wie hoch maximal gehoben werden darf und mit dem 2. wie tief maximal. Es sind sozusagen zwischenpositionen.

Hallo Thma

Herzlich Willkommen im besten Arduinoforum der Welt.

Mache dich mit den Themen der prozeduralen und objektorientierten Programmierung vertraut. Beide Paradigmen können mit dem Arduino-Biotop realisiert werden.
Lass dich nicht von der Tatsache abschrecken, dass die jeweiligen Vertreter der Paradigmen einen "Klassenkampf" führen.

Probieren geht über studieren. Lesen, tun und lernen.

Hallo @Thma

herzlich willkommen im Arduino-Forum B-Klasse berühmtes Zitat: "Hier werden sie geholfen".
Jetzt stehen die erfahrenen User vor der anspruchsvollen Aufgabe dir einerseits Mut zu machen das das machbar ist und andererseits klarzumachen, dass es länger als 5-10 Stunden dauern wird und du doch eine ganze Menge lernen wirst.

Deine Frage nach geeigneten Programmstrukturen hört sich so an als ob du dir Programmieren vorstellst so ähnlich wie

"Mit welchem Stichsägeblatt komme ich zum groben Ablängen gut voran und welches nehme ich für saubere Schnitte?"

Nun Programmieren ist ein Baukasten mit dem man nicht nur sämtliche Sägen, Kettensäge, Kreissäge, Bandsäge, Stichsäge, manuelle / maschinelle Bügelsäge, manueller / maschineller Fuchsschwanz, Kappsäge usw. bauen kann sondern auch noch sämtliche anderen Werkzeuge.

Und um noch ein bisschen im Bild zu bleiben
"Der 10x10cm Balken muss auf 5,75m mit Genauigkeit 3 mm abgesägt werden "
kann man auf sehr unterschiedliche Weise realisieren. Das würde zur Not auch noch mit einer Hand-Metallbügelsäge gehen. (Wenn auch sehr mühsam)

Um es konkreter zu machen:
Du hast jeweils einen Taster für "OBEN" und "UNTEN".
Wie weit auf und ab wird vor der eigentlichen Arbeit eingestellt.
Eventuell bei der Arbeit nachjustiert.

Und dann soll als letztendliches Ziel der Handhebel bei Druck auf die Taste "Oben" auf die "OBEN"-Position gebracht werden

Bei Druck auf die "unten"-Taste auf die Position "UNTEN" gebracht werden.

Ist das eine korrekte Beschreibung der Funktionen die du haben möchtest?

Ob da PWM am besten geeignet ist habe ich ja noch Zweilfel. Aber vielleicht kannst du mir da (für mich) neuartige Hardware zeigen die das per PWM macht.

In jedem Fall wird es günstig sein kennenzulernen wie eine sogenannte State-Machine funktioniert.

Aber NICHT als erstes.

Das wäre wie wenn ich als absoluter Traktorlaie auf einen 1200 PS Maishäcksler draufgesetzt würde "nu mach mal"
Äh - - - ... --- wo ist der Anlasserknopf? Und mit dem Hebel hier schaltet man das Umpflügen ein????

Ebenso wichtig: Datenblätter von den Komponenten die du einsetzen willst.
Oder wenigstens Fotos. Je genauer die anderen sich dein Projekt vorstellen können desto besser die Unterstützung.

vgs

Hallo, danke für die Anregungen, ich werde mich da noch hinein Kniehen müssen.....
Mit dem PWM Treiber meine ich ein Ansteuermodul für den Linearantrieb, der mittels PWM Signal vom Arduino angesteuert wird. Der Erste Test hat schon gut funktioniert, um zu sehen das der Antrieb den Hebel auch mit geringer Geschwindigkeit kraftvoll Bewegen kann.

Ja dann poste doch mal ein Bild davon und/oder das Datenblatt.
Du möchtest ja das wir uns mit hinein kniehen und dazu sind diese Detailinformationen erforderlich.

vgs

Ich werde mal ein Konzept erarbeitet mit den Komponenten die ich verwenden möchte und eine genaue Funktionsveschreibung
Danke nochmal und bis bald

Es braucht weniger ein Konzept als die Datenblätter die sind viel wichtiger.
Nu gut. Wenn es der Projektentwicklung dient immer ran!

Du willst den Steuerhebel der Hebebühne motorisieren und fernsteuern?
Die Position des Hebels soll mit einemPotnetiometer / Incrementalgeber eingestellt werden und zusätzlich mit 2 Potis die ober und untere End-Position?

Ich sehe das als einen Sicherheitsrilevanten Eingriff in die Funktionalität des Traktors und darum zu Deinem 100% Verantwortung wenn was passiert bzw wenn die Versicherung das erfährt auch nichts zahlt.

Arduino kann kein Multitasking.

Grüße Uwe

Wie kommst Du da drauf?
Er überbrückt nix, sondern erweitert nur die Bedienung.

Was meinst Du was passiert wenn die Hebebühne unkontrolliert rauf und runter geht?
Ein Beispiel aus der Äpfelproduktion:
Eine Kiste mit 330 kg Äpfel umschmeißen ist da das geringste Problem.
Die Hebebühne hängt hinten am Traktor und auch der Anhänger hängt da dran.

Beispielbild:

Auch wenn hier der Fahrzeuglenker etwas zu schnell im Kreisverkehr unterwegs war oder wie im Artikel vermuten läßt die Ladung schlecht gesichert hatte.

13 Kisten mit je ca 330 kg Äpfel.
Der großhandelseinkaufspreis für 1 kg liegt zwischen 20 und 80 Eurocent. Einmal umgeworfen, haben die Äpfel Druckstellen und sind Industrieware mit 1-3 Eurocent Verkaufspreis geworden.
Also aus 850 bis 3400€ sind 42 bis 120 € geworden. Dazu ist auch noch die gehälter der Erntehelfer zu zählen. Da haben 3-4 Mann / Frau einen ganzen Tag gepflückt.

Grüße Uwe

Uwe bitte,
wenn Du alle Unwägbarkeiten verhindern willst, dann gehört ein Arduino und seines Gleichen nicht in die Hände von Schreibtisch - Hobby - Bastlern.
Dieses "hätte, könnte, vielleicht" ist mittlerweile zu einer echten Verhinderungsplage geworden.
Der Traktor wird keinen Arduino drin gehabt haben und es ist doch ein Schaden entstanden.
Vielleicht wäre das nicht passiert, wenn ein Arduino drin gewesen wäre.

Von daher...

Im Gegenteil. Man muss alle Hobby-/Schreibtischbastler darauf hin weisen, was passiert, wenn ihre Konstruktion Unsinn baut. Dann holt sich die Versicherung das Geld vom Bastler nach der Schadensregulierung zurück.
Das muss er einrechnen, ob die Ersparnis des Eigenbaus das Risiko aufwiegt.

Gruß Tommy

Endpositionen oben / unten mit Potis einstellen finde ich etwas Problematisch. Potis haben schnell mal Kontaktschwirigkeiten. Tritt der Fall ein, dann ist die Endpos. die von diesem Poti eingestellt wird, im freien Flug zwischen Max. und Min.

Potis, Staub, Rütteln, das ist für mein Gefühl eigentlich eine garantierte Sollbruchstelle. Und das für die obere und die untere Begrenzung. Also ich habe mich schon manchmal am Bau von Geräten mit dem Arduino beteiligt, aber da muss ich denen Recht geben, die das für Fragwürdig halten. Da würde ich schön die Finger weg lassen. Oder über einen Absicherung nachdenken, z.B. Verstellung dieser Hebeeinrichtung nur möglich, wenn keine Fahrstufe eingestellt ist. Also kein Gang eingelegt ist. Und ein absolut sicherer Notaus. Also einer, wo der Arduino nicht reinpfuschen kann.

Franz

Hallo Allerseits! Danke für die Beteiligung. Da wurde ja schon eine Menge philosophiert.
Um Missverständnisse zu vermeiden erkläre ich einmal die Funktionsweise der bestehenden mechanischen Regelung und das, was daraus werden soll.
Am Traktor ist eine MHR (Mechanische Hubwerksregelung) verbaut. Diese wird geregelt mit einem Hebel, dem man mit einem Schiebepotentiometer vergleichen kann. Das heißt, bringt man den Hebel in eine Position, so fährt die Hydraulik diese an. Dafür sorgt ein Hydromechanischer Stellschieber. Das alles ohne Elektrische Komponenten. Zusätzlich gibt es noch einen außenliegenden Hebel, der mittels Seilzug mit dem Haupthebel parallel geführt wird und somit eine Außenbedienung ermöglicht. Das ist für mich ein Sicherheitsrisiko!
Nun zum Umbau zu EHR:
Wie der Name schon sagt, (Elektronische Hubwerksregulierung) wird das ganze Elektrohydraulisch gesteuert.
Moderne Traktoren haben dieses System längst Serienmäßig eingebaut. Die Regelung der Endpositionen wird meist mit Potis durchgeführt. Diese sind ein einer robusten dafür geeigneten Ausführung.
Die Hebe und Senk Funktion soll bei meinem Projekt mit Tasten ausgeführt werden, nur Optional mit einem Poti (besser Inkremantalgeber)
Als gelernter Elektrotechniker mit mehr als 20 Jähriger Erfahrung in der Reparaturtechnik in verschiedensten Bereichen ist mir der Sicherheitsaspekt klar und wichtig.
Ich Teile den Einwand mit den Potis - die sind aber in meinem Fall nur eine Weg Begrenzung, die es ohnehin jetzt nicht gibt. Außerdem gibt es welche die für diese Anforderung gemacht sind.
Ein umgekippter Anhänger in einem Kreisverkehr hat mit einer Hydraulik nichts zu tun.
Auserdem war meine Frage eine andere.
Ich bin Neuling in der Programmierung und möchte mit dem Projekt gleichzeitig lernen, wollte einfach wissen, wie Erfahrene Programmierer an die Sache mit der Struktur heran gehen würden....
Eventuelle fertige Funktionsgruppen, Vorschläge....

Zum beispiel die Erste Antwort von Brattain war hilfreich.

Nach dem in den meisten Anfänger Videos delay()
zur Anwendung kommt, dachte ich das man das so macht. Jetzt weis ich dass der delay Befehl den gesamten Loop Pausiert - besser eine While Schleife. So habe ich das zumindest in Erfahrung gebracht.

Hallo Thma

Du kannnst die Funktion delay() verwenden, wenn du einen einzelnen Task auf dem Arduino ausführen läßt.

Wenn du mehrere Tasks mit einem speziellen Timing-Verhalten hast, dann ist es sinnvoll, Zeitscheiben auf Basis der millis()-Funktion zu verwenden.

Nimm das BlinkWithOutDelay-Beispiel aus dem IDE und verwende es um eine eigne timer()-Funktion zu entwerfen.

Diese timer() Funktion könnte die folgenden Methoden enthalten:

  • start();
  • stop(),
  • event();
  • isRunning();

Einen schönen Tag und viel Spaß beim Programmieren in C++.

Auch diese blockiert, wenn Du nicht spezielle Voraussetzungen erfüllst. Lerne lieber die Arbeit mit millis(). Beispiel BlinkWithoutDelay - es geht dabei in erster Linie nicht ums Blinken, sondern um die Zeitsteuerung.

Gruß Tommy

Genau das, was ich vermutet habe.
Aber nu.
Da werden noch ganz viele Philosophien kommen.
Daran werde ich mich nciht beteiligen.

Hast Du drei Potis?
Sie sollten a) Linear sein und b) irgendwas zwischen 2 udn 10Kohm haben.
Notfalls geht auch 1K.

Dann bauen wir ein kleines Grundgerüst und aus dem kannst Du weiterentwickeln, weil Du dann siehst, wie einfach es ist :wink:

1 Like

ja und jetzt wäre es hilfreicher wenn man es nicht bei so einem kurzen Stichwort belässt sondern mehr ins Detail geht.

Nein - auch nicht mit einer while-schleife.
Die While-Schleife ist auch wieder blockierend in dem Sinne, dass nur der Code der sich innerhalb der While-Schleife befindet ausgeführt wird bis die While-bedingung nicht mehr erfüllt ist.

einfaches pseudo-code Beispiel

void loop() {

 if (NotausTaster betätigt) {
  schalte alles ab
 }

  while (endposition nicht erreicht) {
    fahre in Richtung gewählte endposition
    Blinke Lampe
    Schalte Piepser ein/aus
  }  
}

in diesem Beispiel wird der Not-Aus-Taster erst dann eingelesen wenn die while-schleifen-Bedingung nicht mehr erfüllt ist

Den Notaus sollte man aber IMMER überprüfen lassen
Das bedeutet man müsste die Notausüberprüfung zusätzlich auch in in die Schleife mit hinein nehmen und die while-schleife abbrechen

void loop() {

  if (NotausTaster betätigt) {
    schalte alles ab
  }

  while (endposition nicht erreicht) {
    fahre in Richtung gewählte endposition
    Blinke Lampe
    Schalte Piepser ein / aus

    if (NotausTaster betätigt) {
      schalte alles ab
      break; // breche die while-schleife ab
    }
  }
}

oder man müsste den Notaus als zusätzliche While-Bedingung aufnehmen

void loop() {

  if (NotausTaster betätigt) {
    schalte alles ab
  }

  while (endposition nicht erreicht UND (NICHT NotausTaster betätigt) ) {
    fahre in Richtung gewählte endposition
    Blinke Lampe
    Schalte Piepser ein / aus
  }
}

Jede dieser Varianten ist umständlich.
Deswegen kommen while-schleifen bei nicht-blockierendem Programmieren nur selten zum Einsatz

Man braucht es auch nicht. Man hat schon eine Schleife
void loop() selbst.

void loop() {

  if (NotausTaster betätigt) {
    schalte alles ab
  }

  if (endposition nicht erreicht ) {
    fahre in Richtung gewählte endposition
    Blinke Lampe
    Schalte Piepser ein / aus
  }
  else {
    // lass gut sein (brauchst gerade nichts machen) 
  }
}

Notaus ist nur ein bedingt geeignetes Beispiel.
In real ausgeführter Technik wird ein Notaus immer möglichst direkt wirken´
nach dem Prinzip "Öffner-Kontakt"
Nur so lange alles in Ordnung ist wird die Funktion freiegegeben.
Wenn Kabelbruch gleiches Ergebnis wie Not-Aus betätigt = Schalter geöffnet => alles schaltet ab.

Also ein einfach zu erreichender riesiger Knopf der bei einer rein hydraulischen Steuerung
den Strom der Hydraulikpumpe sofort abschaltet. Oder bei einem Traktor die Zündung unterbricht. Oder die Hydraulikhauptleitung sperrt.

Eine sogenannte State-Machine ermöglicht, dass man je nach Betriebszustand bzw. je nach Ablaufschritt immer nur ein Teil des Programms ausgeführt wird.

Diese Betriebszustände / Ablaufschritte sind die einzelnen "states" der State-Machine

So. Schreibe mal - als Vorübung - eine Beschreibung in normalen Worten welche Schritte da nacheinander ablaufen wenn du den Knopf "Hydraulik nach oben" betätigst

vgs