Geigerzähler und Software mit Visual Studio

von Georg Körnig, Yokohama              
Elektronik-Labor  Projekte   Strahlungsmessung




Dieses Zählerprogramm wurde in Microsoft Visual Basic Express 2005 entwickelt. Der Zugang zur seriellen Schnittstelle erfolgt über die RSCOM.DLL. Die Zählimpulse werde über die CTS-Leitung einer RS232 oder eines USB-Seriell-Wandlers eingelesen. Hier wurde die USB-Platine aus dem Lernpaket
Lernpaket Elektronik Start mit USB zusammen mit einem selbst gebauten Geigerzähler verwendet.




Den Bau des Geigerzählers begann ich kurz nach dem Erdbeben in Japan, da es in dieser Zeit nirgendwo mehr Geigerzähler zu einem angemessenen Preis zu kaufen gab. Es war ziemlich verrückt: in kürzester Zeit nach dem Unglück waren in Deutschland Geigerzähler ausverkauft, obwohl der AKW-Unfall im Tausende Kilometer entfernten Japan stattgefunden hatte. Für Menschen in Japan war es kaum mehr möglich, so ein Gerät zu kaufen.

Mein Ziel war es, mit einfachen Mitteln ein Instrument zu bauen, mit dem man ein Gefühl für die Strahlenbelastung bekommen kann. Grundlage waren entsprechende Artikel in der Zeitschrift Elektor, z.B. die Ausgaben 7-8/2006 und 1/1980. Meine Schaltung ist eine Kombination aus den beiden Artikeln, wodurch ich die einfache akustische Wiedergabe von Klicks der gemessenen Strahlung mit der Anzeige auf einem Drehspulinstrument kombinieren konnte. Weitere Merkmale sind:
  •  Interne Stromversorgung durch 4 AA-Akkus und optionaler Anschluss eines externen 5V-Netzadapters
  •  2 interne Geiger-Müller-Zählrohre (ZP1310 und ZP1320)
  •  Optional anschließbares externes Zählrohr via BNC-Buchse
  •  Einstellbare Spannung für das Geiger-Müller-Zählrohr im Bereich ca. 400 V bis 7 00V
  • Anzeige der Zählrohrspannung und der Strahlendosisleistung über Drehspulinstrument
  • Anschlussmöglichkeit eines Ohrhörers (Mono)
  • Abgreifen der Zählimpulse als TTL-Signal
  • Auswertung der Zählimpulse auf einem angeschlossenen PC via USB-Seriell-Wandler
  • Visual-Basic Programm zur Anzeige der Klicks, Klicks pro Zeiteinheit und der Strahlendosisleistung.


Schaltplan in hoher Auflösung
Stückliste

Es zeigte sich, dass man abhängig von den Eigenschaften des Printtrafos die im Schaltplan von Elektor angegebenen Bauteilwerte der Spannungsversorgung für das Zählrohr anpassen musste, um die gewünschte Spannung von 400 - 500V erreichen zu können. Ausserdem war es nicht ganz einfach, "Nebengeräusche" so zu reduzieren, dass die Spannungsimpulse des Zählrohrs akustisch sauber wiedergegeben und vom Drehspulinstrument angezeigt werden konnten.   Ich denke aber, dass im Video gut zu erkennen ist, dass diese Probleme gelöst wurden. Recht hilfreich war für die Auswertung der Zählimpulse per PC das von Ihnen zusammengestellte Lernpaket MSR von Franzis, wie auch im Video zu sehen.




www.youtube.com/user/bkelektronik

Was die Anzeige der Strahlendosisleistung angeht, habe ich versucht, dies über einen zweiten Geigerzähler mit einem Gaslaternenglühstrumpf sowie mit Hilfe der Datenblätter der Zählrohre so gut wie möglich vorzunehmen. Natürlich kann man hier nicht von einer Kalibrierung sprechen. Wie sicher bekannt ist, geben manche im Handel erhältlichen Gaslaternenglühstrümpfe eine erstaunlich starke Strahlung ab, die hauptsächlich Alpha-Strahlung aber auch Beta- und Gamma-Strahlung beinhaltet - je nach Alter des verwendeten Thoriumoxids bei der Herstellung des Glühstrumpfes. Die beiden von mir verwendeten Zählrohre unterschiedlicher Empfindlichkeit detektieren hauptsächlich Gamma-Strahlung. Darauf beruht dann auch die Anzeige der Dosisleistung in µSv/h, welche sonst je nach Art der Strahlung (Alpha, Beta, Gamma, ...) verschieden gewichtet werden müsste.

