Fischertechnik Ultraschallsensor am Arduino auslesen

Alles rund um TX(T) und RoboPro, mit ft-Hard- und Software
Computing using original ft hard- and software
Forumsregeln
Bitte beachte die Forumsregeln!
Benutzeravatar
MasterOfGizmo
Beiträge: 2720
Registriert: 30 Nov 2014, 07:44

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von MasterOfGizmo » 16 Apr 2017, 14:29

Na wenn Du sich verändernde Werte hast bist Du doch echt nah dran. Dann kommen jetzt die üblichen verdächtigen wie andere Interrupt-Routinen oder Du triggerst nicht auf beide Flanken (dazu musst du m.E. im ISR die Polarität umschalten). Oder Du gibst die Werte während des Empfangs aus und verpasst die Hälfte, weil die Ausgabe natürlich mit 9600bit/s eeeeewig dauert .... aber der Uart sollte eigentlich am besten geeignet sein.
Arduino für fischertechnik: ftDuino http://ftduino.de, ftDuino32 http://ftduino.de/32

Benutzeravatar
ski7777
Beiträge: 870
Registriert: 22 Feb 2014, 14:18
Wohnort: Saarwellingen

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von ski7777 » 16 Apr 2017, 14:37

Wie sieht denn dein aktueller Schaltplan und das Skript aus? Vielleicht könnte ich so auch mal versuchen die richtigen Werte zu bekommen.

Raphael

davidrpf
Beiträge: 252
Registriert: 14 Jul 2015, 14:27
Kontaktdaten:

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 16 Apr 2017, 20:36

Hallo zusammen,

