Hotwheels TOF Lidar Geschwindigkeit Messen

Hallo zusammen,
nach langer Suche und viel geteste, stoße ich an meine Denksperre.
Ich möchte für eine Hotwheelsrampe eine Messstelle Bauen.
Momentan hab ich einen Wemos D1 und einen TF Luna Lidar Sensor.
Der Momentane Sketch sie so aus.

#include <SoftwareSerial.h>
#include "TFMini.h"
TFMini tfmini;

SoftwareSerial SerialTFMini(5, 4);

void getTFminiData(int* distance, int* strength)
{
  static char i = 0;
  char j = 0;
  int checksum = 0;
  static int rx[9];
  if (SerialTFMini.available())
  {
    rx[i] = SerialTFMini.read();
    if (rx[0] != 0x59)
    {
      i = 0;
    }
    else if (i == 1 && rx[1] != 0x59)
    {
      i = 0;
    }
    else if (i == 8)
    {
      for (j = 0; j < 8; j++)
      {
        checksum += rx[j];
      }
      if (rx[8] == (checksum % 256))
      {
        *distance = rx[2] + rx[3] * 256;
        *strength = rx[4] + rx[5] * 256;
      }
      i = 0;
    }
    else
    {
      i++;
    }
  }
}


void setup()
{

  Serial.begin(115200);       //Initialize hardware serial port (serial debug port)
  while (!Serial);            // wait for serial port to connect. Needed for native USB port only
  Serial.println ("Initializing...");
  SerialTFMini.begin(TFMINI_BAUDRATE);    //Initialize the data rate for the SoftwareSerial port
  tfmini.begin(&SerialTFMini);            //Initialize the TF Mini sensor
}

void loop()
{
  int distance = 0;
  int distance2;
  int strength = 0;

  static unsigned long lastMillis = 0;
  const long interval = 200;
  unsigned long ms = millis();


  getTFminiData(&distance, &strength);
  while (!distance)
  {
    getTFminiData(&distance, &strength);
    if (distance)
    {


      if (ms - lastMillis >= interval) {
        lastMillis = ms;

        distance2 = distance;

      }
    }
  }

  Serial.print(distance);
  Serial.print("cm\t");
  Serial.print(distance2);
  Serial.println("cm\t");
}

Momentan habe ich versucht, einen alten gemessenen Wert mit einem aktuellen zu vergleichen und wollte dann die Differenz umrechnen. Es fehlt der Feinschliff.
Doch irgendwie find ich keinen guten Ansatz.

Könnt ihr mir ein wenig Hilfe geben?

Die Erfassung Ihrer Entfernung sollte deterministisch sein. Ändern Sie den Code so, dass er einen booleschen Wert zurückgibt, wenn eine erfolgreiche Distanzmessung durchgeführt wurde.

Vielleicht so (hier eingetippt, daher zur Überprüfung).

#include <SoftwareSerial.h>
#include "TFMini.h"
TFMini tfmini;

SoftwareSerial SerialTFMini(5, 4);

bool getTFminiData(int* distance, int* strength) {
  static char i = 0;
  static int rx[9];

  if (SerialTFMini.available()) {
    rx[i] = SerialTFMini.read();
    if (rx[0] != 0x59) i = 0;
    else if (i == 1 && rx[1] != 0x59) i = 0;
    else if (i == 8) {
      int checksum = 0;
      i = 0;
      for (char j = 0; j < 8; j++) checksum += rx[j];
      if (rx[8] == (checksum % 256)) {
        *distance = rx[2] + rx[3] * 256;
        *strength = rx[4] + rx[5] * 256;
        return true;
      }
      return false;
    } else {
      i++;
    }
  }
  return false;
}


void setup() {
  Serial.begin(115200);       //Initialize hardware serial port (serial debug port)
  while (!Serial);            // wait for serial port to connect. Needed for native USB port only
  Serial.println ("Initializing...");
  SerialTFMini.begin(TFMINI_BAUDRATE);    //Initialize the data rate for the SoftwareSerial port
  tfmini.begin(&SerialTFMini);            //Initialize the TF Mini sensor
}

