Comment Bitte beachten Sie:
  • Alle Autoren akzeptieren mit dem Upload ihres Werkes die PhySX-Nutzungsbedingungen !
  • Sämtliche urheberrechtlich geschützte Medien, d.h. nicht-selbst erstellte Bilder, Medien und Videos werden kommentarlos gelöscht!

Arduino in Fallexperimenten mit Ultraschall

Aus PhySX - Physikalische Schulexperimente Wiki
Wechseln zu: Navigation, Suche
Arduino in Fallexperimenten mit Ultraschall
Fallexperiment1.jpg

Abb. 1: Arduino mit Ultraschallmodul auf Trägerplattform

Kurzbeschreibung
Positionsbestimmung mit Ultraschall in Fallprozessen
Kategorien
Digitales Messen, Mechanik
Einordnung in den Lehrplan
Geeignet für: Sek.
Sonstiges
Durchführungsform Demoexperiment
Anzahl Experimente in dieser Unterkategorie 1
Anspruch des Aufbaus mittel
Informationen
Name: Franz Boczianowski
Kontakt: \text{bocziano}@\text{physik.hu-berlin.de}
Uni: Humboldt-Universität zu Berlin
This box: view  talk  edit  

Per Ultraschall lässt sich die Position eines Objektes über eine Laufzeitmessung bestimmen. Kommerzielle Systeme liefern erstaunlich gute Ergebnisse für den freien Fall und auch das Springen eines Gummiballs (Messung mit LabQuest Mini ca. 250€ mit Ultraschall-Bewegungssensor 130€). In diesem Artikel wird der Versuch beschrieben, eine ähnliche Messung mit einem Arduino Uno mit Ultraschallmodul (insg. ca. 35€) aufzunehmen, siehe Abb. 1.


Versuchsanleitung

Aufbau

Arduino und Ultraschallmodul sind auf einer Trägerplatte befestigt. Die Messdaten werden live per USB an einen Laptop übertragen. Mit einem Taster an der Trägerplatte (nicht in der Abb. gezeigt) lässt sich die Messung auslösen. Die Plattform wird mit Stativmaterial oder einem Fotostativ in einer Höhe von ca. 150m positioniert. Messwerte über 1,20m werden durch die Software unterdrückt, da in diesem Abstand Objekte mit einem Querschnitt von unter 30cm erfahrungsgemäß nicht mehr zuverlässig erkannt werden. Dies resultiert vermutlich aus dem großen Öffnungswinkels des Ultraschallsenders von ca. 55° (Herstellerangabe). Dementsprechend muss auch ein großer Bereich von Tischen und Stühlen freigehalten werden, um unerwünschte Reflexionen zu vermeiden.

Das Programm des Arduinos ist kurzgehalten, um eine möglichst hohe Abtastrate zu erhalten (schwankend zwischen 15 und 25ms). Es ist im Anhang zu finden. Das Ultraschallmodul ist neben der Spannungsversorgung mit zwei digitale Pins des Arduinos zum Senden und Detektieren eines Ultraschallpulses verbunden. Der Start-Taster zieht die Spannung in einem Spannungsteiler (10kOhm gegen 5V) gegen Null.

Die Messwerte lassen sich über den „Seriellen Monitor“ der Arduino IDE bzw. den „Seriellen Plotter“ verfolgen. Im „Seriellen Monitor“ lassen sich die Messwerte per copy & paste speichern und z.B. mit einer Tabellen-Software plotten.

Durchführung

Die Detektion eines springenden Gummiballs ist mit dem gezeigten Aufbau nicht möglich. Selbst ein Fußball lässt sich in einem Abstand über 120cm nicht verlässlich erfassen. Mit Einweg-Suppenschalen lassen sich brauchbare Ergebnisse erzielen. Durch Stapeln der Schalen lässt sich zudem die Masse des fallenden Körpers variieren, die in diesem Experiment mit Luftreibung entgegen dem idealisierten Fall eine bedeutsame Rolle spielt (vgl. T. Wilhelm, 2000, Praxis der Naturwissenschaften. Physik 49/6).

Für jede Messung wird das Arduino-Board durch den Reset-Taster zurückzusetzen. Der „Serielle Monitor“ wird neu gestartet. Die LED 13 am Arduino signalisiert Bereitschaft durch Blinken. Der Fallkörper wird unter das Ultraschallmodul gehalten und kurz nach dem Drücken des Tasters fallen gelassen. Während des Falls werden die Messwerte an den PC übertagen. Die Übertragung endet, wenn der Körper eine Strecke von über 120cm erreicht hat. Die Messwerte werden per Hand in eine Textdatei übertragen und anschließend in der Tabellen-Software Excel bearbeitet. Durch die Tiefe der Schalen von 4,9cm ergibt sich bzgl. des Abstands ein Offset, der allen Messwerten abgezogen wird. (Wegen der geringen Präzision des Ultraschallmoduls in diesem geringen Abstand entstehen dabei auch negative Abstandswerte.) Die Uhr des Arduinos beginnt mit dem Start der Messung nicht bei t=0, sondern bei einem beliebigen Wert. (Auch ein Überlauf ist möglich.) Insbesondere liegt zwischen dem Start der Aufnahme und dem Fallen des Körpers eine unbekannte Zeit von ca. 1s. Alle Graphen wurden bzgl. der Zeit angepasst.

