Alternative für HC-SR04

Muss ich den wirklich an den Pin 10 und 11 (ich weiss es ist im Sketch angegeben) gehen. Oder muss ich den Pin 0 und 1 nutzen?

Auf pin 0 und 1 ist die Programmierschnittstelle angeschlossen über die man per serieller Ausgabe auch debuggen kann.

Wenn du den Sensor unbedingt an 0,1 anschliessen willst bedeutet das zum flashen jedes mal abklemmen und nach dem flashen wieder anklemmen und zum seriell debuggen einen zweiten Schnittstellenwandler benutzen müssen.

Was ist mit

Hast du das ausprobiert?
vgs

1 Like

Ja, du musst, wenn du es im Sketch so vorgibst.
Anders funktioniert es nicht.

1 Like

Da werden also 4 Byte von der Schnittstelle gelesen und ins array geschrieben dann wird das 5. Bye von der Schnittstelle gelesen und kontrolliert ob es 0xff ist.

Ist das so gewollt?

Grüße Uwe

1 Like

Hier ist das Wiki mit Daten dazu
https://wiki.dfrobot.com/A02YYUW%20Waterproof%20Ultrasonic%20Sensor%20SKU:%20SEN0311

Da kann man die Anschlussbelegung nachlesen

Da sieht man dass es nur 4 Byte sind.
Also ich würde das Programm erst einmal so umschreiben, dass es jedes einzelne Byte
ausgibt und nicht nur wenn distance > 30
vgs

1 Like

@StefanL38
Ich habe das Bsp. erstmal genommen um zu testen, ob der Sensor geht, leider noch kein Erfolg...
Änderungen möchte ich dann machen, wenn ich den Testsensor im Betrieb habe.

Ich habe auch die RX und TX am Port 10 und 11 getauscht, jedoch ohne Erfolg.

@uwefed
Siehe Antwort zu StefanL38

Jetzt habe ich erstmal eine Erklärung in jede Zeile geschrieben, ist das so richtig?

#include <SoftwareSerial.h>

SoftwareSerial mySerial(11, 10); // RX, TX  // Kommunikationsport vom Sensor RX, TX an dem angegebenen Ports
unsigned char data[4] = {}; // Speicher für die Werte
float Abstand;  // Variable für die Abstand

void setup()
{
  Serial.begin(57600); // Baudrate zur Kommunikation für den Seriellen Monitor
  mySerial.begin(9600); // Baudrate zur Kommunikation mit dem Sensor
}

void loop()
{
  do
  {
    for (int i = 0; i < 4; i++) // Speicher auf 0 setzen, 4 Werte Schreiben
    {
      data[i] = mySerial.read(); // Zum Auslesen der Schnittstelle
    }
  }
  while (mySerial.read() == 0xff); // Kontrolle ob es 0xff ist

  mySerial.flush(); // Ausgabe der Daten nach übertragung

  if (data[0] == 0xff) // Wenn "data(0)"  "0xff" ist
  {
    int Summe; // Variable zur Berechen der Summe
    Summe = (data[0] + data[1] + data[2]) & 0x00FF; // Werte in Summe setzten
    if (Summe == data[3])
    {
      Abstand = (data[1] << 8) + data[2]; // Abstand berechnen
      if (Abstand > 30)
      {
        Serial.print("Abstand=");  // Text Ausgeben
        Serial.print(Abstand / 10);// Abstand berechnen
        Serial.println("cm");  // Text Ausgeben
      } else
      {
        Serial.println("Below the lower limit");  // Text Ausgeben
      }
    } else Serial.println("ERROR");  // Text Ausgeben
  }
  delay(100); // Wartezeit bis zur nächsten Messung
}

Keine Ahnung.
Ich würde das so machen:
(ungetestet nur aus der Logik - kompiliert fehlerfrei. Einfach mal machen)

#include <SoftwareSerial.h>

SoftwareSerial mySerial(11, 10); // RX, TX  // Kommunikationsport vom Sensor RX, TX an dem angegebenen Ports
unsigned char data[3] = {0}; // Speicher für die Werte
bool startHeader = false;
uint8_t i = 0;

