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 » 04 Aug 2017, 13:57

davidrpf hat geschrieben: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.
Die vier USARTs eines Atmega2560 sind aber identisch. Es gibt daher m.E. keinen technischen Grund, warum es mit Serial0 geht, aber nicht mit Serial1, Serial2 oder Serial3. Wenn die 16Mhz ein Problem wären müssten sie das für alle vier USARTs sein. Es gibt auf dem Arduino aber technische Unterschiede. Z.B. ist am Serial0 der USB->Seriell-Treiber per 1k-Widerstand angeschlossen. Der wirkt wenn Du Serial0 an Pin0 ansteuerst als Pullup. Hast Du mal nachgemessen? Vielleicht fehlt Dir an Serial1 ja nur dieser Pull-Up.
Arduino für fischertechnik: ftDuino http://ftduino.de, ftDuino32 http://ftduino.de/32

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

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 04 Aug 2017, 20:45

MasterOfGizmo hat geschrieben:Es gibt auf dem Arduino aber technische Unterschiede. Z.B. ist am Serial0 der USB->Seriell-Treiber per 1k-Widerstand angeschlossen. Der wirkt wenn Du Serial0 an Pin0 ansteuerst als Pullup. Hast Du mal nachgemessen? Vielleicht fehlt Dir an Serial1 ja nur dieser Pull-Up.
Der fehlende Pull-Up war der entscheidende Hinweis. Es genügt, diesen per pinMode(RX, INPUT_PULLUP) zu aktivieren und die Messung funktioniert auch an Serial2.
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 » 07 Sep 2017, 10:04

davidrpf hat geschrieben: 4. Bei einer erfolgreichen Messung antwortet der Sensor mit 3 Byte
Nee, der sendet zwei Bytes. Das erste Byte sendest Du Dir quasi selbst, weil Du ja zum Triggern des Sensors den Eingang einmal kurz selbst auf Masse ziehst. Der Sensor anwortet darauf mit zwei Bytes.

Ich schalte während des Trigger-Signals am ftduino einfach den USART aus. Dann empfange ich das Byte nicht.

Zwei Sachen sind mir noch nicht ganz klar:
1. Der Sensor reagiert nur auf exakt jeden zweiten Trigger mit einer Antwort. "unbeantwortete" Trigger habe ich im Trace am TXT auch gesehen, von daher liegt es wohl nicht an meinem Setup
2. Wann das oberste Bit der beiden Datenbytes gesetzt ist oder nicht ist unklar. Korrekte Werte kommen anscheinend unabhängig davon. Eine Art Parität oder ähnlich scheint es auch nicht zu sein.

Aber auch ohne diese Antworten zu kennen kann man die Werte gut auslesen.
Arduino für fischertechnik: ftDuino http://ftduino.de, ftDuino32 http://ftduino.de/32

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

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 07 Sep 2017, 11:23

MasterOfGizmo hat geschrieben: Nee, der sendet zwei Bytes. Das erste Byte sendest Du Dir quasi selbst, weil Du ja zum Triggern des Sensors den Eingang einmal kurz selbst auf Masse ziehst. Der Sensor anwortet darauf mit zwei Bytes.
davidrpf hat geschrieben: 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
In meiner Messung enthalten die ersten beiden Bytes die Informationen zum Abstand und das dritte Byte ist immer 0. Da das zuletzt empfangene Byte kann doch somit nicht aufgrund des Auslösens der Messung 0 betragen, oder denke ich da falsch?
MasterOfGizmo hat geschrieben: Der Sensor reagiert nur auf exakt jeden zweiten Trigger mit einer Antwort. "unbeantwortete" Trigger habe ich im Trace am TXT auch gesehen, von daher liegt es wohl nicht an meinem Setup
Offensichtlich muss es am Sensor liegen, die unbeantworteten Trigger hat auch Ad2 am TX Controller beschrieben: viewtopic.php?f=8&t=2191&p=13729
Ad2 hat geschrieben: When the sensor replies, which it not always does, it replies after approx. 100us with two bytes, the first byte always has
its MSB set while the second byte always has its MSB clear. The 7 LSB of the second byte (as LSBs)
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 » 07 Sep 2017, 11:51

