Nach analogRead des Analogeingangs absolute Geschwindigkeit und Richtung übergeben.

Antworten
atomphil
Beiträge: 5
Registriert: 14.06.2025, 21:52
Hat sich bedankt: 5 Mal

Nach analogRead des Analogeingangs absolute Geschwindigkeit und Richtung übergeben.

Beitrag von atomphil » 15.06.2025, 01:52

Hallo,
ich spiele gerade das erste mal mit dem Framework. - tolle Sache: Loksteuerung über App und extra Z21-Zentralen-ESP klappt schonmal ganz gut.

Bild

Ich habe noch einen alten Lego-9V-Trafo mit großem Drehregler. Der hat eine Mittelstellung und pro Richtung sechs Fahrstufen, die intern über Schleifer und eine Wiederstandskaskade gebildet werden. Zum Spaß habe ich einen Spannungsteiler mit Abgriff an A0 des D1 mini angebracht.

Bild

Ich hatte vorher schonmal eine eigene kleine Software auf dem D1 mini laufen, die hat die Werte folgendermaßen in die entsprechende Richtung und Geschwindigkeit übersetzt:

Code: Alles auswählen

void loop() {
  ArduinoOTA.handle();                     //needed to act on OTA requests

  int newValue = analogRead(potPin);
  Motorspeed = 0; // Standardmotorwert ist 0

  if (newValue >= 420 && newValue <= 547) {
    // Rückwärts-Stufen
    if (newValue >= 420 && newValue < 455) {
      Motorspeed = -255;
    } else if (newValue >= 455 && newValue < 470) {
      Motorspeed = -240;
    } else if (newValue >= 470 && newValue < 482) {
      Motorspeed = -225;
    } else if (newValue >= 482 && newValue < 510) {
      Motorspeed = -210;
    } else if (newValue >= 510 && newValue < 527) {
      Motorspeed = -195;
    } else {
      Motorspeed = -180;
    }
  } else if (newValue >= 548 && newValue <= 680) {
    // Vorwärts-Stufen
    if (newValue >= 548 && newValue < 570) {
      Motorspeed = 180;
    } else if (newValue >= 570 && newValue < 590) {
      Motorspeed = 195;
    } else if (newValue >= 590 && newValue < 610) {
      Motorspeed = 210;
    } else if (newValue >= 610 && newValue < 624) {
      Motorspeed = 225;
    } else if (newValue >= 624 && newValue < 640) {
      Motorspeed = 240;      
    } else {
      Motorspeed = 255;
    }
  }

  if (Motorspeed != lastMotorspeed) {
    sendRequest(Motorspeed);
    lastMotorspeed = Motorspeed;
  }

  delay(80); 
}
Das hat eigentlich ganz gut funktioniert.

soweit ich es aus den Dokumentationsstücken zum Framework zusammenraten kann, würde eine Umsetzung ungefähr so aussehen (die Stufen müssen natürlich noch angepaßt werden):

Code: Alles auswählen

    "out":[
        {
            "m":"locdatacontroller",
            "locaddr":[
                "110"
            ],
            "id":"lctl"
        }
    ],
    "in":[
        {
            "m":"analoggpio",
            "gpio":"A0",
	    "value2out" :[ 	
				[0, 520, "absSpeed", "-128"], 
				[521, 570, "absSpeed", "0"], 
				[571, 590, "absSpeed", "60"], 	
				[591, 1023, "absSpeed", "127"]  
			  ],
            "out":[
                "lctl"
            ]
        }
    ],
Prinzipiell scheint der Ansatz so zu gehen, denn wenn ich statt "absSpeed" das dokumentierte "relSpeed" mit Werten eintrage, passiert etwas und die Geschwindigkeit ändert sich. Nun meine Fragen:
Was ist denn der korrekte Variablenname für die absolute Geschwindigkeit und wie ist der Wertebereich? Kann die Richtung über das Vorzeichen mitgegeben werden oder gibt es eine eigene Variable? Wie kann ich dann beide übergeben?

Vielen Dank :-)
Zuletzt geändert von atomphil am 15.06.2025, 17:26, insgesamt 2-mal geändert.