Ergebnisse

Die durchgeführten Messungen sind in den Abb. 2 und Abb. 3 gezeigt.

Die Ergebnisse für eine einzelne fallende Kunststoffschale ist in Abb. 2 gezeigt. Die Messung wurde fünfmal wiederholt. Alle Diagramme zeigen augenscheinlich den gleichen Verlauf.

Abb. 3 zeigt die Ergebnisse für die Variation der Masse des fallenden Körpers. Alle Graphen wurden bzgl. der Zeit so angepasst, dass sie bei einer gefallenen Strecke von ca. 6cm zur Deckung kommen. Deutliche Unterschiede sind nur zwischen der Messung mit einer Schale gegenüber mehreren Schalen erkennbar.
Fallexperiment2.jpg
Abb. 2: Wiederholungsmessung für eine einzelne fallende Kunststoffschale. Aufgetragen ist die gefallene Strecke über der Zeit. Die Messungen wurden zur besseren Sichtbarkeit zeitlich verschoben.
Fallexperiment3.jpg
Abb. 3: Mehrere in einander gesteckte Schalen werden fallen gelassen. Aufgetragen ist die gefallene Strecke über der Zeit. Zur besseren Sichtbarkeit wurden die Messwerte verbunden und Ausreißer entfernt.

Auswertung

Die Möglichkeiten des Ultraschallmoduls des Arduinos sind begrenzt. Nur großflächige Objekte lassen sich detektieren, was den Einfluss der Luftreibung erhöht. Die max. Reichweite ist gering, was wiederum eine genaue Analyse des reibungsbehafteten Falls erschwert. Messungen mit dem o.g. System von Vernier zeigen für eine Distanz zwischen 1m und 2m Abweichungen von der quadratischen Form hin zu einem linearen Verhältnis der Strecke zur Zeit, die hier nicht sichtbar werden können.

Die Auswertung der Messung ist umständlich, denn sie erfordert eine vielschrittige Datenaufbereitung in der Tabellenkalkulation. Die Erzeugung eines Live-Plots und das nachträgliche Speichern der Messwerte ist aktuell nicht möglich.

Code

/* 
 Franz Boczianowski 23.03.2018
 based on demos
 "Button"
 created 2005
 by DojoDave <http://www.0j0.org>
 modified 30 Aug 2011
 by Tom Igoe
 and
 "Ping))) Sensor"
 created 3 Nov 2008
 by David A. Mellis
 modified 30 Aug 2011
 by Tom Igoe

This example code is in the public domain.
 */

// Konstanten
// Ports Ultraschall Sensor an Arduino
const int pingPin = 7; // senden
const int echoPin = 6; // empfangen
const int ledPin = 13; // the number of the LED pin
const int buttonPin = 12; // the number of the pushbutton pi

// Variablen
long dauer=0; // Laufzeit
float entfernung=0; // Entfernung
int t=0; // Zeit
int dt=0; // Zeitdifferenz
int t_0=0; // Zeit aus Durchlauf zuvor

int buttonState = HIGH; // variable for reading the pushbutton status

// Transfer
String data = ""; // Datenzeile für den Transfer an PC
String trennzeichen = "; "; // Trennzeichen für Datenzeile Semikolon und Freistelle

// Einstellungen
void setup()
{
Serial.begin (9600); 
pinMode(pingPin, OUTPUT); 
pinMode(echoPin, INPUT); 
pinMode(ledPin, OUTPUT);
pinMode(buttonPin, INPUT);

}

// Hauptprogramm
void loop()
{
// warten auf Start-Button
while(buttonState == HIGH){

// Led blinkt
 digitalWrite(ledPin, HIGH);
 delay(50);
 digitalWrite(ledPin, LOW);
 delay(50);
 
 // read the state of the pushbutton value:
 buttonState = digitalRead(buttonPin);
}

// aktuelle Zeit abfragen
t=millis();
dt=t-t_0;

// senden und empfangen eines Ultraschallpulses 
digitalWrite(pingPin, LOW); 
delay(2); 
digitalWrite(pingPin, HIGH); 
delay(2);
digitalWrite(pingPin, LOW);
dauer = pulseIn(echoPin, HIGH);


// Berechnung des Abstands aus der Laufzeit mit Schallgeschwindigkeit 343m/s
entfernung = (dauer/2) * 0.0343;

// Datentransfer an den PC
if (entfernung <= 120) // Datentransfer nur für Entfernungen 120cm
{
//zusammensetzen der zu übertragenden Zeile
data += dt;
data += trennzeichen; // Trennzeichen
data += t; 
data += trennzeichen; // Trennzeichen
data += entfernung;
Serial.println(data);
}
else 
{
}
// Übertrag in den nächsten Schleifendurchlauf
t_0 = t;
// Zurücksetzen 
data ="";

// Warten
//delay(1);

}