Seite 1 von 1

Nach analogRead des Analogeingangs absolute Geschwindigkeit und Richtung übergeben.

Verfasst: 15.06.2025, 01:52
von atomphil
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 :-)

Re: absolute Geschwindigkeit vom Analogeingang ausgeben lassen

Verfasst: 15.06.2025, 10:04
von little.yoda
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]

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit übergeben.

Verfasst: 15.06.2025, 10:11
von atomphil
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?

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit übergeben.

Verfasst: 15.06.2025, 11:41
von atomphil

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 ;-)

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit übergeben.

Verfasst: 15.06.2025, 12:01
von little.yoda
[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.

Re: Nach analogRead des Analogeingangs absolute Geschwindigkeit übergeben.

Verfasst: 15.06.2025, 14:29
von atomphil
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.

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

Verfasst: 17.06.2025, 15:07
von little.yoda
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.

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

Verfasst: 26.06.2025, 00:22
von atomphil
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.

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

Verfasst: 27.06.2025, 11:36
von little.yoda
Fehler ist hoffentlich in der neuen Beta/Alpha-Version korrigiert.

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

Verfasst: 27.06.2025, 12:49
von little.yoda
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?