教育用GM管開発を振り返って(15)

高校理科実験での講義の考え方


高校生ともなれば、これまでに初歩的な放射線教育は受けたことがあると思われる。実験内容の距離、遮へい、半減期、統計的変動についてはそれぞれ各論として講義をするが、総論が必要と考えた。さらに、放射線を入り口として、量子論や相対論といった物理学への関心を持たせたい、あるいは、さらに高度な世界があることを高校生には提示して、今後の成長に役立ててほしいと思い、以下のような講義メモを作成した。やや、普通の高校生には難しいかもしれないが、トップレベルの高校生には魅力的と感じる内容になっている。ありふれた項目だが、具体的なイメージが掴みやすいように工夫してある。何かの参考になれば幸いである。


GM管と放射線について」の講義メモ


放射線を粒子性とエネルギーの両面から見ることを意識している。

1.『放射線』の『見える化

  • 放射線』は、五感に感じられない(見えない、聞こえない、触れない、臭わない、味もない) ⇒存在を認識できない
  • 感覚で捉えられるようにする=可視化(見える化
  • 放射線』が見える⇒例:『霧箱
  • 放射線』が聞こえる⇒例:『GM管』

注.可視化ツールの必要性。霧箱を知っている場合に、GM管との違いを説明。

2.『GM管』で『音』が出るしくみ

  • 放射線が空気を電離→電気の引力で集電→電流を電圧に変換→電圧を音に変換

f:id:apgmman:20211222140949p:plain

  • 音(パルス)1回 = 放射線1個

注.単純化したモデルで音になる仕組みを説明。電子なだれには触れていない。

3.『放射線』とは?

  • 法律では

 『電磁波』または『粒子線』のうち、直接または間接に『空気を電離する能力』を持つもの

注.放射線教育の難しいのは、「放射線とは?」に単純明快な答えがないこと。批判を恐れずに言えば、「放射線は、高いエネルギーを持った『粒』」であり、『粒』は粒子性の意。

4.『eV(エレクトロン・ボルト)』とは

  • 原子や素粒子の運動エネルギーの単位
  • 定義:電気素量(=電子の電荷) eクーロン(C)の粒子が電圧1ボルト(V)の真空の2点間で加速されるときに得る運動エネルギー   1eV=1.60×10-19J
  • 粒子1個のエネルギーなので見かけは小さいが、重量あたりの運動エネルギーとしては極めて大きい
  • 例:1MeVのβ線(電子)は1.76×1017J/kg

参考:銃弾や砲弾は105~106J/kg、流星、地球、太陽などの天体でも108~1010J/kg

注.空気の電離エネルギー34eVに呼応。エネルギーへの意識と大きさの相場観が狙い。

5.1eVのエネルギーとは

f:id:apgmman:20211222141158p:plain

注.エネルギーの大きさの相場観で、まず、電磁波である光のスペクトルと対比。波長で表されるのが普通だが、敢えてエネルギーで示した。波長が短いほどエネルギーが高いのは、分かりにくい。

6.化学結合エネルギーの例 (出典:http://onsa.g.dgdg.jp/u47.htm

f:id:apgmman:20211222141232p:plain

注.光が吸収されるのは化学結合の分子間力のレベル。空気の電離エネルギー34eVより、1桁低い。

7.『放射線』の特徴(1)小さい、軽い  量子力学

  • 『小さい』:α線(ヘリウムの原子核)の直径は3.8×10-15m、β線(電子)の大きさはゼロか極めて小さく、γ線(光子)の大きさはゼロ。
  • 例:フラフープ(直径1m):α線=地球の公転直径(3.0×1011m=3.0×1014mm):ケシの実(直径0.57mm)
    • 『軽い』:α線は6.6×10-27kg、β線は9.1×10-31kg、γ線はゼロ。
  • 例:1リットル入りのペットボトル(1kg):α線β線=太陽の重さ(2.0×1030kg):大型ダンプカー(13.2トン):2リットル入りのペットボトル(2kg)

注.よい例とも言い難いが、何とか具体的なイメージを持たせたかった。量子力学というキーワードも生徒には刺激的。

8.『放射線』の特徴(2)速い  相対論的

  • 『速い』:γ線は光子なので、光速c=3.0×108m/s、5MeV(8.0×10-13J)のα線は0.09c(=27000km/s)、 1MeV(1.6×10-13J)のβ線は0.94c(=282000km/s)。
  • 例:物質の速度で最も速いのは、太陽系が銀河宇宙内を動く速度240km/s。

注.α線β線の速度を例に挙げるのは珍しいと思う。ただ、ここでは非相対論的。

9.放射線の『作用』

  • 電離作用    霧箱、GM管
    • (a)原子に作用して電子を放出する
    • (b)原子は陽イオンになる
  • 励起作用    シンチレーション式カウンタ
    • (a)原子に作用して軌道電子のエネルギーを基底状態(安定)から高める(不安定)
    • (b)基底状態に戻るときに光やX線を出す

注.放射線を説明するときに、「実体」と「作用」があるということ。放射線検出器の違いにも触れている。

10.α線β線γ線X線の違い

  • α線=ヘリウムの原子核(大きい、重い、正電荷
  • β線=(高エネルギーの)電子(小さい、軽い、負電荷
  • γ線=(高エネルギーの)電磁波で、原子核から出る
  • X線= (高エネルギーの)電磁波で、核外の軌道電子間から出る(あるいは高速電子の制動や偏向に伴う)
  • α線β線の物質との作用は、電気力(静電引力・斥力)
  • γ線X線の物質との作用は、電子に働きかける作用(弱い相互作用)で固有のもの

注.ここでも、「実体」と「作用」を説明している。

11.『自然にある放射線

注.放射線放射性物質に言及。宇宙線を含め、放射線が宇宙に普遍的な存在であることを強調したい。

12.『人工の放射線

  • 医療用のX線(レントゲン検査、CT検査、がん治療)、電子線(がん治療)、陽子線(がん治療)、重粒子線(がん治療)
  • 空港などの手荷物検査用のX線
  • 産業用のX線(検査など)、電子線(改質、滅菌など)、粒子線(半導体の製作)、光子線(ICなどの製作)
  • 研究用の電子線、粒子線(高エネルギー物理)、光子線(分析など)

注.人工の放射線は、いわば人類の知恵の産物で、意外にも暮らしの中に浸透している。


以上だが、距離の逆二乗測とか、遮へいの指数則、放射性物質半減期という性質や、放射性壊変については、それぞれの各論で解説しているので、ここでは触れていないことに、注意されたい。授業の時間制限の中で、約20分でこの講義を行ってきた。何かの参考になれば、幸いである。


(※id:TJOid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)

教育用GM管開発を振り返って(14)

www.radi-edu.jp

放射線教育支援サイト「らでぃ」の実験集にも掲載したが、教育用GM管開発は結果として開発段階に応じた3タイプを残したことになる。クリアケースGM管、タブレットGM管、7セグメントLEDGM管である。これらの使い分けについて考えてみたい。


クリアケースGM


f:id:apgmman:20211220215812p:plain

既に述べたが、開発すべきGM管の候補を絞り込むためのパラメータ実験では、既にLCD表示の計数器で、パソコンにデータを取り込むためのRS232Cポートを持ったGM計数管ができていた。当然、自作で、以前に作った秋月電子製のGM管キットの回路を参考にしつつ、ブロッキングオシレーターと多段の倍電圧整流による三門先生伝来の高電圧回路と組み合わせた一体型のGM計数管であった。当初の開発目標が、安価なGM管と安価な計数・表示装置で、パソコンでログが取れ、印加電圧は1000V以内にといいう要望まで入っていたので、何とかその方向でと努力したが、まず、GM管で挫折した。


1000V以下で稼働するには、GM管はガス置換して1/10気圧程度の減圧で封じきる必要がある。ということは、市販品と同程度の製品を安く作れということに等しい。国内でGM管の製造が危ぶまれるようになった理由は、端窓の雲母膜を作れる職人がいなくなったからと聞いた。1/10気圧となると薄いプラスチックでは無理だ。容器についても、金属製となると簡単には行かない。平滑面を作るにはメッキか蒸着か、いずれにしてもどこかの工場に頼まないとできない。これらを総合的に判断すると、市販品と同程度のものを作
ろうとすると、コストも同程度となると考えざるを得なかった。

その代案が「大気圧空気GM管」だった。基本的な成立条件はパラメータ実験で分かっていたので、既に口径5cmクラスは可能と考えていた。口径5cmは市販のパンケーキ型GM管と同程度なので、計数率としては申し分ない。大気圧なので容器は薄いプラスチックで良い。端窓もプルスチックフィルムで済む。当時、「大気圧空気GM管」のGM管はプラカップサランラップを被せるのが一般的だったが、これでは標準化しにくい。ここで言う標準化とは容易に同じものが多く作れるという意味で、学校の授業ではできるだけ性能を揃える必要があると思っていた。


そこで、偶然に見つけたのが、近くに山積みになっていたクリアケースだった。他の目的で購入したが使われないまま放置されていたもので、たまたまサイズが口径5cm、高さ5cmで、蓋付きだった。プラスチック製で厚さは0.2mm程度。うってつけと思った。プラカップでは円錐形なのでカソードは扇型に切り出す必要がある、蓋がないので、ラップフィルムを被せて輪ゴムで止めるというのも、まったく美的でない。プラカップは手作り感満載だが、イベントならともかく、学校の授業には向いていないと思っていた。そこで、見つけたクリアケースは天啓と言わざるを得ない。


話しは変わるが、高電圧電源の方はというと、仲間内の情報で高電圧ユニットがジャンク品で安く手に入るという。一例では、十分高い電圧が得られるので、分割抵抗で電圧を調整していた。分割抵抗と言っても紙で、紙の両端をクリップで挟み、適当な中間部から電圧を取り出すというしろもの。これも美的ではない。ジャンクなのでいろいろと探し回るうちに現在の冷陰極放電管用の高電圧ユニットにたどり着いた。既に最初に見つけた時より2倍の値段になっていたが、それでも1個200円だったので、在庫のほとんどにあたる100個を買い占めた。それが、いまでも原資になっている。


その後、何回かの改良を経て標準化した。このクリアケースGM管の特徴は、GM管が自作できること、あるいは、用意した部品を組み立てて、自作の雰囲気を味わえることで、生徒には評判が良い。ただし、性能にはばらつきが出やすい欠点もある。最大の利点は、ラドン220の半減期の実験ができることで、クリスタルイヤホンで音を聞くだけだが、徐々に音が少なくなっていくことを実感できる。完成した状態で用意すれば、小学校低学年から幼稚園児までの低年齢層でも安全に扱うことができる。高電圧電源はあえて透明プラスチックケースに入れてあるので、からくりが見えて面白いが、中学生や高校生向けには自作への誘いの思惑もある。


ということで、クリアケースGM管のセットは入門編だが、高校生でもGM管の組み立てなどを加えると十分授業になる。結構楽し気にやっているのを何度も見た。このセットの最大の特徴は放射線を音として検出することで、この音はサーベイメータの警報音とは違って、まさに放射線そのものが作った音である。つまり、他にはない検出手段で、なおかつ感覚的に放射線の存在を理解できる。このことは、計数を必要としない、小学校低学年や幼稚園児あるいは大人に訴える効果が大きい。サーベイメータではできない機能ともいえる。逆に言えば、定性的な実験には最適だが、定量的な実験には向いていない。例えば、ラドン220の実験では、実際は徐々に数が減っていくので、そのように聞こえるはずだが、多くの生徒は音が小さくなっていくと回答している。感覚というのは、そのような捉え方もあるので、注意が必要になる。感覚というよりは、言葉の表現の問題かもしれないが、放射線を音として聞くことの限界かもしれない。


結局、クリアケースGM管用に開発した高電圧電源は、可変抵抗器を付けて高電圧を可変にするなどの多少の改変を加えながらも、標準型の電源として、使用を続けている。


タブレットGM


f:id:apgmman:20211220215911p:plain

高校の授業で使用するには、計数機能が必要になる。距離の実験、遮へいの実験、統計的変動の実験、ラドン220の半減期の実験など、データを取って解析するには、安定した高電圧電源とGM管が必須となる。これまでのクリアケースGM管では、高電圧は可変抵抗器で調節すればよく、計数機能はないのであくまでもアバウトで済んだ。クリアケースGM管は蓋をするタイプなので、どうしても長時間の安定性に欠ける。実際に計数をしてみると、計数率は徐々に低下していく。1コマ程度の授業時間なら何とか維持できるが、翌日はもう使えない。また、高電圧電源も9Vの電池駆動なので、高電圧が徐々に低下していく。徐々と言ったが、意外と低下は早い。このような事情を考慮すると、密閉型のGM管とACアダプターを使用した安定化電源による高電圧電源が必要と考えた。


タブレットGM管は、計数・表示機能をタブレットに委ねるので高電圧電源は上のような要求が満たせれば、従来型と大きくは変わらない。タブレットに計数・表示のプログラムをインストールさえしておけば、特別な計数・表示装置は不要となる。また、ICT教育の時代になって、タブレットやパソコンにデータを取り込んでおけば、その後の処理にも役立つと考えると、タブレットGM管こそ次世代向けのGM管ではないか、と考えた。実際、学校側にタブレットやパソコンにプログラムをインストールできないかと照会したところ、難しいとの回答があったことが、タブレットを学校に持ち込むことになった理由である。その後は事情が変わっているかもしれないが。


結局、この段階で、塩ビ管を容器とし、ガス注入用のキャップ付きノズルを備えた密閉型GM管が開発された。高電圧電源にプラグインする接続方式は踏襲した。この密閉型GM管は、その後の継続的な測定で、良好なものは数年も性能を維持していることが分かっている。


一方、不具合もある程度出てきて、ブタンの再注入をしても改善されないものもある。密閉と言いながら、貼り合わせた接着剤の接着が不十分で、どこかにリークパスがあるらしい。端窓の方は透明シートなので、接着の具合はよくわかるが、天板は黒いABS樹脂板なので、接着面は見えない。また、ガス注入ノズルも接着しており、キャップを被せて封止しているので、その辺りも怪しいと言えば怪しい。この辺の反省点は、その後の改良版密閉型GM管では配慮されている。天板は透明にし、ガス注入ノズルは止めて、透明な板でガスの注入孔を接着して塞ぐことにした。接着部はすべて目視で確認できるので、信頼性は向上した。


また、性能のバラツキはほとんどがアノードの出来不出来にかかっている。中でも、アノードの先端部の形状がまちまちなのが原因と思われた。そこで、アノードの線材をよじって先端にフープを作る工程で、楊枝を使って先端フープの形状をできるだけ円形とし、その外径も2mmに統一した。アノードの先端付近の露出部の長さも、5mmで揃えた。この結果は、まだ、継続的に測定しているが、密閉性も性能も向上している。


7セグメントLEDGM管


f:id:apgmman:20211220220015p:plain
(初期のタイプ)

4桁の7セグメントLEDで表示する計数・表示回路を高電圧電源に内蔵したコンパクトなGM管である。4桁なので、CPMでの表示は難しく、1秒率と10秒率で表示する。簡単化のため、電源スイッチは省略して、ACアダプターを接続または12V電池パックを接続してスイッチをONすれば起動するようになっている。また、高電圧はプリセットとした。半固定抵抗で調節できるが、生徒がその場で調節しなくてよいように配慮した。1秒率と10秒率の切り替えも、1秒率で起動して、プッシュスイッチを押すと10秒率で計数を始め、10秒のカウントダウンが表示された後に10秒率が表示・保持されるようにした。再度、プッシュスイッチを押すと、次の測定が始まり、これを繰り返す方式となっている。高圧電源は計数・表示回路のノイズ源なので、最小限の隙間を確保するように配慮した。このノイズには悩まされたが、1cm程度間隔を開けたり、高電圧のラインを回路に近づけないように配置したりして、解決した。


7セグメントLEDGM管は、計数値を読み取って記録し、その後にデータ処理をする方式なので、手間ばかりかかるが、実は生徒には忙しい方が良いらしい。何か、やった気になるらしく、むしろ評判は良い。逆に、タブレットGM管はいわば自動測定なので、何もしなくても済むといえば済む。読み取り、記録もできるので、必ずしも何もしないわけではないが、本来、自動測定ができる装置なので、授業で使うには工夫がいるのかもしれない。


7セグメントLEDGM管には、高電圧電源+7セグメントLED表示器、密閉型GM管、放射線源、遮へい板セットが同梱されたケースに入れて、12V電池パックとともに使用されている。授業の際に、無駄なセッティングの時間がないように配慮されており、各実験のためのワークシートも用意されている。かなり、教育用のGM管としては完成された姿になった。


まとめ

クリアケースGM 音で聞く定性的、感覚的。幼児から大人まで。
タブレットGM 定量的。高校生向け。ICT教育にも適応。
7セグメントLEDGM管 定量的。完成度が高い。高校生向け。


(※id:TJOid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)

教育用GM管開発を振り返って(13)

www.radi-edu.jp
apgmman.hatenablog.com

放射線教育支援サイト「らでぃ」の実験集に掲載した「Pythonでクルックス管の微弱X線を計数」のPythonプログラムについて解説する。Pythonやライブラリーのインストール方法や注意点、Pythonの文法の特徴などは「教育用GM管開発を振り返って(9)」に記載した。


Pythonでクルックス管の微弱X線を計数」のプログラム例


これまでとは違って検出器はGM管ではなくウエブカメラなので、PyAudioは使用しない。この例は計数を目的としているので演算の部分はGM管の場合に似ているが、データの取り込み方はまったく異なっている。必要なライブラリーはOpenCvだけである。PyAudioを使用しない分、プログラムが簡単になっている。

まず。ライブラリーとしてOpenCvをインポートする。

import cv2 #画像処理ライブラリーをインポート

次に、ウエブカメラをデフォルトに指定する。タブレットなど既設のカメラがある場合には、引数の0を1にするとよい場合もあるが、まったく受け付けない場合もあるので、パソコンとウエブカメラの組み合わせの方が無難と思う。最初に初期値としてframe1に画像を読み込み、さらにカラー画像からモノクロ画像に変換したものをimg1とする。

cap = cv2.VideoCapture(0) #カメラ指定
ret, frame1 = cap.read() #初期画像入力
img1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY) #カラー画像をモノクロ画像に変換

img1は演算の途中で改変されるので、img0として保存しておく。

img0 = img1 #画像初期値

画素の強度(輝度)は、0から255までとなっている。計数の閾値thresholdを適宜決めておくが、経験的には100でよい。

threshold = input('Threshold(0<255)? ') #計数の閾値
count = 0 #計数
m = 0 #10秒用コマ数カウンタ
n = 0 #0.1秒用コマ数カウンタ
k = 1 #繰り返し数

画像を取り込み、モノクロ画像に変換してimg2に保存する。

while k <= 6: #6回繰り返し
    ret, frame2 = cap.read() #画像入力
    img2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY) #カラー画像をモノクロ画像に変換

10秒経過後、画像の端の部分を除いて、画面上の輝度がthreshold以上の画素の数をカウントして10秒率として画面に出力する。ファイルに残したい場合は、ほかのプログラムをまねれば、簡単に作ることができる。ここで、画像の端の部分を除くのは試作で使用したウエブカメラではノイズらしい輝点があったためで、一般的なのかどうかは分からない。ノイズが出なければ全画面の方が良い。

    if m == 300: #10秒ならば
        m = 0 #10秒用コマ数カウンタをクリア
        for a in range(60, 419): #画像の縦範囲を制限
            for b in range(80, 559): #画像の横範囲を制限
                px = img1[a, b] #画素(a,b)の輝度
                if px > int(threshold): #輝度が閾値以上
                    count += 1 #計数を1増やす
        print('CP10/3S= ' + str(count)) #10秒率を出力
        k += 1 #繰り返し数を1増やす
        count = 0 #計数をリセット
        img1 = img0 #画像をリセット

実はこの間、0.1秒ごとに画像を蓄積している。動画として取り込んでいるが、コマ数は毎秒30コマとなっている。したがって、画像は1/30秒ごとなので、n=3で0.1秒となる。

    if n == 3: #0.1秒ならば
        n = 0 #0.1秒用コマ数カウンタカウンタをクリア
        img = img1 + img2 #画像を加算
        img1 = img #加算した画像を次に送る

    m += 1 #10秒用コマ数カウンタを1増やす
    n += 1 #0.1秒用コマ数カウンタを1増やす

カメラを開放して終わる。

cap.release() #カメラをリリース

簡単なので、つい、ウエブカメラがγ線にも使えないだろうかと思ってしまうが、実はできない。ウエブカメラは可視光線向けの素子を使用している。そのため、低エネルギーのX線までは何とか検知できるが、それでも25keV以上は難しい。クルックス管の微弱X線についても低エネルギーほど感度が高く、無理にインダクションコイルの高電圧を上げる必要はない。むしろ15keV程度で十分なので、陰極線の実験よりは低い電圧で済む。


実は、α線β線でも極めて少数だが輝点は観測されている。しかし、計数実験に使えるような数ではないので無理である。また、α線β線で輝点に何か大きさとか輝度とかに違いがあるかというとはっきり言えない。ウエブカメラは、クルックス管からの微弱X線の観測に最適の機器と言える。


(※id:TJOid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)

教育用GM管開発を振り返って(12)

www.radi-edu.jp

放射線教育支援サイト「らでぃ」の実験集に掲載した「Pythonでパルス波高分析の実験」のPythonプログラムについて解説する。Pythonやライブラリーのインストール方法や注意点、Pythonの文法の特徴などは「教育用GM管開発を振り返って(9)」に記載した。

apgmman.hatenablog.com


Pythonでパルス波高分析の実験」のプログラム例


apgmman.hatenablog.com

やや特殊な計測となるが、「教育用GM管開発を振り返って(4)」で述べたように、GM管をその構造や構成のまま印加電圧を下げていくだけで比例計数管として動作させることが可能である。その場合に必要となるパルス波高分析を行うPythonプログラムについて解説する。プログラムでは、60秒間の計測を行って検出パルスの波形を記録するとともに、波高ごとの度数を求めて、波高の最大値を1000チャンネルとした波高分布をグラフとして出力することで、パルス波高分析を行う。


まず、必要なライブラリーをインポートする。このうち、numpyはPythonのインストールで同時にインストールされるので、ライブラリーとして別途インストールする必要はない。#以下はコメント文である。

import pyaudio #マイク入出力処理
import numpy as np
import matplotlib.pyplot as plt #グラフ処理

次に一連の音声入力をストリーミングとして関数化する。CHUNKは入力単位でここでは、1024個ごとにサンプリングする。サンプリング周波数は変えられるが、デフォルトのままにした。録音時間は60秒とした。

CHUNK = 1024 #入出力の長さ
FORMAT = pyaudio.paInt16 #2Byte整数
CHANNELS = 2 #ステレオ
RATE = 44100 #サンプリング周波数(Hz)
RECORD_SECONDS = 60 #録音時間(秒)

ストリーミングをオープンし、CHUNKごとのデータdata-rawをframesというlistに追記していく。

p = pyaudio.PyAudio()
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True, #入力のみ
                frames_per_buffer=CHUNK) 
print("* recording")
frames = [] #空のlistを用意

for i in range(int(RATE * RECORD_SECONDS // CHUNK)): #CHUNK単位で切り捨て
    data_raw = stream.read(CHUNK) #サンプリング
    frames.append(data_raw) #60sec分を加算
    frames_int16 = np.array(frames) #numpyアレイに変換
print("* done recording")

ここでストリームを閉じる。

stream.stop_stream() #ストリームを閉じる
stream.close()
p.terminate()

以下は、波高ごとの度数を求め、波高の最大値を1000チャンネルとして波高分布を求める演算で、まず、2進数を10進数に変換し、データは片チャンネルだけでよいので、ステレオのLチャンネルのデータだけを抽出する。

data = np.frombuffer(frames_int16, dtype='int16') #バイトデータを整数に変換
data_l = data[::2] #ステレオのLチャンネルを取り出す
data_max = int(max(data_l)) #最大値を求める

nu = 0 #閾値以上を判断
nd = 0 #閾値以下を判断
spectrum = [1 for i in range(1001)] #listを1000Channelに初期化
threshold = int(data_max / 10) #閾値を最大値の1/10とする
peak = int(threshold) #ピーク値の初期化

for k in range(len(data_l)): #全データを逐次処理
    dat = data_l[int(k)] #listの要素kを取り出す
    if int(dat) > int(threshold): #閾値以上ならば
        nu = nu + 1 #閾値以上の回数を1増やす
        if nu == 1: #閾値以上の回数が1(初回の意)ならば
            nd = 0 #閾値以下の回数を初期化
        if int(dat) > peak: #これまでのピーク値以上ならば
            peak = int(dat) #ピーク値を更新
    if int(dat) <= int(threshold): #閾値以下ならば
        nd = nd + 1 #閾値以下の回数を1増やす
        if nd == 1: #閾値以下の回数が1(初回の意)ならば
            peakch = int(peak / data_max * 1000) #規格化
            spectrum[peakch] = spectrum[peakch] + 1 #1加算
            peak = int(threshold) #ピーク値を再度初期化
            nu = 0 #閾値以上の回数を初期化

パルス波高分布の出力ファイルspectrum-data.csvを開き、チャンネル番号と度数を出力する。

with open('spectrum_data.csv', mode='w') as fs: #ファイルを開く
    for m in range(1, 1001): #1000チャンネル分を逐次処理
        spect = spectrum[int(m)] #listの要素mを取り出す
        fs.write(str(m) + ',' + str(spect) + '\n') #末尾に追加

グラフの上段にはパルス波形を、下段にはパルス波高分布を描画して終了する。

plt.subplot(211) #グラフの上半分を指定
plt.plot(data_l) #入力信号をプロット
plt.subplot(212) #グラフの下半分を指定
plt.plot(spectrum) #スペクトルをプロット
plt.show() #描画

次の図は出力の例であるが、高チャンネル側にGMモードのピークが現れている。

f:id:apgmman:20211220213147p:plain


(※id:TJOid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)

室内遊び「平板ブーメラン」

お正月の団欒のひと時に、室内で子供でも遊べる「平板ブーメラン」をご紹介します。2m×2mくらいの広さがあれば、床の上のマークめがけて飛ばして遊べます。マークにうまく落ちたら、ミカン一個なんてゲームにもなります。ぜひ、ご家族や友人と遊んでください。作り方は、極めて簡単です。飛ばすのには多少コツがありますが、野球ができる方ならば簡単です。


平板ブーメランとは


普通のブーメランは、くの字型の木製やプラスチック製で、飛行機の翼のような反りがありますが、平板ブーメランは、十字形の厚紙製で反りがありません。反りがない分、子供でも回転の抵抗がない分、飛ばしやすく、当たっても痛くないうえに軽いので室内で飛ばすのに適しています。大きくすればそれなりに遠くへ飛ばすこともできますが、ここでは8畳間程度の室内でも飛ばせる大きさの平板ブーメランを紹介します。


用意するのは、はがきまたははがき大の厚紙1枚。はがきでもでもできますが、画用紙や適当な厚紙の方が重くなって飛ばしやすくなります。型紙と作り方、飛ばし方は次ページの図を参考にしてください。これは、あるイベントのノベルティーとした用意したものですが、もう時効だと思いますので、そのまま載せました。


飛ばし方というか、投げ方のコツは、野球のボールを投げるような、いわゆるスリークォーターで、手首をうまく使ってできるだけ平板ブーメランが回転するようにします。子供はこの回転を入れるのが普段の動作にはないので、慣れるまでは難しいかもしれません。でも、すぐ慣れるのであきらめずにチャレンジしてください。


速度は遅いので身体に当たっても痛くはありませんが、目に当たったりするといけないので、子供にはふざけ半分で、人を目掛けて投げないように注意して見てやってください。


平板ブーメランは、右利きでも左利きでも同じようにできます。同じように飛ばせば、旋回の方向が逆になるだけです。右利きならS字型、左利きなら逆S字型の飛行ルートで戻ってきます。完全に手元に戻るのは無理ですが、手を伸ばせば届くくらいの距離まで飛ばすこともでき、一人遊びでもできないことはありません。いろいろと楽しめると思います。


型紙、作り方、飛ばし方、遊び方、飛行の原理


f:id:apgmman:20211219185512p:plain

あきらめずに挑戦することが、何に寄らず肝要です。


(※id:TJOid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)

教育用GM管開発を振り返って(11)

www.radi-edu.jp
apgmman.hatenablog.com

放射線教育支援サイト「らでぃ」の実験集に掲載した「Pythonで計数経時変化の実験」のPythonプログラムについて解説する。Pythonやライブラリーのインストール方法や注意点、Pythonの文法の特徴などは「教育用GM管開発を振り返って(9)」に記載した。


Pythonで計数経時変化の実験」のプログラム例


1秒間の計数を繰り返し、経過秒数と1秒率を画面に表示するとともに、csvファイルに出力するプログラムで、ラドン220の半減期の測定や、統計的変動の実験に使用できる。


まず、必要なライブラリーをインポートする。このうち、numpyはPythonのインストールで同時にインストールされるので、ライブラリーとして別途インストールする必要はない。#以下はコメント文である。

import pyaudio #マイク入出力処理
import numpy as np
import matplotlib.pyplot as plt #グラフ処理
import cv2 #カメラ画像処理

次に、グローバル変数を宣言し、初期値を決める。閾値の変数thresholdは、パルス波高を予めモニターして数値を決め、キーボードから入力する。

global m, threshold #グローバル変数
m = 1 #経過時間
threshold = input('Threshold?') #閾値を設定

出力ファイルcps_data.csvを開き、ヘッダーを書き込んでおく。出力ファイルはExcelなどの処理ソフトを利用することを念頭にcsvファイルとした。

with open('cps_data.csv', mode='w') as fc: #計数値を書き込むファイルを新規モードで開く
    fc.write('Time(sec)' + ',' + 'CPS' + '\n') #タイトル

cps_data = [] #計数値の空リストを用意

次に一連の音声入力をストリーミングとしてデータ化し、計数からグラフ描画に至るまでを関数化する。CHUNKは入力単位でここでは、1024個ごとにサンプリングする。サンプリング周波数は変えられるが、デフォルトのままにした。録音時間は1秒である。

def streamandcount(): #入力からグラフ描画まで処理
    CHUNK = 1024 #入出力の長さ
    FORMAT = pyaudio.paInt16 #2Byte整数
    CHANNELS = 2 #ステレオ
    RATE = 44100 #サンプリング周波数(Hz)
    RECORD_SECONDS = 1 #録音時間(秒)

ストリーミングをオープンし、CHUNKごとのデータdata-rawをframesというlistに追記していく。

    p = pyaudio.PyAudio()
    stream = p.open(format = FORMAT,
                    channels = CHANNELS,
                    rate = RATE,
                    input = True, #入力のみ
                    frames_per_buffer = CHUNK)
    frames = [] #空のlistを用意

1秒分のデータを加算して、framesに追記していく。

    for i in range(int(RATE * RECORD_SECONDS // CHUNK)): #CHUNK単位で切り捨て
        data_raw = stream.read(CHUNK) 
        frames.append(data_raw) #43回分を加算

    frames_int16 = np.array(frames)

ここでストリームを閉じる。

    stream.stop_stream() #ストリームを閉じる
    stream.close()
    p.terminate()

以下は、計数と計数率の画面とファイルへの出力のための演算で、まず、2進数を10進数に変換し、データは片チャンネルだけでよいので、ステレオのLチャンネルのデータだけを抽出する。

    pulse = 0 #計数を初期化
    data_l = data[::2] #ステレオのLチャンネルを取り出す
    onflag = False #閾値超過フラッグを初期化
||< 

データが閾値を超えるとフラッグを立て、閾値を下回るとカウント1を加算し、フラッグを降ろす。閾値を超えたところから下回ったところまでを1カウントとするので、複数パルスでも重複カウントすることはない。

>|python|
for k in range(len(data_l)): #data_l全体が範囲
        dat = data_l[int(k)] #data_lのk番目の値
        if int(dat) > int(threshold) and not onflag: #閾値を初超過
            pulse = pulse + 1 #1カウントを加算
            onflag = True #閾値超過フラッグを立てる
        if int(dat) <= int(threshold): #閾値以下になったら
            onflag = False #閾値超過フラッグを降ろす 

計数率をCPSで画面に表示する。

    cps = pulse #CPSに換算
    print('CPS = ' + str(int(cps))) #計数値を画面に出力

同時に計数率をファイルに出力する。フォーマットは、経過秒数、1秒率となっている。 cps_data.append(cps) #計数値のlistに追加

    with open('cps_data.csv', mode='a') as fc: #ファイルを開く
        fc.write(str(m) + ',' + str(cps) + '\n') #経過と計数値を追記

さらに、入力信号の一部の44msec分をパルス波形のモニターとして上段のグラフに表示し、下段には経過時間と1秒率をグラフに表示して計数のトレンドが分かるようにした。

    fig = plt.figure(num = 1, figsize = (6, 7)) #グラフを定義
    plt.subplot(211) #グラフの上半分を指定
    plt.plot(data_l[200:1200]) #入力信号の一部44msec分を表示
    plt.ylim(-250, 1000) #y軸の範囲
    plt.xlabel('t (msec/44)') #x軸のラベル
    plt.ylabel('PulseHeight') #y軸のラベル
    plt.subplot(212) #グラフの下半分を指定
    plt.plot(cps_data) #計数値を表示
    plt.xlim(0, 600) #x軸の範囲
    plt.ylim(0, 1000) #y軸の範囲
    plt.xlabel('t (sec)') #x軸のラベル
    plt.ylabel('CPS') #y軸のラベル
    plt.pause(0.3) #0.3秒間だけ描画
    plt.clf() #グラフを閉じる

キーボードからqを入力するまで、計数を反復する。プログラムの停止には、キーボードからqを入力する。

while True: #キー入力を待つ
    streamandcount() #処理を反復
    m = m + 1 #経過時間1秒を加算
    if cv2.waitKey(0) & 0xFF == ord('q'): #qを入力
        break #処理を終了

画面に出力したグラフの例を図に示す。

f:id:apgmman:20211217234759p:plain

上のグラフの上段はモニター用のパルス波形で、下段は計数率の経時変化、すなわち経過秒数に対する1秒率の関係を描画している。


(※id:TJOid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)

教育用GM管開発を振り返って(10)

apgmman.hatenablog.com

放射線教育支援サイト「らでぃ」の実験集に掲載した「Pythonで反復計数の実験」のPythonプログラムについて解説する。Pythonやライブラリーのインストール方法や注意点、Pythonの文法の特徴などは「教育用GM管開発を振り返って(9)」に記載した。


Pythonで反復計数の実験」のプログラム例


10秒間の計数を、キーqの入力で停止するまで繰り返し、計数率を画面表示するとともに、csvファイルに出力する計数の基本プログラムについて解説する。


まず、必要なライブラリーをインポートする。このうち、numpyはPythonのインストールで同時にインストールされるので、ライブラリーとして別途インストールする必要はない。#以下はコメント文である。

import pyaudio #マイク入出力処理
import numpy as np
import matplotlib.pyplot as plt #グラフ処理
import cv2 #カメラ画像処理

次に、グローバル変数を宣言し、初期値を決める。閾値の変数thresholdは、パルス波高を予めモニターして数値を決め、キーボードから入力する。

global m, threshold #回数と閾値の変数をグローバルと宣言
m = 1 #測定回数
threshold = input('Threshold?') #閾値を入力

出力ファイルcpm_data.csvを開き、ヘッダーを書き込んでおく。出力ファイルはExcelなどの処理ソフトを利用することを念頭にcsvファイルとした。

with open('cpm_data.csv', mode='w') as fc: #出力ファイルを新規モードで開く
    fc.write('Time(sec)' + ',' + 'CPM' + '\n') #ヘッダーを書き込む

次に一連の音声入力をストリーミングとしてデータ化し、計数に至るまでを関数化する。CHUNKは入力単位でここでは、1024個ごとにサンプリングする。サンプリング周波数は変えられるが、デフォルトのままにした。録音時間は10秒である。

def streamandcount(): #マイク入力から計数までの処理
#stream
    CHUNK = 1024 #入出力の長さ
    FORMAT = pyaudio.paInt16 #2Byte整数
    CHANNELS = 2 #ステレオ
    RATE = 44100 #サンプリング周波数(Hz)
    RECORD_SECONDS = 10 #録音時間(秒)

ストリーミングをオープンし、CHUNKごとのデータdata-rawをframesというlistに追記していく。

    p = pyaudio.PyAudio()

    stream = p.open(format=FORMAT,
                    channels=CHANNELS,
                    rate=RATE,
                    input=True, #入力のみ
                    frames_per_buffer=CHUNK) #ストリームを開く

    frames = [] #空のlistを用意

10秒分のデーターを加算して、framesに追記していく。

    for i in range(int(RATE * RECORD_SECONDS // CHUNK)): #CHUNK単位で切り捨て
        data_raw = stream.read(CHUNK) #CHUNK単位で音声信号をサンプリング
        frames.append(data_raw) #430回分を加算

    frames_int16 = np.array(frames) #listをnumpyアレイに変換

ここでストリームを閉じる。

    stream.stop_stream() #ストリームを閉じる
    stream.close()
    p.terminate()

以下は、計数と計数率の画面とファイルへの出力のための演算で、まず、2進数を10進数に変換し、データは片チャンネルだけでよいので、ステレオのLチャンネルのデータだけを抽出する。

#count
    pulse = 0 #計数を初期化
    data = np.frombuffer(frames_int16, dtype='int16') #バイトデータを整数に変換
    data_l = data[::2] #ステレオのLチェンネルを取り出す
    onflag = False #閾値超過フラッグの初期値

データが閾値を超えるとフラッグを立て、閾値を下回るとカウント1を加算し、フラッグを降ろす。閾値を超えたところから下回ったところまでを1カウントとするので、複数パルスでも重複カウントすることはない。

    for k in range(len(data_l)): #data_l全体が範囲
        dat = data_l[int(k)] #data_lのk番目の値
        if int(dat) > int(threshold) and not onflag: #閾値を超えたら
            pulse = pulse + 1 #1カウントを加算
            onflag = True #閾値超過フラッグを立てる
        if int(dat) <= int(threshold): #閾値以下になったら
            onflag = False #閾値超過フラッグを降ろす

計数率はCPMで表示することとしたので、10秒のカウント数を6倍して画面に出力する。

    cpm = pulse / RECORD_SECONDS * 60 #CPMに換算
    print('CPM = ' + str(int(cpm))) #CPMを画面に出力

同時に計数率をファイルに出力する。フォーマットは、回数、計数率となっている。

    with open('cpm_data.csv', mode='a') as fc: #出力ファイルを追記モードで開く
            fc.write(str(10 * m) + ',' + str(cpm) + '\n')

キーボードからqを入力するまで、計数を反復する。プログラムの停止には、キーボードからqを入力する。

while True: #キー入力まで反復する
    if cv2.waitKey(1) & 0xFF == ord('q'): #qを入力すると
        break #プログラムが終了
    streamandcount() #処理を繰り返す
    m = m + 1 #回数のカウントを1増やす

Pythonの実行は、Windows Power ShellまたはCMDを開いて、ファイル名を入力することで行う。そうすれば、終了時にも計数率は画面上に残っているので、結果を確認することができる。Pythonファイルをダブルクリックして実行した場合は、画面上に残らないので結果は出力ファイルで確認することになる。学校の授業で、距離の実験や遮へいの実験を行う場合は、条件を変えて10秒率で6回の測定を繰り返すので、6回測定後に一旦停止して、再度再開できるプログラムの方が適している。しかし、キーボード入力でコントロールする方法に確実性がないために、できていない。うまい方法があれば教えてほしい。


(※id:TJOid:apgmmanから受領したWord原稿を元に再構成、代理投稿したものです)