davidrpf hat geschrieben:
MasterOfGizmo hat geschrieben: In meiner Messung enthalten die ersten beiden Bytes die Informationen zum Abstand und das dritte Byte ist immer 0.
Ich bekomme immer im ersten Byte die 0. Ich gehe direkt über die AVR-Hardware ohne Arduino-Bibliotheken dazwischen und kann daher genau sehen, zu welcher Zeit welches Byte empfangen wurde. Ich nehme an, dass Du die Arduino-Serial-Routinen nimmst. Die sind m.E. IRQ-basiert und empfangen daher im Hintergrund und implementieren einen eigenen Empfangspuffer etc. Da dürfte es schwierig sein, genau zu sagen, was wann empfangen wurde.

Ich bin mir sicher, dass das 0-Byte der Trigger ist. Wenn ich den Empfänger während des Triggers abschalte ist das Byte nicht mehr dabei.
Arduino für fischertechnik: ftDuino http://ftduino.de, ftDuino32 http://ftduino.de/32

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

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von MasterOfGizmo » 07 Sep 2017, 12:05

davidrpf hat geschrieben: ... two bytes, the first byte always has its MSB set while the second byte always has its MSB clear. The 7 LSB of the second byte (as LSBs)
Das ist bei mir längst nicht immer so. Das MSB des ersten Bytes ist oft, aber längst nicht immer gesetzt und das des zweiten Bytes auch manchmal. Ich würde eher annehmen, dass das irgendein Status ist, den der Sensor da schickt.
Arduino für fischertechnik: ftDuino http://ftduino.de, ftDuino32 http://ftduino.de/32

xbach
Beiträge: 16
Registriert: 10 Dez 2011, 12:24

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von xbach » 07 Sep 2017, 12:26

Hallo,
mein Sensor zeigt bei einer gültigen! Antwort, das beschriebene Verhalten.
Also Byte1: 128 Byte2: 3-127. Eine Kontrolle mit dem Oszi bestätigt das
Ergebnis.
Allerdings schätze ich, dass nur jeder dritte Wert brauchbar ist. Der ist aber
am 1. Byte erkennbar.

LG Xbach

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

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 07 Sep 2017, 13:36

MasterOfGizmo hat geschrieben:Ich nehme an, dass Du die Arduino-Serial-Routinen nimmst. Die sind m.E. IRQ-basiert und empfangen daher im Hintergrund und implementieren einen eigenen Empfangspuffer etc. Da dürfte es schwierig sein, genau zu sagen, was wann empfangen wurde.

Ich bin mir sicher, dass das 0-Byte der Trigger ist. Wenn ich den Empfänger während des Triggers abschalte ist das Byte nicht mehr dabei.
Ja, ich verwende die Serial Routinen, die in der Arduino IDE bereitgestellt werden. Dies könnte die Abweichung erklären.
MasterOfGizmo hat geschrieben:Der Sensor reagiert nur auf exakt jeden zweiten Trigger mit einer Antwort
Dieses Verhalten konnte ich so 1:1 reproduzieren. Ich habe 400 Messungen ausgelöst. Dabei blieben 200 unbeantwortet und 200 wurden mit dem korrekten Abstandswert beantwortet (jeweils genau abwechselnd). Die Fehlerquote bei dieser Stichprobe liegt somit bei 0 % unter der Voraussetzung, dass man unbeantwortete Messungen ignoriert.

Außerdem ist mir aufgefallen, dass es bei Verwendung der Arduino Routinen eine Rolle spielt, ob man das Byte mit dem Wert 0 ausliest oder nicht. Ich empfehle, das Byte mit Serial.read() zu lesen und dann zu ignorieren, da man so mehr brauchbare Messungen erhält und das oben beschriebene Verhalten reproduzieren kann. Der Grund hierfür liegt wahrscheinlich darin, wie der Arduino den Pufferspeicher verwaltet.
MasterOfGizmo hat geschrieben:Aber auch ohne diese Antworten zu kennen kann man die Werte gut auslesen.
Genau: Letztlich ist entscheidend, dass man den Sensor überhaupt nutzen kann. Ich halte die Arduino Routinen trotz ihrer intransparenten Implementierung auf Lange Zeit für am besten geeignet, da auf diese Weise auch weniger erfahrene Nutzer schnell eine Messung vornehmen können.

Gruß,
David
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 » 07 Sep 2017, 20:57

xbach hat geschrieben: Allerdings schätze ich, dass nur jeder dritte Wert brauchbar ist. Der ist aber
am 1. Byte erkennbar.
Genau das meine ich: Alle Werte sind brauchbar, wenn man das obere Bit ignoriert. Ich habe noch keinen einzigen "schlechten" Messwert erhalten. Von daher glaube ich eigentlich nicht, dass das obere Bit irgendwas mit "schlecht" zu tun hat. Ca. 50% aller Messwerte haben im ersten Byte das obere Bite gesetzt. Beim zwieten Bytes ist das obere Bit von den Daten abhängig und es ist tendenziell mit dem 6ten Bit zusammen gesetzt.
Arduino für fischertechnik: ftDuino http://ftduino.de, ftDuino32 http://ftduino.de/32

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

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von MasterOfGizmo » 07 Sep 2017, 21:06