Ich denke den Grund gefunden zu haben, weshalb es die ISR unzuverlässige Werte anzeigt. Nick Gammon beschreibt auf seiner Website (http://gammon.com.au/interrupts), dass das bloße Starten und Beenden einer ISR auf einem 16Mhz Board etwas mehr als 5µs erfordert. Dazu kommt die Zeit des Zugriff auf die Long Variable micros, der nochmals mehrere Takte des Prozessors in Anspruch nimmt. Bei etwa 8,5µs pro Bit ist eine solche Ungenauigkeit fatal und die ISR disqualifiziert sich zur Auswertung. In der Vergangenheit hat auch die serielle Datenübertragung bei einer Baudrate von 115200 häufig Probleme bereitet.
Ich werde die Auswertung nochmals in Angriff nehmen, sobald ich ein schnelleres Board habe. Angesichts der Komplexität des ft Ultraschallsensors denke ich, dass man mit einem hc-sr04 bei Arduino Boards in einem 3d gedruckten Gehäuse besser bedient ist.

Trotzdem vielen Dank für eure Hilfe.

@ ski7777: Ich schicke eine PN

David
Polarkoordinaten Plotter https://youtu.be/u6XwKxZuxqk
Autofabrik: https://youtu.be/mX9JWcca6kQ

davidrpf
Beiträge: 252
Registriert: 14 Jul 2015, 14:27
Kontaktdaten:

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 20 Apr 2017, 14:29

Hallo zusammen,

nach etwas Probieren hat die Dekodierung des Sensor funktioniert!

Versuchsaufbau: Die 16 MHz Arduinos sind für 115200Baud zu langsam, nicht aber ihr UART / USB Wandler. Daher triggert ein Arduino den Sensor, ein zweiter Arduino gibt seine TX Datenleitung frei. Putty empfängt das UART Signal bei 115200 Baud 8n1, der OUTPUT sieht so aus (Anhang).
Interpretation des Output: Das Pixelwirrwarr ist für mich wertlos, es kommt auf die Buchstaben bzw. Zeichen an. Man kann sie in einer Unicodetabelle http://www.utf8-chartable.de/ nachschlagen, ihren HEX-Code in einen Dezimalwert umrechnen und siehe da, das Ergebnis gibt die Entfernung in cm an.

Edit: es gibt noch zwei Probleme:
1. Da die UTF8 Tabelle erst mit 0x20 beginnt, können kleinere Werte aus den Buchstaben nicht interpretiert werden (Abhilfe schafft ein HEX-Editor, das ist aber mehr Aufwand)
2. Selbiges gilt für den Zahlenbereich jenseits von 0x7e (größere Werte)

Konstruktive Grüße
David
Dateianhänge
Puttyausgabe
Puttyausgabe
Polarkoordinaten Plotter https://youtu.be/u6XwKxZuxqk
Autofabrik: https://youtu.be/mX9JWcca6kQ

Benutzeravatar
ski7777
Beiträge: 870
Registriert: 22 Feb 2014, 14:18
Wohnort: Saarwellingen

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von ski7777 » 20 Apr 2017, 15:09

Könntest du mal einige Werte vom UART Wandler mit dem Maß in cm hier posten?

Raphael

davidrpf
Beiträge: 252
Registriert: 14 Jul 2015, 14:27
Kontaktdaten:

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 20 Apr 2017, 15:27

ski7777 hat geschrieben:Könntest du mal einige Werte vom UART Wandler mit dem Maß in cm hier posten?
Du musst nur den Putty-Screenshot anschauen. Die Buchstaben kannst du in einer UTF8 Tabelle nachschlagen, der HEX-Wert in Dezimal umgerechnet entspricht der Entfernung in cm. Die Genauigkeit unterscheidet sich nicht zu TX(T) Messungen

David
Polarkoordinaten Plotter https://youtu.be/u6XwKxZuxqk
Autofabrik: https://youtu.be/mX9JWcca6kQ

Benutzeravatar
ski7777
Beiträge: 870
Registriert: 22 Feb 2014, 14:18
Wohnort: Saarwellingen

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von ski7777 » 20 Apr 2017, 15:28

Ich brauche aber immer zwei Bytes

davidrpf
Beiträge: 252
Registriert: 14 Jul 2015, 14:27
Kontaktdaten:

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 20 Apr 2017, 15:54

Okay, hier ist ein Screenshot aus dem HEX Editor

David
Dateianhänge
Hex-werte
Hex-werte
Polarkoordinaten Plotter https://youtu.be/u6XwKxZuxqk
Autofabrik: https://youtu.be/mX9JWcca6kQ

Benutzeravatar
MasterOfGizmo
Beiträge: 2720
Registriert: 30 Nov 2014, 07:44

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von MasterOfGizmo » 20 Apr 2017, 17:58

Der UART des Arduino sollte mit 115200 bit/s halbwegs klarkommen. Bei der Datenrate liegt er zwar wegen seines 16Mhz-Quarzes ein paar Prozent daneben, aber das sollte nicht dazu führen, dass Du gar nichts empfängst.
Arduino für fischertechnik: ftDuino http://ftduino.de, ftDuino32 http://ftduino.de/32

Benutzeravatar
H.A.R.R.Y.
Beiträge: 1083
Registriert: 01 Okt 2012, 08:38
Wohnort: Westpfalz

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von H.A.R.R.Y. » 21 Apr 2017, 08:36

Hallo zusammen,

ich lese hier ja schon ein Weilchen mit. Euer Problem mit der einen Leitung verstehe ich nicht ganz. Auch nicht warum ein zweiter Arduino her muß. Mein Vorschlag (wenn der Arduino die Ressourcen her gibt, ich nehme für sowas gerne den "nackten" AVR):
Die Datenleitung zum/vom US-Sensor an den RXD des AVR anhängen. Hardware UART aktivieren und notfalls den Quarz austauschen um die 115200 hinzubekommen (da gibt es im Datenblatt jedes AVR so eine Tabelle).
Eine zweite Leitung irgendeines Ports wird mit dieser RXD-Leitung verbunden. Im Datenrichtungsregister des Ports schreibt man eine '0' an die entsprechende Stelle und im Datenregister eine '1' (Reihenfolge ist wichtig). So ist die Leitung als 'Pullup' konfiguriert. Zum Start der Messung schreibt man in dann eine '0' ins Datenregister und eine '1' ins Datenrichtungsregister. Jetzt zieht er runter. Nach einer kurzen Zeit schaltet man auf 'Pullup' zurück. Da ich meist keine Lust auf die Hantiererei an Datenregister plus Datenrichtungsregister habe, spendiere ich einen externen Pullup-Widerstand. Im Datenregister steht fix '0' auf dem entsprechenden Bit und die Schalterei (auf GND ziehen / hochohmig) erledige ich ausschließlich im Datenrichtungsregister. Diese Lösung geht eigentlich immer.

Eventuell ist es beim AVR im Arduino auch möglich den Port an den auch der RXD des UART geht per Software zu schalten wenn der UART aktiviert ist. Extern den Widerstand dran und der Rest s.o.

Für die AVRs gibt es auch libs mit denen man Variablenwerte (also deren Bitmuster) wunderschön in Klarschrift ans Terminal schicken kann. Nehmt ihr C? WinAVR?

Gruß
H.A.R.R.Y.
[42] SURVIVE - or die trying

davidrpf
Beiträge: 252
Registriert: 14 Jul 2015, 14:27
Kontaktdaten:

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 21 Apr 2017, 12:16

H.A.R.R.Y. hat geschrieben:Auch nicht warum ein zweiter Arduino her muß.
Du hast recht, der zweite Arduino ist wirklich nicht nötig. Mein Ansatz war eben, den UART auf USB Wandler des Arduinos zu benutzen, mit Putty den Sensor auszulesen. Und dann hab ich nachträglich mit einem anderen Arduino den Sensor auf 0 V geschalten, um den Versuchsaufbau nicht zu verändern müssen. Das kann ich aber auch mit einem Arduino umsetzen.

Gruß, David
Polarkoordinaten Plotter https://youtu.be/u6XwKxZuxqk
Autofabrik: https://youtu.be/mX9JWcca6kQ

Benutzeravatar
H.A.R.R.Y.
Beiträge: 1083
Registriert: 01 Okt 2012, 08:38
Wohnort: Westpfalz

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von H.A.R.R.Y. » 21 Apr 2017, 12:33

Ach so!
Du hast den USB-2-RS232-TTL (einzeln heißt sowas RS232-Dongle) vom Arduino "ausgeliehen" und der Sensor schickt direkt zum USB. Ah, jetzt ja. Dann nutzen irgendwelche AVR-libs à la printf("%n",variable) natürlich nix.

Was für ein AVR sitzt auf dem Arduino? Einer der eventuell 2 UARTs an Bord hat?
Oder Du koppelst zwei Arduinos per SPI. Einer unterhält sich mit dem Sensor und schiebt die Daten rüber, der andere unterhält sich mit dem PC und konvertiert die Daten in Klarschrift bevor er sie auf die Reise schickt. Dann wird das mit dem Sensor auslesen per PuTTy auch angenehmer. Nur falls das noch interessant ist. An sich ist die Frage nach dem "Wie" ja schon von euch geklärt worden.

Gruß
H.A.R.R.Y.
[42] SURVIVE - or die trying

Benutzeravatar
MasterOfGizmo
Beiträge: 2720
Registriert: 30 Nov 2014, 07:44

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von MasterOfGizmo » 21 Apr 2017, 16:04

H.A.R.R.Y. hat geschrieben:USB-2-RS232-TTL (einzeln heißt sowas RS232-Dongle)
RS232 _oder_ TTL. Genau das sollte man nicht verwechseln. RS232 bedeutet +/-12V. Wenn man das an den FT-Sensor anschließt macht man ihn ggf kaputt.
Arduino für fischertechnik: ftDuino http://ftduino.de, ftDuino32 http://ftduino.de/32

Benutzeravatar
H.A.R.R.Y.
Beiträge: 1083
Registriert: 01 Okt 2012, 08:38
Wohnort: Westpfalz

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von H.A.R.R.Y. » 21 Apr 2017, 20:58

MasterOfGizmo hat geschrieben:RS232 _oder_ TTL. Genau das sollte man nicht verwechseln. RS232 bedeutet +/-12V. Wenn man das an den FT-Sensor anschließt macht man ihn ggf kaputt.
Grundsätzlich und uneingeschränkt richtig. Und außerdem sind die Pegel dann obendrein auch noch invertiert! '1' = -12V und '0' = +12V. Selbst wenn der µC die Mißhandlung überlebt wird das nicht funktionieren.

Nur ist mittlerweile im 'Neusprech' auch die Bezeichnung "RS232-TTL" eingebürgert. Soll auf die Art andeuten, daß es sich um die serielle Schnittstelle aber mit Logikpegeln anstelle den +/-12V handelt. Bei UART denke ich immer sofort an die Hardware-Baugruppe der AVRs.

Gruß
H.A.R.R.Y.
[42] SURVIVE - or die trying

Benutzeravatar
ski7777
Beiträge: 870
Registriert: 22 Feb 2014, 14:18
Wohnort: Saarwellingen

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von ski7777 » 10 Mai 2017, 21:25

Könntest du mal Werte von 4m bis 1cm posten? Also die Maximalwerte und einige dazwischen (am Besten mit grober Angabe in cm). Vielleicht lässt sich ja ein Zusammenhang feststellen.

davidrpf
Beiträge: 252
Registriert: 14 Jul 2015, 14:27
Kontaktdaten:

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 11 Mai 2017, 18:05

ski7777 hat geschrieben:Könntest du mal Werte von 4m bis 1cm posten? Also die Maximalwerte und einige dazwischen (am Besten mit grober Angabe in cm). Vielleicht lässt sich ja ein Zusammenhang feststellen.
Ich habe im Moment keinen geeigneten Versuchsaufbau, um die Messreihe zu starten. Ich werde die Werte posten, sobald ich sie mit einem schnelleren Arduino nochmals ausgelesen habe.

Gruß
David
Polarkoordinaten Plotter https://youtu.be/u6XwKxZuxqk
Autofabrik: https://youtu.be/mX9JWcca6kQ

davidrpf
Beiträge: 252
Registriert: 14 Jul 2015, 14:27
Kontaktdaten:

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 02 Aug 2017, 13:55

Hallo zusammen,

mir ist es heute gelungen, den ft-Ultraschallsensor (TX(T) Controller Variante) an einem anderen (?) Arduino UNO auszulesen (ebenfalls 16 MHz!). Offensichtlich scheint die Geschwindigkeit doch ausreichend zu sein.

Hier ist das Beispielprogramm

Code: Alles auswählen

void setup() {
  Serial.begin(115200);
}

int messen()
{
  // Variablen anlegen
  int abstand = 0;
  byte number = 0;

  do {
    // Messung ausloesen
    pinMode(8, OUTPUT);
    digitalWrite(8, LOW);
    delay(10);
    pinMode(8, INPUT);

    // 3 Byte entgegennehmen
    for (int i = 0; i < 3; i++)
    {
      if (Serial.available()) {
        number = Serial.read();

        // Wenn das erste Byte '0' ist, ist die Messung ungueltig
        if (number == 0 && i == 0)
        {
          abstand = -1;
          break;
        }

        // (Byte2-128) * 128^1 ergibt den ersten Teil des Abstands
        if (i == 0)
        {
          abstand = (number - 128) * 128;
        }
        // Byte3 * 128^0 ergib den zweiten Teil des Abstands
        // Beide Teile ergeben addiert den Gesamtabstand
        else
        {
          abstand += number;
        }
      }
    }
    delay(1);
  } while (abstand < 0); // miss solange bis eine Messung gueltig ist
  return abstand;
}

void loop() {
  Serial.println(messen());
  delay(100);
}
Die Genauigkeit des Sensor ist sehr gut, die gemessenen Werte weichen auf einem Meter Entfernung um nicht mehr als einen cm ab.

Jetzt noch ein paar Erläuterungen zum Programm:
1. Der Sensor wird an den RX Pin des Arduino angeschlossen. Es besteht das Problem, dass man den Sensor zum Uploaden eines Programms immer kurz vom Arduino trennen muss. Abhilfe könnte der Arduino Mega schaffen, bei dem man den Sensor mit Serial1 / Serial2 verbinden könnte.
2. Wie bereits oben erwähnt muss der Sensor aktiviert werden. Ein anderer Pin (in meinem Fall Pin 8) zieht das Potential dazu kurz auf 0:

Code: Alles auswählen

// Messung ausloesen
    pinMode(8, OUTPUT);
    digitalWrite(8, LOW);
    delay(10);
    pinMode(8, INPUT);
3. Der Sensor beantwortet nur etwa jede zweite Anfrage. Daher erzwingt das Unterprogramm eine gültige Messung:

Code: Alles auswählen

do {
    // Messung ausloesen
   ...
  } while (abstand < 0); // miss solange bis eine Messung gueltig ist
Eine ungültige Messung erkennt man daran, dass der Sensor einmal '0' sendet und dann abbricht
4. Bei einer erfolgreichen Messung antwortet der Sensor mit 3 Byte
Betrachtet man die Werte dezimal, ergibt sich folgender Wertebereich:
Byte 1: 128 - 135
Byte 2: 0 - 127
Byte 3: 0
Der Abstand berechnet sich über folgende Formel: (Byte1 - 128) * 128^1 + Byte2 * 128^0. Die Formel gibt den Abstand in cm an
5. Der größtmögliche Wert wäre 135-127-0, also 1023cm. Tatsächlich reicht der Messbereich laut ft nur bis 4m. Folglich ist 135-127-0 eher als eine Art Fehlercode zu betrachten. Der Messbereich von ca 4 cm bis 2,5m wird jedoch zuverlässig erfasst.

Gruß,
David
Polarkoordinaten Plotter https://youtu.be/u6XwKxZuxqk
Autofabrik: https://youtu.be/mX9JWcca6kQ

Benutzeravatar
Dirk Fox
ft:pedia-Herausgeber
Beiträge: 1831
Registriert: 01 Nov 2010, 00:49
Wohnort: Karlsruhe
Kontaktdaten:

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von Dirk Fox » 02 Aug 2017, 18:18

Hallo David,
davidrpf hat geschrieben:1. Der Sensor wird an den RX Pin des Arduino angeschlossen. Es besteht das Problem, dass man den Sensor zum Uploaden eines Programms immer kurz vom Arduino trennen muss. Abhilfe könnte der Arduino Mega schaffen, bei dem man den Sensor mit Serial1 / Serial2 verbinden könnte.
warum verwendest Du nicht die SoftSerial-Bibliothek?
Ansonsten: Hervorragendes "Reverse Engineering", das Ihr da geleistet habt!

Edit: Wahrscheinlich klappt das nicht, weil SoftSerial die serielle Hardware-Schnittstelle lediglich "umbiegt", oder?

Beste Grüße,
Dirk

davidrpf
Beiträge: 252
Registriert: 14 Jul 2015, 14:27
Kontaktdaten:

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 02 Aug 2017, 22:07

Hallo Dirk,
Dirk Fox hat geschrieben: warum verwendest Du nicht die SoftSerial-Bibliothek?
Ich hatte SoftwareSerial überhaupt nicht auf dem Schirm, als ich am Aufbau der Schaltung getüfftelt habe, werde es aber einmal ausprobieren.
Dirk Fox hat geschrieben: Edit: Wahrscheinlich klappt das nicht, weil SoftSerial die serielle Hardware-Schnittstelle "umbiegt", oder?
Hmm, könnte sein. Ich habe aber eher wegen der Geschwindigkeit auf den 16Mhz Boards Bedenken: In der Beschreibung der Library https://www.arduino.cc/en/Reference/SoftwareSerial wird angedeutet, dass externe change-Interrupts zum Simulieren der Schnittstelle (RX) benötigt werden. Bei früheren Messungen (siehe oben) hat die Ausführung der ISR aber derart "viel" Zeit in Anspruch genommen, dass eine valide Zeitmessung bei baudrate=115200 nicht mehr möglich war.

Gruß,
David
Polarkoordinaten Plotter https://youtu.be/u6XwKxZuxqk
Autofabrik: https://youtu.be/mX9JWcca6kQ

davidrpf
Beiträge: 252
Registriert: 14 Jul 2015, 14:27
Kontaktdaten:

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 03 Aug 2017, 11:16

Nachtrag: Weder mit SoftwareSerial noch mit Serial1 oder Serial2 des Arduino Mega kann man den Sensor auslesen. Grund: Die 16MHz Boards sind zu langsam und die Fehlerquote beim Empfangen viel zu hoch. Es bleibt also nichts anderes übrig, als Pin 0 (Arduino UNO / Mega) oder einen schnelleren Controller zu nutzen.
Polarkoordinaten Plotter https://youtu.be/u6XwKxZuxqk
Autofabrik: https://youtu.be/mX9JWcca6kQ

Antworten