PDA

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.

Kampi
06.01.2013, 14:55
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

Klebwax
06.01.2013, 17:54
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?

Kampi
08.01.2013, 16:15
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

Kampi
08.01.2013, 19:27
Hey,

ja ich würde die Widerstände nur vlt 3,3k und 4,7k oder 33k und 47k groß machen :)

Kampi
28.01.2013, 13:55
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

Kampi
15.06.2013, 18:34
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

dremler
16.06.2013, 13:00
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.