davidrpf hat geschrieben:Ich halte die Arduino Routinen trotz ihrer intransparenten Implementierung auf Lange Zeit für am besten geeignet, da auf diese Weise auch weniger erfahrene Nutzer schnell eine Messung vornehmen können.
Da der unerfahrende Nutzer eh eine fertige Routine nehmen wird dürfte es ihm egal sein, ob die innendrin Arduino-Kram nimmt oder direkt auf dem AVR aufsetzt. Am Ende soll das halt alles elegant mit der AD-Wandler-Auswertung der Eingänge, der PWM-Erzeugung für die acht Motorausgänge und der Abfrage der schnellen Zähler harmonieren. Da hilft es sehr, wenn das Verhalten jeder einzelnen Routine verstanden und vorhersehbar ist. Am Ende landet das alles in einer eigenen Bibliothek und dann sieht der unerfahrene Nutzer da nichts mehr von. Der schreibt dann nur noch
distanz = ftduino.ultrasonic_get_distance()
und was da drinnen steckt sieht er nicht.

Aber Du hast Recht, wenn der unerfahrene Nutzer den Code selbst anpassen will und soll, dann ist das Arduino-Framework prima. Genau das ist ja dessen Stärke.

Den ftduino-II wird es übrigens auf der Maker-Faire Bensheim zu sehen geben.
Arduino für fischertechnik: ftDuino http://ftduino.de, ftDuino32 http://ftduino.de/32

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

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von MasterOfGizmo » 12 Sep 2017, 13:39

Auf der Maker-Faire am WE habe ich den FTduino mit ft-Ultraschallsensor und einer kleinen Demo-App dabei. Läuft jetzt parallel mit den ganzen Ein- und Ausgängen im Hintergrund und das eigentliche Vordergrundprogramm holt sich nur noch fertige Messwerte ab,

Edit: Mit einem kleinen OLED-Display am I2C kann man dann prima Distanzen anzeigen:
ftduino_us.jpg
Zuletzt geändert von MasterOfGizmo am 13 Sep 2017, 13:26, insgesamt 1-mal geändert.
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 » 12 Sep 2017, 14:12

Cool :D Das muss ich mir am Samstag mal genau angucken. Wenn die I/Os ausreichend abgesichert sind, wäre das richtig cool.

Raphael

Dusty
Beiträge: 3
Registriert: 29 Dez 2019, 00:40

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von Dusty » 29 Dez 2019, 01:24

davidrpf hat geschrieben:
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
---
Hallo David,

leider gelingt es mir nicht, mit meinem übriggebliebenen ft-Ultraschallsensor (3-polig) dein Beispiel erfolgreich nachzuvollziehen. :cry:
Mein Aufbau: Sensor-Rot/-Schwarz an 5V/GND, Sensor-Grün an Uno Pin 0 (RX).
Code ist wie aus deinem Beitrag, einziger Zusatz ist in setup() die Zeile

Code: Alles auswählen

pinMode(0, INPUT_PULLUP); // 0 = RX-Pin, richtig?
gemäss deines späteren Nachtrages.

Der SerialMonitor gibt permanent 0 aus; einzige Ausnahme ist das temporäre Trennen von Pin 0, beim Wiederverbinden wird jeweils einmal ein wert um 16000 ausgegeben (15872, 16128, 16256 u.ä.). Danach wieder gleichmässig 0.
Wenn ich die vorangegangene Diskussion richtig deute dann müsste der Sensor beim Aktivieren der Messung ein Geräusch/Knacken von sich geben? Sowas höre ich hier jedenfalls gar nicht.

Was kann ich falsch gemacht haben?

Auf der Suche nach Erleuchtung habe ich mir auch schon die ftduino.h von MasterOfGizmo angesehen, aber die nachzuvollziehen übersteigt meine Fähigkeiten bei weitem. :roll:

Danke,
Dusty

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

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 29 Dez 2019, 09:55

Hallo Dusty,

ich habe soeben mal meinen damaligen Sourcecode auf Github geladen, dort kannst du das Beispielprogramm ansehen: https://github.com/dmholtz/ft-ultrasonic