Das Visual-Basic Programm ist recht einfach gehalten und bietet noch einiges an Verbesserungspotential. Bisher ist das extern anschliessbare Zählrohr noch nicht implementiert und es fehlen noch eine Aufzeichnung der Messdaten über einen längeren Zeitraum sowie deren grafische Darstellung in einem Fenster mit Zeitachse.

Die gute Erkenntnis aus diesem Projekt ist, dass sich die Strahlenbelastung in der Umgebung meines Wohnortes in Yokohama / Tokyo auf einem sehr ähnlichen Niveau befindet, wie z.B. in der Umgebung von Köln.

Als zukünftigen Ausblick beabsichtige ich, das Visual-Basic Programm weiterzuentwickeln und ein Fenster-Zählrohr als externe Sonde aufzubauen, mit der man Alpha- und Beta-Strahlung messen kann.

Die Visual Basic Dateien kann auch unter Visual Studio 2010 kompiliert  werden, da ich diese zuerst in dieser Version unter Windows 7 erstellt hatte, sie dann aber wegen Verwendung unter XP noch einmal in Visual Studio 2005 übersetzt hatte.

Download:  Geigercounter01B.zip

Public Class Geigerzaehler01b
Private Declare Sub MessageBeep Lib "User32" (ByVal N As Integer)

Private Declare Function OPENCOM Lib "RSCOM" (ByVal OpenString$) As Integer
Private Declare Sub TIMEOUTS Lib "RSCOM" (ByVal b%)
Private Declare Sub BUFFERSIZE Lib "RSCOM" (ByVal b%)
Private Declare Sub CLOSECOM Lib "RSCOM" ()
Private Declare Sub SENDBYTE Lib "RSCOM" (ByVal Dat%)
Private Declare Function READBYTE Lib "RSCOM" () As Integer
Private Declare Sub SENDSTRING Lib "RSCOM" (ByVal Dat$)
Private Declare Function READSTRING Lib "RSCOM" () As String
Private Declare Sub CLEARBUFFER Lib "RSCOM" ()
Private Declare Function INBUFFER Lib "RSCOM" () As Integer
Private Declare Function OUTBUFFER Lib "RSCOM" () As Integer
Private Declare Sub DTR Lib "RSCOM" (ByVal b%)
Private Declare Sub RTS Lib "RSCOM" (ByVal b%)
Private Declare Sub TXD Lib "RSCOM" (ByVal b%)
Private Declare Function CTS Lib "RSCOM" () As Integer
Private Declare Function DSR Lib "RSCOM" () As Integer
Private Declare Function RI Lib "RSCOM" () As Integer
Private Declare Function DCD Lib "RSCOM" () As Integer
Private Declare Function INPUTS Lib "RSCOM" () As Integer
Private Declare Sub TIMEINIT Lib "RSCOM" ()
Private Declare Function TIMEREAD Lib "RSCOM" () As Double
Private Declare Sub DELAY Lib "RSCOM" (ByVal ms As Double)
Private Declare Sub REALTIME Lib "RSCOM" ()
Private Declare Sub NORMALTIME Lib "RSCOM" ()

Dim Zustand
Dim Clicks As Long
Dim CPM As Decimal
Dim Minute(59) As Long 'Wird automatisch mit Nullen initialisiert
Dim SecCount As Long
Dim CPM_select As Boolean
Dim CP_multiplier As Double
Dim GMZ As Integer
Dim GMZ_sensitivity(2) As Double

Private Sub Geigerzaehler01b_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim msg As String
Dim OpenString As String
Dim i As Integer
Dim IniFilename As String
Dim fileReader As System.IO.StreamReader
Dim stringReader As String

AddHandler Application.ApplicationExit, AddressOf OnApplicationExit

If PrevInstance() = True Then
msg = "Programm wurde bereits gestartet "
MessageBeep(0)
MsgBox(msg, 48)
End
End If

IniFilename = "G:\MSR\install\MSR.ini"
If My.Computer.FileSystem.FileExists(IniFilename) = False Then
TextBox1.Text = "1"
GoTo KeinIniFile
End If

fileReader = My.Computer.FileSystem.OpenTextFileReader(IniFilename)
stringReader = fileReader.ReadLine()
If stringReader = "[Franzis MSR COM]" Then
stringReader = fileReader.ReadLine()
TextBox1.Text = stringReader
Else
TextBox1.Text = "1"
End If
KeinIniFile:
OpenString = "COM" + TextBox1.Text + ":9600,N,8,1"
i = OPENCOM(OpenString)
If i = 0 Then
MessageBeep(0)
MsgBox("Schnittstelle nicht verfügbar")
End If
'Timer1.Enabled = False
Clicks = 0
CPM = 0.0
RTS(1)
Zustand = CTS
SecCount = 0
CPM_select = True
CP_multiplier = 60.0
GMZ = 0
GMZ_sensitivity = New Double() {7.5, 1.5, 999999999999999.87}
'GMZ_sensitivity(0) = 7.5
'GMZ_sensitivity(1) = 1.5
'GMZ_sensitivity(2) = 999999999999999.87
End Sub

