Audio-FM Signalisierung von Zählraten

Begonnen von DG0MG, 24. Oktober 2020, 21:26

⏪ vorheriges - nächstes ⏩

DG0MG

Der Titel klingt kompliziert, gemeint ist was Einfacheres: Die Ausgabe der Impulsdichte eines Strahlungsmessgerätes als Ton und somit z.B.: Je höher der Ton, desto höher die Aktivität. Für jemand, der eine Quelle sucht oder Steine sammelt, ist das eine außerordentliche Hilfe - man braucht nicht mehr auf Display oder Zeigerinstrument schauen. Sinnvoll ist das natürlich vorwiegend bei Szintillatoren, bei denen die Impulsdichte eh höher als bei Zählrohren ist und bei denen man ab einer gewissen Detektorgröße einzelne Impulse sowieso akustisch nicht mehr auseinanderhalten kann.

Wie immer zu Beginn ein Link zu Bernd Laquai, der sich auch schon mit diesem Thema beschäftigt hat. Er verwendet einen Spannungs-zu-Frequenz-Wandler LM331, um einen veränderlichen Ton zu erzeugen:


Im Prospektions-Szintillometer PSC-1 ist sowas auch integriert und mit dem PLL-IC 4046 realisiert (siehe dort das Video und Handbuch/Schaltplan).

Ebenso im "Exploranium GR-110G":



Sowas sollte ja auch mit einem Controller machbar sein. Nach Möglichkeit sollte sich die Tonhöhe "gleitend" und nicht stufig ändern, damit es nicht so "digital" klingt.

Vorschläge, wie sowas zu lösen ist?
"Bling!": Irgendjemand Egales hat irgendetwas Egales getan! Schnell hingucken!

Henri

So wie in https://www.geigerzaehlerforum.de/index.php/topic,406.msg3411.html#msg3411   ;D

Der entsprechend im µC errechnete Messwert wird dann mit einem festen Faktor multipliziert zu einer Frequenz, die beim Arduino mit tone() auf einen Piezo gegeben wird.

Der Hörbereich eines ohrgesunden jungen Menschen beträgt ca. 20 Hz bis 20 kHz. Ein Piezo-Ohrhörer macht vielleicht von 200 Hz bis 8 kHz. tone() schafft von 31 Hz bis zu > 20 kHz. Weder die sehr tiefen noch die sehr hohen Töne machen dem Ohr viel Spaß.