little.yoda
Site Admin
Beiträge: 949
Registriert: 14.09.2018, 19:05
Hat sich bedankt: 34 Mal
Danksagung erhalten: 154 Mal

Re: absolute Geschwindigkeit vom Analogeingang ausgeben lassen

Beitrag von little.yoda » 15.06.2025, 10:04

Sehr gute Frage.

<- such ->

Die Variablen finden sich in in der Function setSettings:
https://github.com/littleyoda/littleyod ... roller.cpp

<- such ->

Dein Fall wird tatsächlich noch nicht unterstützt.
Die Geschwindigkeit "setSpeed" und die Richtung "toggleDir" werden getrennt erwartet.
Ich schaue, dass ich es die Tage einbaue.
[Disclaimer: Ich werde es nicht testen können, so dass du es bitte testen müsstest]

atomphil
Beiträge: 5
Registriert: 14.06.2025, 21:52
Hat sich bedankt: 5 Mal

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit übergeben.

Beitrag von atomphil » 15.06.2025, 10:11

Hallo Sven,
vielen Dank für schnelle Antwort. Ich teste gerne.
Für die Richtung bräuchte man dann aber auch eine Möglichkeit diese direkt zu übergeben (setDir), nicht nur Umschalten (toggle). ;-)

PS: Wie werden denn die Linearpotis in den Selbstbaureglern abgefragt?

atomphil
Beiträge: 5
Registriert: 14.06.2025, 21:52
Hat sich bedankt: 5 Mal

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit übergeben.

Beitrag von atomphil » 15.06.2025, 11:41

Code: Alles auswählen

    	    "value2out" :[ 	
                          [0, 470, "toggleDir", "1"], 
                          [471, 550, "setSpeed", "0"], 
                          [551, 520, "setSpeed", "15"], 	
                          [521, 570, "setSpeed", "30"], 	
                          [571, 590, "setSpeed", "45"],                           
                          [591, 610, "setSpeed", "75"],
                          [611, 623, "setSpeed", "100"], 	
                          [624, 1023, "setSpeed", "127"]  
    			  ],
So geht es zumindest schonmal in eine Richtung, die andere toggled die Richtung ;-)

little.yoda
Site Admin
Beiträge: 949
Registriert: 14.09.2018, 19:05
Hat sich bedankt: 34 Mal
Danksagung erhalten: 154 Mal

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit übergeben.

Beitrag von little.yoda » 15.06.2025, 12:01

[Irgendwie ist meine Antwort weg ... also nochmal]

Wenn alles geknappt hat, steht jetzt eine neue Beta/Alpha Version zur Verfügung:
https://www.open4me.de/service/test-flash/

Diese Version hat nun die Option "setDirectionSpeed".
Es akzeptiert Werte von -127 bis 127.
Damit sollte dein Wusch umsetzbar sein.

----
So sieht meine Konfiguration für das Linearpotentiometer sieht so aus. Richtungswechsel wurde durch einen Button ausgelöst.

Code: Alles auswählen

    "in":[
        {
            "m":"analoggpio",
"gpio":"IO35",
            "value2out" : [
 [ 4075, 4115 , "setSpeed", "110"],
[ 3887, 3927 , "setSpeed", "100"],
[ 3283, 3323 , "setSpeed", "90"],
[ 2921, 2961 , "setSpeed", "80"],
[ 2450, 2490 , "setSpeed", "70"],
[ 2049, 2089 , "setSpeed", "60"],
[ 1580, 1620 , "setSpeed", "50"],
[ 1113, 1153 , "setSpeed", "40"],
[ 651, 691 , "setSpeed", "30"],
[ 299, 339 , "setSpeed", "20"],
[ 11, 51 , "setSpeed", "10"],
[ 0, 40 , "setSpeed", "0"],
           ],
            "out": [ "lctl" ]

        },
    ],
Ich hatte mal eine Lösung, die das Modul FilterPolynom nutzt, um mit einer Formel aus den Analog-Werte Geschwindigkeiten zu berechnen. Diese Konfiguration finde ich aber nicht mehr.

atomphil
Beiträge: 5
Registriert: 14.06.2025, 21:52
Hat sich bedankt: 5 Mal

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit übergeben.

