Lagesensor integrieren

Hi Roland,

Ok das erklärt es.

Wenn ich das mpuangle.py umbaue und die ausgabevariablen gleich lasse könnte man es einfach austauschen ohne das es den rest beeinflusst oder?

Hallo Arno,

Ich war mir fast sicher, dass du es warst!

ABER ICH WAR GERADE auf der Autobahn A61 unterwegs (nein nicht am fahren sondern am Parkplatz auf der Moselbrücker bei der Regenation!)

Und wollte nicht spekulieren, denn zum suchen hatte ich keine Kraft…

Ganz ehrlich, die Funktion wie sie ist ist fast nutzlos, da müsste man was besseres finden, wäre ich nur Entwickler mit Ahnung …

Vielleicht taugt auch nur der Sensor nix…

Aber bei uns sind das alles nur Themen die ich spaßeshalber mal anschaue, denn ich habe noch viele andere Baustellen.

Im Moment nehm ich mein Handy und schmeiß. es mit einer Wasserwagen-App auf den Boden vom Kastenwagen und freu mich wenn nach dem Klötze unterlegen der Vanpi auch auf Null steht!

Wünsche Dir noch einen schönen Wochenanfang!

Gruß Roland

Wenn Du das kannst wären sicher viele dein bester Freund!

Nee im ernst wäre cool wenn das jemand anpasst, dass man mit der Funktion was anfangen kann…

Jedoch sollte es update tauglich sein, darum lege ich meine geklauten/ki-selbst-gebastelte-Funktionen immer in einen Userlow und überschreiben nur die Vorgegebenen Variablen, dann kann ich ohne Änderungen, die Werte in de Äpp anzeigen ohne groß was zu ändern.

funktioniert nicht für alles aber besser als nix!

Gruß Roland.

Hallo Roland,
ich hab dir mal meinen flow exportiert, das kannst du ja mal ausprobieren.
Das deaktivierte habe ich nicht mit kopiert, das war die Berechnung die eh nicht funktioniert.



wenn du daas auch haben möchtest, das sind die dunkelbauen Nodes dann mußt du dir die Palette " node-red-contrib-ui-level " laden, sonst einfach löschen
auf der MPU Seite musst du dir noch 2 Linkout schaffen

Lagesensor.json (8,1 KB)
In der Range node musst du die Werte eintragen wie oben beschrieben,
also eigentlich passt das, wenn ich vorne jetzt 15 cm und links 2-3 unterlege stehe ich gerade.
Edit:
bin jetzt mal auf Keile gfahren, die sind aber nur 8cm. 6 cm werden jetzt noch angezeigt. Dass kannst du ja mal probieren

Hallo Arno,

das sieht ja cool aus, muss ich mir mal überlegen ob ich das auch hinbekomme..

Ich hatte mal ein wenig gebastelt und habe mit dieser Funktion die Ausgaben, nur als Text ganz unten im Bild erstellt. Das mit “Vorne” und “Rechts” war mein erster Test, den ich noch nicht entfernt habe:

Mit der Formatierung Kämpfe ich noch, weil gefallen tut mir das noch nicht!

// ===== Einstellungen =====
const wheelbase_cm = 403.5;   // Radstand in cm
const track_width_cm = 205;   // Spurbreite in cm
const wedge_factor = 0.65;    // Praxisfaktor: 1.0 = rechnerisch, 0.65 = realistischer Keilwert




// ===== Anzeige-Stabilisierung =====
const update_interval_ms = 2000; // max. alle 2 Sekunden aktualisieren
const min_change_cm = 1;         // erst ab 1 cm Änderung neu anzeigen




// ===== Werte speichern =====
let x_deg = flow.get("x_angle") ?? null;
let y_deg = flow.get("y_angle") ?? null;

if (msg.topic === "x_angle") {
    x_deg = Number(msg.payload);
    flow.set("x_angle", x_deg);
}


if (msg.topic === "y_angle") {
    y_deg = Number(msg.payload);
    flow.set("y_angle", y_deg);
}


// warten bis beide Werte vorhanden sind
if (x_deg === null || y_deg === null || isNaN(x_deg) || isNaN(y_deg)) {
    return null;
}


// ===== Winkel -> cm berechnen =====
let x_cm = Math.tan(x_deg * Math.PI / 180) * wheelbase_cm;
let y_cm = Math.tan(y_deg * Math.PI / 180) * track_width_cm;

// ===== Räder berechnen =====
let VL = 0;
let VR = 0;
let HL = 0;
let HR = 0;

// Längsrichtung
if (x_cm > 0) {
    VL += x_cm;
    VR += x_cm;
} else if (x_cm < 0) {
    HL += Math.abs(x_cm);
    HR += Math.abs(x_cm);
}


// Querrichtung
if (y_cm > 0) {
    VR += y_cm;
    HR += y_cm;
} else if (y_cm < 0) {
    VL += Math.abs(y_cm);
    HL += Math.abs(y_cm);
}


// Praxisfaktor anwenden und auf ganze cm runden
VL = Math.round(VL * wedge_factor);
VR = Math.round(VR * wedge_factor);
HL = Math.round(HL * wedge_factor);
HR = Math.round(HR * wedge_factor);