Die Zählrate eines Szintillators beträgt beispielsweise von 20 cps bei 100 nSv/h bis zu 20.000 cps bei 100 µSv/h. Bei einem Faktor von 1 wird man den Hintergrund nicht hören können (erst ab ca. 150 nSv/h, und ab ~40 µSv/h macht der Piezo nicht mehr mit. 

Meine Idee wäre deshalb, immer im gut hörbaren Bereich zu bleiben. Wird die Zählrate für diesen überschritten, wird ein neuer Faktor genommen, dh. man ist wieder bei den tiefen Tönen. Damit man nicht durcheinander kommt, könnte man z.B. jede Sekunde einen fixen hohen Ton einblenden, damit man weiß, dass man sich in einem anderen Bereich befindet. Dieser Ton wird um so höher, je öfter man bereits in einen höheren Bereich umgeschaltet hat.

So, und nun schau ich mir das Video an und höre mal, wie sie's bei Gr-110 gelöst haben  :dance4:


Na-22

Mein Vorschlag wäre:

f=X*sqrt(cps)
X= 200 Hz / sqrt(20 cps)

Je nach Szintillator muss das passende X gewählt werden. Für das Beispiel von 20 cps bis 20000 cps bleibt man mit X=45 in dem gewünschten Frequenzbereich von 200 Hz bis 8 kHz.


DL3HRT

Bei PSC-1 (siehe Link im 1. Post) gibt es noch einen Empfindlichkeitssteller. Damit stellt man die Schwelle ein, ab der überhaupt ein Tonsignal generiert wird. Da ich das Gerät intensiv nutze kann ich sagen, dass diese Funktionalität bei der Suche nach einem Hotspot ein absolutes Muss ist. Der Grund ist, dass unser Gehör geringe Frequenzänderungen nur bei niedrigen Frequenzen optimal erkennen kann.

Selbst wenn der Szintillator bereits 5000 ips registriert, kann man die Schwelle so hoch legen, dass nur ein Knarren aus dem Piezo kommt. Damit kann man dann ganz bequem nach dem Maximum suchen. In der empfindlichsten Position erzeugt die Hintergrundstrahlung ab ca. 35 ips ein niederfrequentes Knarren. Selbst eine leichte Erhöhung der Aktivität führt dann zu einer schnelle Veränderung der Tonhöhe.

Im Anhang der Schaltungsausschnitt zur Tonerzeugung. Z1 ist ein MC14538 (4538 Monoflop) und Z2 ein MC14046 (4046 PLL). Z1 dient dazu, die sehr kurzen Detektorimpulse zu verlängern und Z2 erzeugt die Töne. Danach schließen sich zwei Transistorstufen zur Verstärkung und Ausgabe auf den Lautsprecher an.

DG0MG

Zitat von: Na-22 am 25. Oktober 2020, 07:47
Mein Vorschlag wäre:
f=X*sqrt(cps)
X= 200 Hz / sqrt(20 cps)

Hm, das führt aber in der praktischen Umsetzung zu Problemen (denke ich). Zuerst mal muss ja der cps-Wert gemessen werden. 1 Sekunde Messzeit ist dafür aber schon zu lang: Wenn sich die Tonhöhe nur einmal pro Sekunde ändert - noch dazu sprunghaft, kann man nicht gescheit suchen. Messen wir 100 mSec und bilden einen gleitenden Mittelwert aus der Summe der letzten 10 Messungen, dann ist das vielleicht nicht mehr so sprunghaft, aber das reagiert dann womöglich auch wieder zu träge.

Ich hatte mir folgendes vorgestellt: Man programmiert einen "Software-Kondensator". Die Tonhöhe folgt linear dem Ladezustand (der Spannung) dieses "Kondensators".
1.) JEDER Tick erhöht die "Spannung" am Kondensator ein klein wenig.
2.) Ein periodischer Timerinterrupt (z.B. alle 10 mSec) verringert die "Spannung" um einen Betrag, solange die "Ladung" noch >0, entsprechend einem dem Kondensator parallelgeschaltenen Widerstands.

Wir hätten also 3 Softwareteile:

  • eine Pin-Change-Interruptroutine, die nur die Impulse hochzählt.
  • eine Timer-Interruptroutine, die die vergangenen Zeitscheiben hochzählt.
  • die Hauptschleife, die aus den "inzwischen" neu eingegangenen Impulsen und der seit dem letzen Schleifendurchlauf vergangenen Zeit den neuen Füllstand ("die Spannung") des Kondensators berechnet und danach die Tonhöhe einstellt. Vor dem Rücksprung an den Anfang werden die beiden Zähler für die Interrupte genullt. Die Tonhöhe kann sich so schnell ändern, wie diese Schleife durchlaufen wird.
Dabei muss man bedenken, dass die Ladekurve (Spannung über die Zeit) eines Kondensators ja keine Gerade ist, sondern eine e-funktion beschreibt: Mit steigender Ladespannung eines Kondensators nimmt der Ladestrom immer weiter ab. Ebenso beim Entladen:  Zu Beginn eines Entladevorganges ist der Entladestrom größer, weil die Spannung noch höher ist. Das Entladen beschreibt eine umgekehrte e-Funktion. Beides ist für unseren Anwendungszweck gut: Es ergibt sich ein nichtlineares Verhältnis von Impulsdichte zu Tonhöhe.

Wir brauchen jetzt also erstmal eine Formel, die aus der aktuellen "Spannung" am C, den inzwischen eingetroffenen Impulsen und der inzwischen vergangenen Zeit den neuen Wert der "Spannung" am C errechnet.

Ich fürchte, da kommt zweimal "eirgendwas" drin vor, aber sei es erstmal drum.

Hat das jemand verstanden?
Wie müsste die Formel aussehen? Mathe war nicht mein Lieblingsfach ..  :whistle3:
"Bling!": Irgendjemand Egales hat irgendetwas Egales getan! Schnell hingucken!

Henri

Hallo,