void setup()
{
  Serial.begin(57600); // Baudrate zur Kommunikation für den Seriellen Monitor
  Serial.println(F("Start..."));
  mySerial.begin(9600); // Baudrate zur Kommunikation mit dem Sensor
}

void loop()
{
  if (mySerial.available())
  {
    if (mySerial.read() == 0xFF)
    {
      startHeader = true;
      i = 0;
      Serial.println(F("Header erkannt!"));
    }
    if (startHeader)
    {
      data[i] = mySerial.read();
      Serial.print(data[i]);
      Serial.print("\t");
      i++;
      if (i > 2) // Hier war das edit
      {
        Serial.println();
        i = 0;
        Serial.print(F("Eingefangene Daten: "));
        for (; i < 2; i++)
        {
          Serial.print(data[i]);
          Serial.print("\t");
        }
        Serial.println();
        startHeader = false;
      }
    }
  }
}

Zeig mal, was der SerMon ausgibt.

1 Like

Die Ausgabe das aus:

Start...
Header erkannt!
1	30	Start...

Da war noch was im Seriellen Speicher.
Das habe ich auch immer wieder.
Ersetze mal das setup()


void setup()
{
  Serial.begin(57600); // Baudrate zur Kommunikation für den Seriellen Monitor
  while(Serial.available()) Serial.read();
  Serial.println(F("Start..."));
  mySerial.begin(9600); // Baudrate zur Kommunikation mit dem Sensor
  while(mySerial.available()) mySerial.read();
  delay(100);
  Serial.println(F("Start 1.."));
}

Ich will eine Ausgabe von Eingefangene Daten :slight_smile:
Bitte beachten! Ich habe oben den Code noch geändert! Das loop() ist editiert!

Ich habe jetzt mal diesen Sketch verwendet:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(11, 10); // RX, TX  // Kommunikationsport vom Sensor RX, TX an dem angegebenen Ports
unsigned char data[3] = {0}; // Speicher für die Werte
bool startHeader = false;
uint8_t i = 0;

void setup()
{
  Serial.begin(57600); // Baudrate zur Kommunikation für den Seriellen Monitor
  while(Serial.available()) Serial.read();
  Serial.println(F("Start..."));
  mySerial.begin(9600); // Baudrate zur Kommunikation mit dem Sensor
  while(mySerial.available()) mySerial.read();
  delay(100);
  Serial.println(F("Start 1.."));
}

void loop()
{
  if (mySerial.available())
  {
    if (mySerial.read() == 0xFF)
    {
      startHeader = true;
      i = 0;
      Serial.println(F("Header erkannt!"));
    }
    if (startHeader)
    {
      data[i] = mySerial.read();
      Serial.print(data[i]);
      Serial.print("\t");
      i++;
      if (i > 2) // Hier war das edit
      {
        Serial.println();
        i = 0;
        Serial.print(F("Eingefangene Daten: "));
        for (; i < 2; i++)
        {
          Serial.print(data[i]);
          Serial.print("\t");
        }
        Serial.println();
        startHeader = false;
      }
    }
  }
}

Da kommt als Ausgabe nur das:

Start...
Start 1..

Und warum debuggst Du nicht?

