Laden...

Ultraschallsensor via Raspberry Pi mit C#

Erstellt von LaT3St vor 8 Jahren Letzter Beitrag vor 8 Jahren 3.036 Views
L
LaT3St Themenstarter:in
3 Beiträge seit 2015
vor 8 Jahren
Ultraschallsensor via Raspberry Pi mit C#

Hallo,

ich versuch nun schon eine ganze Weile einen Ultraschallsensor zur Abstandsmessung via C# zu nutzen. Die Aufgabe an das Programm ist, einen Pin für ca. 1ms auf "True" zu setzen und direkt dann wieder auf "False". An einem zweiten Pin erfolgt dann die Ausgabe des Sensors, zuerst schaltet der Sensor auf "True" und dann, nach einer bestimmten Zeit, wieder auf "False". Die Zeitspanne in der der Pin auf "True" stand ist mit ein wenig grundlegender Mathematik in die Entfernung umzurechnen ( siehe Kommentare im nachfolgenden Code).

Fertiges Python-Script

# setze Trigger auf HIGH
  GPIO.output(GPIO_TRIGGER, True)
 
  # setze Trigger nach 0.01ms aus LOW
  time.sleep(0.00001)
  GPIO.output(GPIO_TRIGGER, False)
 
  StartZeit = time.time()
  StopZeit = time.time()
 
  # speichere Startzeit
  while GPIO.input(GPIO_ECHO) == 0:
    StartZeit = time.time()
 
  # speichere Ankunftszeit
  while GPIO.input(GPIO_ECHO) == 1:
    StopZeit = time.time()
 
  # Zeit Differenz zwischen Start und Ankunft
  TimeElapsed = StopZeit - StartZeit
  # mit der Schallgeschwindigkeit (34300 cm/s) multiplizieren
  # und durch 2 teilen, da hin und zurueck
  distanz = (TimeElapsed * 34300) / 2

Das ganze gibt es bereits fertig in Python geschrieben, wenn ich das allerdings so in C# umsetze, gibts Probleme. Entweder, wenn ich dem Sensor zu nahe komme, hängt sich das Programm in der while-Schleife für die "endTime" auf. Außerdem hab ich Recht ungenaue Werte, die Umrechnung beinhaltet auch noch einen Fehler, aber das kann man ja vorerst mal ignorieren.

Mein Code

Trigger.Write (true);
                        Thread.Sleep (1);
                        Trigger.Write (false);
 
                        long startTime = 0, endTime = 0;
 
                        while (Echo.Read() == PinState.Low) {
                                startTime = DateTime.Now.Ticks;
                                Console.WriteLine("Echo down");
                        }
 
                        while (Echo.Read() == PinState.High) {
                                endTime = DateTime.Now.Ticks;
                                Console.WriteLine("Echo up");
                        }
 
                        Console.WriteLine ("TestTime: " + (endTime - startTime));
                        Distance = ((endTime - startTime) /10000 * 34300) / 2;

Mit freundlichen Grüßen
LaT3St

Hinweis von Abt vor 8 Jahren

Bitte in Zukunft [Hinweis] Wie poste ich richtig? "6. Code-Tags" und "6.1 Bilder als Dateianhang hochladen", was auch für Pastebin gilt, beachten.

16.827 Beiträge seit 2008
vor 8 Jahren

Wenn Dein Code stimmt dann gibts zwischen dem Sleep von 0.01ms in Python und Sleep von 1ms in C# halt nen ziemlichen Unterschied: Faktor 100.
Der Sleep in C# bzw. dessen tatsächliche Dauer ist aber vom Betriebssystem abhängig und ist zumindest unter Windows irgendwo zwischen 10 und 20ms (Faktor ~2000).
Wir sprechen also hier also aus Sicht des Faktors von einem riesigen Unterschied.

Vermutlich nimmt aber Python hier Sekunden an, wobei 0.00001 Sekunden halt nicht 1ms sondern 10µs sind - als 0.01ms; was dem Kommentar im Code entspricht und nicht der Beschreibung Deiner Anforderung.

Diese Auflösungsanforderung wirst Du so leider nicht ohne weiteres mit .NET umsetzen können.

L
LaT3St Themenstarter:in
3 Beiträge seit 2015
vor 8 Jahren

Ist mir auch ziemlich schnell klar geworden, hatte nur gehofft, dass das nicht allzuviel unterschied macht. Der Artikel in dem ich über den Ultraschallsensor gelesen habe, nannte zumindest die Möglichkeit ein durchgehendes Signal zu schicken.
Ich studiere nochmal das Datenblatt des Sensors, vielleicht finde ich eine Lösung.

P
1.090 Beiträge seit 2011
vor 8 Jahren

Hier schau mal hier: MSCodeplex:Professional MRDS, da sind einige Beispiele zur Roboter Programmierung zu finden. Ich denke das wird auch was mit einem Utraschallsensor dabei sein.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

P
64 Beiträge seit 2011
vor 8 Jahren

Hallo,

dürfen wir wissen, was das für ein Sensor ist, oder ist da ein Geheimnis?

L
LaT3St Themenstarter:in
3 Beiträge seit 2015
vor 8 Jahren

@Palin: Das sind ja hunderte .cs - Dateien, da brauch ich erstmal ne Weile für.
@panicJonny: So bissig? 🤔http://www.elecfreaks.com/244.html

T
708 Beiträge seit 2008
vor 8 Jahren

Was spricht denn dagegen den Wert seriell zu übertragen, wie es das Arduino-Beispiel auch gezeigt hat?
Also die Werte nicht als Zeitinterval, sondern als Text übertragen. Macht imho mehr Sinn und erlaubt Dir auch später noch mehr damit anzustellen.

Beispiele für den Serial Port gibt es hier im Forum massenweise. Für den RasPi funktioniert das auch einfach aus Python (z.B. so).