ich habe letzten Sonntag mal ein wenig rumprogrammiert, so wie ich es geschrieben habe, und auch tatsächlich was brauchbares hinbekommen, mit einem großen "Aber" allerdings.

Nach etwas rumprobieren  fand ich 100ms Intervalle und einen gleitenden Mittelwert über eine Sekunde ganz praktikabel. Die Intervalle müssen sehr klein sein, um einen sanften Tonverlauf zu bekommen, aber je länger das Mittelungsintervall, desto träger wird das System natürlich. 

Mit den Tonfrequenzen habe ich auch etwas gespielt und herausgefunden, dass man gut bis 31 Hz (minimaler Wert des Arduino) runtergehen kann, allerdings nicht über 1,8 kHz als obere Grenze. Ich hatte einen kleinen Piezo Schallwandler von Ekulit (121 war's glaub ich), der hat bei 4 kHz seine Resonanzfrequenz. Über 1,8 kHz wird er sehr leise und dreht dann weiter oben natürlich noch mal richtig auf, aber das will keiner mehr hören.

Das "Aber" ist, dass ich zunächst mit einem SBT10A und Pottaschetütchen getestet habe. Damit ging es ganz überzeugend, aber der Ton sprang natürlich schon etwas hin und her. Und die Reaktion war ziemlich träge.

Dann habe ich versucht, die Schaltung an einen Szinti ranzufrickeln, der ca. 50-70cps Hintergrund macht. Da ich die Impulszählung über Interrupts gemacht habe, hat man schon deutliche Unterbrechungen in der PWM-Ausgabe gehört. Bei 300 cps (Glühstrumpf) kam dann schon kaum noch was Brauchbares mehr aus dem Speaker.

Man kann Impulse auch ohne Interrupts zählen, mit Hardwaretimer/counter. Da wird es aber schon kompliziert mit der Programmierung, da man direkt mit den entsprechenden Registern hantieren muss. Ich wollte mir das kommendes Wochenende mal anschauen, bin bislang aber noch nicht weitergekommen.

Die Idee, das mit einem µC zu machen, kam daher, dass man keine speziellen Bauteile benötigt und ein sehr kleines Baumaß erreichen kann: ein Arduino Pro Mini ist so groß wie eine Briefmarke und im kleinsten Gehäuse noch unterzubringen. Und man könnte theoretisch gleich noch eine optische Ausgabe mit dranklemmen.
Aber rein funktional ist die Lösung über eine analoge Schaltung vielleicht die bessere für die Praxis. Man hat keine nennenswerte Latenzen (beim µC deutlich, durch die Mittelwertbildung). Und man hat bei einem Szintillator auch die Möglichkeit, nicht nur gleichhohe Impulse zu integrieren, sondern die Impulse in der Höhe, wie sie vom PMT kommen (die Idee hab ich in einem alten Yahoo Forumsbeitrag gefunden, den ich mir mal abgespeichert hatte - yahoo ist ja mittlerweile abgeschaltet). Jedenfalls führt dann nicht nur die Änderung der absoluten Impulszahlen, die ja eventuell sehr klein ist, zu einer Tonfrequenzänderung, sondern auch eine Änderung der Energieverteilung. Und der Hintergrund ist ja in der Regel im unteren Energiebereich, aber künstliche Nuklide eher darüber.
Man müßte das mal ausprobieren, aber wenn es funktioniert, könnte man hier wirklich was ganz hoch empfindliches basteln. Digital geht das nur mit einem Riesenaufwand über MCA etc, analog kann man ganz einfach über einen Kondensator integrieren.

Viele Grüße,

Henri

Na-22

Zitat von: DG0MG am 28. Oktober 2020, 14:58
...
Hat das jemand verstanden?
...

ja  :)
Wenn ich das richtig überblicke, ergibt sich eine e-Funktion ohne das in der Berechnung eine benötigt wird.

  • Ich würde einen Zähler nehmen, der bei jedem Puls erhöht wird. Es wird sozusagen eine Ladung dazugefügt.
  • Mit der Timer-Interruptroutine wird dann eine dem aktuellen Zählerwert proportionaler Anteil vom Zähler abgezogen und der neue Zählerwert in einen Ton umgesetzt