void loop()
{
  if (mySerial.available())
  {
    Serial.print(F("Da gibt es...\t"));
    char myRead=mySerial.read();
    Serial.println(myRead, HEX);
    if (myRead == 0xFF)
    {
      startHeader = true;

Was kommt als Ausgabe?
Wenn da kein FF bei ist, kann das nichts werden.

1 Like

Sketch geändert nach:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(11, 10); // RX, TX  // Kommunikationsport vom Sensor RX, TX an dem angegebenen Ports
unsigned char data[3] = {0}; // Speicher für die Werte
bool startHeader = false;
uint8_t i = 0;

void setup()
{
  Serial.begin(57600); // Baudrate zur Kommunikation für den Seriellen Monitor
  while (Serial.available()) Serial.read();
  Serial.println(F("Start..."));
  mySerial.begin(9600); // Baudrate zur Kommunikation mit dem Sensor
  while (mySerial.available()) mySerial.read();
  delay(100);
  Serial.println(F("Start 1.."));
}

void loop()
{
  if (mySerial.available())
  {
    Serial.print(F("Da gibt es...\t"));
    char myRead = mySerial.read();
    Serial.println(myRead, HEX);
    if (myRead == 0xFF)
    {
      startHeader = true;
    }
    if (startHeader)
    {
      data[i] = mySerial.read();
      Serial.print(data[i]);
      Serial.print("\t");
      i++;
      if (i > 2) // Hier war das edit
      {
        Serial.println();
        i = 0;
        Serial.print(F("Eingefangene Daten: "));
        for (; i < 2; i++)
        {
          Serial.print(data[i]);
          Serial.print("\t");
        }
        Serial.println();
        startHeader = false;
      }
    }
  }
}

Aber die Ausgabe bleibt wie im Post #30

Dann gibt es hier kein true:

  if (mySerial.available())

Da kommt nichts. Richtig rum angeklemmt?

1 Like

Richtig, nur warum?

Stecker sitzen alle richtig (Schwarz=GND, Rot=5V), TX und RX wurden auch schonmal testweise getauscht!

Geht der Sketch aus #27?
Wenn nein, ist was faul.
RX/TX vertauscht oder miserable Kontakte?

Habe jetzt mal den 2. Sensor genommen, dakommt diese Ausgabe mit dem Sketch aus dem Post #27:

Start...
Header erkannt!
4	204	

Allerdings nur 1x (beim einstecken der PIN), wenn ich den Arduino Resette kommt nur:

Start...

Woran kann das liegen?
Kann es sein, das ich die Falschen geliefert bekommen habe? Und nicht die UART Controlled Output, sondern die UART Auto Putput?

Also wenn etwas nicht so funktioniert wie man sich das erhofft
dann reduziert man das Programm auf das allerelementarste und programmiert debug-output der bei der kleinsten Regung schon etwas ausgibt.

Wenn das Programm dann den seriellen Monitor zuballert kann man sich ja anschauen was da ausgegeben wird und ausgehend von dieser Analyse den code so abändern das der serielle Monitor nicht mehr zugeballert wird.

Im übrigen wäre so ein Logic-Anaylser für schlappe 10 Euro eine gute Investition um über bessere Analysemöglichkeiten zu verfügen.

Dazu gibt es eine Software sigrok PulseView die das Bitbanging von einer Menge serieller Protokolle analysieren kann.
vgs

1 Like

Ich habe jetzt den Analyzer erhalten. Jetzt erstmal die Frage, wie muss das Geräte, also der Sensor korrekt angeschlossen werden?

  1. Rote Ader (5V) an CLK
  2. Schwarze Ader (GND) an GND
  3. Gelbe Ader (RX) an CH2
  4. Weiße Ader (TX) an CH1

Ist es soweit richtig? Oder wie muss ich vorgehen?

Hier mal das Datenblatt vom Sensor:
Datenblatt vom Sensor

  1. rote Ader (5V) an 5V. Da der Sensor laut Datenblatt nur 8 mA braucht kann man den Spannungsregler des Arduino mitbenutzen. Bei größeren Strömen sollte man lieber eine extra Spannungsquelle benutzen.

  2. schwarze Ader GND vom Logic-analyser und GND vom Arduino miteinander verbinden.

  3. Gelbe Ader (RX) parallel zu der bestehenden Verbindung zum Arduino an CH2

  4. Weiße Ader (TX) parallel zu der bestehenden Verbindung zum Arduino an CH1

Ob nun Rx oder Tx an CH1 oder CH2 des logic-analysers hängt ist völlig wurscht
man könnte auch CH3 und CH8 nehmen.

Dann würde der Signalverlauf in PulseView halt auf CH3 / CH8 angezeigt.

Dann startest du das Programm auf dem Arduino und startest die Aufzeichnung in PusleView und dann sieht man das bitbanging in PulseView.

vgs

Ich habe es jetzt genau so angeschlossen. Leider bekomme ich an den Channel nichts angezeigt...
Und nach kurzer Zeit erhalte ich ReadTimeout, als Programm nutze ich Logic 2. Muss ich da was bestimmtes Einstellen?

Zu der schwarzen Ader, GND muss doch am Logic-analyser, GND vom Sensor und an GND vom Arduino, oder?

Verwendet habe ich den Sketch vom #32