Auswertung von Ultraschallmodulen

Hier ein weiteres Tutorial, diesmal zur Auswertung von von Ultraschallsensoren vom Typ HC-SR04

Diese Module bestechen durch einen kompakten Aufbau, großen Messbereich sowie eine einfache Ansteuerung und geringen Preis.

Technische Daten
Länge: 43mm
Breite: 20mm
Höhe: 15mm
Messbereich: 2 bis 500cm
Maximale Auflösung: 3mm
Öffnungswinkel: ca. 15 Grad
Betriebsspannung: 5V
Stromverbrauch: 2mA

Allgemeine Funktionsweise
Das Modul verfügt über einen Lautsprecher und ein Mikrofon, sowie einen Taktgeber für 40kHz. Soll eine Messung durchgeführt werden, so wird für kurze Zeit der Lautsprecher mit dem 40kHz Signal besteuert (Trigger) und anschließend darauf gewartet, dass dieses Signal vom Mikrofon (Echo) registriert wird. Über die Formel s = (t * v)/2 kann daraus die Entfernung zum Hindernis bestimmt werden, die vom Schall zurückgelegte Strecke s ist die Zeit t multipliziert mit der Schallgeschwindigkeit v von 344m/s. Da die Entfernung doppelt gemessen wurde, wird das Ergebnis abschließend noch durch 2 geteilt.

Programmaufbau
Bevor im Setup-Bereich die Pinmodes gewählt werden, werden die einzelnen Pins zugewiesen:
int trigger = 30 //Connect the Trigger Pin to digital Pin 30
int echo = 40 //Connect the Echo Pin to digital Pin 40

Die Pins des Ultraschallmodules können selbstverständlich auch mit jedem anderen Digitalen Pin des Arduino verbunden werden, dies muss dann natürlich oben auch entsprechend geändert werden.
Danach wird im Setup festgelegt, ob der Pin ein Input oder Output ist
void setup()
{
pinMode(trigger, OUTPUT); //The Trigger becomes a Output
pinMode(echo, INPUT); //The Echo becomes a Input

Serial.begin(9600); //Serial Connection to the Computer with 9600 Baud
}

Jetzt kann mit dem eigentlichen Programm begonnen werden:

void loop() //this block will run through an through until you disconnect the controller
{
digitalWrite(trigger, LOW); //The Trigger is set LOW
delayMicroseconds(2); //Continue after 2μs
digitalWrite(trigger, HIGH); //The Trigger is set HIGH
delayMicroseconds(10); //Send the 40kHz Signal
digitalWrite(trigger, LOW); // The Trigger is set LOW
int time = pulseIn(echo, HIGH); //Count the time in μs until the Echo Pin becomes HIGH
int distance = time / (29/2); //The distance
Serial.print("Die Entfernung ist "); //Prints to the Serial Console
Serial.print(distance); //Prints the distance to the Serial Console
Serial.println(" cm"); //Prints to the Serial Console and also a new line
}

Tabelle erstellen

In diesem kurzen Eintrag werde ich euch zeigen, wie man eine Tabelle in iOS 5 erstellt.

Wir öffnen dazu XCode, erstellen mit „cmd“ + „Shift“ + „N“ ein neues Projekt und wählen „Single View Application“.

Benannt wird es natürlich mit „Tabelle“, der Company Identifier ist der umgekehrte URL eurer Webpage, einen Class Präfix brauchen wir heute noch nicht, ich werde das in einem späteren Eintrag erklären, der Gerätetyp wird ein iPhone und wir verwenden keine Storyboards.

Jetzt sollte euer Projekt nach wenigen Sekunden so aussehen

Zuerst ändern wir im ViewController.h folgendes:

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>;
{
UITableView *myTableView;
}

@property (nonatomic, retain) UITableView *myTableView;
@end

Als nächstes gehen wir in das ViewController.m File fügen unterhalb von @implemention ViewController ein @synthesize myTableView; hinzu.

Weiter geht’s in viewDidLoad:

– (void)viewDidLoad
{
[super viewDidLoad];

UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 200.0f, 200.0f) style:UITableViewStylePlain];
self.myTableView = tableView;
self.myTableView.dataSource = self;
self.myTableView.delegate = self;

[self.view addSubview:tableView];
}

Wir erzeugen hier eine Tabelle mit dem Pointer auf tableView und reservieren uns mit alloc den dafür nötigen Speicher. Danach legen wir mit initWithFrame: die Größe und die Lage auf dem Bildschirm fest. Dazu nutzen wir CGRectMake() welches uns erlaubt die Parameter anzugeben. Als erstes wird der X-Wert angegeben, dann der Y-Wert, anschließend die Breite und zum Schluss die Höhe. Die Werte sollten vom Typ float sein.
Als nächsten Schritt sagen wir, dass unsere gerade erzeugte Tabelle die Tabelle aus dem .h File ist und fügen die Tabelle unserem View durch [self.view addSubview:tableView]; dem View hinzu.
Wenn wir jetzt das Programm kompilieren lassen („cmd“ + „B“) kommt ein gelbes Dreieck und sagt:

Method in protocol not implemented
Incomplete implemention

Um diesen Fehler zu beheben fügen wir nach dem viewDidLoad hinzu:

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}

Diese Methode liefert der Tabelle einen Wert, wie viele Zeilen erstellt werden sollen. In diesem Fall ist es eine einzige.
Weiter fügen wir hinzu:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @“Cell“;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

cell.textLabel.text = @“Hallo“;

return cell;
}

Dies erzeugt uns die nötigen Zellen und fügt ihnen den Textinhalt Hallo hinzu. Dies geschieht durch cell.textLabel.text

Jetzt können wir ohne Fehler den Simulator mit „cmd“ + „R“ anwerfen und sehen unsere wunderschöne Tabelle.
Wenn man die Zeile „Hallo“ jedoch anklickt, so bleibt diese angeklickt und verblasst nicht mehr, so wie es sich gehören würde. Dazu fügen wir einfach eine weitere Methode ein

-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}

Eine kurze Erklärung dazu:
tableView ist die Tabelle in der die Zeile abgewählt werden soll
deselectRowAtIndexPath: ist die Funktion, welche die Zeile wieder abwählt
indexPath ist die Zeile welche abgewählt werden soll, also die aktuelle Zeile, welche gerade angewählt wurde
animated: führt den ganzen Vorgang ästhetisch schön aus, sodass die Zeile langsam verblasst.
Ihr könnt einfach einmal ausprobieren, wie das ganze aussieht wenn animated: auf NO gesetzt wird.