In Kurz:

  • Bei jedem Puls: N=N+1
  • Nach einer festen Zeit dt: dN=X*N, N=N-dN

Ein Rücksetzten des Zählers ist nicht notwendig. Der Faktor X muss noch passend zum System ermittelt werden.
Im Programm sollte man vielleicht noch hier und da ein paar Grenzen einbauen, z.B. ab welchem Zählerwert überhaupt ein Ton erzeugt werden soll.

DG0MG

Das Rücksetzen kam daher, dass in der Interruptroutine(n) keine aufwendigen Sachen passieren sollen, ausschliesslich ganzzahlige Additionen. So braucht man in der Hauptschleife nicht zeitkritisch arbeiten und kann da "in Ruhe" alle Aufgaben abarbeiten.


Dein Vorschlag Punkt 1.) führt aber zu einem linearen Verhältnis Impulszahl<==>Tonfrequenz?

Das ließe sich durch ein ebensolches Konstrukt wie bei 2.) lösen:
Es wird nicht "1" addiert, sondern ein Quotient aus der Differenz zwischen Maximalwert und akt. Wert geteilt durch einen Faxtor X. Somit wird - je "voller" der Kondensator ist - pro Impuls immer weniger addiert.

N = N+ (Nmax-N)/X

Das führt zu denselben Ergebnissen und damit einer nichtlinearen Kurve, wie die Rechnung mit der exp()-Funktion. Ich hab mal eine Exceldatei angehängt, wo man das sieht.

Der Faktor X hat genau die weiter oben von DL3HRT beschriebene Funktion des Potis. Wenn X groß ist, steigt die "Spannung" pro Tick nur ganz wenig an und man liegt mit der Tonhöhe selbst bei großer Impulsdichte im steil steigenden Teil, ist also trotzdem sehr empfindlich.

"Bling!": Irgendjemand Egales hat irgendetwas Egales getan! Schnell hingucken!

Na-22

Zitat von: DG0MG am 29. Oktober 2020, 12:10
Das Rücksetzen kam daher, dass in der Interruptroutine(n) keine aufwendigen Sachen passieren sollen, ausschliesslich ganzzahlige Additionen. So braucht man in der Hauptschleife nicht zeitkritisch arbeiten und kann da "in Ruhe" alle Aufgaben abarbeiten.

Bisher programmiere ich keine Mikrocontroller. Daher habe ich nicht betrachtet, dass die Interruptroutinen möglichst kurz sein soll/müssen.  :).

Henri

Hallo,

ich habe mal eine erste Version fertig (0.1). Sie ist nur ein "proof of concept" und kann/sollte noch weiter verfeinert werden. Wer Lust hat, kann sie mal ausprobieren: man braucht nur einen Arduino Nano und einen kleinen Piezo-Lautsprecher. Der Lautsprecher kommt an D9 und GND, das Eingangssignal (positiv, zwischen 2,5 und 5,0 V) an D2 und GND. Wer einen anderen Arduino hat, muss evtl. die Pinbelegung ändern.


Im .ino File kann man ein paar Sachen konfigurieren, das steht dann ganz oben. Da ich .ino hier nicht hochladen darf, musste ich sie in .txt umbenennen, was ihr dann rückgängig machen müsst.


In der "Auslieferkonfiguration" ist es für kleine bis mittlere Szintillationszähler eingerichtet. Nach dem Start bestimmt das Programm 400 Impulse lang die Hintergrundrate (bei einem SBT10 o.ä. sollte man da vielleicht auf 100 Impulse gehen). In dieser Zeit leuchtet die eingebaute LED. Wenn die Hintergrundrate später um 30% überschritten wird, schaltet sich das Audio ein. Vom Zählwert wird dabei der Hintergrund abgezogen, so dass man ganz unten in der Tonskala anfangen kann.

Sollte sich der Hintergrund deutlich ändern und man möchte neu kalibrieren, kann man einfach den RESET-Taster auf dem Arduino drücken.


Ich hatte ja beschrieben, dass ich Probleme mit den Interrupts hatte, die die PWM gestört haben. Das lag aber nicht am µC, sondern an einer falschen Impulsaufbereitung meines Szintis :-)  Irgendwo habe ich gelesen, dass man mit Interrupts bis mehrere 10.000 cps kommen kann, ohne dass es andere Programmteile stört. Also habe ich es erst mal bei den Interrupts belassen.