// ===== Nur bei relevanter Änderung aktualisieren =====
let last = flow.get("wheel_display_last") || {};
let now = Date.now();


let changed =
    Math.abs((last.VL ?? -999) - VL) >= min_change_cm ||
    Math.abs((last.VR ?? -999) - VR) >= min_change_cm ||
    Math.abs((last.HL ?? -999) - HL) >= min_change_cm ||
    Math.abs((last.HR ?? -999) - HR) >= min_change_cm;


if (!changed && (now - (last.time ?? 0)) < update_interval_ms) {
    return null;
}


flow.set("wheel_display_last", {
    VL: VL,
    VR: VR,
    HL: HL,
    HR: HR,

    time: now
});


// ===== Keilstufen =====
function wedgeStage(cm) {
    if (cm <= 1) return 0;
    if (cm <= 4) return 1;
    if (cm <= 8) return 2;
    if (cm <= 12) return 3;
    return 4;
}

// ===== Darstellung =====
function card(name, val) {
    let stage = wedgeStage(val);

    let stageText = stage === 0
        ? "&nbsp;"
        : `Stufe ${stage}`;

    return `
      <td style="width:75%; padding:6px;">
        <div style="
          width:100%;
          height:105px;
          box-sizing:border-box;
          border-radius:10px;
          background:rgba(255,255,255,0.08);
          display:grid;
          grid-template-rows:30px 34px 26px;
          align-items:center;
          justify-items:center;
          text-align:center;
          overflow:hidden;
        ">
          <div style="
            font-size:20px;
            font-weight:bold;
            width:100%;
            padding-bottom:3px;
            border-bottom:1px solid rgba(255,255,255,0.25);
          ">${name}</div>


          <div style="
            font-size:24px;
            font-weight:bold;
            width:100%;
            white-space:nowrap;
          ">${val} cm</div>


          <div style="
            font-size:15px;
            font-weight:bold;
            width:100%;
            min-height:24px;
            white-space:nowrap;
          ">${stageText}</div>

        </div>

      </td>`;

}




// ===== HTML Ausgabe =====

msg.payload = `

<div style="font-size:22px; line-height:1.15; width:100%;">

  <div style="text-align:left; font-weight:bold; margin-bottom:6px;">

  🚐 Ausrichtung

  </div>


table style="
    width:100%;
    table-layout:fixed;
    border-collapse:separate;
    border-spacing:0 14px;
    text-align:center;
  ">
    <tr>
      ${card("VL", VL)}
      ${card("VR", VR)}
    </tr>
    <tr>
      ${card("HL", HL)}
      ${card("HR", HR)}
    </tr>
  </table>
</div>
`;




msg.text = msg.payload;
msg.value = msg.payload;




msg.wheels = { VL, VR, HL, HR };
msg.stages = {
    VL: wedgeStage(VL),
    VR: wedgeStage(VR),
    HL: wedgeStage(HL),
    HR: wedgeStage(HR)
};


msg.raw = {
    x_deg: x_deg,
    y_deg: y_deg,
    x_cm: Math.round(x_cm * 10) / 10,
    y_cm: Math.round(y_cm * 10) / 10
};

return msg;

Mit Stufe ist dabi gemeint, die jeweilige Platform der Keile, da ich die aber nicht da hatte hab ich jetzt mal geschätzt.

Am 1 Mai Wochenende werde ich mal testen, ob die Werte in etwa stimmen.
Ich bin unter der Woche 300km weit weg vom Fahrzeug und muss mir da immer über Portweiterleitungen und SSH helfen, darum werden die Bilder auch nicht angezeigt…

Ich habe zwar auch dauerhaften VPN-Zugang zum Fahrzeug, aber nicht aus dem Aktuellen Netzwerk…

Gruß
Roland

P.S.: Bezüglich des “pekaway.local” Problem was ich remote im VPN hatte, habe ich mir nur eine Funktion (in einem userflow) erstellt, wo ich regelmäßig die Variable mit meine fest IP hart füttere, Nun habe ich die Bilder im VPN…

Die Balken Anzeige könntest du so einstellen das du für jede Stufe eine Farbe hast grün 1. Stufe orange 2. Stufe rot 3. Stufe, oder ähnliches

Ich habe ein mpu6050 auf den dimmy gelötet und mir die Kalibrierung und Anzeige über ein Home Assistant Dashboard gebaut. Die Winkel und X-/Y-/Z-Achsermittlung habe ich über einen Beschleunigungs-/Bremstest auf einem Parkplatz realisiert. Als Anzeige dient ein Bullseye-Wasserwaage Bild. Falls jemand Interesse hat, kann ich das mal in ein Github Repo kippen und den link hier posten

Warum einen mpu6050? Der ist doch auf auf dem Vanpi verbaut oder hast du den nicht?

Und es gibt mittlerweile viel genauere/modernere Sensoren…

Weil ich mag mir auch noch einen anderen verbauen, weil ich von dem Ergebnis des mpu6050 nicht begeistert bin.

Ich werde mir mal den IIS2ICLX und den ADXL355 anschauen, sind beide auch oer i2c anzusteuern.