void loop(){
  int distance = 0;
  int strength = 0;

  if (getTFminiData(&distance, &strength)) {
    Serial.print("distance: ");
    Serial.print(distance);
    Serial.print("cm\tstrength:");
    Serial.println(strength);
  }
}

Hi, bis auf den Pervormace unterschied, erkenne ich erstmal keinen Vorteil.
Da der Sketch, permanent Messwerte heraus gibt, sollte ich also einen Startwert der Messung Festlegen. Also zum Beispiel ein starke Änderung des Grundrauschens.

Wenn, Aktueller Wert, abweichung grösser ist als vorausgegangener Wert, dann Messung Start?

Es handelt sich nicht um ein Leistungsproblem. Es ist nur so, dass Sie keine Chance haben, dass dies (sequenzielle Lesevorgänge) funktioniert.

getTFminiData(&distance, &strength);
while (!distance)
{
  getTFminiData(&distance, &strength);
  if (distance)
  {

wenn Sie nicht wissen, ob die Funktion einen neuen Wert erhalten hat.

➜ Die Funktion kann Ihnen mitteilen, ob der Lesevorgang (der asynchron ist) abgeschlossen ist. Dann, um zwei aufeinanderfolgende Werte zu lesen, könnte eine kleine Zustandsmaschine Ihnen das Leben erleichtern.

#include <SoftwareSerial.h>
SoftwareSerial SerialTFMini(5, 4);

enum {WARTEN_AUF_SCHRITT1, WARTEN_AUF_SCHRITT2, ERGEBNIS} zustand = WARTEN_AUF_SCHRITT1;

struct TFMiniDaten {
  int entfernung = 0;
  int staerke = 0;
};

TFMiniDaten schritt1, schritt2;

bool getTFminiDaten(TFMiniDaten& tfDaten) {
  static byte i = 0;
  static byte rx[9];

  if (SerialTFMini.available()) {
    rx[i] = SerialTFMini.read();
    if (rx[0] != 0x59) i = 0;
    else if (i == 1 && rx[1] != 0x59) i = 0;
    else if (i == 8) {
      int checksum = 0;
      i = 0;
      for (byte j = 0; j < 8; j++) checksum += rx[j];
      if (rx[8] == (checksum % 256)) {
        tfDaten.entfernung = rx[2] + rx[3] * 256;
        tfDaten.staerke = rx[4] + rx[5] * 256;
        return true;
      }
      return false;
    } else {
      i++;
    }
  }
  return false;
}

void setup() {
  Serial.begin(115200);
  while (!Serial);
  SerialTFMini.begin(9600);   // Initialisiere die Datenrate für den TFMini (9600 ??)
  Serial.println("Bereit...");
}

void loop() {
  switch (zustand) {
    case WARTEN_AUF_SCHRITT1:
      if (getTFminiDaten(schritt1)) zustand = WARTEN_AUF_SCHRITT2;
      break;

    case WARTEN_AUF_SCHRITT2:
      if (getTFminiDaten(schritt2)) zustand = ERGEBNIS;
      break;

    case ERGEBNIS:
      Serial.print("Schritt 1: (");
      Serial.print(schritt1.entfernung);
      Serial.print("cm, ");
      Serial.print(schritt1.staerke);
      Serial.println(")");

      Serial.print("Schritt 2: (");
      Serial.print(schritt2.entfernung);
      Serial.print("cm, ");
      Serial.print(schritt2.staerke);
      Serial.println(")");

      zustand = WARTEN_AUF_SCHRITT1;
      break;
  }
}

Wenn ich Ihr Beispiel richtig lese, setzt es vorraus das ich in ausgangssituation, keinen Messwert habe und bei Zustand 1 und 2 mir ihn erzeuge?
Als hätte ich 2 Lichtschranken die unterbrochen werden.
Korrekt?

Dies war nur ein Beispiel, bei dem Sie zwei aufeinanderfolgende Messwerte erhalten

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.