Bachelorarbeit - OPUS HHN · allen anderen Raspberry Pis [8]. Mit weniger als 40 e ist der...

70

Transcript of Bachelorarbeit - OPUS HHN · allen anderen Raspberry Pis [8]. Mit weniger als 40 e ist der...

Bachelorarbeit

Mobile Signalverarbeitung auf dem Raspberry Pi mit Aspekten derVernetzung mehrerer Messgeräte

Ste�en Fröhlich

27.04.2016 - 17.08.2016

Inhaltsverzeichnis

1 Abkürzungsverzeichnis 3

2 Einleitung 5

3 Aufgabenbeschreibung 7

4 Der Raspberry Pi 7

5 Das Geiger-Müller-Zählrohr 9

5.1 Eigenschaften . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95.2 Geiger-Shield für Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . 105.3 Spezi�kation des Zählrohrs . . . . . . . . . . . . . . . . . . . . . . . . . . . 105.4 Umrechnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

6 Methoden 12

6.1 Inbetriebnahme Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . 126.2 Signalverarbeitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156.3 Webserver und JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206.4 Vernetzung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256.5 Secure Copy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256.6 Cronjob . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276.7 Router . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286.8 Code-Review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346.9 Zeitsynchronisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

7 Ergebnis 38

7.1 Signalform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387.2 Messversuch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387.3 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

8 Diskussion und Ausblick 42

9 Literaturverzeichnis 45

10 Anhang 50

10.1 Python-Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5010.2 Web-Server-Dateien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6210.3 Abbildungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

11 Eidesstattliche Erklärung 69

2

1 Abkürzungsverzeichnis

Nicht aufgeführt sind SI-Einheiten, deren Symbole, sowie Zeichen und Kürzel ausmathematischen, chemischen und physikalischen Formeln.

AJAX Asynchronus JavaScript and XML

cpm count per minute

cps counts per second

CSI Camera Serial Interface

CSS Cascading Style Sheets

DHCP Dynamic Host Con�guration Protocol

DNS Domain Name System

DSI Display Serial Interface

FTP File Transfer Protocol

GPIO General Purpose Input Output

GPS Global Positioning System

GPU Graphics Processing Unit

HDMI High De�nition Multimedia Interface

hostapd Host-Access-Point-Deamon

HTML Hypertext Markup Language

IP Internet Protocol

I2C Inter-Integrated Circuit

JSON JavaScript Object Notation

LAN Local Area Network

MAC Media Access Control

SCP Secure Copy

SPI Serial Peripheral Interface

SSH Secure Shell

SSID Service Set Identi�er

3

SVG2 Strahlenspür- und Verstrahlungsmessgeräteausstattung 2

WLAN Wireless Local Area Network

XML Extensible Markup Language

4

2 Einleitung

Bei dem Raspberry Pi handelt es sich um einen Einplatinen-Computer, welcher sich seitdem Verkaufsstart im Jahr 2012 sehr groÿer Beliebtheit erfreut. Nicht zuletzt aufgrunddes hohen Grades an Kompatibilität und der groÿen Online-Community wurden biszum heutigen Tage unzählige Projekte realisiert. In der Zwischenzeit ist der RaspberryPi in verschiedenen Anwendungsgebieten und Branchen anzutre�en. Dies ist insoferninteressant, da dieser ursprünglich für den Einsatz in Bildungseinrichtungen auf Basiseiner Stiftung entwickelt wurde [1]. Dabei stellen Anwendungen wie eine Smart-HomeSteuerung, ein Multimedia-Center oder eine Wetterstation nur einen Bruchteil derMöglichkeiten dar. Grundlage dieser vielfältigen Anwendungsgebiete ist die Unterstüt-zung sämtlicher standardisierter Hard- und Software-Schnittstellen, zum Beispiel USB,Audio-Klinke, Serial Peripheral Interface (SPI) oder Inter-Integrated Circuit (I2C).Dadurch wird die Einbindung von beispielsweise Global Positioning System (GPS)-Modulen, Wireless Local Area Network (WLAN)-Empfängern oder sogar der eigenenSpiegelre�exkamera ermöglicht. Weiterhin ist mit Hilfe eines Mikrofons die Entwicklungeiner Sprachsteuerung denkbar. Der mögliche Anwendungsbereich des Raspberry Pigeht noch weit über die hier genannten Beispiele hinaus. Eine der Schnittstellen desRaspberry Pi stellen die sogenannten General Purpose Input Output (GPIO)-Portsdar. Hierbei handelt es sich um analoge und digitale Ein- und Ausgänge worüberHardware-Komponenten direkt auf physikalischer Ebene eingebunden werden können.

Der Raspberry Pi eignet sich auch zum Nachweis radioaktiver Strahlung. Ziel derArbeit soll die Entwicklung eines Gerätes zur Messung der Strahlendosis sein. Dazugehört die Verwendung eines Geiger-Müller-Zählrohrs, welches mittels eines ArduinoShields ansprechbar ist. Weiterhin sollen im Rahmen dieser Arbeit verschiedene Mög-lichkeiten zur Weiterentwicklung des Systems betrachtet werden.

Das Geiger-Shield, zu dem das Geiger-Müller-Zählrohr und das Arduino-Shieldgehören, wurden von dem Hardware-Hersteller Libelium im Jahr 2011 entwickelt. An-lass war der Tsunami in Japan, welcher die Atom-Katastrophe von Fukushima nach sichgezogen hat [2]. Das Geiger-Shield sollte den Alltag der Menschen in Japan vereinfachen,indem sie selbst die Strahlendosis messen konnten. Mit einem Mikrocontroller, einemeinfachen LC-Display und einem Akku konnte so jederzeit die aktuelle Strahlendosisbestimmt werden.

5

Eine Möglichkeit der Bundeswehr, um Strahlendosen zu messen, ist die Strahlenspür-und Verstrahlungsmessgeräteausstattung 2 (SVG2) [3]. Dazu gehört ein handgetragenesStrahlendosismessgerät, mit welchem eine Einsatztruppe nach Kontaminationen suchenkann. An diesem Punkt setzt diese Bachelorarbeit an. Es soll eine Möglichkeit gefun-den werden, mit einfachen Mitteln ein Strahlendosismessgerät zu entwickeln, wobei dieHandhabung verbessert und möglichst keine Person einer unnötig hohen Strahlenbelas-tung ausgesetzt werden soll. Zusätzliche Aspekte sollen die Verwendung kostengünstigerBauteile, sowie ein geringes Gesamtgewicht sein.

6

3 Aufgabenbeschreibung

Zunächst soll die Signalform eines Zählimpulses analysiert werden. Darauf aufbauendsoll der Zählimpuls anhand eines Schwellwertes registriert und angemessen dargestelltwerden. Anschlieÿend kann die Strahlendosis berechnet und somit eine Strahlendosis-messgerät entwickelt werden. Dieses soll mobil einsetzbar, dabei möglichst leicht und mitgeringem �nanziellem Aufwand umsetzbar sein. Dieses Messgerät könnte beispielsweisean eine Drohne befestigt werden, um nicht Personen einer vermeidbaren Strahlenbelas-tung auszusetzen. Daraus folgt, dass ein Weg gefunden werden muss, die gemessenenDosiswerte einem entfernten Benutzer zu präsentieren. Anschlieÿend soll eine möglicheVernetzung mehrerer Messgeräte betrachtet werden, wobei auf verschiedene Aspekte,zum Beispiel die Datenübertragung oder die Zeitsynchronisation, eingegangen werdensoll.

4 Der Raspberry Pi

Der Raspberry Pi ist ein Einplatinen-Computer, der von der Raspberry Pi

Foundation entwickelt und durch die Raspberry Pi Trading produziert undvermarktet wird. Zu kaufen gibt es den Raspberry Pi laut Herstellerseite über dreiVertriebspartner [4], man �ndet ihn aber auch bei vielen anderen Händlern im Sortiment.

Die Raspberry Pi Foundation ist eine gemeinnützige Organisation, die es sich zumZiel gesteckt hat, Kindern und Neueinsteigern einen günstigen PC anzubieten, mit demsie experimentieren und erste Programmierkenntnisse sammeln können [1].

Produktübersicht

Bis jetzt gibt es drei Generationen an Raspberry Pis. Die Gemeinsamkeiten liegen vorallem in der Gröÿe. Alle Raspberry Pis haben dieselben Maÿe: Länge = 93 mm; Breite= 63,5 mm; Höhe = 20 mm. Was das Gewicht betri�t, so liegen mit 40-45 Gramm alleModelle im gleichen Bereich. Auch preislich bewegen sich die Fabrikate bei ca. 35e. Dieeinzelnen Unterschiede werden im folgenden behandelt:

1. Generation

Der Raspberry Pi 1 Model B+ ist die letzte Version der ersten Generation. Dieser besitztden Einkernprozessor ARM1176JZF-S, welcher mit 700 MHz getaktet ist. Es gibt 40Pins, 26 davon sind GPIO-Pins, einen Ethernet-Adapter sowie 4 USB-Schnittstellen.Weitere Schnittstellen sind einzelne Camera Serial Interface (CSI)-, Display Serial Inter-face (DSI)- und I2C-Schnittstellen, sowie ein 3,5 mm Klinkenstecker für Audioausgabenund eine High De�nition Multimedia Interface (HDMI)-Schnittstelle für Videoausgaben[5].

7

2. Generation

Die letzte Version der zweiten Generation ist der Raspberry Pi 2 Model B. Dieserwurde mit einem ARM Cortex-A7-Vierkernprozessor ausgestattet, welcher mit 900MHz getaktet ist. Zusätzlich wurde der Arbeitsspeicher auf 1024 MB erhöht. DieSchnittstellen sind die Gleichen wie bei der ersten Generation [6].

3.Generation

Die aktuell neueste Generation ist der Raspberry Pi 3 Model B. Dieser wurde wiedermit einem neuen Prozessor ausgestattet, dem ARM Cortex-A53, der auf 1200 MHzgetaktet ist. Der Arbeitsspeicher und die Schnittstellen blieben unverändert im Vergleichzum Vorgänger (2. Generation). Neu hinzu kamen eine integrierte WLAN-Schnittstellesowie eine Bluetooth 4.1-Schnittstelle [7].

Raspberry Pi Zero

Etwas abseits muss der Raspberry Pi Zero erwähnt werden. Dieser wurde zeitgleich mitder ersten Generation entwickelt ist jedoch deutlich kleiner und wiegt etwa 9 Gramm. Erbesitzt den gleichen Prozessor, wie in der ersten Generation verwendet wurde, ist jedochmit 1000 MHz höher getaktet. Des Weiteren besitzt er nur eine USB-Schnittstelle undkeinerlei Netzwerkschnittstellen. Er hat einen Arbeitsspeicher von 512 MB und dieselbePinbelegung (siehe 1. Generation), sowie eine CSI- und eine I2C-Schnittstelle. SpeziellenWert wurde bei der Entwicklung auf den Stromverbrauch gelegt, der geringer ist als beiallen anderen Raspberry Pis [8].

Mit weniger als 40e ist der Raspberry Pi relativ günstig. Auf der Herstellerseite wird ineinzelnen Schritten die Inbetriebnahme erklärt, aber auch Beispiel-Projekte werden vor-gestellt [9]. Sieht man auf der Herstellerseite keinen Lösungsansatz, so gibt es ZahlreicheErfahrungsberichte im Netz, sodass man für nahezu jedes Problem einen Lösungsansatz�ndet. In diesem Projekt wurde der Raspberry Pi der zweiten Generation verwendet, ausdem einfachen Grund, dass davon schon zwei in meinem Besitz waren. Generell lässt sichdas Projekt mit jeder Generation von Raspberry Pis umsetzen.

8

Abbildung 1: Aufbau eines Zählrohrs [10, S. 46]

5 Das Geiger-Müller-Zählrohr

5.1 Eigenschaften

Ein Geiger-Müller-Zählrohr ist eine gasgefüllte Röhre. Durch Ionisation im gasgefülltenZählvolumen erzeugt einfallende Strahlung Elektronen und Ionen. Der Aufbau eines Zähl-rohrs ist in Abbildung 1 zu sehen. Je nach Ladung driften die durch Ionisation erzeugtenLadungsträger zur Anode oder Kathode. Wenn Elektronen auf ihrem Weg zum Zähl-draht einen Energiebetrag aus dem elektrischen Feld aufnehmen, der gröÿer ist als dieIonisationsenergie, kommt es zu einer lawinenartigen Vermehrung der Ladungsträger.Dieser Vorgang wird Gasverstärkung genannt. Unabhängig von Art und Energie dereinfallenden Teilchen, sind die erzeugten Signale alle gleich groÿ. Deshalb lassen sichkeine verschiedenen Teilchen mit dem Geiger-Müller-Zählrohr unterscheiden, jedoch istdie Signalanalyse einfacher. Beachtet werden muss, dass sich niederenergetische α- undβ-Teilchen nur schwer detektieren lassen, da diese bereits in der Gehäusewand absor-biert werden. Um dies zu verhindern müsste man o�ene Zählrohre verwenden [10, Seiten44-47].

9

5.2 Geiger-Shield für Arduino

In diesem Projekt wurde ein Geiger-Shield für den Arduino verwendet. Hergestelltwird dies von Libelium, einem Hardware-Hersteller für Mikrocontroller. Dazu gehörtauch das Radiation Sensor Board, welches die nötige Spannung für den Betrieb einesZählrohrs liefert. Des Weiteren überträgt es die elektrischen Impulse des Zählrohrs anden Mikrocontroller.

Zusätzlich wird ein Zählrohr benötigt. In diesem Projekt wird das Geiger-ZählrohrJ305β verwendet, welches es auf www.cooking-hacks.com zu kaufen gibt. Über dieseWebsite verkauft der Hersteller Libelium seine Produkte. Die Entscheidung �el aufdieses Produkt, da es für dieses Projekt aufgrund seiner Gröÿe sehr geeignet und schonim Besitz der Hochschule war.

