Sonntag, 24. August 2014

SRF02 Ultraschallsensoren am STM32F4-Discovery

Dieser Blog ist umgezogen: http://scholtyssek.org/blog/de/2014/08/24/srf02-ultraschallsensoren-am-stm32f4-discovery/

Der SRF02 Ultrasonic range finder ist ein Ultraschallsensor, der über nur eine Membran verfügt aber trotzdem als Tranceiver funktioniert. Dadurch ist der Sensor praktischerweise von seiner Bauart her sehr kompakt und eignet sich besonders für Einsatzbereiche, in denen es aus die Größe des Sensors ankommt. Der Sensor detektiert Hindernisse in einem Bereich von 16 - 6000 cm. Die benötigte Spannungsversorgung von 5 V erlaubt es, dass des Sensor an einer Vielzahl von  Mikroprozessoren direkt angeschlossen werden kann.
Der Sensor kann per serieller Leitung (UART) oder per i²c Bus (oder aus I2C Bus genannt) angesteuert und ausgelesen werden. Im Folgenden wird die Ansteuerung per I2C beschrieben, da dies den charmanten Vorteil hat, dass lediglich zwei Leitungen (SDA und SCL) auf dem Controller (auch bei der Verwendung mehrerer Sensoren) zur Kommunikation benötigt werden. SDA ist dabei die Datenleitung und SCL die Taktleitung. Komponenten am i²c Bus werden über eine eindeutige Adresse identifiziert. Im folgenden zeige ich beispielhaft den Einsatz von insgesamt vier SRF02 Ultraschallsensoren an einem i²c Bus, inklusive der vorhergehenden Konfiguration der eindeutigen Adressen. Als Mastercontroller wird ein ARM basierter STM32F4-Discovery (STM32F407VG) eingesetzt.





Grundlagen zum SRF02 Sensor

Der SRF02 Sensor kann Distanzen mittels Ultraschall messen. Dafür sendet der Sensor einen kurzen Ultraschallimpuls über die Membran aus und detektiert im Anschluss die Reflexion der Schallwellen. Außerdem misst der Sensor die Zeit zwischen dem Aussenden des Impulses und der Detektion der Reflexion. Da die Geschwindigkeit des Schalls konstant ist, kann mit der ermittelten Zeit, die Distanz berechnet werden. Dieses Verfahren nennt sich time-of-flight Messung.
Der SRF02 muss nicht explizit kalibriert werden, dies wurde durch den Hersteller durchgeführt, sodass diese Arbeit erspart bleibt. Der Sensor kann für die Distanzen verschiedenen Messwerte liefert. So kann die Distanz in cm, in inch oder aber die Zeit zwischen dem Aussenden und Detektieren eines Schallimpulses von dem Sensor übertragen werden. Die Messwerte, die der Sensor liefert, können konfiguriert werden. Die Register des Sensors sind wie folgt aufgebaut:

Adresse Funktion
0x50 Messwerte in inch
0x51 Messwerte in cm
0x52 Messwerte in Mikrosekunden
0x56 Fake Range Modus (inch)
0x57 Fake Range Modus (cm)
0x58 Fake Range Modus (Mikrosekunden)
0xA0 1. Sequenz zum Setzen der I2C Adresse
0xA5 2. Sequenz zum Setzen der I2C Adresse
0xAA 3. Sequenz zum Setzen der I2C Adresse

Setzten einer eindeutigen I2C Adresse


Die Adressen der Sensoren werden als Bytes hexadezimal übertragen. Initial hat jeder Sensor die Adresse 0xE0. Wird nur ein Sensor eingesetzt, ist es nicht notwendig, diese Adresse zu ändern, sollen aber mehrere Sensoren an einem Bus eingesetzt werden, muss die Adresse auf dem Bus eindeutig sein. Dafür wird die neue Adresse an das Command Register (0x00) des Sensors übertragen. Damit der Sensor in den Modus wechselt, in dem er die neue Adresse empfängt und übernimmt, müssen die Steuerbytes (1. - 3. Sequenz) zum Setzen der Adresse zuvor übertragen werden. Die neue Adresse bleibt auf dem Sensor gespeichert, sodass diese auch dann gesetzt ist, wenn den Sensor abschaltet wird.


Die konfigurierte Adresse eines Sensors kann man anhand des Blinkverhaltens der LED beim Einschaltvorgang erkennen. Der Sensor teilt seine Adresse durch kurze Lichtpulse der LED mit. Beim Einschalten des Sensors leuchtet die LED einmal lange auf. Danach blinkt die LED in Abhängigkeit von der gesetzten Adresse. So würde diese bei der Adresse 0xE0 kein mal blinken, während sie bei der 0xF0 8 mal aufblinken würde. Die Zuordnung zwischen den Adressen und den Lichtpulsen zeigt die folgende Tabelle:

Adresse Lichtpulse
0xE0 0
0xE2 1
0xE4 2
0xE6 3
0xE8 4
0xEA 5
0xEC 6
0xEE 7
0xF0 8
0xF2 9
0xF4 10
0xF6 11
0xF8 12
0xFA 13
0xFC 14
0xFE 15

Die Implementierung im Repository (Projekt: SRF02_example) beinhaltet eine Funktion zum Setzen einer I2C Adresse für die Sensoren. Da diese initial alle eine identische Adresse haben, müssen diese nacheinander Konfiguriert werden. Will man die Adresse eines Sensors ändern, kann das einfach mit der Funktion setSensorI2CAddress() durchgeführt werden. Die Funktion erwartet als Parameter die aktuelle und die neue Adresse des Sensors. Eine Implementierung könnte wie folgt aussehen:

#include "SRF02.h"

int main(int argc, char **argv) {
 uint8_t address = 0x00;
 initSRF02();
 while(1){
  initUltrasonicSensorI2C(SENSOR1_ADDRESS);
  setSensorI2CAddress(SENSOR1_ADDRESS, 0xF0);
 }
}

STM32F4 Anbindung

Der Beispielcode im Repository zeigt die Anbindung und Konfiguration von insgesamt vier Sensoren an einem STM32F4 Controller. Das Projekt ist in dem Verzeichnis SRF02_example zu finden. Damit die Sensoren verwendet werden können, wird zuerst der I2C Bus in der Funktion  initSRF02() konfiguriert. Anschließend wird der einzelne Sensor mittels initUltrasonicSensorI2C() initialisiert. Die Funktion erwartet die I2C Adresse des Sensors. Außerdem wird an dieser Stelle die Messeinheit konfiguriert. Danach kann die gemessene Distanz des Sensors mit Hilfe der Funktion readDistance() abgefragt werden. Eine Implementierung zum Auslesen eines Sensors sieht wie folgt aus:

#include "SRF02.h"

uint16_t distance[4];
uint16_t minimumRange[4];

int main(int argc, char **argv) {
 uint8_t address = 0x00;
 initSRF02();

 /* receive sensor data */
 while (1) {
  initUltrasonicSensorI2C(SENSOR1_ADDRESS);
  distance[i] = readDistance(SENSOR1_ADDRESS);
 }
}

Anhang

Datenblatt
Bezugsquelle: exp-tech



Keine Kommentare:

Kommentar veröffentlichen