Da ich in einer kleinen Mietwohnung lebe, ist aufgrund fehlender angemessener Lagerungsmöglichkeiten meine Auswahl an Testquellen ziemlich begrenzt: wenn ich alles, was ich habe, auf den Szinti schmeiße, komme ich von 65 cps Hintergrund auf etwa 500 cps. Das Programm funktioniert in diesem Bereich super. Ich weiß allerdings nicht, was passiert, wenn man da deutlich drüber gehen würde. Dafür ist aber schon ein Rechteckimpulsgenerator (zweiter Arduino) in der Queue.

Viel Spaß beim Spielen!  :)

Henri

Henri

Kleines PS:

Es tut auch sehr gut ein Arduino Nano Clone für knapp unter 5,- incl. Versand. Wenn man das Original kauft, unterstützt man damit allerdings die Entwicklung neuer Hardware und die Verbesserung der Entwicklungsumgebung. Hat also alles so seine Vor- und Nachteile  :o

Passt aber auf, dass ihr aus Versehen keinen "Pro Mini" nehmt - der hat keine USB-Buchse, und ihr braucht zur Programmierung dann noch einen USB-TTL-Wandler mit DTR-Ausgang. Die meisten Wandler haben das nicht, dann muss man den Reset bei jedem Flashen manuell per Knopfdruck auslösen - ziemlich nervig. Also, nicht kaufen, es sei denn ihr braucht unbedingt ein Controllerboard, das ohne größere Eingriffe mit 3V läuft.

DL3HRT

ZitatDa ich in einer kleinen Mietwohnung lebe, ist aufgrund fehlender angemessener Lagerungsmöglichkeiten meine Auswahl an Testquellen ziemlich begrenzt: wenn ich alles, was ich habe, auf den Szinti schmeiße, komme ich von 65 cps Hintergrund auf etwa 500 cps. Das Programm funktioniert in diesem Bereich super. Ich weiß allerdings nicht, was passiert, wenn man da deutlich drüber gehen würde. Dafür ist aber schon ein Rechteckimpulsgenerator (zweiter Arduino) in der Queue.
Beim PSC-1 hat man einen Bereich von ca. 15 cps bei ruhigem Hintergrund bis 19999 cps bei einem Stück Pechblende. Bei letzterer ist die Impulszahl sogar noch höher aber der Zähler zählt nur bis 19999. Mit diesen Eckwerten müsste die Software zurechtkommen.

Eine automatische Anpassung an den Messwert stelle ich mir schwierig vor. Wenn man nach einem Hotspot sucht, so muss die Soundausgabe nahezu verzögerungsfrei dem Messwert folgen. Ich kann mir gut vorstellen, auch am Arduino ein Poti zur festen Einstellung der Ansprechschwelle zu verwenden.

Henri

Zitat von: DL3HRT am 31. Oktober 2020, 22:26
ZitatDa ich in einer kleinen Mietwohnung lebe, ist aufgrund fehlender angemessener Lagerungsmöglichkeiten meine Auswahl an Testquellen ziemlich begrenzt: wenn ich alles, was ich habe, auf den Szinti schmeiße, komme ich von 65 cps Hintergrund auf etwa 500 cps. Das Programm funktioniert in diesem Bereich super. Ich weiß allerdings nicht, was passiert, wenn man da deutlich drüber gehen würde. Dafür ist aber schon ein Rechteckimpulsgenerator (zweiter Arduino) in der Queue.
Beim PSC-1 hat man einen Bereich von ca. 15 cps bei ruhigem Hintergrund bis 19999 cps bei einem Stück Pechblende. Bei letzterer ist die Impulszahl sogar noch höher aber der Zähler zählt nur bis 19999. Mit diesen Eckwerten müsste die Software zurechtkommen.

Eine automatische Anpassung an den Messwert stelle ich mir schwierig vor. Wenn man nach einem Hotspot sucht, so muss die Soundausgabe nahezu verzögerungsfrei dem Messwert folgen. Ich kann mir gut vorstellen, auch am Arduino ein Poti zur festen Einstellung der Ansprechschwelle zu verwenden.