Zusätzlich wird ein Connection-Board benötigt, damit man das Arduino-Shield aufden Raspberry Pi aufstecken kann. Dieses ist ebenfalls vom Hersteller Libelium undwurde speziell für den Raspberry Pi 1 entwickelt. Dadurch kommt es auf dem RaspberryPi 2 zu Platzproblemen, die mit einem kleinen Zwischenstück gelöst wurden. DerHersteller liefert zusätzlich eine Software-Bibliothek aus, womit auf dem Raspberry PiArduino-Code geschrieben und ausgeführt werden kann [11]. Auch fertige Methoden, umauf das Zählrohr zuzugreifen, sind bereits enthalten. Diese Bibliothek wurde jedoch nichtfür dieses Projekt verwendet, da diese nur sehr wenige Freiheiten lässt. Auÿerdem war esein Vorhaben meinerseits, sich mit einer neuen Programmiersprache auseinanderzusetzen.

Das Zählrohr muss mit einem radioaktiven Sto� kalibriert werden. Das verwendeteZählrohr wurde mit Cobalt-60 (60Co) kalibriert und liefert somit nur korrekte Werte fürdiesen Sto� und in einer bestimmten Entfernung vom Zählrohr. Unter welchen Umstän-den genau das Zählrohr kalibriert wurde, ist nicht bekannt.

5.3 Spezi�kation des Zählrohrs

Hersteller: North Optic

Detektierte Strahlung: β,γ

Länge: 111 mm

Durchmesser: 11 mm

Empfohlene Spannung: 350 V

Max. cpm: 30000 (count per minute (cpm))

γ-Emp�ndlichkeit (60Co): 65 cps/(µR/s) (counts per second (cps))

Ein Auszug der Spezi�kation ist im Kapitel 14 auf Seite 66 zu �nden.

10

5.4 Umrechnung

Das Geiger-Müller-Zählrohr detektiert lediglich einzelne Impulse. Um eine Aussage überdie Strahlenbelastung tre�en zu können, benötigt man die Dosisleistung in der EinheitµSv/h (Mikrosievert pro Stunde). Dazu werden Impulse gezählt und anschlieÿend miteinem Umrechnungsfaktor multipliziert. Dieser ist abhängig von den Eigenschaften desZählrohrs, der Gröÿe, der Form, des Materials, der Emp�ndlichkeit, den gemessenenTeilchen, usw. Im Allgemeinen kann der Umrechnungsfaktor aus Tabellen des Herstellersabgelesen werden. Die Werte beziehen sich dabei auf den Sto�, mit dem das Zählrohrursprünglich vom Hersteller kalibriert wurde.

Der Umrechnungsfaktor für das verwendete Zählrohr, welches mit 60Co kalibriertwurde, beträgt 0, 008120. Folgendermaÿen kommt man auf diesen Wert:

Aus der Spezi�kation lässt sich ablesen, dass die γ-Emp�ndlichkeit für 60Co 65cps/(µR/s) beträgt. Diesen Wert rechnet man um in cps/mR/h [11]:

1µR/s = 65cps→ 1mR/s = 65000cps→ 1mR/h = 18cps

Anschlieÿend noch:

18cps/mR/h→ 1080cpm/mR/h

Da 1mR = 8, 77µSv für Wasser gilt:

1080/8, 77cpm/µSv/h = 123, 14cpm/µSv/h

Woraus wiederum folgt:

1cpm ∼ 1/123, 14 = 0, 008120µSv/h

Dieser Umrechnungsfaktor stimmt für 60Co. Möchte man andere Sto�e messen, mussdas Zählrohr neu kalibriert und ein neuer Umrechnungsfaktor bestimmt werden. Zu-dem muss beachtet werden, dass der Umrechnungsfaktor nur für Counts per minute

stimmt.Soll aus einem Zählintervall von 10s eine Dosis bestimmt werden, so muss derUmrechnungsfaktor ebenfalls angepasst werden.

11

6 Methoden

6.1 Inbetriebnahme Raspberry Pi

Die Schritte, die in diesem Unterkapitel durchgeführt werden, sind Basiswissen imUmgang mit dem Raspberry Pi. Dieses habe ich mir selbst mit Hilfe eines Tutorials [12]angeeignet.

Zu Beginn der Bearbeitung wurde der Raspberry Pi in Betrieb genommen. Dazuwird ein Betriebssystem benötigt. Dieses bekommt man direkt über die Website derRaspberry Pi Foundation (www.raspberrypi.org). Das Rasbian ist ein speziell für denRaspberry Pi entwickeltes Betriebssystem, welches auf der Linuxdistribution Debian ba-siert. Daraus folgt, das Linux-Grundkenntnisse benötigt werden, um mit dem RaspberryPi umgehen zu können. Zum Zeitpunkt der Bearbeitung war das neueste Betriebssys-tem das Rasbian Jessie (Erschienen am 27.05.2016). Dieses muss bit-genau auf eineMicroSD-Karte kopiert werden. Unter Windows kann dies mit dem Win32DiskImager

gemacht werden. Daraus lässt sich schlieÿen, dass jeder Raspberry Pi eine SD-Kartebenötigt. Bei den neueren Modellen ist immer eine MicroSD-Karte. In diesem Projektwurde eine 16 GB groÿe MicroSD-Karte benutzt, wobei noch Speicherplatz übrig blieb.Sollte der Speicherplatz erschöpft sein, ist es problemlos möglich einen USB-Stick odereine Festplatte anzuschlieÿen.

Zur Bearbeitung dieses Projekts benötigt man zwingend eine Internetverbindung.Dafür sollte der Raspberry Pi mit einem Local Area Network (LAN)-Kabel an eineninternetfähigen Router angeschlossen werden. Man kann den Raspberry Pi auch übereinen WLAN-Stick mit dem Router verbinden, wozu der WLAN-Stick kon�guriert wer-den muss. Dafür gibt es zwei Möglichkeiten:

Tastatur, Maus und Bildschirm

Über eine angeschlossene Maus, Tastatur und einen Bildschirm lässt sich dieBenutzerober�äche des Raspberry Pi einsehen und benutzen. Darüber können Ein-gaben vorgenommen werden und man erhält gra�sche Rückmeldungen. Dies istgeeignet für Personen, die nicht allein mit textbasierten Eingaben arbeiten möch-ten. Da der Raspberry Pi keine sonderlich leistungsstarke Graphics ProcessingUnit (GPU) besitzt, nimmt die Generierung der Ober�äche viel Rechenleistungein und macht den Raspberry Pi langsam.

Secure Shell und PuTTY

Die bevorzugte Möglichkeit, die auch im Projekt verwendet wird, ist die SecureShell (SSH). Die SSH ermöglicht es, verschlüsselte Verbindungen zu Geräten imselben Netzwerk herzustellen. Nachdem man eine Verbindung über einen SSH-Client aufgebaut hat, lässt sich der Raspberry Pi über einenTerminal steuern [13].In dieser Arbeit wurde der Client PuTTY genutzt. Durch dieses Vorgehen lassensich alle verwendeten Raspberry Pis von einem PC aus steuern und verwalten.

12

Der Raspberry Pi wird nun an die Stromversorgung angeschlossen. Vom Herstellerwird für alle Modelle ein MicroUSB-Netzteil mit einem Ausgangsstrom von 2 Ampereund einer Ausgangsspannung von 5 Volt empfohlen. Dadurch ist gewährleistet, dassalle Schnittstellen mit genügend Strom versorgt werden. Um eine spätere Mobilität zuerreichen wird eine Powerbank verwendet, um den Raspberry Pi mit Strom zu versorgen.

Das Betriebssystem wird automatisch gestartet und man kann sich direkt auf demRaspberry Pi einloggen. Dazu wird der Standardbenutzer �pi� und das Passwort�raspberry� eingegeben. Möchte man sich über SSH auf dem Raspberry Pi einloggen,muss zunächst die Internet Protocol (IP)-Adresse des Raspberry Pi über den Routerherausgefunden werden. Mit dieser kann über PuTTY eine Verbindung hergestellt undsich mit den genannten Zugangsdaten eingeloggt werden.

Im nächsten Schritt sollten die Grundeinstellungen des Raspberry Pi kon�guriert wer-den. Dies geschieht über den Befehl:

1 sudo rasp i−c on f i g

Folgende Einstellungen sollten getätigt werden:

• Expand Filesystem

• Change Userpassword (bei Bedarf)

• Unter Internationalisation Options die Punkte Change Locale undChange Timezone

Anschlieÿend wird das Betriebssystem auf den neuesten Stand gebracht. Dies geschiehtmit den Befehlen:

1 sudo apt−get update2 sudo apt−get upgrade

Nach einem Update muss der Raspberry Pi neu gestartet werden und ist dann einsatz-bereit.

Der Raspberry Pi lässt sich zunächst nur über die LAN-Verbindung ansprechen. Umden Raspberry Pi in der Nähe des Routers frei bewegen zu können, wurde ein WLAN-Stick kon�guriert. Der verwendete WLAN-Stick ist der sehr kleine und preiswerte EdimaxEW-7811UN. Er wird häu�g in Kombination mit dem Raspberry Pi genutzt und bieteteine Übertragungsgeschwindigkeit von bis zu 150 Mbits/s [14]. Über:

1 sudo nano / etc /network/ i n t e r f a c e s

ö�net man als Super-User die Kon�gurationsdatei für die Netzwerkschnittstellenin einem Texteditor. Hier setzt man die Kon�guration und einen Verweis auf dieDatei �wpa_ supplicant.conf�, wie sie in Abbildung 2 zu sehen ist. In der Datei�wpa_ supplicant.conf� können alle Netzwerke eingetragen werden, mit denen der

13

Abbildung 2: Dateiinhalt /etc/network/interfaces

WLAN-Stick eine Verbindung aufzubauen soll. Es werden alle eingetragenen Netzwerk-verbindungen überprüft, bis eine erfolgreich ist. Wie diese Datei aussehen kann ist inAbbildung 3 auf Seite zu sehen. Um herauszu�nden welche Kon�guration für die einzel-nen Netzwerke vorgenommen werden muss, lassen sich über den Befehl:

1 sudo i w l i s t scanning

alle Details zu allen Netzwerken in der Umgebung anzeigen. Anschlieÿend müssen dieRechte für die Datei �wpa_supplicant.conf� geändert werden, damit diese für jeden Be-nutzer lesbar ist:

1 sudo chmod 666 / e tc /wpa_supplicant/wpa_supplicant . conf

Der Raspberry Pi wird neu gestartet und die LAN-Verbindung kann getrennt werden.Über den Router lässt sich die neue IP-Adresse des Raspberry Pi auslesen.

14

Abbildung 3: Dateiform für Netzwerke mit denen Verbindungen aufgebaut werdenkönnen

6.2 Signalverarbeitung

In diesem Abschnitt wird die Entwicklung eines Programms betrachtet, mit dem sichSignale eines Geiger-Müller-Zählrohrs detektieren, verarbeiten und speichern lassen.Zunächst musste der GPIO-Port bestimmt werden, mit dem sich Signale detektierenlassen. Auf dem Arduino wird dazu laut Hersteller der Digital-Pin Zwei genutzt [11].Durch das Connection-Board wird das Signal auf dem GPIO-Pin Zwölf des RaspberryPi weitergegeben. Da dies auf keiner Herstellerseite steht wurde dies durch ausprobierenherausgefunden.

Python

Für die Signalverarbeitung wurde die Programmiersprache Python genutzt. Mit Pythonlässt sich gut lesbarer Code schreiben, mit dem die Signalverarbeitung e�zient gestaltetwerden kann. Python sollte auf einer Linux-Distribution vorinstalliert sein, um dies zugewährleisten kann der Befehl:

1 sudo apt−get i n s t a l l python

genutzt werden. Falls die Software schon installiert war, wird sie auf den neuesten Standgebracht. Anschlieÿend lässt sich über:

1 sudo nano dateiname . py

eine Pythondatei erzeugen, in die Programmcode geschrieben werden kann. Mit:

1 sudo python3 dateiname . py

lässt sich Python-Code ausführen.

15

Beim Umstieg von Python 2.x auf Python 3.x wurden einige Funktionen geändert, umdie Performance zu erhöhen und den Speicherplatz besser nutzbar zu machen [15]. Umkeine Kompatibilitätsprobleme zu riskieren wurde speziell Python3 angegeben und nurPython3-Code geschrieben.

Signalform und Interrupt

Um eine Signalinterrupt im Programm richtig zu behandeln, musste die Signalformbestimmt werden. Der Raspberry Pi wurde mit dem Geiger-Shield an einen Oszillatorangeschlossen, um ein Standbild eines Ausschlags zu erzeugen. Es wurde eine allgemeineSignalform detektiert, die in Abbildung 4 zu sehen ist. Eine Auswertung dazu be�ndetsich im Kapitel 7.1 auf Seite 38. Entsprechend der Signalform wird im Programmcodeder Pin Zwölf so kon�guriert, dass dieser auf eine fallende Flanke reagiert und einenInterrupt auslöst. Aufgrund dieses Interrupts wird wiederum eine Methode aufgerufen,mit der später ein Zähler inkrementiert wird. Um dies zu realisieren wurden diePython-Bibliotheken RPi.GPIO [16] und signal [17] genutzt. Der Codeabschnitt dazuist in Listing 1 zu sehen.

Abbildung 4: Signalform beim Detektieren eines Teilchens (Kennzeichnung 1 auf der Y-Achse entspricht 0V (GND))

16

1 # Eigene Bib l io thek , d i e e inen e i n f a che Zaeh le r implement ie r t2 import ge igerCounter3

4 import RPi .GPIO as GPIO5

6 # Setz t Nummerierung der GPIO−Ports so , das auf dem RaspberryPi e i n f a ch durchgezaeh l t werden kann

7 GPIO. setmode (GPIO.BOARD)8

9 # Auf diesem Pin wird das S i gna l r e g i s t r i e r t10 g e i g e r = 1211

12 # GPIO−Pin fu e r f a l l e n d e Flanke i n i t i a l i s i e r e n13 GPIO. setup ( ge i ge r , GPIO. IN , pull_up_down=GPIO.PUD_DOWN)

Listing 1: Kon�guration des GPIO-Ports und Methode zur Registrierung eines Signals

Multiprocessing

