Experimente mit dem Ultraschallsensor SRF02

Ein weiterer Sensor, mit dem ich hier nun ein bisschen experimentieren werde, ist der SRF02, ein Entfernungsmesser mittels Ultraschall. Von diesem kann man bis zu 16 Stück an den I2C-Bus des Raspberry’s anschließen.
Im folgenden beschreibe ich wie der Sensor an den Raspberry Pi angeschlossen und Inbetrieb genommen wird.

Achtung: Für Schäden aller Art übernehmen ich keine Haftung.
Für den richtigen Aufbau ist jeder selbst verantwortlich.
Des weiteren kann für die 100 % tige Funktionalität der Bauanleitungen, Software und Schaltpläne nicht garantiert werden, sie sollen nur eine Anregung zum Bau darstellen.

 

Anschluss des SRF02 an den Raspberry:

Der SRF02 besitzt fünf Pins, von denen für die Nutzung des I2C-Buses jedoch nur 4 notwendig sind. Der fünfte Pin ist für die Umschaltung zwischen I2C-Betrieb und RS232-Betrieb gedacht. Für den I2C-Betrieb wird er nicht beschaltet (sollte man einen RS232-Betrieb ausprobieren wollen, muss der Pin auf GND gelegt werden).
Im Bild sieht man die Pin-Belegung des SRF02 wobei die Farben folgende Anschlüsse representieren:

– Rot = 5V
Gelb = SDA
Grün = SCL
– Schwarz = GND

2015-01-25_IMG_0021

Verbindungstest:

Nachdem die Leitungen entsprechend am Raspberry angeschlossen wurden, habe ich den üblichen Shell-Befehl zum detektieren eines I2C-Gerätes durchgeführt:

i2cdetect -y 1

Daraufhin wurde mir vom System gemeldet, dass ein Gerät mit der ID 0x70 gefunden wurde. Interessanterweise dürfte das Gerät diese ID gar nicht besitzen, da laut Datenblatt als Standardwert die ID 0xE0 vergeben wird (Nachtrag: Den Grund habe ich in diesem Artikel beschrieben). Sollte man mehrere Sensoren nutzen, kann man die ID ändern. Wie dies geht, beschreibe ich am Ende des Beitrags.

Erste Messungen:

Der Sensor hat sechs Register, von denen das Register „0“ als Befehlsregister dient, in das man mit i2cset schreiben kann. Diesem Register kann man verschieden Befehle übergeben, wobei im folgenden nur der Wert 0x51 genutzt wird. Dieser startet einen Messvorgang und schreibt den Wert in „cm“ in die Register „2“ und „3“. Den Wert kann man mittels i2cget aus den beiden Registern auslesen. Um den finalen Wert herauszubekommen, muss man nun zuerst die Werte von Hex in Dezimal umwandeln. Danach wird dann zum Register „2“ der Wert 256 addiert (falls Register „2“ ungleich Null) und dieses Zwischenergebnis mit dem Register „3“ addiert. Hierzu zwei Beispiele:

i2cset -y 1 0x70 0x00 0x51
i2cget -y 1 0x70 0x02
i2cget -y 1 0x70 0x03
Register „2“ = 0x01Register „3“ = 0x66
Umwandeln von Hexadezimal in Dezimal
Register „2“ = (0 * 16) + (1 * 1) = 1
Register „3“ = (6 * 16) + (6 * 1) = 102
Entfernung = (1+256) + 102 = 358cm

i2cset -y 1 0x70 0x00 0x51
i2cget -y 1 0x70 0x02
i2cget -y 1 0x70 0x03
Register „2“ = 0x00
Register „3“ = 0x1F
Umwandeln von Hexadezimal in Dezimal
Register „2“ = (0 * 16) + (0 * 1) = 0
Register „3“ = (1 * 16) + (F(15) * 1) = 31
Entfernung = (0) + 31 = 31cm

2015-01-25_IMG_0031Testaufbau

Python Programm:

Da für die weiteren Tests die Eingabe über die Shell zu umständlich war habe ich ein kleines Python-Programm geschrieben, welches jede Sekunde eine Messung durchführt und den Wert dann ausgibt.

——————————————————————————
#Import verschiedener Libraries
import smbus
from time import sleep

#Definieren der Variablen und Konstanten
Busnummer = 1
Adresse_SRF02 = 0x70
Start = 0x51
High_Byte = 0
Low_Byte = 0
Entfernung = 0

#Instanzieren eines I2C Objektes
i2cBus = smbus.SMBus(Busnummer)

#Entfernungsmessung
while True:

print „Start der Messung“
i2cBus.write_byte_data(Adresse_SRF02, 0x00, 0x51)
sleep(1)
#Sleep absichtlich vor dem Lesen der Daten, da es je nach Entfernung ca. 65ms
#dauern kann, bis das Ergebnis ermittelt und in das Register geschrieben wurde.
#Möchte man ein schnelleres Abtasten der Entfernung haben, kann man den Wert
#z.B. auf 100ms stellen — sleep(0.1)
High_Byte = i2cBus.read_byte_data(Adresse_SRF02, 0x02)
Low_Byte = i2cBus.read_byte_data(Adresse_SRF02, 0x03)
if High_Byte == 0:

Entfernung = Low_Byte

else:

Entfernung = (High_Byte*256)+Low_Byte

print „High_Byte %d“ % High_Byte
print „Low_Byte %d“ % Low_Byte
print „Entfernung %d“ % Entfernung

——————————————————————————

 Ändern der I2C-Adresse

Möchte man mehrere SRF02 an einem I2C-Bus nutzen, so muss die Adresse gesetzt werden. Hierzu sollte der SRF02 alleine im I2C-Bus sein. Nun kann man folgende Befehle per Shell an den SRF02 senden:

i2cset -y 1 0x70 0x00 0xA0
i2cset -y 1 0x70 0x00 0xAA
i2cset -y 1 0x70 0x00 0xA5

Nun ist das Gerät bereit mit der neuen Adresse beschrieben zu werden, dies wird durch das Leuchten der roten LED dargestellt. In diesem Beispiel beschreiben wir das Gerät mit der Adresse „EA“

i2cset -y 1 0x70 0x00 0xEA

Mittels i2cdetect kann man nun die neue Adresse auslesen. Es stehen folgende Adressen zur Verfügung:

E0, E2, E4, E6, EA, EC, EE, F0, F2, F4, F6, F8, FA, FC und FE

Dieser Beitrag wurde unter Raspberry Pi, Sensoren abgelegt und mit , , , , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreib einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.