Projekt 89: Sonarstation
Autoren: Niklas Rohlfs, Tim Leonard Bexten
Betreuer: Prof. Schneider
→ zurück zur Übersicht: WS 18/19: Fachpraktikum Elektrotechnik (MTR)
Einleitung
Im Studiengang Mechatronik der Hochschule Hamm-Lippstadt findet im 5. Semester das Modul Mechatronische Systeme II statt. Ein Teil dieses Moduls bildet das GET-Fachpraktikum. Das GET-Fachpraktikum umfasst unter anderem die Bearbeitung eines eigenen mechatronischen Projekts. Neben vielen spannenden Projekten, die von Prof. Schneider vorgestellt wurden, war es auch möglich ein eigenes Projekt zu definieren und dieses nach Absprache mit Prof. Schneider durchzuführen. Der folgende Artikel beschäftigt sich mit dem selbstständig definierten Projekt „Sonarstation“ und soll die Planung und Umsetzung des Projekts dokumentieren.
Erwartungen an die Projektlösung
- Planung und Konstruktion der Sonarstation
- Horizontaler Messbereich: 360°
- Rotationswinkelmessung mit eine Auflösung < 1°
- Messfrequenz: <1Hz für 360°
- Reichweite: 1cm - 8m
- Winkelrückmeldung über Drehencoder
- oder
- Horizontaler Messbereich: 180°
- Rotationswinkelmessung mit eine Auflösung 1°
- Messfrequenz: max.
- Rotationsfrequenz: maximal für 1° Auflösung
- Reichweite: 2cm - 3m
- Winkelrückmeldung über Drehencoder
- Beschaffung der Bauteile
- Schaltungsentwicklung zur Ansteuerung von Sensor und Motor
- Modellbasierte Programmierung der Hardware via Simulink
- Entwicklung der Sensorblöcke in Simulink
- Entwicklung des Motorblocks in Simulink
- Koordinatentransformation der gemessenen Polarkoordinaten (Winkel, Entfernung) in karthesische Koordinaten
- Darstellung der Messwerte in karthesische Koordinaten
- Bewertung der Ergebnisse mit geeigneter Referenz
- Softwareentwicklung nach HSHL Standard in SVN
- Darstellung der Funktion in einem YouTube Video
- Test und wissenschaftliche Dokumentation
- Live Vorführung während der Abschlusspräsentation
Kür: Objektbildung und Objekttracking in Simulink
Aufgabe
Das Wort Sonar ist ein Akronym von „sound navigation and ranging“, dies lässt sich mit Schall-Navigation und -Entfernungsbestimmung übersetzen. Im Projekt soll also eine Sonarstation gebaut werden, die Objekte in ihrer Umgebung wahrnimmt und ortet. Zur Umsetzung wird neben dem Mikrocontroller Arduino Uno ein Ultraschallsensor zur Ortung der Objekte verwendet. Dieser Ultraschallsensor ist mit einem Servomotor verbinden, wodurch sich der Sensor um 180° drehen lässt. Der Servomotor wird ebenfalls über den Mikrocontroller angesteuert. Zusätzlich wird ein Bildschirm benötigt, der den Standort der erkannten Objekte sowie deren Entfernung zur Sonarstation ausgibt.
Planung
Der erste Schritt in der Projektplanung war die Beschaffung der Bauteile. Hierzu wurde nach einem passenden Ultraschallsensor und einem Servomotor gesucht. Die Bauteile wurden auf die BOM geschrieben und von der Hochschule beschafft. Im Rahmen der Lehrveranstaltung wurde von der Hochschule ein Budget von ca. 20€ pro Projekt zur Verfügung gestellt.
Mit diesem Budget war es möglich die Sonarstation zu bauen, es mussten allerdings einige Anpassungen bei den Erwartungen an die Projektlösung gemacht werden, die mit Prof. Schneider abgesprochen wurden.
So wurde beispielsweise der horizontale Messbereich von 360° auf 180° angepasst. Der horizontale Messbereich von 360° wäre nur mit einem Slip Ring möglich gewesen, damit sich die Kabel bei der Rotation des Ultraschallsensors um die eigene Achse mitbewegen. Da diese Investition allerdings das Budget überschritten hätte, wurde sich dagegen entschieden.
Eine weitere Anpassung wurde außerdem bei der Reichweite gemacht, da kein passender Ultraschallsensor im Budget zu finden war. Somit ist die Reichweite des Ultraschallsensors auf ca. 3m statt auf 8m begrenzt.
Verwendete Materialien
Pos. | Anzahl | Bezeichnung | Preis |
---|---|---|---|
1. | 1 | HC-SR04 Ultraschall Sensor | 2,95 € |
2. | 1 | Mini Analog Servo SM-S2309S | 4,95€ |
3. | 1 | Arduino Uno | 20,00 € |
4. | 1 | USB-A auf USB-B Kabel | 1,59 € |
5. | div. | Schrauben, Muttern, Kabel ... |
Projektdurchführung
Konstruktion der Sonarstation
Während der Planungsphase wurde sich dafür entschieden, eine Grundplatte zu erstellen, auf welcher der Arduino befestigt wird. Zusätzlich soll auf dieser Grundplatte der Servomotor fixiert werden. Außerdem wurde beschlossen, die Grundplatte über das additive Fertigungsverfahren 3D-Druck zu fertigen. Hierzu ist die Grundplatte im 3D-CAD-Programm SolidWorks erstellt worden.
Vor Beginn der Konstruktion wurden zuerst die Maße des Arduinos und des Servomotors benötigt. Diese sind zum einen in den jeweiligen Datenblättern zu finden, sicherheitshalber wurden sie auch nochmal von Hand aus vermessen. Neben den Maßen der beiden Bauteile sind auch die Abstände der beiden zueinander sowie zum Grundplattenrand relevant. Zwischen den beiden Bauteilen wurde sich für einen Abstand von 2,5 cm entschieden, damit der Servomotor problemlos mit dem Arduino verbunden werden kann. Des Weiteren wurde der Abstand vom Arduino zum Grundplattenrand mit 5cm beziffert, damit der Arduino angeschlossen werden kann, ohne das Anschlusskabel zu sehr zu verdrehen und somit unnötig zu belasten. Der Abstand vom Servomotor zum Ende der Grundplatte wurde auf 0,5cm festgelegt, um den Servomotor problemlos verschrauben zu können.
In SolidWorks wurde zuerst eine sogenannte Skizze erstellt, bei der schon alle Bemaßungen und Bohrungen enthalten sind. Bei der Größe der Bohrungen wurde sich beim Arduino am vorhandenen Datenblatt orientiert, beim Datenblatt des Servomotors war die Größe der Befestigungslöcher nicht bemaßt. Das Ausmessen gestaltete sich als schwierig, da es sich um sehr kleine Löcher handelt, diese wurden mit Durchmesser 2mm angenommen.
Nachdem die Skizze vollständig definiert ist, kann man in SolidWorks unter „Features“ die Auswahl „Linear ausgetragener Aufsatz“ wählen, um aus der Skizze einen 3D-Körper zu erstellen. Als Aufsatz, also die Höhe der Grundplatte wurden 8mm gewählt, um bei der Fixierung von Servomotor und Arduino eine ausreichende Bohrungstiefe zu gewährleisten.
Neben der Grundplatte wurde auch die Halterung für den Ultraschallsensor mit SolidWorks konstruiert. An dieser soll der Ultraschallsensor angebracht werden und zusätzlich die Verbindung zum Arduino über eine Verschraubung hergestellt werden. Diese Konstruktion gestaltete sich etwas schwieriger als die der Grundplatte. Die Halterung sollte grob so gestaltet werden, dass sie aus drei Bereichen besteht. Im oberen Bereich soll der Ultraschallsensor angebracht werden, der mittlere Bereich gilt nur als Übergangsbereich und der untere Bereich soll die Verbindung an den Servomotor über eine Verschraubung darstellen.
Zuerst wurden wieder die Maße des Ultraschallsensors benötigt, welche im Datenblatt zu finden waren. Da der Ultraschallsensor im oberen Bereich der Halterung angebracht wird, entsprechen die Maße der Halterung im oberen Bereich in etwa denen des Ultraschallsensors. Um Material einzusparen wurde sich dazu entschieden, die Halterung im mittleren Bereich schmaler zu gestalten, da dieser nur als Übergang dient. Im unteren Bereich wird die Halterung um 90° gebogen, um den Servomotor daran verschrauben zu können. Der gebogene Bereich wird mit 10mm bemaßt, um genug Platz für die Bohrung und ein einfaches Verschrauben zu gewährleisten.
Außerdem muss beachtet werden, dass die Pins des Ultraschallsensors zugänglich sind. Hierzu wird im Bereich der Pins eine 20x20mm Öffnung eingebracht. Des Weiteren müssen Bohrungslöcher eingefügt werden. Hierbei werden vier für die Befestigung des Sensors an den Ecken des oberen Bereichs vorgesehen und fünf im unteren Bereich, zur Verschraubung des Servomotors. Es werden unten fünf Löcher gewählt, um bei der Verschraubung flexibel zu sein und die passende Position wählen zu können. Alle Löcher werden mit 2mm bemessen. Dieser Wert wurde selbstständig ausgemessen, da in den Datenblättern keine Angaben dazu zu finden sind.
Nach Fertigstellung der Skizze wird auch hier wie bei der Grundplatte ein linear ausgetragener Aufsatz gewählt, um einen 3D-Körper zu erstellen. Als Wandstärke werden hier nur 5mm gewählt, da keine großen Lasten getragen werden müssen.
Zum Schluss werden diese beiden CAD-Dateien in ein STL-Format übertragen und mit einem in der Hochschule vorhandenen 3D-Drucker gedruckt.
Hardwareaufbau
Der Hardwareaufbau der Sonarstation besteht aus dem Anschluss des Ultrasschallsensors und dem Anschluss des Servomotors. Der
Prinziperklärung Ultraschallmessung
Das Messprinzip des Ultraschallsensormoduls ist ein Laufzeitverfahren. Der Ultraschallsensor strahlt zyklisch einen kurzen, hochfrequenten Schallimpuls aus. Diese Schallwellen pflanzen sich mit Schallgeschwindigkeit in der Luft fort. Wenn nun die Schallwelle auf ein Objekt, im Messfeld des Sensors trifft, wird diese reflektiert. Die wieder beim Sensor eintreffende Schallwelle wird detektiert und die Zeit zwischen dem Aussenden und dem Wiedereintreffen gemessen. Aus der Zeit und der Schallgeschwindigkeit in einem bestimmten Medium (Luft) kann die Distanz zum detektierten Objekt errechnet werden.
Messablauf HC-SC04 Abstandssensor
Der Messzyklus des Ultraschallmoduls wird durch eine fallende Flanke am Trigger-Pin ausgelöst. Bevor die fallende flanke detektiert werden kann, muss am Trigger-Pin zuvor erst mindestens für 10 μs ein High-Pegel anliegen. Im Anschluss auf die detektierte fallende Flanke, sendet das Modul 8 aufeinander folgende Ultraschallsignale, mit einer Frequenz von 40 kHz aus (Burst-Siganle). Diese Phase dauert 200 μs. Nachdem die Siganle ausgesendet wurden, wird der Echo-Pin sofort auf einen High-Pegel gesetzt und das Modul wartet auf die Rückkehr des Echos der Burst-Siganle. Wenn das Echo eintrifft, wird der Echo-Pin wieder auf einen Low-Pegel gesetzt. Die Triggerung des Trigger-Pins kann alle 20 ms erfolgen. Wenn kein Echo detektiert werden konnte, weil die Schallwelle zu großen teilen Absorbiert wurde, oder kein Hindernis in der nähe ist, so wartet das Modul 200 ms und zeigt die Erfolglose Messung somit an. Die Messung kann danach mit der fallenden Flanke am Trigger-Pin erneut gestartet werden.
Messgenauigkeit HC-SC04 Abstandssensor
Die Modulabhänige Messgenauigkeit, die mit 3 mm angegeben ist hängt mit der Abtastrate des Moduls zusammen. Des Weiteren ist bei Ultraschallmessverfahren die Temperatur der Umgebungsluft ein nicht unwesentlicher Faktor. Die Schallgeschwindigkeit in Luft bei 20 °C beträgt 343,5 m/s. Die Schallgeschwindigkeit lässt sich mit Hilfe der Formel:
Näherungsweise bestimmen, für den Temperaturbereich -20 °C bis 40 °C.
Es ist zu empfehlen, wenn größere Abstände genau ermittelt werden sollen, den HC-SR04 Ultraschallsensor mit einem Umgebungstemperatursensor zu koppeln und so die Schallgeschwindigkeit genauer bestimmen zu können.
Servomotor
Für dieses Projekt wurde der Servomotor SM-S2309S gewählt, da er mit der kleinen Bauform und geringen Stromaufnahme optimal die Bedingungen erfüllt um direkt vom Arduino Uno angesteuert zu werden. Des Weiteren verfügt der Servomotor über einen analogen Eingang mit dem man ihn an eine bestimmte Position verfahren kann. Der Servomotor kann in einem Bereich von 0 - 180° in 1° Schritten bewegt werden. Die Umdrehungen des Servomotors wird über ein kleines integriertes Getriebe auf eine Narbe übertragen, an dieser Narbe wird für das Projekt die Ultraschallsensorhalterung angebracht.
Programmierung
Die Umsetzung der Ansteuerung des Ultraschallsensors und des Servomotors sowie die Darstellung der Messergebnisse wird in zwei Teile unterteilt.
1. Ansteuerung des Servomotors und Ultraschallsensor mit Arduino IDE
2. Plot der Messergebnisse in Matlab
Die Kommunikation zwischen den beiden Programmteilen findet über die serielle Schnittstelle des Arduinos statt.
Für die Ansteuerung des Servos muss zunächst die Library "servo.h" eingebunden werden, um den Servo über die darin enthaltenen Funktionen ansteuern zu können. Danach muss ein Servo-Objekt erzeugt werden um im nachhinein den Servo über dieses Objekt anzusteuern. In der Setupfunktion des Arduinoprogramms wird die Baudrate für die serielle Buskommunikation auf 9600 Bd gesetzt. Im Anschluss daran werden die Anschlüsse für den Ultraschallsesor (Trigger = Output, Echo = Input) gesetzt. Ebenso wird mit der Funktion DrehServo.attach(9) der Pin für den Anschluss des Servomotors festgelegt. Der Anschluss muss auf einen PWM-Pin gelegt werde, da die Kommunikation mit dem Servo analog erfolgt.
Die Loop Finktion verfügt über zwei for-Schleifen, die ein Positionsvariable zwischen 0 - 180 inkrementieren und im Anschluss daran dekrementieren. Diese Positionsvariable wird mit der Funktion DrehServo.write() an den Servomotr zu übergeben. Der Servomotor richtet sich so aus, bis er die angegebenen Position erreicht hat. Die Stellung des Servomotors wird mit der Funktion DrehServo.read() ermittelt und an die serielle Schnittstelle übergeben, sowie ein Tennzeichen (Delimiter "/") übertragen. Der nächste Schritt ist die Erittlung der Distanzerkennung, mit Hilfe des Ultraschallsensors. Dafür wurde eine Funktion selbst erstellt GetUSRuntime(), welche die Laufzeit des Ultraschallsignals in Mikrosekunden zurück gibt. In der Funktion wird der Messablauf, wie oben beschrieben (Messablauf HC-SR04 Abstandssensor), angesteuert und die Signallaufzeit über die pulseIn(echo,HIGH) Funktion ermittelt. Wenn die steigende Flanke erkannt wird, wird die Laufzeit als Returnvariable zurück gegeben. Wie auch der Positionswikel wird auch die Siganllaufzeit an die serielle Schnittstelle übergeben, um von dem Matlab-Script ausgewertet werden zu können. Zum Ende der Loop Funktion wird ein Delay angestoßen, welches die Geschwindigkeit den Start des nächsten Loops verzögert um für den Ultraschallsensor den passenden Dutycycle zu gewährleisten.
Der zweite Teil der Programmierung findet in Matlab 2018b statt. In diesem Programmteil geht es hauptsächlich um die Darstellung der vom Arduino übermittelten Daten. Zu Beginn des Programms werden Variablen deklariert die für den weiteren Programmablauf benötigt werden z.B. Die maxiamle Reichweite die Dargestellt werden soll, oder der verwendete COM-Port. Es wird draufhin überprüft, ob ein serielles Objekt angeschlossen ist, welches Daten übermittelt. Wenn dies der Fall ist, wird ein serielles Objekt erzeugt, welches alle wichtigen Einstellungen für die serielle Kommunikation enthält. Wichtig ist, dass die Baudrate auf die im Arduinoprogramm eingestellte Baudrate angepasst wird, in diesem Fall 9600 Bd, 8 Data-Bits, kein Parity-Bit und ein Stop-Bit. Nachdem alle Einstellungen getätigt wurden wird mit fopen() die serielle Kommunikation gestartet.
Für die Darstellung der Messergebnisse wird eine Dauerschleife gestartet, in welcher zunächst der seriell übermittelte Datenstring in ein Variable geschrieben wird. Der Datenstring wird nun mit Hife eines Trennzeichens "/", welches im Arduinoprogramm zwischen den Winkelwert und den Laufzzeitwert eingesetzt wurde, in zwei Teile zerlegt. Diese beiden Teile befinden sich in einem Rohdaten-Array, indem an der ersten Stelle der Winkel und an der zweiten Stelle die entsprechende Laufzeit der Ultraschallmessung zu dem Winkel steht. Der Winkel wird an ein Winkel-Array übergeben, welches in jedem Schleifendurchlauf inkrementiert wird. Ebenfalls gibt es ein Distanz-Array, welches von der "ObjektEntfernung-Funktion" gefüllt wird.
Diese Funktion bekommt eine Laufzeit, eine Umgebungstemperatur und einen maximal zulässigen Abstand übergeben. Die Laufzeit wird in jedem Schleifenduchlauf aus dem Rohdaten-Array neu extrahiert. Die Umgebungstemperatur und der maximal zulässige Abstand sind konstanten, die für die Berechnung der Distanz vonnöten sind. In der Funktion wird zuerst die Schallgeschwindigkeit der Luft bei der angegebenen Temperatur berechnet, nach der Formel aus Abschnitt "Messungenauigkeiten HC-SR04 Abstandssensor" und im Anschluss daran findet die Distanzberechnung, nach der Formel aus Abschnitt "Prinziperklärung Ultraschallmessung" statt. Soll bei der Distanzmessung ein Distanzwert errechnet werden, der größer ist als der maximal zulässige Abstand wird der Distanzwert auf "NaN = Not a Number" gesetzt. Das resultiert im Plot später darin das kein Wert dargestellt wird.
Wenn nun die Daten für Winkel und Distanz beide vorliegen, wird die Funktion RadarPlot aufgerufen. Die Funktion bekommt das Laufzeit- und Winkel-Array, maximalen Abstand und einige Parameter die für die Darstellung der Grafik benötigt werden übergeben. Um den aufgenommenen Bereich der darzustellen, wird ein Polarplot gewählt. Diese Plotfunktion von Matlab benötigt einen Winkel Theta im Bogenmaß und ein Rho, welches in diesem Fall der Ultraschallmessabstand ist. Danach werden noch Ploteinstellungen für die Darstellung getätigt. Zum Abschluss der Funktion wird der Befehl "drawnow" aufgerufen, der dafür zuständig ist den Plot zur Laufzeit darzustellen.
Dadurch erhält man ein Matlab-Plot der zur Laufzeit die Werte die vom Arduino übermittelt werden darstellt.
Ergebnis
Zusammenfassung
Lessons Learned
Während des Projekts konnte die Erkenntnis gewonnen werden, dass während der Projektplanung immer Verzögerungen einkalkuliert werden sollten. Bei der Planung des Projekts wurde nicht berücksichtigt, dass Bauteile erst spät eintreffen könnten. Dadurch, dass die benötigten Teile erst Mitte Dezember ankamen, haben sich der Bau der Station sowie die ersten Tests verzögert. Somit musste der geplante Ablauf des Projekts ein wenig umstrukturiert werden, was aufgrund des noch vorhandenen Zeitfensters von fünf Wochen allerdings noch ein lösbares Problem war. Trotzdem konnte daraus gelernt werden, in der Zukunft solche Verzögerungen einzurechnen und sich möglicherweise einen „Plan B“ aufzustellen.
Außerdem kann aus dem Projekt mitgenommen werden, dass sich vorher ausgiebig über Verfahren informiert werden sollte, die während des Projekts benutzt werden. So wurde im Projekt das 3D-Druck Verfahren angewendet, über welches nur wenige Vorkenntnisse vorhanden waren. Dadurch kam es zu Schwierigkeiten, da die Genauigkeit des 3D-Druckers falsch eingeschätzt wurde, weshalb viele Konstruktionslöcher zu klein waren und nachbearbeitet werden mussten.
Außerdem wurde in dem Projekt festgestellt, dass für eine Kommunikation mit dem Arduino über einen COM-Port dieser im Vorhinein freigegeben werden muss. Dies führte bei der Programmierung zu erheblichen Problem, bei denen die Fehlerursache darin lag, dass der selbe COM-Port von der Arduino IDE und dem Matlab-Script verwendet wurde. Dieses Problem ließ sich durch explizietes Freigeben des COM-Ports nach dem Aufspielen des Arduinoprogramms lösen.
Projektunterlagen
Direktlink zum SVN-Ordner: Projekt 89: Sonarstation
YouTube Video
Weblinks
Literatur
→ zurück zur Übersicht: WS 18/19: Fachpraktikum Elektrotechnik (MTR)