Zur e�zienteren Gestaltung des Programms, wurde die Python-Bibliothekmultiprocessing eingesetzt. Diese Bibliothek ermöglicht es, parallele Prozessezu starten [18]. Ein Prozess wird gestartet, der ausschlieÿlich für das Detektierenvon Interrupts verantwortlich ist und einen Zähler inkrementiert. Weitere Prozessewerden gestartet, die in verschiedenen Intervallen Messungen durchführen. Als Beispielwurde ein Prozess mit einem Intervall von 10 Sekunden und ein Prozess mit einemIntervall von 60 Sekunden programmiert (siehe Listing 2). Beide Prozesse erzeugenihren eigenen Zähler, die jeweils vom Interrupt-Prozess inkrementiert werden. DiesesVorgehen ist im Code-Abschnitt Listing 3 abgebildet. Die Prozesse warten ihre In-tervallzeit ab und lesen dann den Zählerstand ab. Aus dem gelesenen Wert wird eineDosis berechnet und der Zähler auf null zurückgesetzt. Die Zähler wurden in einemextra Python-Skript implementiert. Der Quellcode ist in Listing 11 auf Seite 55 zu �nden.

17

1 # I n t e r v a l l z e i t wird f e s t g e l e g t2 s l e ept imeSec = 103 s leept imeMin = 604

5 """Methode , a l l e zehn Sekunden d i e Methode ca l cu la te_dose ( )f u e r e inen Zaeh le r au f r u f t . Nach 6 sechs durch laeu fen wirde ine Mitte lwertberechnung i n i t i a l i s i e r t """

6 de f timekeeperTenSec ( ) :7 name=mul t i p r o c e s s i ng . current_process ( ) . name8 pr in t ( "Process " , name , " s t a r t ed " )9 whi le True :

10 tenSecValues =[ ]11 f o r i in range (1 , 7 ) :12 time . s l e e p ( s l e ept imeSec )13 tenSecValues . append ( ca l cu la te_dose (1 ) )14 calc_mean_val ( tenSecValues )15

16 """Methode , d i e a l l e 60 Sekunden d i e Methode ca l cu la te_dose ( )au f r u f t """

17 de f timekeeperOneMin ( ) :18 name=mul t i p r o c e s s i ng . current_process ( ) . name19 pr in t ( "Process " , name , " s t a r t ed " )20 whi le True :21 time . s l e e p ( s leeptimeMin )22 ca l cu la te_dose (2 )23

24

25 de f main_methode ( )26 # Prozesse i n i t i a l i s i e r e n27 process_1 = mul t i p r o c e s s i ng . Process (name=" de t e c t o r " ,

t a r g e t=detect_events )28 process_2 = mul t i p r o c e s s i ng . Process (name="timekeeper_1"

, t a r g e t=timekeeperTenSec )29 process_3 = mul t i p r o c e s s i ng . Process (name="timekeeper_2"

, t a r g e t=timekeeperOneMin )30

31 # Prozesse s t a r t en32 process_1 . s t a r t ( )33 process_2 . s t a r t ( )34 process_3 . s t a r t ( )

Listing 2: Prozesse die in einem bestimmten Intervall eine Berechnung auslösen

18

1 # Zaehler werden d e f i n i e r t2 secCounter = ge igerCounter . Counter ( )3 minCounter = ge igerCounter . Counter ( )4

5 """Methode , d i e auf den In t e r rup t durch e ine f a l l e n d e Flankewarted und an s ch l i e s s end d i e Methode count ( ) au f r u f t """

6 de f detect_events ( ) :7 name=mul t i p r o c e s s i ng . current_process ( ) . name8 pr in t ( "Process " , name , " s t a r t ed " )9 GPIO. add_event_detect ( ge i ge r ,GPIO.FALLING, ca l l b a ck=

count )10 s i g n a l . pause ( )11