Private Sub startButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles startButton.Click
Timer1.Enabled = True
End Sub

Private Sub stopButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles stopButton.Click
Timer1.Enabled = False
End Sub

Private Sub resetButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles resetButton.Click
Clicks = 0
CPM = 0.0
For count As Integer = 0 To 59
Minute(count) = 0
Next
clicksTextBox.Text = Str$(Clicks)
cpmTextBox.Text = (CPM * CP_multiplier / 60.0).ToString("F1")
SecCount = 0
End Sub

Private Sub opencomButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles opencomButton.Click
Dim OpenString As String
Dim i As Integer

OpenString = "COM" + TextBox1.Text + ":9600,N,8,1"
i = OPENCOM(OpenString)
If i = 0 Then
MsgBox("Schnittstelle nicht verfügbar")
End If
RTS(1)
End Sub

Private Sub cpmRadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cpmRadioButton.CheckedChanged
If cpmRadioButton.Checked = True Then
CPM_select = True
CP_multiplier = 60.0
cpmLabel.Text = "Clicks/min"
Else
CPM_select = False
CP_multiplier = 1.0
cpmLabel.Text = "Clicks/sec"
End If
End Sub

Private Sub cpsRadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cpsRadioButton.CheckedChanged
If cpsRadioButton.Checked = True Then
CPM_select = False
CP_multiplier = 1.0
cpmLabel.Text = "Clicks/sec"
Else
CPM_select = True
CP_multiplier = 60.0
cpmLabel.Text = "Clicks/min"
End If
End Sub

Private Sub zp1320RadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles zp1320RadioButton.CheckedChanged
If zp1320RadioButton.Checked = True Then
GMZ = 0
ElseIf zp1310RadioButton.Checked = True Then
GMZ = 1
Else
GMZ = 2
End If
End Sub

Private Sub zp1310RadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles zp1310RadioButton.CheckedChanged
If zp1310RadioButton.Checked = True Then
GMZ = 1
ElseIf zp1320RadioButton.Checked = True Then
GMZ = 0
Else
GMZ = 2
End If
End Sub

Private Sub externRadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles externRadioButton.CheckedChanged
If externRadioButton.Checked = True Then
GMZ = 2
ElseIf zp1320RadioButton.Checked = True Then
GMZ = 0
Else
GMZ = 1
End If
End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim alt
Dim Clicks_old As Long

alt = CTS()
REALTIME()
TIMEINIT()
While TIMEREAD < 1000
Zustand = CTS()
If Zustand > alt Then
Clicks = Clicks + 1
End If
alt = Zustand
End While
NORMALTIME()

SecCount = SecCount + 1

clicksTextBox.Text = Str$(Clicks)
If SecCount < 60 Then
For count As Integer = SecCount To 1 Step -1
Minute(count) = Minute(count - 1)
Next
Minute(0) = Clicks
cpmTextBox.Text = (Clicks / SecCount * CP_multiplier).ToString("F1") 'cpmTextBox.Text = Str$(Clicks / SecCount * 60)
dosageTextBox.Text = (Clicks * 10.0 / SecCount / GMZ_sensitivity(GMZ)).ToString("F3")
Else
Clicks_old = Minute(59)
For count As Integer = 59 To 1 Step -1
Minute(count) = Minute(count - 1)
Next
Minute(0) = Clicks
cpmTextBox.Text = ((Clicks - Clicks_old) * CP_multiplier / 60.0).ToString("F1")
dosageTextBox.Text = ((Clicks - Clicks_old) / 6.0 / GMZ_sensitivity(GMZ)).ToString("F3")
End If
End Sub

Private Sub OnApplicationExit(ByVal sender As System.Object, ByVal e As System.EventArgs)
' When the application is exiting, write the application data to the
' user file and close it.

Try
'Ignore any errors that might occur while closing the file handle.
'MsgBox("Closecom now executed", 48)
NORMALTIME()
CLOSECOM()
Catch
End Try
End Sub

'Visual Basic .NET: Ersatz für App.PrevInstance
Function PrevInstance() As Boolean
Dim procname As String
Dim count As Integer

procname = Diagnostics.Process.GetCurrentProcess.ProcessName
count = UBound(Diagnostics.Process.GetProcessesByName(procname))
If UBound(Diagnostics.Process.GetProcessesByName(Diagnostics.Process.GetCurrentProcess.ProcessName)) > 0 Then
Return True
Else
Return False
End If
End Function

End Class


Elektronik-Labor  Projekte   Strahlungsmessung