Ja, das ist jetzt noch die Herausforderung.

Man sollte aber auch bedenken, dass bei 1000 cps die Zeit, um 400 cps für eine Rekalibrierung zu messen, sehr schnell vorbei ist. Dh. wenn der Ton unangenehm hoch wird, drückt man auf den Knopf, und der Sound fängt nach einer halben Sekunde wieder von unten an. Das kann sogar bequemer sein, als am Poti den richtigen Wert zu finden, wenn man den Knopf z.B. am Ende eines Handgriffs anbringt.

Ich habe jetzt keinen Vergleich zum analogen Gerät, aber auch das benötigt ja eine gewisse Integrationszeit, bzw. der Kondensator muss sich erst füllen. Es reagiert also auch nicht sofort, allerdings im Gegensatz zum Programm in der derzeitigen Version um so schneller, je höher die Zählrate wird. Das könnte man aber auch recht einfach in der Software abbilden, indem man statt zeitlich vorgegebenen Zählintervallen eine feste Zahl von Impulsen abwartet und hierfür die Zeit stoppt. So, wie es bei der Initialisierungsmessung des Hintergrunds bereits gemacht wird. Da das bei niedrigen Zählraten ungünstig ist, könnte man automatisch ab einer bestimmten Rate auf den anderen Zählmodus umschalten.

Mit den voreingestellten Werten im Programm funktioniert es eigentlich echt gut. Wenn das Gerät auf dem Tisch steht, ist es still, nur ab und zu kommt mal kurz ein Summen. Dann weiß man, dass es noch funktioniert. Meinen Blechkasten mit den beiden Glühstrümpfen hat es sehr schnell erfasst aus 30-40cm Entfernung, und man kann dann auch von außen lokalisieren, wo im Kasten genau die Strümpfe liegen.  Das Gerät direkt außen am Kasten aufgelegt habe ich so 150-200 cps, also gut 3-fachen Hintergrund (ca. 250 nSv/h). Ich bin ehrlich gesagt ziemlich begeistert, weil die Quelle ja wirklich schwach ist. Auf dem Display fallen die Änderungen gar nicht auf, im Rauschen des Tickers, den das Gerät schon vorher hatte, auch nicht, aber in der Tonfrequenz merkt man es sehr deutlich.

Man könnte noch Taster/Schalter am Arduino hinzufügen und damit dann z.B. auswählen, ob man eine lineare Frequenzabhängigkeit (dann mit Reset-Taste drücken von Zeit zu Zeit) oder eine exponentielle haben möchte. Oder ob Audio immer an sein soll oder nur, wenn die Hintergrundstrahlung um 30% überschritten wird. Oder man wählt per DIP-Schalter die "Steilheit" der Frequenzänderung. Das alles kann dann einen Vorteil bedeuten, wenn man mal auf der Suche nach Punktstrahlern ist (da geht logarithmischer Verlauf gut, weil ja auch die Strahlung exponentiell bei Annäherung ansteigt), oder ob man einen Flächenstrahler hat, wie z.B. die Landstrasse, über die man gerade fährt, bei der das ja eher ein linearer Zusammenhang ist. Und die ganze Schaltung passt, egal was man anflanscht, immer in eine Streichholzschachtel und verbraucht vielleicht 20 mA.

Viele Grüße!

Henri

Henri

Ich kann grad leider kein Video hochladen, aber wer sich einen Eindruck verschaffen möchte:

die bisherige Version meiner Software ist ziemlich genau dem Gerät (Saphymo/Novelec DG-5) nachempfunden, das man in diesem Video hier ab 0:30 sehen kann



Sogar die Empfindlichkeit ist ähnlich, nur dass der DG-5 einen großen Plastikszintillator verwendet und ich einen alten Alpha Spectra NaI(Tl) für 50,-.

Die linke schwarze Taste dient zum Rekalibrieren des Hintergrunds.

DG0MG

Hier der weinerliche Ton eines EXPLORANIUM GR-110G:



Scheint aber trotzdem sehr gut zu funktionieren.
"Bling!": Irgendjemand Egales hat irgendetwas Egales getan! Schnell hingucken!