12 """Methode , d i e d i e d e f i n i e r t e n Zaeh le r ink r ement i e r t """13 de f count ( pin ) :14 g l oba l secCounter15 g l oba l minCounter16 secCounter . increment ( )17 minCounter . increment ( )18 pr in t ( datet ime . datet ime . now( ) . s t r f t ime ( '%Y−%m−%d %H:%M

:%S.% f ' ) [ : −3 ] , "Detected counts l a s t minute : {}" .format (minCounter . getValue ( ) ) , "Last ten seconds : {}" . format ( secCounter . getValue ( ) ) )

Listing 3: Detektions-Prozess der die Zähler inkrementiert

Dosisberechnung

Die Dosisberechnung �ndet, je nach Intervalllänge, mit einem angepassten Umrech-nungsfaktor (siehe Kapitel 5.4) statt. Dazu wurde der Programmcode um die Methodecalculate_dose erweitert (siehe Listing 4 auf Seite). Zusätzlich wird im Zehn-Sekunden-Intervall ein Mittelwert für die letzte gemessene Minute berechnet (sieheListing 5).

Anzeigen der Messergebnisse

Um die Messwerte in geeigneter Form anzuzeigen gibt es mehrere Möglichkeiten, die hierdiskutiert werden.

Terminal

Die einfachste Umsetzung wäre eine textbasierte Ausgabe im Terminal. Dabei wer-den die Werte allerdings unübersichtlich dargestellt und lassen sich schwer nach-vollziehen. Diese Methode kann zur Überprüfung der Messergebnisse während derEntwicklungsphase eingesetzt werden.

19

Graphical User Interface (GUI)

Es ist möglich mit Python eine Benutzerober�äche zu programmieren, die auf einemangeschlossenen Bildschirm angezeigt wird. Dabei kann man sich die Ober�äche aufeinem anderen PC im selben Netzwerk anzeigen lassen, bei Windows zum BeispielüberRemote-Desktop. Aber wie schon in Kapitel 6.1 beschrieben, ist die Rechen-leistung des Raspberry Pi nicht hoch genug um die Benutzerober�äche ruckelfreizu generieren.

Webober�äche

Die dritte Variante ist eine webbasierte Ausgabe. Dabei kommt ein Web-Serverzum Einsatz, mit dem die gemessenen Werte in eine Website eingep�egt werden.Die Website kann von einem beliebigen Client aufgerufen werden, auf dem einBrowser installiert ist. Dabei muss der Raspberry Pi keine Ober�äche generieren,er sendet lediglich eine Hypertext Markup Language (HTML)-Datei an den Client.

In diesem Projekt wurde ein Web-Server eingesetzt, da hier eine hohe Flexibilitätgegeben ist. Im Hinblick auf eine spätere Vernetzung lässt sich damit eine zentraleAusgabe der Messwerte realisieren. Zudem lässt sich eine Website von unterschiedlichstenEndgeräten aufrufen.

6.3 Webserver und JSON

Auf dem Raspberry Pi installiert man einen Web-Server, indem man den Befehl:

1 sudo apt−get i n s t a l l apache2

eingibt. Der Web-Server von Apache ist damit schon einsatzbereit. Überprüfen kannman dies indem man über die IP-Adresse des Raspberry Pi die Standardseite desWeb-Servers aufruft. Dazu wird im Browser eines PCs, der sich in dem selben Netzwerkwie der Raspberry Pi be�ndet, die Adresse �127.0.0.2/index.html� (IP-Adresse mussangepasst werden) eingegeben und die Standardseite wird geladen (siehe Abbildung 15auf Seite 67).

Anschlieÿend können im Ordner �/var/www/html� alle Dateien der Website erzeugtund gespeichert werden. Zunächst wird eine HTML-Datei erstellt, in der die Strukturder Website de�niert wird [19]. Auÿerdem wird eine Cascading Style Sheets (CSS)-Dateierzeugt, womit das Aussehen der Website bestimmt werden kann [20]. Über:

1 sudo nano /var /www/html webs i te . html2 sudo nano /var /www/html s t y l e . c s s

lassen sich die HTML- und CSS-Datei erzeugen. In dieser Arbeit wurde eine einfacheWebsite programmiert, die nur den Zweck der Anzeige erfüllen soll (siehe Abbildung5). In der HTML-Datei wird dazu eine Tabellenstruktur de�niert, damit die Werteübersichtlich dargestellt werden (siehe Listing 15 auf Seite 62). Die dazugehörigeCSS-Datei kann unter Listing 16 auf Seite 63 eingesehen werden.

20

1 """Methode , d i e e in e Dosis berechnet . Je nach au f ru f ende rMethode wird der Zaeh le r und Konver s ions faktor gewaehlt .Ansch l i e s s end wird d i e Methode write_out ( ) au fge ru f en """

2 de f ca l cu la te_dose ( index ) :3 timestamp=datet ime . datet ime . now( ) . s t r f t ime ( '%Y−%m−%d %H

:%M:%S.% f ' ) [ : −3 ]4 actCounts=05 actCF=06 i f index==1:7 g l oba l secCounter8 g l oba l secCF9 pr in t ( "\ nCalcu late dose f o r the l a s t ten

seconds : " )10 actCounts=secCounter . getValue ( )11 secCounter . r e s e t ( )12 actCF=secCF13 e l i f index==2:14 g l oba l minCounter15 g l oba l CF16 pr in t ( "\ nCalcu late dose f o r the l a s t minute : " )17 actCounts=minCounter . getValue ( )18 minCounter . r e s e t ( )19 actCF=CF20 e l s e :21 pr in t ( "Unknown counter to c a l c u l a t e dose ! " )22 pr in t ( "Used CF: {}" . format ( actCF ) )23 dose=actCounts∗actCF24 pr in t ( timestamp , "Detected counts : {}" . format ( actCounts

) , " Calcu lated dose : {}\n" . format ( dose ) )25 write_out ( index , timestamp , dose )26 r e turn dose

Listing 4: Berechnung der Dosiswerte

21

1 """Methode berechnet den Mitte lwert aus e i n e r L i s t e mitDosiswerten """

2 de f calc_mean_val ( l i s t ) :3 timestamp=datet ime . datet ime . now( ) . s t r f t ime ( '%Y−%m−%d %H

:%M:%S.% f ' ) [ : −3 ]4 e n t i r e=05 l ength=len ( l i s t )6 f o r i in range (0 , l ength ) :7 e n t i r e+=l i s t [ i ]8 meanVal=en t i r e / l ength9 pr in t ( timestamp , "Calcu lated meanvalue over l a s t s i x

ten−seconds−measurements {}\n" . format (meanVal ) )10 write_out (3 , timestamp , meanVal )11 r e turn meanVal

Listing 5: Berechnung eines Mittelwerts aus den letzten sechs Messergebnissen

Da fortwährend neue Strahlendosen bestimmt werden, muss eine Möglichkeit gefundenwerden, die Website immer die aktuellen Messergebnisse anzeigen zu lassen. Um dies zuerreichen, wurde die Asynchronus JavaScript and XML (AJAX)-Technologie eingesetzt.Diese erlaubt es, einzelne Teile der Website zu aktualisieren, ohne die komplette Seiteneu laden zu müssen [21]. Dabei wird die Programmiersprache JavaScript eingebunden,um die Funktion der Website zu implementieren [22]. In diesem Projekt werden mitdieser Methode die Tabellenzellen Zeitstempel und Messwert aktualisiert. ZurVervollständigung des JavaScripts muss eine Methode implementiert werden, mit derdie Messwerte aus dem Python-Code vom JavaScript gelesen und verarbeitet werdenkönnen. Dazu werden verschiedene Möglichkeiten betrachtet:

Text-Datei

Eine Möglichkeit ist, Messwerte in eine Text-Datei zu schreiben. Text-Dateien sindunstrukturierte Daten, wodurch es zu Fehlern während der Verarbeitung durch ein Skriptkommen kann. Diese Methode wurde in diesem Projekt dazu verwendet, Messergebnisselokal auf dem jeweiligen Raspberry Pi zu speichern.

Extensible Markup Language (XML)

Durch XML lassen sich strukturierte Daten erzeugen, wodurch ganze Objekte abge-bildet werden können. Dabei kann das Script über die Objektnotationen auf einzelneDatenfelder zugreifen [23]. XML wird in Verbindung mit JavaScript sehr häu�g ver-wendet, sobald verschiedene Schnittstellen zum Einsatz kommen oder komplexe Datenverarbeitet werden müssen.

22

Abbildung 5: Website zum Anzeigen der Dosis-Werte

JavaScript Object Notation (JSON)

JSON hat viele Gemeinsamkeiten mit XML. Die übergebenen Daten sind ebenfallsstrukturiert, die Syntax ist aber einfacher und lesbarer. Es kann durch ein JavaScriptleicht verarbeitet werden und ist ausreichend für unsere Zwecke [24].

Zum einfacheren Umgang mit den JSON-Dateien wurde die JavaScript-BibliothekJQuery genutzt. In dieser Bibliothek werden neue Methoden de�niert, die den Umgangmit JavaScript vereinfachen. Dazu gehört das Ändern von Websites und das Einlesen vonJSON-Dateien [25]. Aus den gewonnenen Erkenntnissen wurde ein JavaScript entwickelt,welches im Zwei-Sekunden-Takt die Tabellenzellen Zeitstempel und Messwert

aktualisiert. Das Python-Programm schreibt die Messwerte als JSON-Dateien in denOrdner �/var/www/html� (siehe Listing 6). Dazu müssen die Rechte dieses Ordnersgeändert werden:

1 sudo chmod 766 /var /www/html

Das JavaScript liest diese JSON-Datei aus und ändert die Tabelleneinträge. DerJavaScript-Code ist in Listing 17 auf Seite 63 zu sehen.

Die aktualisierte, vollständige und kommentierte Version des Python-Codes ist imAnhang unter Listing 10 auf Seite 50 zu �nden. In Verbindung mit dem Web-Serverkann an dieser Stelle der Arbeit eine Strahlendosismessung durchgeführt werden. Imweiteren Verlauf wird ein Lösungsweg gesucht, mit dem mehrere Raspberry Pis vernetztund das Messsystem mobil eingesetzt werden kann.

23

1 # Pfad wo a l l e Werte abge spe i che r t werden2 path="/home/ pi /PythonCode/doseValues . txt "3

4 # Pfad zum Server , wo d i e JSON−Datei hingeschoben wird5 s e rve rF i l ePath="/var /www/html/actDose . j son "6

7 """Methode , d i e d i e Dos i swerte in e in e Textdate i s c h r e i b t . BeimI n t e r v a l l von zehn Sekunden wird zudem e ine JSON−Datei

g e s ch r i eben und an den WebServer uebertragen """8 de f write_out ( index , timestamp , dose ) :9 f i l e=open ( path , ' a ' )

10 i f index == 1 :11 s t r i n g = timestamp + " Last ten−seconds−

measurement : {}\n" . format ( dose )12 j s o n s t r i n g = "{\" timestamp \" :\" "+s t r ( timestamp )

+"\" ,\" dose \" :\" "+s t r ( dose )+"\"}"13 f i l e . wr i t e ( s t r i n g )14 f i l e 2=open ( se rverF i l ePath , 'w ' )15 f i l e 2 . wr i t e ( j s o n s t r i n g )16 f i l e 2 . c l o s e ( )17 e l i f index == 2 :18 s t r i n g = timestamp + " Last s ix ty−seconds−

measurement : {}\n" . format ( dose )19 f i l e . wr i t e ( s t r i n g )20 e l i f index == 3 :21 s t r i n g = timestamp + " Mean value over l a s t s i x

ten−seconds−measurements : {}\n" . format ( dose)

22 f i l e . wr i t e ( s t r i n g )23 e l s e :24 pr in t ( "Unknown index to wr i t e out ! " )25 f i l e . c l o s e ( )26 r e turn

Listing 6: Schreiben der Dosiswerte

24

6.4 Vernetzung

Zu einer vernetzten Messung gehören mehrere Messgeräte, die unabhängig voneinanderMessungen durchführen. Anschlieÿend sollen alle Messergebnisse zentral gesammeltund angezeigt werden. In dieser Arbeit wurde bereits ein Raspberry Pi so kon�guriert,dass dieser eine Strahlendosis messen kann (siehe Kapitel 6.2). Es wurde eine Methodeentwickelt, die Messergebnisse über einen Web-Server zu präsentieren (siehe Kapitel6.3). Im Folgenden soll durch einen zweiten Raspberry Pi ein zentraler Zugangspunktgescha�en werden, über den alle Messgeräte vernetzt und alle Messergebnisse angezeigtwerden.

Zuerst wird diskutiert, welcher Übertragungsweg für das Projekt geeignet ist. Anfäng-lich sollte ein File Transfer Protocol (FTP)-Server genutzt werden. Damit lassen sich Ord-nerstrukturen auf einem entfernten Gerät verwalten. Da in diesem Projekt aber nur eineDatei in eine Richtung übertragen wird, bietet der FTP-Server zu viel Funktionalität.Eine einfachere Methode bietet die Secure Copy (SCP). Diese ist ein reines Übertra-gungsprotokoll, welches eine verschlüsselte SSH-Verbindung nutzt. Um diese Möglichkeitzu nutzen, muss auf dem Raspberry Pi der SSH-Server aktiviert sein. Das lässt sich überdie Grundeinstellungen des Raspberry Pi realisieren (siehe Kapitel 6.1).

6.5 Secure Copy

Mit dem Befehl:

1 scp myf i l e . txt pi@192 . 1 6 8 . 1 . 3 : remoteDirectory /

lässt sich die Datei �my�le.txt� im aktuellen Verzeichnis an den Benutzer �pi� unter derIP-Adresse �192.168.1.3� senden und dort im Verzeichnis �remoteDirectory� ablegen.Das Ganze funktioniert ebenfalls in die andere Richtung. Mit dem Befehl:

1 scp pi@192 . 1 6 8 . 1 . 3 : remoteDirectory /myf i l e . txt d i r e c t o r y /

wird die Datei �my�le.txt� von dem Benutzer �pi� unter der IP-Adresse �192.168.1.3�kopiert und im eigenen Verzeichnis �directory� abgelegt [26]. Bei der Ausführungdieser Befehle, �ndet bei jedem Verbindungsaufbau eine Passwortabfrage statt. Dies isthinderlich für eine spätere, automatisierte Übertragung.

25

Eine sogenannt Whitelist ermöglicht es, vom eigenen PC aus ohne eine Passwort-abfrage Befehle auf einem anderen PC auszuführen. Dazu wird auf dem Remote-PCeine Whitelist erzeugt, um Zugri�srechte zu vergeben. Im Vorfeld wird ein ö�entlicherSchlüssel auf dem lokalen PC generiert, der einmalig in der Whitelist des Remote-PCabgespeichert werden muss [27]. Dazu werden auf dem lokalen Raspberry Pi folgendeBefehle ausgeführt:

1 sudo mkdir /home/ pi / . ssh2 sudo chown pi . p i /home/ pi / . ssh3 sudo chmod 700 /home/ pi / . ssh

Dadurch wird das Verzeichnis �.ssh� angelegt und dessen Rechte geändert. Durch denBefehl:

1 ssh−keygen

wird ein Schlüssel erzeugt, der im zuvor erzeugten Verzeichnis gespeichert wird. DieserSchlüssel muss kopiert werden. Anschlieÿend wechselt man auf den Remote-PC underzeugt dort ebenfalls das neue Verzeichnis. In diesem Verzeichnis wird die Datei�authorized_keys� erzeugt und der zuvor erzeugte Schlüssel eingefügt. Danach ist es mög-lich, Befehle auf dem Remote-PC auszuführen, ohne ein Passwort eingeben zu müssen. Daeinzelne Befehle als Super-User ausgeführt werden, muss die Schlüsselgeneration auchfür diesen durchgeführt werden. Anschlieÿend lässt sich die Übertragung automatisieren.

26

Abbildung 6: Die fünf notwendigen Zeitangaben vor dem auszuführenden Befehl einesCronjobs

Abbildung 7: Schlüsselwörter für Cronjobs

6.6 Cronjob

Der Cronjob ist unter Unix-Systemen eine wiederkehrende Aufgabe, die zu bestimmtenZeiten ausgeführt wird. Cronjobs werden durch den Cron-Deamon ausgeführt. So lässtsich zum Beispiel eine Aufgabe immer beim Start des Systems ausführen. Ein Cronjobwird eingerichtet, indem mit:

1 crontab −e

eine Datei geö�net wird. Über fünf Zeitangaben wird in dieser Datei festgelegt, wannein Systembefehl oder ein Skript ausgeführt werden soll. Die genauen Möglichkeiten kön-nen über das Benutzerhandbuch eingesehen werden, welches durch folgenden Befehl auf-gerufen wird:

1 man 5 crontab

Als Ergebnis wird dabei die Abbildung 6 geliefert. Es gibt eine Variante, bei der einCronjob über Schlüsselwörter eingerichtet wird. Mögliche Schlüsselwörter sind in Abbil-dung 7 zu sehen. Dabei fällt auf, dass keine Sekundenangaben gemacht werden können.Dies muss bei der weiteren Bearbeitung beachtet werden.

27

6.7 Router

eine mobile Lösung erfordert eine Vernetzung, die unabhängig von existierendenNetzwerken funktioniert. Daraus lässt sich schlieÿen, dass ein Raspberry Pi die Router-funktion übernehmen muss. Die Schritte, die dazu durchgeführt werden müssen, wurdenauf Basis verschiedener Quellen bestimmt.

Da es keine einheitliche Lösung gibt, erwarb ich das Basiswissen zur Kon�gurationeines Access-Points über ein Online-Video-Tutorial [28]. Ergänzend dazu habe ich imNetz [29] und in Foren [30] nach ergänzenden Hilfestellungen gesucht.

Für die Umsetzung der folgenden Schritte wurde ein zweiter Raspberry Pi mit dengleichen Grundeinstellungen benutzt (siehe Kapitel 6.1). Des Weiteren muss mit einerdirekten LAN-Verbindung gearbeitet werden, da zwischenzeitlich die Netzwerkschnitt-stelle wlan0 abgeschaltet wird.

Um zu überprüfen, ob das verwendete WLAN-Modul den Access-Point-Modus unter-stützt, gibt man den folgenden Befehl ein:

1 i w l i s t

Es werden alle Informationen angezeigt, die über die Netzwerkschnittstellen zur Ver-fügung stehen. Unter dem Punkt Supported interface modes sollte durch denverwendeten WLAN-Stick das Kürzel AP auftauchen. Die Kon�guration des Routerskann somit fortgesetzt werden. Des Weiteren gibt es für unterschiedliche Chipsätzeunterschiedliche Treiber, um einen Access-Point einzurichten. In diesem Fall wird derChipsatz RTL8188CUS verwendet, mit dem sich ein 2,4 GHz-Netzwerk aufbauen lässt[14].

Um den einen Raspberry Pi als Router zu verwenden, müssen einige Kon�gurationenvorgenommen werden. Zunächst wird die Software-Bibliothek Host-Access-Point-Deamon(hostapd) installiert:

1 sudo apt−get i n s t a l l hostapd

Diese ermöglicht das Einrichten eines Access-Points und bietet auch die Möglich-keit mehrere Zugangspunkte zu kon�gurieren. Da der mitgelieferte Treiber dieserSoftware-Bibliothek nicht mit dem verwendeten Chipsatz funktioniert, muss dieserdurch einen alternativen Herstellertreiber [31] ersetzt werden. Dieser muss manuell aufdem Raspberry Pi installiert werden [32].

Damit alle Clients von dem erstellten Access-Point eine IP-Adresse erhalten, muss einDynamic Host Con�guration Protocol (DHCP)-Server installiert werden:

1 sudo apt−get i n s t a l l i s c−dhcp−s e r v e r

28

Dieser muss anschlieÿend kon�guriert werden:

1 sudo nano / etc /dhcp/dhcpd . conf

Dabei muss das Kommentarsymbol vor �authoritative� entfernt werden, wodurch derDHCP-Server zum o�ziellen DHCP-Server im lokalen Netzwerk wird. Am Ende der Dateiwird ein Subnetz de�niert (siehe Abbildung 8), welches angibt, in welchem Bereich IP-Adressen vergeben werden. Zusätzlich kann die Lease-Time gesetzt werden, welche be-stimmt, wie lange ein Client dieselbe IP-Adresse behalten kann. Es gibt weitere optionaleStatements zur Kon�guration, zum Beispiel, welcher Domain Name System (DNS)-Serververwendet werden, sofern ein Internetzugang möglich ist. Die angegebene IP-Adresse�10.11.12.1�, die erst später zugewiesen wird, ist dabei frei wählbar.

Abbildung 8: Beispielhafte Deklaration eines Subnetzes

Im nächsten Schritt muss folgende Datei geö�net werden:

1 sudo nano / etc / d e f au l t / i s c−dhcp−s e r v e r

Die Zeile:

1 INTERFACES=" "

wird geändert zu

1 INTERFACES="wlan0 " ,

wodurch das de�nierte Subnetz der Netzwerkschnittstelle wlan0 zugewiesen wird.

29

Abbildung 9: Neue De�nition der Schnittstelle wlan0

Anschlieÿend muss in der Datei �interfaces� die Netzwerkschnittstelle wlan0 neu de-�niert werden. Dazu wird diese Schnittstelle heruntergefahren:

1 sudo ifdown wlan0

Anschlieÿend ö�net man die Datei:

1 sudo nano / etc /network/ i n t e r f a c e s

und weisen der Netzwerkschnittstelle wlan0 eine statische IP-Adresse zu. Eine Beispiel-datei ist in Abbildung 9 zu sehen.

An diesem Punkt wird auch die Router-Adresse �10.11.12.1� zugewiesen. Die Weiterlei-tung auf die Datei �wpa_supplicant.conf� muss dabei auskommentiert werden, da sonst

30

Abbildung 10: Kon�guration des neuen Netzwerks

die Kon�guration der Schnittstelle wlan0 nicht funktioniert. Durch den Befehl:

1 sudo i f c o n f i g wlan0 1 0 . 1 1 . 1 2 . 1

wird der Netzwerkschnittstelle wlan0 die Routeradresse zugewiesen. Anschlieÿend wirdin der Datei

1 sudo nano / etc /hostapd/hostapd . conf

der Access-Point kon�guriert. Es wird neben der NetzwerkkennungService Set Identi�er (SSID) auch das Passwort festgelegt. Auÿerdem kann bestimmtwerden, welche Authenti�zierungsalgorithmen verwendet werden oder auf welchemKanal gesendet werden soll (siehe Abbildung 10).Dem Hostapd muss der Pfad zur geänderten Kon�gurationsdatei übergeben werden:

1 sudo nano / etc / d e f au l t /hostapd

In der Zeile:

1 #DEAMON_CONF=" "

wird dabei der Pfad zur Kon�gurationsdatei angegeben:

1 DEAMON_CONF="/etc /hostapd/hostapd . conf "

31

Die Kon�guration des hostapd kann über:

1 sudo / usr / sb in /hostapd / e tc /hostapd/hostapd . conf

getestet werden. Funktioniert alles problemlos, werden die Services hostapd undisc-dhcp-server so kon�guriert, dass diese beim Systemstart ausgeführt werden. Dazustartet man beide Services manuell:

1 sudo s e r v i c e hostapd s t a r t2 sudo s e r v i c e i s c−dhcp−s e r v e r s t a r t

und lässt diese anschlieÿend beim Systemstart ausführen:

1 sudo update−rc . d hostapd enable2 sudo update−rc . d i s c−dhcp−s e r v e r enable

Danach muss der Raspberry Pi neu gestartet werden.

An dieser Stelle sind die gröÿten Probleme aufgetreten. Zunächst erhielt die Schnitt-stelle wlan0 nicht die zugewiesene IP-Adresse �10.11.12.1�. Nach kurzer Recherche imNetz wurde ich in einem Raspberry Pi Forum [33] fündig. In manchen Fällen muss derWPASupplicant-Service entfernt werden. Über den Befehl:

1 sudo mv /usr / share /dbus−1/system−s e r v i c e s / f i . e p i t e s t. hostapd .WPASupplicant . s e r v i c e ~/

wird diese Datei in das Home-Verzeichnis verschoben. Nach einem Neustart war derAccess-Point sichtbar, Einloggen wiederum nicht möglich. Die Fehlermeldung auf Client-Seite war: Authentifizierungsfehler. Über die Befehle:

1 sudo s e r v i c e hostapd s t a tu s2 sudo s e r v i c e i s c−dhcp−s e r v i c e s t a tu s

kann die Stati der wichtigen Access-Point-Services, eingesehen werden. Diese zeigtenkeine Fehler an. Nach längerer Recherche und verschiedensten Änderungen in denKon�gurationsdateien verdeutlichte sich, dass das letzte Update des Betriebssystemsden Fehler verursacht. Dabei wurde die Kernel-Version des Betriebssystems aktualisiert,womit der Treiber von Realtek nicht mehr funktioniert [34]. Zum Zeitpunkt derErstellung dieser Bachelorarbeit gab es noch keine Lösung für dieses Problem. Um dasProblem zu lösen wurde ein älteres Betriebssystem (Rasbian Jessie, Stand 18.03.2016)genutzt. Dazu muss das alte Betriebssystem auf die SD-Karte kopiert werden, jedochdürfen keine Updates ausgeführt werden.

Damit sich der als Messgerät fungierende Raspberry Pi am neuen Access-Point ein-loggt, muss dessen �wpa_supplicant�-Datei überarbeitet werden. Es muss das de�nierteNetzwerk als Zielnetzwerk eingetragen werden (siehe Abbildung 11):

1 sudo nano / etc /wpa_supplicant/wpa_supplicant . conf

32

Abbildung 11: Neues Netzwerk beim Client eintragen

Startet man den Client neu, meldet er sich automatisch im neuen Netzwerk an. Zudemkann man sich mit einem PC ebenfalls im neuen Netzwerk anmelden. Mit der Router-adresse lässt sich über PuTTY auf den als Router fungierenden Raspberry Pi zugreifen.Dort ruft man:

1 sudo s e r v i c e i s c−dhcp−s e r v e r s t a tu s − l

auf und kann einsehen an welchen Client welche IP-Adresse vergeben wurde. Wurdedie IP-Adresse des Raspberry Pi herausgefunden, der sich als Client angemeldet hat,so kann über PuTTY auf diesen zugegri�en werden. Im normalen Betrieb ist diesesVorgehen nicht notwendig.

Zum Schluss, wird der Web-Server auf den Router ausgelagert (siehe Kapitel 6.3). Mitangeschlossenem LAN-Kabel und einer Internetverbindung muss der Befehl:

1 sudo apt−get i n s t a l l apache2

ausgeführt werden. Anschlieÿend müssen die erzeugten Dateien des Web-Servers auf denRouter verschoben werden, genauer in den Ordner des Web-Servers. Wie in Kapitel 6.3auf Seite beschrieben, müssen die Rechte des Web-Servers geändert werden. Über einenPC, der im Netzwerk angemeldet ist, kann die selbst geschrieben Website aufgerufenwerden. Der Router ist einsatzbereit und kann Messwerte von verbundenen Gerätenanzeigen. Für einen reibungslosen Ablauf müssen der geschriebene Python-Code sowiedas JavaScript und die Website überarbeitet werden.

33

1 #MAC−Adresse wird bestimmt2 macAddr=s t r ( open ( "/ sys / c l a s s / net /wlan0/ address " , " r " ) . read ( ) .

r ep l a c e ( "\ r " , "" ) . r ep l a c e ( "\n" , "" ) . r ep l a c e ( " : " , "−" ) )3

4 # Ort , an dem die JSON−Dateien zw i s chenge spe i che r t werden5 s e rve rF i l ePath="/home/ pi /PythonCode/actDose " +macAddr+ " . j son "6

7 # Pfad zum Server , wo d i e JSON−Datei hingeschoben wird8 routerAddr="pi@10 . 1 1 . 1 2 . 1 : / home/ pi / doseValues /"

Listing 7: Neue Adresse und Pfade

6.8 Code-Review

Pythoncode zur Signalverarbeitung

Hinsichtlich der Vernetzung muss beachtet werden, dass mehrere Geräte ihre Daten anden Web-Server schicken werden. Damit die gesendeten Daten nicht von anderen Gerä-ten überschrieben werden, müssen eindeutige Dateinamen eingeführt werden. Dies wirderreicht, indem im Dateinamen die Media Access Control (MAC)-Adresse des jeweiligenErstellers vermerkt ist. Des Weiteren muss die Zieladresse geändert werden, da sich dieGeräte in einem neuen Netzwerk be�nden (siehe Listing 7). Dabei werden die JSON-Dateien nicht direkt auf den Web-Server kopiert, sondern in einen Zwischenordner aufdem Router (siehe Unterpunkt Zusammenfassung aller JSON-Dateien).

Eine weitere Änderung betri�t die Funktionalität der Prozesse. Es wurden drei Prozesseimplementiert, die in Intervallen von drei, fünf und zehn Sekunden messen. Jeder Pro-zess erzeugt seine eigene JSON-Datei, wobei die Intervalldauer ebenfalls im Dateinamenvermerkt wird. So bleibt die Eindeutigkeit erhalten. Um eine leichtere Ausgabe zu ermög-lichen, wurden die MAC-Adresse und die Intervalldauer zusätzlich mit in die JSON-Dateiaufgenommen (siehe Listing 8).

Der vollständige, überarbeitete und kommentierte Python-Code, inklusive dergeänderten Prozesse ist im Anhang unter Listing 12 auf Seite 56 zu �nden. Mit die-sem Code wurden die späteren Tests durchgeführt, die im Kapitel 7.2 präsentiert werden.

Zusammenfassung aller JSON-Dateien

Um die Verarbeitung der JSON-Dateien zu erleichtern, wurde ein neues Python-Scriptgeschrieben. Dieses fasst alle von Clients geschickten Einzeldateien zu einer Gesamtdateizusammen (siehe Listing 9). Diese Datei kann vom JavaScript einfacher verarbeitetwerden. Das neu erzeugte Python-Script wird mittels eines Cronjobs zu Beginn gestartetund erzeugt jede Sekunde eine neue Gesamtdatei.

Das JavaScript anpassen

34

1 """Methode , d i e d i e Dos i swerte in e in e JSON−Datei s c h r e i b t undan den WebServer uebe r t raeg t """

2 de f write_out ( timestamp , dose , i n t e r v a l ) :3 j s o n s t r i n g = "{\" timestamp \" :\" "+s t r ( timestamp )+"\" ,\"

dose \" :\" "+s t r ( dose )+"\" ,\"MAC\":\" "+s t r (macAddr)+"\" ,\" i n t e r v a l \" :\" "+s t r ( i n t e r v a l )+"\"}"

4 ex tens i on=s t r ( i n t e r v a l )+" . j son "5 ac tSe rve rF i l ePath = se rve rF i l ePath . r ep l a c e ( " . j son " ,

ex tens i on )6 f i l e 2=open ( actServerF i l ePath , 'w ' )7 f i l e 2 . wr i t e ( j s o n s t r i n g )8 f i l e 2 . c l o s e ( )9 os . system ( " scp "+actSe rve rF i l ePath+" "+routerAddr )

10

11 r e turn

Listing 8: MAC-Adresse und Intervalldauer werden in JSON-Dateien eingebunden

Durch die geänderte Datenstruktur innerhalb der JSON-Datei muss auch das JavaScriptangepasst werden. Die Tabelle der Website wird dynamisch aufgebaut, da zum Startdes Web-Servers unklar ist, wie viele Tabellenzeilen benötigt werden. Um auf dieJSON-Datei zuzugreifen, wurde die JQuery-Bibliothek [25] genutzt, mit der sich eineListe von JSON-Daten einlesen lässt. Die Aktualisierung der Werte �ndet sekündlichstatt. Das überarbeitete JavaScript ist in Listing 18 auf Seite 64 zu �nden.

HTML-Website und CSS

Abschlieÿend muss die HTML-Website angepasst werden. Bei der CSS-Datei muss nichtsgeändert werden. Die Website wurde so angepasst, dass nur die Spaltenüberschriftende�niert werden. Die restlichen Inhalte werden vom JavaScript dynamisch generiert. DerQuellcode der überarbeiteten HTML-Seite ist in Listing 19 auf Seite 65 zu �nden, dieOber�äche der neue Website ist in Abbildung 16 auf Seite 68 zu sehen.

35

6.9 Zeitsynchronisation

Der folgende Abschnitt beschäftigt sich mit der Zeitsynchronisation. Dabei soll aufallen Geräten die gleiche Systemzeit gesetzt sein. Beim Testen des gesamten Systems istaufgefallen, dass die Systemuhrzeit der einzelnen Geräte nicht mit der realen Systemzeitübereinstimmte. Dies liegt daran, dass der Raspberry Pi bei jedem Systemstart überdas Internet seine Uhrzeit und sein Datum neu stellt. Da während dem Betriebdes Messsystems keine Internetverbindung zur Verfügung steht, musste eine andereLösung gefunden werden. Die Zeitsynchronisation wurde durch Zeitstempel zu denMessungen realisiert, diese werden abhängig von der Laufzeit des Routers gesetzt. Diesbedeutet, dass beim Start des Routers dessen Systemuhrzeit auf 0:00,00 Uhr gesetztwird. Anschlieÿend wird ein Client gestartet, der sich im Netzwerk anmeldet und dieSystemuhrzeit des Routers abfragt. Dazu liest ein Skript auf Routerseite dessen aktuelleSystemuhrzeit aus (siehe Listing 13 auf Seite 60). Diese wird beim Client als neueSystemzeit gesetzt (siehe Listing 14 auf Seite 61), womit die Uhren synchronisiert sind.Beide Vorgänge werden über Cronjobs beim Hochfahren des jeweiligen Geräts gestartet.

36

1 #!/ usr /bin /python2

3 import os4 import time5 import os . path6

7 #Pfad , an dem die Datei mit a l l e n Werten ge s ch r i eben wird8 path="/home/ pi / a l lVa lu e s . j son "9

10 #Pfad zum Server , um die Datei zu ve r s ch i eben11 serverPath="/var /www/html/ a l lVa lu e s . j s on "12

13 """Methode l i e s t a l l e JSON−Dateien e i n e s Ordner , f u eg t d i e s e zue i n e r Datei zusammen und s ch i eb t d i e s auf den Server """

14 de f main ( ) :15 t ry :16 whi le True :17 s t r i n g=" [ "18 f o r i in os . l i s t d i r ( "/home/ pi /

doseValues " ) :19 s t r i n g+=s t r ( open ( "/home/ pi /

doseValues /"+i , " r " ) . read ( ) )+" , "

20 s t r i n g+=" ] "21 s t r i n g=s t r i n g . r ep l a c e ( " , ] " , " ] " )22

23 f i l e=open ( path , "w" )24 f i l e . wr i t e ( s t r i n g )25 f i l e . c l o s e ( )26 time . s l e e p ( 0 . 2 )27 os . system ( "sudo cp "+path+" "+

serverPath )28 time . s l e e p ( 0 . 7 )29 except KeyboardInterrupt :30 pr in t ( "Beendet" )31

32 i f __name__=='__main__ ' :33 i f not os . path . e x i s t s ( path ) :34 f i l e=open ( path , "w" )35 f i l e . c l o s e36 main ( )

Listing 9: Python-Code der viele JSON-Dateien zu einer zusammenfasst

37

7 Ergebnis

7.1 Signalform

Das Signal hat im Allgemeinen die Form, die in Abbildung 4 auf Seite 16 zu sehen ist.Das Oszilloskop zeigt eine Spannung von 5V. Ein Teilchen registriert, wenn der Peakvon 5V auf 1V abfällt. In ca. acht Millisekunden steigt die Spannung wieder bis zurAusgangssituation. Im Programmcode wird deshalb zur Detektion eines Signals auf einefallende Flanke reagiert. Dazu wurde die Python-Bibliothek signal [17] verwendet.

7.2 Messversuch

Um die Funktion des gesamten Messsystems zu überprüfen wurde eine Testmessungdurchgeführt. Dazu wurde das Zählrohr in verschiedenen Abständen zu einer 60Co-Quelleaufgestellt. Die Quelle befand sich in einem abgeschirmten Behälter. Die Aktivität derQuelle ist konstant.

Bei verschiedenen Intervalllängen kam es zu unterschiedlich starken Schwankungender Messergebnisse im Verhältnis zur gemessenen Gröÿe. In einem Messintervall vondrei Sekunden und einem Abstand von 30 cm schwanken die Werte stärker, als in einemMessintervall von zehn Sekunden und einem Abstand von 20cm. Die Ungenauigkeit dergemessene Werte lässt sich dadurch erklären, dass die Detektion von Teilchen auf demZufall beruht. Bei fünf detektierten Teilchen entsteht durch ein weiteres detektiertesTeilchen eine groÿe Schwankung im Messergebnis. Detektiert man 50 Teilchen istdie Schwankung, die durch ein weiteres detektiertes Teilchen entsteht viel geringer.Zur genaueren Bestimmung von Strahlendosen müssten mehrere Messungen gemachtund Mittelwerte berechnet werden. Nähert sich das Messsystem der Quelle, werdendie Schwankungen gemessener Werte im Verhältnis zur Gröÿe der gemessenen Wertegeringer.

Eine weitere Erkenntnis brachte das Bewegen der Quelle. Dabei konnte über dasakustische Signal vernommen werden, dass das verwendete Zählrohr eine kleineAnsprechzeit hat. Nähert man sich der Quelle, werden sehr schnell mehr Teilchendetektiert. Um eine korrekte Messung durchzuführen muss das Zählrohr dennoch füreinige Sekunden an einer Position stehen bleiben. Die gemessenen Werte weisen sonstzu groÿe Schwankungen auf.

Bei einem weiteren Test wurde die E�zienz des Messgeräts überprüft. Dazu wurden zujeder durchgeführten Aktion Zeitstempel gesetzt, sodass nachvollzogen werden konnte,wie lange die Berechnung in Anspruch nimmt. Es zeigt sich, dass durch die Berechnungder Dosiswerte eine zusätzliche Zeit von weniger als 0,02 Sekunden benötigt wird (sieheAbbildung 12). Dies stellt bei der Messung einer Strahlendosis kein Problem dar. Wieviel Zeit zwischen Berechnung und Anzeigen der Messergebnisse vergeht, kann nichtexakt bestimmt werden, da eine Übertragung zwischen zwei Geräten statt�ndet. Diesynchronisierten Systemzeiten sind auf die Sekunde genau, im Millisekundenbereich

38

Abbildung 12: Mit dem Zeitstempel lässt sich erkennen, dass alle zehn Sekunden einZeitversatz von weniger als 0,02 Sekunden entsteht

kann die Genauigkeit nicht garantiert werden.

Es konnte nicht getestet werden, wie der Router auf die Verwendung mehrerer Mess-geräte anspricht. Es stand nur ein Zählrohr zur Verfügung, weshalb keine vernetzte,�ächendeckende Messung simuliert werden konnte, bei der viele Messergebnisse auf ein-mal eintre�en und verarbeitet werden müssen.

39

7.3 Fazit

Alle gesteckten Ziele sind grundsätzlich erfüllt worden. Es gibt einen als Routerfungierenden Raspberry Pi. Dieser baut ein Netzwerk auf, in dem sich andere RaspberryPis anmelden können. Zudem übernimmt der Router die Darstellung der Messwerte,welche über einen Web-Server realisiert werden. Über jede Art von Endgerät kanneine Verbindung mit dem Router hergestellt und die Website aufgerufen werden. ZurGenerierung eines autarken Messgeräts kann ein Geiger-Shield auf dem als Routerfungierenden Raspberry Pi aufgesteckt werden.

Es wurde erfolgreich ein Raspberry Pi zu einem Strahlendosismessgerät kon�guriert.Meldet dieser sich im erzeugten Netzwerk an, werden dessen Messergebnisse an denRouter gesendet. Dadurch lässt sich eine Vernetzung von Messgeräten realisieren, dieeine �ächendeckende Messung von Strahlendosen erlauben.

Die Abläufe werden in Abbildung 13 übersichtlich zusammengefasst.

40

Abbildung 13: Aktivitätsdiagramm aller Abläufe (Erstellt mit Visual Paradigm)

41

8 Diskussion und Ausblick

Alles in allem ist das Ergebnis dieses Projekts positiv zu bewerten. Es ist gelungen einStrahlendosismessgerät aus Komponenten zu bauen, die kostengünstig und massenhaftverfügbar sind. Des Weiteren lassen sich mehrere Messgeräte vernetzen wodurch eine�ächendeckende Messung möglich wird.

Die Kosten für den Router ohne Sensor-Board betragen ca. 46e. Dabei kosteteder Raspberry Pi 2 B+ ca. 31e, eine Micro-SD-Karte mit 16GB ca. 8e und derWLAN-Stick ca 7e. Für die Strahlenmessung müssen ca. 115e für das Zählrohrinklusive Sensor-Board und ca. 40e für die Connection-Bridge ausgegeben werden [35].Insgesamt werden ca. 250e für ein Strahlendosismessgerät und einen Router benötigt.Dabei fallen keinerlei Kosten für Softwarelizenzen an. Für die Stromversorgung müssenweitere Kosten mit eingerechnet werden. Geeignete Powerbanks gibt es schon für 20e,ein passendes Netzteil für 10e.

Das System ist mobil einsetzbar und bietet den groÿen Vorteil, dass mit einfachenBauteilen und überschaubarem Aufwand ein Strahlendosismessgerät gebaut werdenkann. Entweder können die in dieser Arbeit vorgestellten Schritte nachvollzogen oderdas fertige Projekt auf eine MicroSD-Karte kopiert werden. Mit dieser MicroSD-Karteund einem WLAN-Stick ist der Raspberry Pi sofort einsatzbereit. Dies zeigt die Flexi-bilität des Systems, wobei auch bei Beschädigung einzelne Teile problemlos getauschtwerden können. Dieses Vorgehen funktioniert unabhängig vom verwendeten Modell desRaspberry Pi, da die Connection-Bridge mit allen Raspberry Pi-Modellen kompatibelist, die GPIO-Pins besitzen (siehe Kapitel 4).

Ein weiterer Aspekt der Flexibilität des Raspberry Pi ist, dass verschieden Sensorenaufgesteckt werden können. Zum einen kann ein anderes Zählrohr verwendet werdenohne Änderungen durchführen zu müssen. Zum anderen lässt sich der Raspberry Pijederzeit zu einem neuen Messgerät umbauen, zum Beispiel, um Gase in der Umweltzu bestimmen. Dazu muss neben einem Sensor-Board lediglich eine geeignete Softwareentwickelt werden, Raspberry Pi, Betriebssystem, WLAN-Modul und die Connection-Bridge bleiben dieselben. Der Web-Server kann weiterhin genutzt werden, nur ein kleinerTeil der Website müsste angepasst werden.

Ein weiterer groÿer Vorteil ist der Gewichtsaspekt. Der Router kommt auf einGewicht von 182 Gramm. Dabei wurden die verwendeten Teile inklusive einer Hülle undPowerbank gewogen. Das Messgerät kommt, inklusive Powerbank aber ohne Hülle, auf208 Gramm. Der reine Messaufsatz besitzt ein Gewicht von 71 Gramm. Dazu gehört dieConnection-Bridge, das Sensor-Board und das Zählrohr. Dieses geringe Gewicht erlaubtes die Geräte an Drohnen oder andere Trägerfahrzeuge anzubringen.

42

Ein Nachteil des Programmcodes ist es, dass die Pfade und Adressen, an denenDateien abgespeichert werden sollen, exakt eingetragen werden müssen (siehe Listing7 auf Seite 34). Eine Änderung der Ordnerstruktur zieht immer eine Änderung desProgrammcodes mit sich. Ähnliche Probleme können bei Softwareupdates auftreten. Wiein diesem Projekt geschehen, können durch Softwareupdates Probleme entstehen. Umdem entgegenzuwirken, kann auf System- und Softwareupdates verzichtet werden, dadie bisher benötigten Funktionen erfüllt sind. Ohne Updates bleiben jedoch vorhandeneSicherheitslücken bestehen. Die Gefahr von Funktionsverlust durch Softwareupdateskann nur vermindert werden, indem Updates zeitverzögert installiert werden, sodassdiese schon ausgereift sind.

Des Weiteren kann die Robustheit des Systems verbessert werden. Für den RaspberryPi gibt es einige Standardgehäuse zu kaufen. Bei einem aufgesteckten Sensor-Boardmuss allerdings eine Sonderanfertigung produziert werden. Dabei können bereits beider Entwicklung eines Gehäuses Aspekte mit aufgegri�en werden, die das Messergebnispositiv beein�ussen können, zum Beispiel um direkte Sonneneinstrahlung zu vermeiden.

Es gibt noch einige Punkte, an denen angesetzt werden kann, um das System zuverbessern. Zunächst könnten den Geräten aussagekräftigere Namen zugewiesen werden,um einfacher nachvollziehen zu können, welches Gerät welche Messwerte liefert. DesWeiteren sollte der Python-Code überarbeitet werden, denn er könnte dynamischergestaltet werden. Am Aussehen der Website muss nicht zwingend etwas geändert werden.Überlegenswert wäre allerdings, dass ein Dosisverlauf dargestellt werden würde.

Woran unbedingt gearbeitet werden muss, ist die Zeitsynchronisation (siehe Kapitel6.9 auf Seite 36). Die aktuelle Methode funktioniert, es wäre aber wünschenswert,Zeitstempel zu haben, die die Realität widerspiegeln. Ohne Internetverbindung ist esnotwendig, ein GPS-Modul mit einzubinden. Dadurch lässt sich eine Zeitsynchronisationbesser realisieren. Ein groÿer Vorteil wäre, dass die Clients nicht mehr die Router-Zeitabfragen müssten, sondern direkt die Zeit übernehmen, die im GPS-Signal übertragenwird. Es ist damit gesichert, dass auf allen Geräten exakt dieselbe Uhrzeit gesetzt wird.Zudem müsste nicht mehr darauf geachtet werden den Router zuerst zu starten, da dieseraktuell der Zeitgeber ist. Auch die Speicherung von Messergebnissen über einen gröÿerenZeitraum lässt sich mit der neuen Methode leicht realisieren. Der eigentliche Nutzeneines GPS-Moduls, die Positionsbestimmung, erlaubt es, zusätzlich ortsgebundeneMesswerte zu speichern. Damit wäre es denkbar, einen Strahlendosisverlauf auf einerKarte einzuzeichnen.

Ebenfalls wichtig ist die Erhöhung der Reichweite, um das Übertragen der Messwerte,zum Beispiel, während, eines Drohnen�ugs zu ermöglichen. Dabei sollen die Geräteüber gröÿere Entfernungen kommunizieren können. Die aktuell verwendete WLAN-Verbindung ist für Testzwecke geeignet, eine richtige Antenne würde die Reichweitedeutlich verbessern.

43

Gesamt betrachtet, bietet das beschriebene Messsystem einige Vorteile im Vergleichzu bisherigen Messmethoden, die nicht zu vernachlässigen sind. Es ist klein, leicht,kostengünstig und vielseitig einsetzbar. Es erfüllt seinen Zweck und die Funktion einesStrahlendosismessgeräts, wobei neben der Vernetzung auch eine entfernte Steuerung derMessgeräte möglich ist. Weitere Optimierungen sind jederzeit möglich und sollten inBetracht gezogen werden, bevor das Messsystem eingesetzt wird. Das gröÿte Potenzialsehe ich im Einsatz eines GPS-Moduls.

44

9 Literaturverzeichnis

[1] Raspberry Pi Foundation.About us.https://www.raspberrypi.org/about/, 2016.Letzter Zugri�: 09.08.2016.

[2] Libelium.Wireless sensor networks to control radiation levels.http://www.libelium.com/wireless\_sensor\_networks\_to\_control\_radi

ation\_levels\_geiger\_counters.Letzter Zugri�: 09.08.2016.

[3] Informationstechnik und Nutzung der Bundeswehr Bundesamt für Ausrüstung.Aufgaben des wehrwissenschaftlichen instituts für schutztechnologien - abc-schutz.http://www.baainbw.de/portal/a/baain/!ut/p/c4/04\_SB8K8xLLM9MSSzPy8x

Bz9CP3I5EyrpHK9pMTEzDy9lMzUvOKSYr3yzGK9xNK09MSkVP2CbEdFAEqXZeU!/, 2016.Letzter Zugri�: 11.08.2016.

[4] Raspberry Pi Foundation.Products.https://www.raspberrypi.org/products/, 2016.Letzter Zugri�: 09.08.2016.

[5] Raspberry Pi Foundation.Raspberry pi 1 model b+.https://www.raspberrypi.org/products/model-b-plus/, 2016.Letzter Zugri�: 09.08.2016.

[6] Raspberry Pi Foundation.Raspberry pi 2 model b.https://www.raspberrypi.org/products/raspberry-pi-2-model-b/, 2016.Letzter Zugri�: 09.08.2016.

[7] Raspberry Pi Foundation.Raspberry pi 3 model b.https://www.raspberrypi.org/products/raspberry-pi-3-model-b/, 2016.Letzter Zugri�: 09.08.2016.

[8] Raspberry Pi Foundation.Raspberry pi zero.https://www.raspberrypi.org/products/pi-zero/, 2016.Letzter Zugri�: 09.08.2016.

45

[9] Raspberry Pi Foundation.Help guides.https://www.raspberrypi.org/help/, 2016.Letzter Zugri�: 10.08.2016.

[10] Claus Grupen.Grundkurs Strahlenschutz.Vieweg, 2 edition, 2000.ISBN: 3-528-16949-4.

[11] Cooking Hacks.Geiger counter - radiation sensor board for arduino and raspberry pi.https://www.cooking-hacks.com/documentation/tutorials/geiger-counter-

radiation-sensor-board-arduino-raspberry-pi-tutorial/, 2016.Letzter Zugri�: 09.08.2016.

[12] Video2Brain.Raspberry pi für einsteiger.https://www.video2brain.com/de/videotraining/raspberry-pi-fuer-

einsteiger, 2015.Letzter Zugri�: 09.08.2016.

[13] Raspberry Pi Foundation.Ssh using windows.https://www.raspberrypi.org/documentation/remote-access/ssh/windows.m

d, 2016.Letzter Zugri�: 09.08.2016.

[14] Edimax.Ew-7811un.http://www.edimax-de.eu/edimax/merchandise/merchandise\_detail/data/

edimax/de/wireless\_adapters\_n150/ew-7811un/, 2014.Letzter Zugri�: 09.08.2016.

[15] Rainer Grimm.Umstieg auf pyhon 3.Linux Magazin, 9, 2016.

[16] Python Software Foundation.Rpi.gpio.https://pypi.python.org/pypi/RPi.GPIO, 2016.Letzter Zugri�: 09.08.2016.

[17] Python Software Foundation.Signal.https://docs.python.org/2/library/signal.html, 2016.Letzter Zugri�: 09.08.2016.

46

[18] Python Software Foundation.Multiprocessing.https://docs.python.org/2/library/multiprocessing.html, 2016.Letzter Zugri�: 09.08.2016.

[19] w3schools.Html tutorial.http://www.w3schools.com/html/default.asp, 2016.Letzter Zugri�: 09.08.2016.

[20] w3schools.Css tutorial.http://www.w3schools.com/css/, 2016.Letzter Zugri�: 09.08.2016.

[21] w3schools.Ajax tutorial.http://www.w3schools.com/ajax/ajax\_intro.asp, 2016.Letzter Zugri�: 09.08.2016.

[22] w3schools.Javascript tutorial.http://www.w3schools.com/js/default.asp, 2016.Letzter Zugri�: 09.08.2016.

[23] w3schools.Xmltutorial.http://www.w3schools.com/xml/default.asp, 2016.Letzter Zugri�: 09.08.2016.

[24] w3schools.Json tutorial.http://www.w3schools.com/json/default.asp, 2016.Letzter Zugri�: 09.08.2016.

[25] JQuery Foundation.Jquery api.https://api.jquery.com/, 2016.Letzter Zugri�: 09.08.2016.

[26] Raspberry Pi Foundation.Scp (secure copy).https://www.raspberrypi.org/documentation/remote-access/ssh/scp.md,2016.Letzter Zugri�: 09.08.2016.

47

[27] Raspberry Pi Foundation.Passwordless ssh access.https://www.raspberrypi.org/documentation/remote-access/ssh/passwordl

ess.md, 2016.Letzter Zugri�: 09.08.2016.

[28] Video2Brain.Raspberry pi als wlan-access-point einrichten.https://www.video2brain.com/de/tutorial/raspberry-pi-als-wlan-access-

point-einrichten, 2014.Letzter Zugri�: 09.08.2016.

[29] Dave Conroy.Turn your raspberry pi into a wi� hotspot with edimax nano usb ew-7811un(rtl8188cus chipset).http://www.daveconroy.com/turn-your-raspberry-pi-into-a-wifi-hotspot-

with-edimax-nano-usb-ew-7811un-rtl8188cus-chipset/.Letzter Zugri�: 12.08.2016.

[30] Adafruit.Setting up a raspberry pi as a wi� access point.https://learn.adafruit.com/setting-up-a-raspberry-pi-as-a-wifi-

access-point/overview.Letzter Zugri�: 12.08.2016.

[31] Realtek.Software: Drivers & untilities.http://www.realtek.com/downloads/downloadsView.aspx?Langid=1\&PFid=

48\&Level=5\&Conn=4\&ProdID=274\&DownTypeID=3\&GetDown=false\&Downlo

ads=true, 2016.Letzter Zugri�: 09.08.2016.

[32] Adafruit Forum.Raspberry pi, wireless dongle, hostapd.https://forums.adafruit.com/viewtopic.php?f=19\&t=47716.Letzter Zugri�: 09.08.2016.

[33] Raspberry Pi Forum.[tutorial] rp b+ - accesspoint(ap)/hotspot mit edimax ew-7811un.http://www.forum-raspberrypi.de/Thread-tutorial-rp-b-accesspoint-ap-

hotspot-mit-edimax-ew-7811un.Letzter Zugri�: 09.08.2016.

[34] Raspberry Pi Forum.Edimax wlan accesspoint geht nach letzem updatenicht mehr.http://www.forum-raspberrypi.de/Thread-edimax-wlan-acesspoint-geht-

48

nach-letztem-update-nicht-mehr.Letzter Zugri�: 09.08.2016.

[35] Cooking Hacks.Radiation shield for raspberry pi + geiger tube.https://www.cooking-hacks.com/radiation-shield-for-raspberry-pi-

geiger-tube, 2016.Letzter Zugri�: 14.08.2016.

[36] Libelium.Radiation board - technical guide.http://www.libelium.com/downloads/documentation/radiation\_board.pdf.Letzter Zugri�: 09.08.2016.

49

10 Anhang

10.1 Python-Code

1 #!/ usr /bin /python2

3 import time4 import datet ime5 import s i g n a l6 import mu l t i p r o c e s s i ng7 import os . path8

9 # Eigene Bib l io thek , d i e e inen e i n f a che Zaeh le r implement ie r t10 import ge igerCounter11

12 import RPi .GPIO as GPIO13

14 # Setz t Nummerierung der GPIO−Ports so , das auf dem RaspberryPi e i n f a ch durchgezaeh l t werden kann

15 GPIO. setmode (GPIO.BOARD)16

17 # Auf diesem Pin wird das S i gna l r e g i s t r i e r t18 g e i g e r = 1219

20 # GPIO−Pin fu e r f a l l e n d e Flanke i n i t i a l i s i e r e n21 GPIO. setup ( ge i ge r , GPIO. IN , pull_up_down=GPIO.PUD_DOWN)22

23 # Zaehler werden d e f i n i e r t24 secCounter = ge igerCounter . Counter ( )25 minCounter = ge igerCounter . Counter ( )26

27 # I n t e r v a l l z e i t wird f e s t g e l e g t28 s l e ept imeSec = 1029 s leept imeMin = 6030

31 # Der Konver s ions faktor wird d e f i n i e r t32 CF=0.008120370373733

34 # Der Konvers ion faktor f u e r d i e Umrechnung nach 10 Sekunden35 secCF=CF∗636

37 # Pfad wo a l l e Werte abge spe i che r t werden38 path="/home/ pi /PythonCode/doseValues . txt "39

50

40 # Pfad zum Server , wo d i e JSON−Datei hingeschoben wird41 s e rve rF i l ePath="/var /www/html/actDose . j son "42

43 """Methode , d i e auf den In t e r rup t durch e ine f a l l e n d e Flankewarted und an s ch l i e s s end d i e Methode count ( ) au f r u f t """

44 de f detect_events ( ) :45 name=mul t i p r o c e s s i ng . current_process ( ) . name46 pr in t ( "Process " , name , " s t a r t ed " )47 GPIO. add_event_detect ( ge i ge r ,GPIO.FALLING, ca l l b a ck=

count )48 s i g n a l . pause ( )49

50 """Methode , d i e d i e d e f i n i e r t e n Zaeh le r ink r ement i e r t """51 de f count ( pin ) :52 g l oba l secCounter53 g l oba l minCounter54 secCounter . increment ( )55 minCounter . increment ( )56 pr in t ( datet ime . datet ime . now( ) . s t r f t ime ( '%Y−%m−%d %H:%M

:%S.% f ' ) [ : −3 ] , "Detected counts l a s t minute : {}" .format (minCounter . getValue ( ) ) , "Last ten seconds : {}" . format ( secCounter . getValue ( ) ) )

57

58 """Methode , a l l e zehn Sekunden d i e Methode ca l cu la te_dose ( )f u e r e inen Zaeh le r au f r u f t . Nach 6 sechs durch laeu fen wirde ine Mitte lwertberechnung i n i t i a l i s i e r t """

59 de f timekeeperTenSec ( ) :60 name=mul t i p r o c e s s i ng . current_process ( ) . name61 pr in t ( "Process " , name , " s t a r t ed " )62 whi le True :63 tenSecValues =[ ]64 f o r i in range (1 , 7 ) :65 time . s l e e p ( s l e ept imeSec )66 tenSecValues . append ( ca l cu la te_dose (1 ) )67 calc_mean_val ( tenSecValues )68

69 """Methode , d i e a l l e 60 Sekunden d i e Methode ca l cu la te_dose ( )au f r u f t """

70 de f timekeeperOneMin ( ) :71 name=mul t i p r o c e s s i ng . current_process ( ) . name72 pr in t ( "Process " , name , " s t a r t ed " )73 whi le True :74 time . s l e e p ( s leeptimeMin )75 ca l cu la te_dose (2 )

51

76

77 """Methode , d i e e in e Dosis berechnet . Je nach au f ru f ende rMethode wird der Zaeh le r und Konver s ions faktor gewaehlt .Ansch l i e s s end wird d i e Methode write_out ( ) au fge ru f en """

78 de f ca l cu la te_dose ( index ) :79 timestamp=datet ime . datet ime . now( ) . s t r f t ime ( '%Y−%m−%d %H

:%M:%S.% f ' ) [ : −3 ]80 actCounts=081 actCF=082 i f index==1:83 g l oba l secCounter84 g l oba l secCF85 pr in t ( "\ nCalcu late dose f o r the l a s t ten

seconds : " )86 actCounts=secCounter . getValue ( )87 secCounter . r e s e t ( )88 actCF=secCF89 e l i f index==2:90 g l oba l minCounter91 g l oba l CF92 pr in t ( "\ nCalcu late dose f o r the l a s t minute : " )93 actCounts=minCounter . getValue ( )94 minCounter . r e s e t ( )95 actCF=CF96 e l s e :97 pr in t ( "Unknown counter to c a l c u l a t e dose ! " )98 pr in t ( "Used CF: {}" . format ( actCF ) )99 dose=actCounts∗actCF

100 pr in t ( timestamp , "Detected counts : {}" . format ( actCounts) , " Calcu lated dose : {}\n" . format ( dose ) )

101 write_out ( index , timestamp , dose )102 r e turn dose103

104 """Methode berechnet den Mitte lwert aus e i n e r L i s t e mitDosiswerten """

105 de f calc_mean_val ( l i s t ) :106 timestamp=datet ime . datet ime . now( ) . s t r f t ime ( '%Y−%m−%d %H

:%M:%S.% f ' ) [ : −3 ]107 e n t i r e=0108 l ength=len ( l i s t )109 f o r i in range (0 , l ength ) :110 e n t i r e+=l i s t [ i ]111 meanVal=en t i r e / l ength112 pr in t ( timestamp , "Calcu lated meanvalue over l a s t s i x

52

ten−seconds−measurements {}\n" . format (meanVal ) )113 write_out (3 , timestamp , meanVal )114 r e turn meanVal115

116 """Methode , d i e d i e Dos i swerte in e in e Textdate i s c h r e i b t . BeimI n t e r v a l l von zehn Sekunden wird zudem e ine JSON−Datei

g e s ch r i eben und an den WebServer uebertragen """117 de f write_out ( index , timestamp , dose ) :118 f i l e=open ( path , ' a ' )119 i f index == 1 :120 s t r i n g = timestamp + " Last ten−seconds−

measurement : {}\n" . format ( dose )121 j s o n s t r i n g = "{\" timestamp \" :\" "+s t r ( timestamp )

+"\" ,\" dose \" :\" "+s t r ( dose )+"\"}"122 f i l e . wr i t e ( s t r i n g )123 f i l e 2=open ( se rverF i l ePath , 'w ' )124 f i l e 2 . wr i t e ( j s o n s t r i n g )125 f i l e 2 . c l o s e ( )126 e l i f index == 2 :127 s t r i n g = timestamp + " Last s ix ty−seconds−

measurement : {}\n" . format ( dose )128 f i l e . wr i t e ( s t r i n g )129 e l i f index == 3 :130 s t r i n g = timestamp + " Mean value over l a s t s i x

ten−seconds−measurements : {}\n" . format ( dose)

131 f i l e . wr i t e ( s t r i n g )132 e l s e :133 pr in t ( "Unknown index to wr i t e out ! " )134 f i l e . c l o s e ( )135 r e turn136

137 """ In der Main−Methode werden d i e Prozesse i n i t i a l i s i e r t undg e s t a r t e t """

138 de f main ( ) :139 pr in t ( datet ime . datet ime . now( ) . s t r f t ime ( '%Y−%m−%d %H:%M

:%S.% f ' ) [ : −3 ] , "START RADIATION−SENSOR\n" )140 pr in t ( s e rve rF i l ePath )141

142 # Ueberpruefen , ob Dateien e x i s t i e r e . Wenn n i cht werdend i e s e neu ange l eg t

143 i f not os . path . e x i s t s ( path ) :144 f i l e=open ( path , 'w ' )145 f i l e . c l o s e

53

146 i f not os . path . e x i s t s ( s e rve rF i l ePath ) :147 pr in t ( "Datei e x i s t i e r t n i cht ! " )148 f i l e=open ( se rverF i l ePath , 'w ' )149 f i l e . c l o s e150

151 # Prozesse i n i t i a l i s i e r e n152 process_1 = mul t i p r o c e s s i ng . Process (name=" de t e c t o r " ,

t a r g e t=detect_events )153 process_2 = mul t i p r o c e s s i ng . Process (name="timekeeper_1"

, t a r g e t=timekeeperTenSec )154 process_3 = mul t i p r o c e s s i ng . Process (name="timekeeper_2"

, t a r g e t=timekeeperOneMin )155

156 # Prozesse s t a r t en157 process_1 . s t a r t ( )158 process_2 . s t a r t ( )159 process_3 . s t a r t ( )160

161 time . s l e e p ( 0 . 1 )162 pr in t ( "\nINITIALIZING FINISHED\n" )163

164 # Beende das Programm be i einem Keyboard−In t e r rup t165 t ry :166 whi le True :167 time . s l e e p ( 0 . 1 )168 except KeyboardInterrupt :169 process_1 . terminate ( )170 process_2 . terminate ( )171 process_3 . terminate ( )172 GPIO. cleanup ( )173

174 i f __name__ == '__main__ ' :175 main ( )

Listing 10: Python-Code zur Strahlendosismessung

54

1 #!/ usr /bin /python2

3 import mu l t i p r o c e s s i ng4

5 c l a s s Counter ( ob j e c t ) :6 de f __init__( s e l f ) :7 s e l f . va l = mu l t i p ro c e s s i ng . Value ( ' i ' , 0 )8 s e l f . l o ck = mu l t i p r o c e s s i ng . Lock ( )9

10 # Methode , um den Zaeh le r um 1 zu erhoehen11 de f increment ( s e l f ) :12 with s e l f . l o ck :13 s e l f . va l . va lue += 114

15 # Methode l i e f e r t ak tu e l l e n Zaeh le r s tand zurueck16 de f getValue ( s e l f ) :17 with s e l f . l o ck :18 r e turn s e l f . va l . va lue19

20 # Methode , d i e den Zaeh le r wieder auf 0 s e t z t21 de f r e s e t ( s e l f ) :22 with s e l f . l o ck :23 s e l f . va l . va lue = 0

Listing 11: Python-Code des Zählers

55

1 #!/ usr /bin /python2

3 import time4 import datet ime5 import s i g n a l6 import mu l t i p r o c e s s i ng7 import os . path8 import RPi .GPIO as GPIO9

10 # Eigene Bib l io thek , d i e e inen e i n f a che Zaeh le r implement ie r t11 import ge igerCounter12

13 # Setz t Nummerierung der GPIO−Ports so , das auf dem RaspberryPi e i n f a ch durchgezaeh l t werden kann

14 GPIO. setmode (GPIO.BOARD)15

16 # Auf diesem Pin wird das S i gna l r e g i s t r i e r t17 g e i g e r = 1218

19 # GPIO−Pin fu e r f a l l e n d e Flanke i n i t i a l i s i e r e n20 GPIO. setup ( ge i ge r , GPIO. IN , pull_up_down=GPIO.PUD_DOWN)21

22 # Zaehler werden d e f i n i e r t23 threeSecCounter = ge igerCounter . Counter ( )24 f i veSecCounter = ge igerCounter . Counter ( )25 tenSecCounter = ge igerCounter . Counter ( )26

27 # I n t e r v a l l z e i t wird f e s t g e l e g t28 stThreeSec = 329 s tF iveSec = 530 stTenSec = 1031

32 # Der Konver s ions faktor wird d e f i n i e r t33 CF=0.008120370373734

35 #MAC−Adresse wird bestimmt36 macAddr=s t r ( open ( "/ sys / c l a s s / net /wlan0/ address " , " r " ) . read ( ) .

r ep l a c e ( "\ r " , "" ) . r ep l a c e ( "\n" , "" ) . r ep l a c e ( " : " , "−" ) )37

38 # Ort , an dem die JSON−Dateien zw i s chenge spe i che r t werden39 s e rve rF i l ePath="/home/ pi /PythonCode/actDose " +macAddr+ " . j son "40

41 # Pfad zum Server , wo d i e JSON−Datei hingeschoben wird42 routerAddr="pi@10 . 1 1 . 1 2 . 1 : / home/ pi / doseValues /"

56

43

44 """Methode , d i e auf den In t e r rup t durch e ine f a l l e n d e Flankewarted und an s ch l i e s s end d i e Methode count ( ) au f r u f t """

45 de f detect_events ( ) :46 name=mul t i p r o c e s s i ng . current_process ( ) . name47 pr in t ( "Process " , name , " s t a r t ed " )48 GPIO. add_event_detect ( ge i ge r ,GPIO.FALLING, ca l l b a ck=

count )49 s i g n a l . pause ( )50

51 """Methode , d i e d i e d e f i n i e r t e n Zaeh le r ink r ement i e r t """52 de f count ( pin ) :53 g l oba l threeSecCounter54 g l oba l f iveSecCounter55 g l oba l tenSecCounter56 threeSecCounter . increment ( )57 f i veSecCounter . increment ( )58 tenSecCounter . increment ( )59

60 """Methode , a l l e d r e i Sekunden d i e Methode ca l cu la te_dose ( )f u e r e inen Zaeh le r au f r u f t . """

61 de f t imekeeperThreeSec ( ) :62 name=mul t i p r o c e s s i ng . current_process ( ) . name63 pr in t ( "Process " , name , " s t a r t ed " )64 whi le True :65 time . s l e e p ( stThreeSec )66 ca l cu la te_dose ( threeSecCounter , stThreeSec )67

68 """Methode , a l l e f u en f Sekunden d i e Methode ca l cu la te_dose ( )f u e r e inen Zaeh le r au f r u f t . """

69 de f t imekeeperFiveSec ( ) :70 name=mul t i p r o c e s s i ng . current_process ( ) . name71 pr in t ( "Process " , name , " s t a r t ed " )72 whi le True :73 time . s l e e p ( s tF iveSec )74 ca l cu la te_dose ( f iveSecCounter , s tF iveSec )75

76 """Methode , a l l e zehn Sekunden d i e Methode ca l cu la te_dose ( )f u e r e inen Zaeh le r au f r u f t . """

77 de f timekeeperTenSec ( ) :78 name=mul t i p r o c e s s i ng . current_process ( ) . name79 pr in t ( "Process " , name , " s t a r t ed " )80 whi le True :81 time . s l e e p ( stTenSec )

57

82 ca l cu la te_dose ( tenSecCounter , stTenSec )83

84 """Methode , d i e e in e Dosis berechnet . Je nach au f ru f ende rMethode wird der Zaeh le r und Konver s ions faktor gewaehlt .Ansch l i e s s end wird d i e Methode write_out ( ) au fge ru f en """

85 de f ca l cu la te_dose ( counter , s e c ) :86 timestamp=datet ime . datet ime . now( ) . s t r f t ime ( '%H:%M:%S ' )87 actCounts=088 actCF=089 actCounts=counter . getValue ( )90 counter . r e s e t ( )91 actCF=(60/ sec ) ∗CF92 dose=actCounts∗actCF93 dose=round ( dose , 4 )94

95 write_out ( timestamp , dose , s e c )96 r e turn dose97

98 """Methode , d i e d i e Dos i swerte in e in e JSON−Datei s c h r e i b t undan den WebServer uebe r t raeg t """

99 de f write_out ( timestamp , dose , i n t e r v a l ) :100 j s o n s t r i n g = "{\" timestamp \" :\" "+s t r ( timestamp )+"\" ,\"

dose \" :\" "+s t r ( dose )+"\" ,\"MAC\":\" "+s t r (macAddr)+"\" ,\" i n t e r v a l \" :\" "+s t r ( i n t e r v a l )+"\"}"

101 ex tens i on=s t r ( i n t e r v a l )+" . j son "102 ac tSe rve rF i l ePath = se rve rF i l ePath . r ep l a c e ( " . j son " ,

ex tens i on )103 f i l e 2=open ( actServerF i l ePath , 'w ' )104 f i l e 2 . wr i t e ( j s o n s t r i n g )105 f i l e 2 . c l o s e ( )106 os . system ( " scp "+actSe rve rF i l ePath+" "+routerAddr )107

108 r e turn109

110 """ In der Main−Methode werden d i e Prozesse i n i t i a l i s i e r t undg e s t a r t e t """

111 de f main ( ) :112 pr in t ( datet ime . datet ime . now( ) . s t r f t ime ( '%H:%M:%S ' ) , "

START RADIATION−SENSOR\n" )113 pr in t ( "MAC−Adresse : {}" . format (macAddr) )114 pr in t ( "Pfad zum Server : {}" . format ( routerAddr ) )115 i f not os . path . e x i s t s ( s e rve rF i l ePath ) :116 f i l e=open ( se rverF i l ePath , 'w ' )117 f i l e . c l o s e

58

118 pr in t ( "Al l e benoet i g t en Dateien wurden erzeugt . " )119 process_1 = mul t i p r o c e s s i ng . Process (name=" de t e c t o r " ,

t a r g e t=detect_events )120 process_2 = mul t i p r o c e s s i ng . Process (name="timekeeper_1"

, t a r g e t=timekeeperThreeSec )121 process_3 = mul t i p r o c e s s i ng . Process (name="timekeeper_2"

, t a r g e t=t imekeeperFiveSec )122 process_4 = mul t i p r o c e s s i ng . Process (name="timekeeper_3"

, t a r g e t=timekeeperTenSec )123

124 process_1 . s t a r t ( )125 process_2 . s t a r t ( )126 process_3 . s t a r t ( )127 process_4 . s t a r t ( )128

129 time . s l e e p ( 0 . 1 )130 pr in t ( "\nINITIALIZING FINISHED\n" )131

132 t ry :133 whi le True :134 time . s l e e p ( 0 . 1 )135 except KeyboardInterrupt :136 process_1 . terminate ( )137 process_2 . terminate ( )138 process_3 . terminate ( )139 process_4 . terminate ( )140 GPIO. cleanup ( )141 pr in t ( "Beendet" )142

143 i f __name__ == '__main__ ' :144 main ( )

Listing 12: Python-Code zur Strahlendosismessung nach der Überarbeitung

59

1 #!/ usr /bin /python2 import datet ime3 import os4

5 """Die a k t u e l l e Systemze i t wird abge f rag t und in e ine Dateig e s ch r i eben """

6 i f __name__=='__main__ ' :7 routerTime = datet ime . datet ime . now( ) . s t r f t ime ( '%m%d%H%M

%y.%S ' )8 f i l e=open ( ' /home/ pi / routerTime . txt ' , 'w ' )9 f i l e . wr i t e ( routerTime )

10 f i l e . c l o s e ( )11 pr in t ( routerTime )

Listing 13: Python-Skript welches die aktuelle Uhrzeit des Routers ausliest

60

1 #!/ usr /bin /python2

3 import os4 import thread ing5 import time6

7 """Methode , d i e s i c h d i e Router−Ze i t ho l t und d i e s ean s ch l i e s s end a l s Systemze i t s e t z t """

8 de f main ( ) :9 getTimeFromRouter ( )

10 t ry :11 f i l e=open ( "/home/ pi / routerTime . txt " )12 routerTime=f i l e . read ( )13 f i l e . c l o s e ( )14 os . system ( "sudo date "+routerTime )15 os . system ( "sudo rm /home/ pi / routerTime . txt " )16 except :17 os . system ( "sudo date 0101000016" )18 pr in t ( "Keine Router−Ze i t vorhanden ! Ze i t auf

00 :00 g e s e t z t . " )19

20 """Ruft das Skr ip t auf dem Router auf , womit dort d i e a k t u e l l eZe i t bestimmt und uebertragen wird """

21 de f getTimeFromRouter ( ) :22 os . system ( "sudo ssh pi@10 . 1 1 . 1 2 . 1 \ ' sudo python3

getTime . py\ ' " )23 os . system ( "sudo scp pi@10 . 1 1 . 1 2 . 1 : / home/ pi / routerTime .

txt /home/ pi / routerTime . txt " )24

25 i f __name__=='__main__ ' :26 main ( )

Listing 14: Python-Skript welches die Uhrzeit auf dem Client setzt

61

10.2 Web-Server-Dateien

1 <!DOCTYPE html PUBLIC "−//W3C//DTD XHTML 1 .0 Tran s i t i ona l //EN""http ://www.w3 . org /TR/xhtml1/DTD/xhtml1−t r a n s i t i o n a l . dtd">

2 <html xmlns="http ://www.w3 . org /1999/ xhtml" lang=de−DE>3 <head>4 <meta cha r s e t="utf−8">5 <l i n k r e l=" s t y l e s h e e t " h r e f=" s t y l e . c s s ">6 <s c r i p t type=" text / j a v a s c r i p t " s r c=" jquery −1 .12 . 4 .min .

j s "></ s c r i p t>7 <s c r i p t type=" text / j a v a s c r i p t " s r c=" s c r i p t . j s "></ s c r i p t

>8 <nos c r i p t>S ie haben JavaScr ipt d e a k t i v i e r t</ no s c r i p t>9 <t i t l e>Geiger−Mü l l e r −Zä h l rohr !</ t i t l e>

10 </head>11 <body>12 <h1>Strah lendos i smessung mit dem Raspberry Pi 2 und

einem Geiger−Mü l l e r −Zä h l rohr</h1>13 <tab l e>14 <tr>15 <th>Gerä t</th>16 <th>Ze i t s t empe l</th>17 <th>Messwert</th>18 </ t r>19 <tr>20 <td>Raspberry Pi</td>21 <td id="timestamp"></td>22 <td id="dose "><s c r i p t>$ ( document ) . ready

( currentValues ( ) )</ s c r i p t></td>23 </ t r>24 </ tab l e>25 </body>26 </html>

Listing 15: HTML-Code der zu Begin verwendet wurde

62

1 body {2 background−c o l o r : l i g h t g r e y ;3 }4 h1 {5 c o l o r : b lue ;6 }7 t ab l e {8 width :100%;9 }

10 tab le , th , td{11 border : 1px s o l i d black ;12 border−c o l l a p s e : c o l l a p s e ;13 }14 th , td{15 padding :15 px ;16 width :33%;17 }18 th{19 text−a l i g n : l e f t ;20 }21 td {22 text−a l i g n : c en te r ;23 }

Listing 16: CSS-Datei für die HTML-Website

1 f unc t i on currentValues ( ) {2 //Funktion , d i e s i c h a l l e 2000ms wiede rho l t3 s e t I n t e r v a l ( f unc t i on ( ) {4 //JQuery−Funktion um JSON−St r ing e i n zu l e s en und

an s ch l i e s s end e ine Funktion auszufuehren5 $ . getJSON( ' actDose . j son ' , f unc t i on ( r e s u l t ) {6 // Be f u e l l t d i e Tabe l l e n z e l l e n m i t h i l f e

der S ch l u e s s e lwoe r t e r7 $ ( '#timestamp ' ) . html ( r e s u l t . timestamp ) ;8 $ ( '#dose ' ) . html ( r e s u l t . dose ) ;9 }) ;

10 } ,2000) ;11 } ;

Listing 17: JavaScript-Code der zu Begin verwendet wurde

63

1 f unc t i on currentValues ( ) {2 //Funktion , d i e s i c h j ede Sekunde wiede rho l t3 s e t I n t e r v a l ( f unc t i on ( ) {4 //Jquery−Methode , um e ine JSON−L i s t e e i n zu l e s en

und an s ch l i e s s end e ine Funktion au f r u f t5 $ . getJSON( ' a l lVa lu e s . j son ' , f unc t i on ( r e s u l t ) {6 var content="<table>" ;7 //JQuery−Funktion , mit der ueber d i e

JSON−L i s t e i t e r i e r t wird8 $ . each ( r e su l t , f unc t i on ( i , item ) {9 //HTML−Code gener i e r en , wodurch

d i e Tabe l l e dynamischerzeugt wird .

10 // M i t h i l f e der JSON−Sch l u e s s e lwoe r t e r werden d i eTabe l l e n z e l l e n b e f u e l l t

11 content+="<tr><td>"+r e s u l t [ i ] .MAC+"</td><td>"+r e s u l t [ i ] .timestamp+"</td><td>"+r e s u l t[ i ] . dose+"</td><td>"+r e s u l t [i ] . i n t e r v a l+"</td></tr>" ;

12 }) ;13 content+="</table>" ;14 //HTML−Code a l s Rueckgabewert

uebermit te ln15 $ ( '#val_table ' ) . html ( content ) ;16 }) ;17 } ,1000) ;18 } ;

Listing 18: Überarbeitetes JavaScript

64

1 <!DOCTYPE html PUBLIC "−//W3C//DTD XHTML 1 .0 Tran s i t i ona l //EN""http ://www.w3 . org /TR/xhtml1/DTD/xhtml1−t r a n s i t i o n a l . dtd">

2 <html xmlns="http ://www.w3 . org /1999/ xhtml" lang=de−DE>3 <head>4 <meta cha r s e t="utf−8">5 <l i n k r e l=" s t y l e s h e e t " h r e f=" s t y l e . c s s ">6 <s c r i p t type=" text / j a v a s c r i p t " s r c=" jquery −1 .12 . 4 .min .

j s "></ s c r i p t>7 <s c r i p t type=" text / j a v a s c r i p t " s r c=" s c r i p t . j s "></ s c r i p t

>8 <nos c r i p t>S ie haben JavaScr ipt d e a k t i v i e r t</ no s c r i p t>9 <t i t l e>Geiger−Mü l l e r −Zä h l rohr !</ t i t l e>

10 </head>11 <body>12 <h1>Strah lendos i smessung mit dem Raspberry Pi 2 und

einem Geiger−Mü l l e r −Zä h l rohr</h1>13 <tab l e>14 <tr>15 <th>Gerä t (MAC−Adresse )</th>16 <th>Ze i t s t empe l ( s e i t S ta r t des Routers

)</th>17 <th>Messwert in uSv/h</th>18 <th>Mes s i n t e r va l l in Sekunden</th>19 </ t r>20 </ tab l e>21 <tab l e id=" val_table ">22 </ tab l e>23 <s c r i p t>$ ( document ) . ready ( currentValues ( ) )</ s c r i p t>24 </body>25 </html>

Listing 19: Überarbeiteter HTML-Code

65

10.3 Abbildungen

Abbildung 14: Auszug aus der Spezi�kation des Radiation Boards von Libelium [36]

66

Abbildung 15: Standard-Seite des Apache-Webservers

67

Abbildung 16: Überarbeitete Website

68

11 Eidesstattliche Erklärung

Ich erkläre an Eides Statt, dass ich die vorliegende Arbeit selbständig und ohneBenutzung anderer als der angegebenen Hilfsmittel angefertigt habe und dass ich alleStellen, die ich wörtlich oder sinngemäÿ� aus Verö�entlichungen entnommen habe, alssolche kenntlich gemacht habe. Die Arbeit hat bisher in gleicher oder ähnlicher Formoder auszugsweise noch keiner Prüfungsbehörde vorgelegen.

Heilbronn, den 15. August 2016

Ste�en Fröhlich

69