Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Kostengünstige Ultraschall - Entfernungsmessung
pinsel120866
06.01.2013, 13:07
Hallo,
ich habe mir ein sehr billiges SRF04 aus Fernost (http://www.ebay.at/itm/251166201075?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649) bestellt und am GPIO des RPi angehängt:
- Trigger an GPIO 14 (Pin8)
- Echo an GPIO 15 (Pin 10)
- GND an GND (Pin 6)
- VCC an 3,3V (Pin 1)
Ausgelegt ist das Modul für eine Spannungsversorgung von 5 Volt, hier ist allerdings zu beachten dass die GPIO Pins am Eingang nur 3,3 Volt aushalten. Also habe ich kurzerhand 3,3 Volt probiert und siehe da, es funktioniert genauso. Allerdings gibt es eine Einschränkung: Aufgrund der geringen Spannung misst das SRF04 nur Entferungen bis ca. 50 cm!
Das Python Programm dazu:
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO_TRIGGER = 14
GPIO_ECHO = 15
adjustment = 7
print "Ultrasonic Messung mit SRF04"
while True:
GPIO.setup(GPIO_TRIGGER,GPIO.OUT) # Trigger
GPIO.setup(GPIO_ECHO,GPIO.IN) # Echo
GPIO.output(GPIO_TRIGGER, False)
time.sleep(0.5)
GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
start = time.time()
GPIO.output(GPIO_TRIGGER, False)
while GPIO.input(GPIO_ECHO)==0:
stop = time.time()
while GPIO.input(GPIO_ECHO)==1:
stop = time.time()
elapsed = stop-start
distance = elapsed * 34300
distance = distance / 2
distance = distance - adjustment
print "Distance : %.1f cm" % distance
time.sleep(1)
GPIO.cleanup()
Ein Video dazu gibt es hier: http://www.youtube.com/watch?v=0ALpTiyItzQ
oberallgeier
06.01.2013, 14:00
... sehr billiges SRF04 aus Fernost bestellt und am GPIO des RPi angehängt ... es funktioniert ... Hi,
Glückwunsch und Respekt. Ich bewundere ja Alle, die so etwas mit dem Himbeerkuchen hinkriegen, weil sie mit dem ja wirklich etwas anfangen können. Ich kam bei meinem grad mal bis zur GUI - vermutlich weil ich nie wirklich in Linux reinkam.
Billig ist das Teil ja, aber ich will immer noch nicht auf die Liste von PayPal - schon wieder so ein "inmeineTascheGucker". Aber die haben sich so breit gemacht, da gibts leider garnicht mehr die Variante, so ewas per Karte zu bezahlen. Ausserdem steht auf meiner Wunschliste ja ein Teil, bei dem Sendeteil und Empfangsmodul getrennt angesteuert und ausgewertet werden können. Ich will damit einen Transponder bauen.
Hey,
sieht ja klasse aus :)
Wobei es mich ja echt interessiert wie man was für 2,60€ aus China bei Ebay anbieten kann ohne Versand zu verlangen.
Kannst du die Zeile:
while GPIO.input(GPIO_ECHO) == 0;
stop = time.time()
nicht eigentlich weglassen?
Weil für die Berechnung brauchst du ja nur die High-Level Zeit. Oder habe ich das Programm falsch interpretiert?
Du kannst das Modul ja mit 5V betreiben und den Echo Pin legst du dann einfach an einen Spannungsteiler. Das sollte für das Pi reichen. Und das Modul dürfte 3,3V Pegel vom Trigger auch problemlos interpretieren können.
pinsel120866
06.01.2013, 17:29
Hey,
Kannst du die Zeile:
while GPIO.input(GPIO_ECHO) == 0;
stop = time.time()
nicht eigentlich weglassen?
Hi Kampi, hab ich zuerst versucht - es kam allerdings eine Fehlermeldung:
Traceback (most recent call last):
File "ultrasonic.py", line 34, in <module>
elapsed = stop-start
Hi Kampi, hab ich zuerst versucht - es kam allerdings eine Fehlermeldung:
Traceback (most recent call last):
File "ultrasonic.py", line 34, in <module>
elapsed = stop-start
Versuch mal folgendes:
GPIO.output(GPIO_TRIGGER, False)
while GPIO.input(GPIO_ECHO)==0:
pass
start = time.time()
while GPIO.input(GPIO_ECHO)==1:
pass
stop = time.time()
elapsed = stop-start
......
So bekommst du die "reine" Laufzeit des Signals ohne die interne Verarbeitungszeit im SRF04
MfG Klebwax
pinsel120866
06.01.2013, 19:20
Danke für eure Tipps und Hinweise,
hier nun der überarbeitete Code:
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO_TRIGGER = 14
GPIO_ECHO = 15
adjustment = 7
print "Ultraschallmessung mit SRF04"
while True:
GPIO.setup(GPIO_TRIGGER,GPIO.OUT)
GPIO.setup(GPIO_ECHO,GPIO.IN)
GPIO.output(GPIO_TRIGGER, False)
time.sleep(0.5)
GPIO.output(GPIO_TRIGGER, True)
time.sleep(0.00001)
start = time.time()
GPIO.output(GPIO_TRIGGER, False)
while GPIO.input(GPIO_ECHO)==0:
pass
start = time.time()
while GPIO.input(GPIO_ECHO)==1:
pass
stop = time.time()
elapsed = stop-start
distance = elapsed * 23000
distance = distance - adjustment
print "Abstand: %.1f cm" % distance
time.sleep(1)
GPIO.cleanup()
pinsel120866
08.01.2013, 09:28
Du kannst das Modul ja mit 5V betreiben und den Echo Pin legst du dann einfach an einen Spannungsteiler.
Hallo Kampi,
wie mache ich diesen Spannungsteiler am besten/einfachsten?
Hey,
das Modul betreibst du mit 5V und legst den Outputpin des Moduls an das eine Ende von zwei in Reihe geschalteten 10kOhm Widerständen (Beispielswert) und das andere Ende an GND. Zwischen den beiden Widerständen legst du den Anschluss vom GPIO vom Raspberry Pi hin.
Dadurch wird das Signal vom Modul auf 2,5V reduziert und du kannst es direkt ans Pi anschließen.
Ist keine supertolle Lösung aber am einfachsten zu realisieren (so lasse ich z.B. auch einen Mega32 der mit 5V betrieben wird über UART mit meinem Pi reden. Da halbiere ich einfach die Spannung von dem Tx Pin vom Mega32).
pinsel120866
08.01.2013, 19:21
OK, danke. Ich habe eine kleine Grafik hochgeladen, mit den beiden Widerständen komme ich auf genau 3,33 Volt
Hey,
ja ich würde die Widerstände nur vlt 3,3k und 4,7k oder 33k und 47k groß machen :)
Hey,
mein Ultraschallmodul ist heute auch mit der Post gekommen.
Bin mir noch nicht ganz sicher von wo aus die Entfernung gemessen wird. Vom Anfang der Kapsel oder von der Platine aus? (Ich vermute mal vom Kapselanfang aus).
Aber ich muss sagen, dass ich echt beeindruckt davon bin....das Ding ist verdammt genau...also für einen Preis von 2€.... kann man echt nicht meckern.
Marius2805
15.06.2013, 17:58
Hallo,
erst einmal vielen Dank für den tollen Tip und das Python Script.
Ich habe das ganze jetzt auch mal so nachgebaut, allerdings funktioniert die Messung bei mir nicht. Vielleicht könnt ihr mir ja ein paar Anhaltspunkte geben wo die Fehlerquelle liegt.
Ich habe einen Raspberry Pi Rev 2.0. Stromversorgung über Micro USB Netzteil mit 1.0 A. Die verschiedenen Pins habe ich über ein Telefonkabel mit 1,5m Länge an beide Seiten sauber angelötet.
Kalte Lötstellen kann ich ausschließen, da ich bereits alle Leitungen "durchgepiepst" habe.
VCC -> 3,3V
GND -> Pin 6
Trig -> Pin 8 (GPIO 14)
Echo -> Pin 10 (GPIO 15)
Ich habe auch schon versucht eine Spannungsmessung durchzuführen, dazu habe ich mein Messgerät parallel zum Sensor an VCC und GND angeschlossen. Leider stürzt dann der Raspberry Pi ab. Vermutlich fließt zu viel Strom obwohl ich den kleinst möglichen Messbereich gewählt habe und der Widerstand groß genug sein müsste.
Wenn ich das Script nach dem Start das erste mal ausführe, werden kurzzeitig zwei Ergebnise ausgegeben, welche aber viel zu groß sind. z.B. 60cm.
Ich bin für alle Antworten dankbar :)
Viele Grüße,
Marius
Hey,
wenn das Pi abstürzt wird die Spannungsversorgung zusammenbrechen, sprich du hast irgendwo einen Kurzschluss :)
Marius2805
15.06.2013, 19:59
Hallo Daniel,
danke für die Antwort.
Der Pi stürzt aber nur ab, wenn ich die Spannung messe. Hierbei lege ich die Messung (parallel) zum Sensor, also an VCC und GND.
Wahrscheinlich ist der Widerstand des Messgerätes im Vergleich zum Sensor zu klein, so dass zuviel Strom fließt.
Vielleicht ist auch 1A einfach zu wenig, da ja auch noch ein WLAN Stick und ein Tastatur + Maus Stick dran hängen, ich werde es jetzt mal mit einem 2A Netzteil versuchen.
Viele Grüße,
Marius
Sicher das du Spannungen misst und keinen Strom eingestellt hast? Bei Spannungsmessungen gehen die Innenwiderstände idealerweise gegen unendlich, nur bei der Strommessung gehen sie gegen 0.
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.