Beitrag von atomphil » 15.06.2025, 14:29

little.yoda hat geschrieben:
15.06.2025, 12:01
[Irgendwie ist meine Antwort weg ... also nochmal]

Wenn alles geknappt hat, steht jetzt eine neue Beta/Alpha Version zur Verfügung:
https://www.open4me.de/service/test-flash/

Diese Version hat nun die Option "setDirectionSpeed".
Es akzeptiert Werte von -127 bis 127.
Damit sollte dein Wusch umsetzbar sein.
Wow das ging ja fix und es funktioniert. Vielen Dank :-)


little.yoda hat geschrieben:
15.06.2025, 12:01
Ich hatte mal eine Lösung, die das Modul FilterPolynom nutzt, um mit einer Formel aus den Analog-Werte Geschwindigkeiten zu berechnen. Diese Konfiguration finde ich aber nicht mehr.
Das wäre sicherlich eleganter als eine look-up-table und würde die Feinheit der analogen Eingabe super mit den 128 Fahrstufen abbilden. Außerdem könnte man gut nichtliniaritäten ausgleichen oder ein Expo einbauen. Evtl. wäre da noch eine Mittelwertbildung oder ähnliches sinnvoll, daß die Werte dann nicht ständig hüpfen, nur weil ein Bit wackelt.

----

Könnte man darüber auch einen Rangiergang der Lok realisieren? Also mit einer F-Taste den Geschwindigkeitsbereich begrenzen und evtl. das Licht umschalten.

little.yoda
Site Admin
Beiträge: 949
Registriert: 14.09.2018, 19:05
Hat sich bedankt: 34 Mal
Danksagung erhalten: 154 Mal

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit und Richtung übergeben.

Beitrag von little.yoda » 17.06.2025, 15:07

Wenn du genügend Referenzpunkte (Input-Value => Geschwindigkeit) könnten wir versuchen, eine entsprechende Formel aufzustellen. Die Funktionalität ist in der Software enthalten.


---
Die Idee wäre möglich. Dazu müsste man aber einen Filter hinzufügen, der Bedingungen verarbeiten kann.
Dafür fehlt mir aber aktuell die Energie.

atomphil
Beiträge: 5
Registriert: 14.06.2025, 21:52
Hat sich bedankt: 5 Mal

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit und Richtung übergeben.

Beitrag von atomphil » 26.06.2025, 00:22

Ein Filter mit Bedingungen wäre nicht nur für den Rangiergang toll. Ich möchte bei einigen Loks zwischen einer und zwei roten Rückleuchten (Vereinfachtes Schlusssignal) umschalten können. Das könnte man damit zB auch machen.


----

Ich glaube bei der aktuellen Alpha hat sich ein Bug eingeschlichen. Für den Legotrafo funktioniert sie super. Ich habe sie heute aber auf einen D1 mini gespielt, der über eine H-Brücke einen Motor steuern soll. Dabei geht sowohl über das Webinterface, als auch über Z21 gesteuert PWM nur Vorwärts, in die andere Richtung ists tot. Mit der stable 1.3.0 geht PWM in beide Richtungen wie es soll.

little.yoda
Site Admin
Beiträge: 949
Registriert: 14.09.2018, 19:05
Hat sich bedankt: 34 Mal
Danksagung erhalten: 154 Mal

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit und Richtung übergeben.

Beitrag von little.yoda » 27.06.2025, 11:36

Fehler ist hoffentlich in der neuen Beta/Alpha-Version korrigiert.

little.yoda
Site Admin
Beiträge: 949
Registriert: 14.09.2018, 19:05
Hat sich bedankt: 34 Mal
Danksagung erhalten: 154 Mal

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit und Richtung übergeben.

Beitrag von little.yoda » 27.06.2025, 12:49

atomphil hat geschrieben:
26.06.2025, 00:22
Ein Filter mit Bedingungen wäre nicht nur für den Rangiergang toll. Ich möchte bei einigen Loks zwischen einer und zwei roten Rückleuchten (Vereinfachtes Schlusssignal) umschalten können. Das könnte man damit zB auch machen.
Kannst du mal genauer schreiben, was du im Kopf hast?

Antworten