In dem Beispiel fehlt es leider etwas an Dokumentation. Ich habe sowohl den Trigger-Pin, als auch den C3 Pin mit dem schwarzen Kabel des Sensors verbunden. Mit der verwendeten Library konnte ich dies damals nicht mit einem Pin umsetzen, sofern ich mich richtig erinnere. Rot und grün gehören zu plus 5V respektive GND am Arduino.

Ob man ein Knacken hört, hängt generell eher davon ab, wie gut man (noch) hört. Wenn du den Sensor also auch an einem TXT oder TX nicht knacken hörst, mach dir keine Sorgen, er funktioniert wahrscheinlich trotzdem.

Leider kann ich den Versuch derzeit nicht reproduzieren. Vor einem Jahr aber hatte es mit diesem Beispiel funktioniert. Lass mich gerne wissen, ob der Code auch auf deinem Arduino läuft.

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

Dusty
Beiträge: 3
Registriert: 29 Dez 2019, 00:40

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von Dusty » 29 Dez 2019, 17:43

Danke für die schnelle Antwort und das Bereitstellen des Codes!
Die Pin-Bezeichnungen C3 und I6 kann ich allerdings nicht zuordnen, stammen die aus der im Code referenzierten MicroArduino.h? Letztere ist ja anscheinend keine Standard-Library.
Welche Pin-Entsprechung hat das auf einem Standard-UNO?

Bzgl. Grün-Rot-Schwarz ist es offenbar zu lange her, dass ich was mit ft gemacht habe, so dass ich die spezifische "Farbenlehre" vergessen hatte. :shock: Bei genauerer Inspektion der Sensor-Platine ist am "grünen" Lötpad sogar sowas wie ein Minus-Zeichen zu erkennen.
Auf die Funktionsfähigkeit meines bisherigen Versuchsaufbau hat die korrekte Polung aber leider keine Auswirkung.

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

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von davidrpf » 29 Dez 2019, 20:05

Stimmt, ich hatte übersehen, dass der Code schon meine Hardwareabstrahierung aus der MicroArduino.h Datei einbezieht. Die Bibliothek ist zwar auch schon seit längerem auf Github (https://github.com/dmholtz/MicroArduino), jetzt wird es aber kniffelig, da du ein anderes Board verwendest.

Ich verwende einen Arduino Micro, aus dem ich einen fischertechnik kompatiblen Controller gebastelt habe.
I6 ist bei mir ein Universaleingang und auf jedem normalen Arduino Board ein beliebiger I/O Pin. C3 ist bei meinem Controller ein Zähleingang, das Pinmapping verweist jedoch auf Pin 0 des Arduino Micro. Dieser Pin unterstützt eine serielle Schnittstelle (genauer gesagt Serial1)

Das Problem ist nun das folgende: Du kannst das ganze mit deinem UNO zunächst mal genauso verdrahten wie ich, also I6 ist irgendein Pin (z.B. Pin 7) und C3 wäre dann Pin 0. Allerdings bietet der Arduino UNO nur einen serielle Schnittstelle an. Wenn du also Pin 0 nimmst, dann kannst du den Arduino nicht mehr über Serial.println() mit dem Rechner sprechen lassen.

Mein Code kann also für einen Arduino UNO nicht kompilieren und auch nicht ohne weiteres angepasst werden. Was du also machen musst, ist folgendes:
1) SoftwareSerial Bibliothek importieren
2) Statt Pin 0 einen anderen I/O Pin nehmen.
3) Dort, wo bei mir Serial1 steht, das entsprechende Objekt vom Typ SoftwareSerial einsetzen. Und damit sind wir wieder bei der obigen Diskussion ob das funktioniert.

Wenn du auf das Serial.println() verzichten kannst, dann kannst du die obigen Schritte überspringen und einfach alle Serial.print aus dem Sourcecode entfernen. Serial1 muss dann noch zu Serial ersetzt werden und der Code sollte kompilieren. Als Anzeige bräuchtest du allerdings ne Alternative, z.B. LEDs oder irgendwas mit i2c.

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

Dusty
Beiträge: 3
Registriert: 29 Dez 2019, 00:40

Re: Fischertechnik Ultraschallsensor am Arduino auslesen

Beitrag von Dusty » 29 Dez 2019, 21:06

Jetzt lichtet sich der Nebel etwas, danke!
Einen Micro habe ich gerade geordert, inzwischen versuche ich es mal mit der SoftSerial-Variante oder dem externen Display.

Im neuen Jahr kann ich hoffentlich Erfolg vermelden, ich wünsche schonmal einen guten Rutsch!

Gruss,
Dusty

Antworten