CosmicRay Recorder

CosmicRay Recorder · v2 基板

マニュアル

宇宙線検出器をパソコンにつないで、数える・記録する・解析するまでの使い方です。後半の付録には、ファイルの形式、検出器のコマンド、ピン配置、ファームウェアの書き込み方をまとめています。

01このアプリについて

CosmicRay Recorder は、SiPM(シリコン光電子増倍管)を使った宇宙線検出器のデータをブラウザで記録するアプリです。検出器から 1 イベントごとに届く行を受け取り、その場でグラフにし、パソコンのフォルダへ自動で保存します。インストールは要りません。

検出器 1 イベント = 1 行 USB Bluetooth 記録 index.html 数える・グラフ・設定 自動保存 パソコンのフォルダ .dat / .csv(正本) 送信(任意) 観測サーバー 複製 解析 plotter.html
記録のページが検出器から行を受け取り、フォルダへ保存します。保存したファイルを解析のページで読み込みます。
ページできること
記録(index.html)検出器とつなぐ、計数を見る、保存する、オシロスコープ、検出器の設定、サーバーへの送信
解析(plotter.html)保存した .dat / .csv を読み込んで、ヒストグラム・天頂角分布・エネルギー校正を行う。検出器は要りません
マニュアル(このページ)使い方と資料
v1 のページ(v1.html)v1 の検出器の記録用。v1 の使い方は画面左の「注意事項・ヒント」を見てください
対応ブラウザ

パソコンの Chrome か Edge を使ってください。USB 接続(Web Serial)、Bluetooth 接続(Web Bluetooth)、フォルダへの自動保存(File System Access)は、Firefox と Safari では使えません。デモと解析のページはどのブラウザでも動きます。

このマニュアルの画面写真は、デモ(合成データ)で撮ったものです。数値は実際の測定ではありません。写真を押すと大きく開きます。

02ページの開き方

ページをどの方法で開いたかによって、使える機能が変わります。いちばん確実なのは http://localhost で開く方法です。

開き方USBBluetoothhttp:// のサーバーへ送信
file://(ファイルをダブルクリック)使える使えないChrome の版によって変わる(事前に確認)
http://localhost:ポート使える使える使える — おすすめ
https://(Web サイトに置いたページ)使える使える使えない(混在コンテンツとして止められる)

localhost で開くには、console フォルダで簡単なサーバーを動かして、ブラウザで http://localhost:8000/ を開きます。

# Python が入っていれば追加のインストールは要りません
cd arduino/v2/console
python -m http.server 8000

03機種を選ぶ

最初に開くと、検出器の機種を選ぶ画面が出ます。機種によってデータの形式が違うので、画面も別々です。手元の検出器とケースの形を見比べて選んでください。

機種を選ぶ画面。v1・v2・v2.1 のケースの画像が並んでいる
機種を選ぶ画面。v2.1 は「準備中」で、まだ選べません。
v1 のケース
v1縦長の箱。上の面に画面の小窓と小さな丸い穴。v1.html が開きます。
v2 のケース
v2ほぼ立方体の箱。横の面に画面の窓と丸い穴 2 つ。このアプリの本体です。
v2.1 のケース
v2.1四隅に柱がある平たい箱。横に丸い穴が 4 つ。画面は準備中です。

04つなぐ

接続の画面。USB・Bluetooth・デモの 3 つのカード 1 2 3 4 5 6 7
  1. 1USBでつなぐ — ケーブルでつなぐ。いちばん確実
  2. 2接続オプション — ボーレート(ふつうは 9600)
  3. 3Bluetoothでつなぐ — 無線でつなぐ
  4. 4検出器の名前 — Bluetooth の一覧をこの名前で絞り込む
  5. 5デモで試す — 検出器なしで全部の機能を試せる
  6. 6保存先を先に選ぶ — つなぐ前に保存フォルダを決めておける
  7. 7機種を選び直す

USB でつなぐ

  1. 検出器を USB ケーブルでパソコンにつなぎます。
  2. USBでつなぐ を押し、ブラウザが出す一覧から検出器のポートを選んで 接続 を押します。
  3. 上の帯が 接続中 · USB になり、検出器の名前が出れば完了です。宇宙線が届くたびにグラフが伸びていきます。

検出器が書き込み待ち(ブートローダー)で止まっていたときは、自動で通常の起動に戻します。

Bluetooth でつなぐ

  1. 検出器の電源を入れます。
  2. 検出器の名前 に、検出器の Bluetooth の名前を入れます(最初は CosmicRay)。名前で絞り込むので、教室に何台あっても自分の検出器だけが一覧に出ます。
  3. Bluetoothでつなぐ を押し、一覧から選んで ペア設定 を押します。

途中で切れたときは、自動でつなぎ直します。上の帯がコーラル色で点滅し、「◯ 秒後に ◯ 回目の再接続」と数えます。つながり直すと、自動保存は同じファイルに続けて書きます。やめるときは 切断 を押します。

切れてから次に試すまでの間隔 1 2 4 8 16 30 秒(以後ずっと 30 秒)
再接続の間隔は 1 秒から倍々に延び、最長 30 秒です。回数の制限はありません。

デモで試す

検出器がなくても、合成データで全部の機能を試せます。右の欄で、宇宙線だけの 通常、線源を置いた 線源あり、空気シャワーが続く シャワー を選べ、頻度のつまみや バーストを起こす で動きを変えられます。デモのあいだは上に斜線の帯が出て、保存ファイルの名前に DEMO_ が付き、サーバーへは送れません。

05計測画面の見方

計測画面。上に数値、中央にヒストグラムとカウントレートのグラフ、右に保存の欄 1 2 3 4 5 6 7 8 9 10 11 12
  1. 1接続の状態 — 点はイベントが届くたびに光る
  2. 2記録を一時停止 — 届いたイベントを記録しない(検出器は数え続ける)
  3. 3切断 — データは画面に残る。もう一度つなぐ で続きから
  4. 4オシロスコープ(07)
  5. 5解析・マニュアル — 別のタブで開くので計測は止まらない
  6. 6詳細設定(08)
  7. 7総イベント数・平均カウントレート・経過時間
  8. 8エネルギー分布 — 届いたばかりのビンがシアンで光る
  9. 9カウントレートの変化 — 最新の点がシアン
  10. 10温度・湿度・気圧、外部検出器、平均 ADC、デッドタイム、トリガー
  11. 11デモの設定(デモのときだけ)
  12. 12保存(06)

いちばん上の数値

時間 → オシロスコープ中(計数停止) 経過時間 ライブタイム = 経過時間 − デッドタイム(赤い部分の合計) 平均カウントレート = イベント数 ÷ ライブタイム  統計誤差 = √イベント数 ÷ ライブタイム イベント デッドタイム
イベントを処理している間(とオシロスコープを開いている間)は数えられません。この時間を差し引くので、オシロスコープを開いてもカウントレートは正しいままです。

グラフ

どちらも右上の画像のボタンで PNG に保存できます。描き直す間隔は 詳細設定 > 表示 で 1 秒・3 秒・10 秒・手動から選べます。数値や項目の名前の横の ? を押すと、用語の説明が出ます。

記録の中身

下にスクロールすると、届いたデータそのものを見られます。

記録の中身。測定データ・受信ログ・統計のタブと、測定データの表
測定データは新しい順に最新 100 件、受信ログは検出器から届いた行そのまま(最新 100 行)、統計は平均・最大・標準偏差・ライブタイム・外部検出器の反応率など 18 項目です。

画面のメモリには最大 1,000,000 件まで残します。それを超えると古いものから空けて、警告を出します。長時間の測定では自動保存を使ってください。

06保存する

保存の欄 1 2 3 4 5

計測画面の右の欄(狭い画面では右下の 保存 ボタン)にまとまっています。

  1. 1保存フォルダを選ぶ — ここから自動保存が始まる
  2. 2形式 — .dat・.csv・両方
  3. 3メモ — 場所・向き・条件など。ファイルの先頭に # 付きで入る
  4. 4ダウンロード — 画面にあるデータをまとめて 1 つのファイルに
  5. 5データを消去して最初から — 検出器にも RESET を送り、番号と時間を 0 に。保存済みのファイルは消えない

自動保存(おすすめ)

  1. 保存フォルダを選ぶ を押して、保存先のフォルダを選びます。ブラウザが書き込みの許可を聞いてきたら ファイルの編集を許可 を選びます。
  2. 届いたデータが <検出器の名前>_<日付>.dat に書き足されていきます。日付が変わると新しいファイルになります。ファイルがとても大きくなったときは _02、_03… に分けます。
  3. 欄に、書き込み済みの件数と、まだ書き込んでいない件数が出ます。まだ書き込んでいないデータがあるときにタブを閉じようとすると、ブラウザが確認します。
0 時 CosmicRay_2026-10-07.dat CosmicRay_2026-10-08.dat
名前の前半は検出器の Bluetooth の名前です。台ごとに名前を変えておくと、ファイルも台ごとに分かれます。

ファイルの列の並びは 付録 A を見てください。

07オシロスコープ

上の帯の オシロスコープ を押すと、確認のあと画面がオシロスコープの表示に切り替わり、検出器から届く信号の波形(12 µs ごとに 1 点)を表示します。

オシロスコープを開くときの確認
開いている間は計数が止まります

上の帯に「計数停止中 mm:ss」が出ます。止まっていた時間はデッドタイムに入るので、平均カウントレートは正しいままです。閉じて計数に戻る(または Esc)で戻ります。10 分間操作しないと自動で閉じて計数に戻ります。

オシロスコープの画面。計数の画面と同じ紙色の背景に、立ち上がってゆっくり下がる波形が重なっている 1 2 3 4 5 6 7 8 9 10 11
  1. 1計数停止中 — 止まっている時間
  2. 2閉じて計数に戻る
  3. 3トリガー / 連続 — しきい値を超えたときに撮るか、撮り続けるか
  4. 4レート上限 — 1 秒に送る波形の数(1〜20)。Bluetooth では低めに
  5. 5再アーム(しきい値 −) — 次を撮れる状態に戻す水準は、しきい値からいくつ下か(初期値 5)
  6. 6残光 — 前の波形を薄く残す本数
  7. 7縦軸を自動で合わせる — 初期値はオフ(写真はオンで撮っています)
  8. 8一時停止 / クリア
  9. 9.wfm で保存 — 表示中の波形をファイルに
  10. 10波形 — いちばん新しいものが濃い線。赤い点線がしきい値で、線(右端のつまみ)をつかんで上下にドラッグすると、離したところが基板に設定されます。↑↓ キーでも動かせます(Shift で 10、PageUp / PageDown で 100)。青緑の点線が再アームの水準で、しきい値と一緒に動きます
  11. 11ピーク ADC・t_peak・波形の数・波形/秒・壊れた行

見えているのはアンプの生の信号ではなく、ピークホールド回路の出力です。立ち上がって頂点で止まり、ゆっくり下がってからリセットされる形になります(付録 C の図)。

撮り方(トリガー / 連続)と再アーム

上の画面写真の 3 が トリガー / 連続 の切り替え、5 が 再アーム(しきい値 −) の入力欄です。縦軸を自動で合わせる設定(7)は、初期値ではオフです(縦軸は 0〜4095 のまま)。

開いても波形が 1 本も出ないとき

トリガーのままで、A0 のベースラインが再アームの水準(しきい値 − 入力欄の値)より下まで下がらないと、波形は出ません(ベースラインは、基板によりますが 86 前後の例があります)。しきい値をベースラインより十分上に、入力欄の値をベースラインのゆらぎより小さくしてください。しきい値の線をドラッグして動かせます。受信ログに、取り方を示す行(### trigger above … , re-arm at or below …)が出ます。確かめるだけなら 連続 にすると、ベースラインが見えます。

v1 のページのオシロにも、同じ トリガー / 連続 と 再アーム(しきい値 −) があります(v1 の 2 つのファーム、ESP32-S3 版と Arduino Nano 版を、更新したスケッチに書き込み直したとき)。再アームの水準は、v1 でも「しきい値 − 入力欄の値」(初期値 5)で、オシロだけが使います。計数のリセットしきい値(THRESH:信号,リセット)とは別です。v1 のページでも、しきい値の線(右端のつまみ)をつかんで上下にドラッグでき(↑↓ キーでも。Shift で 10、PageUp / PageDown で 100)、再アームの線が一緒に動きます。離したところで SET_THRESH:信号,リセット を 1 回送ります。Arduino Nano 版はこの 2 つの値の形しか受けないので、リセットのしきい値は「信号 − 今の差」で一緒に決めて送ります(差は引く前のまま。信号を下げすぎてリセットが 0 になっても、差は覚えています)。ESP32-S3 版にも同じ形で送ります。

08詳細設定

上の帯の 詳細設定 で右からパネルが開きます。上の目次で節に飛べます。基板の設定は検出器をつないでいるときだけ変えられます。「基板: …」の行は、検出器が今使っている値です。

トリガーとしきい値

詳細設定のトリガーとしきい値 1 2 3 4 5
  1. 1トリガーモード — Analog / Digital / Dual(下の図)
  2. 2信号しきい値(0〜4095)— Analog と Dual で使う
  3. 3自動校正 — ノイズを約 1 秒(100 回)測り、その最大値にマージン(初期値 50)を足してしきい値にする。光が入らない状態で
  4. 4コンパレータしきい値(PWM duty 0〜255)— Digital と Dual で使う
  5. 5Auto PWM — しきい値を掃引し、ノイズの反応が目標(回/秒)以下になるところに合わせる(約 8 秒)。Digital・Dual にしたら一度実行
信号(ピークホールドの出力) 時間 → 信号しきい値 コンパレータ Analog(起動時) 信号を読み続け、黒い点線を超えたら数える Digital 回路の比較器が赤い点線を超えたのを知らせたら数える Dual 比較器が反応し、さらに黒い点線も超えていたら数える
しきい値が低すぎるとノイズまで数え、高すぎると小さな信号を取りこぼします。迷ったら Analog で自動校正を使ってください。

検出器の機能・音と振動

詳細設定の検出器の機能と音と振動

検出器の機能 — microSD への記録・外部検出器の読み取り・OLED 画面・ブザー・振動モーターを、それぞれスイッチでオン/オフできます。使わない機能を止めると、デッドタイムが減り電池が長持ちします。設定は検出器に保存され、次の起動でも残ります。

音と振動 — 信号が大きいほど高い音・長い振動になります(対数)。最低 / 最高の周波数、音の長さ、振動の最短 / 最長を設定し、鳴らしてみる / 振動させてみる で確かめられます。音は計数を妨げません。振動のテストのあいだ止まった時間はデッドタイムに入ります。

表示・接続

09サーバーへの送信

詳細設定 > サーバー送信 から、測定イベントを観測サーバー(cosmicray-server)へリアルタイムに送れます。

届いたイベント 自動保存(全件)このパソコン — 正本 送る量全件 / 1/10 / 1/100 送信待ち最大 50,000 件 1 秒ごと 観測サーバー切れたら自動で再試行 あふれたら古いものから破棄(ファイルには残る → 再送できる)
正式な記録はこのパソコンの自動保存です。サーバーへの送信は複製なので、自動保存と一緒に使ってください。

送信の手順

詳細設定のサーバー送信 1 2 3 4 5 6
  1. 1サーバー URL(例: http://accel-kitchen.com:3000)
  2. 2観測局 ID とパスワード — ID がサーバー上の保存先の名前になる。必要なら装置ラベル(1 か所に何台もあるときの区別)と緯度・経度も
  3. 3パスワードを保存 — 共用のパソコンでは使わない(下の注意)
  4. 4送る量 — 回線が細いときや計数率が高いときは減らす(自動保存は全件のまま)
  5. 5ログイン を押してから 送信開始
  6. 6状態 — 下の表。その下の行は 送信 / 待ち / 間引き / 破棄 / 拒否 の件数

表示の見方

表示意味
未設定URL / ID が空、またはログインしていない
◯◯ でログイン中 — 送信は止まっていますログイン済み。送信開始 を待っている
送信中 — 送信済み N 件 / 待ち N 件正常に送っている
N 秒後に再試行(M 回目)送信に失敗。1 → 2 → 4 … 最長 60 秒の間隔で、回数の制限なく再試行(データは保持)
未送信 N 件 — 回線が追いつきません送信待ちがたまっている。送る量を減らす
オフラインネットワークが切れている。戻ると自動で再開
認証に失敗しましたもう一度ログインする

送られる項目

今のサーバーの取り込み形式は CosmicWatch 用のため、湿度・気圧・外部検出器(Dig1〜3・Ana1〜3)は送られません(画面にも「旧 API モード」と出ます)。これらが必要なときは保存した .dat / .csv を使ってください。

サーバーの項目この検出器の値備考
eventEvent(通し番号)—
timestampパソコンの時計 + 検出器の µs 時計間隔の精度は検出器の時計で保つ
timeTime[us]起動からの経過
adcADC(0〜4095)—
volADC から換算した電圧 [mV]計算値で、実測ではありません
deadtimeDeadtime[us] ÷ 1000ms にして送る
tempTemp[C]—

パスワードの扱い

「このパソコンにパスワードを保存する」は共用のパソコンで使わないでください

ブラウザの中に暗号化せずに保存されます。file:// で開いているときは、Chrome がすべてのローカル HTML ファイルで保存場所を共有するので、ほかのローカルのページからも読めてしまいます。

ふつうはパスワードを保存せず、タブを開いている間だけメモリに持っています(夜通しの測定中に認証が切れても、自動でログインし直せるように)。測定が終わったら ログアウト で消してください。サーバー URL が http:// のときは、パスワードとデータが暗号化されずに送られる旨の注意が出ます。

10解析(プロッター)

上の 解析 で開きます。保存したファイルを読み込むだけなので、検出器は要りません。v2 の .dat / .csv のほか、v1 のページで保存した .dat と、microSD のログ(LOG0001.TXT など)も読めます。ファイルはこのパソコンの中だけで読み、どこにも送りません。

ADC ヒストグラム

解析の ADC ヒストグラム。線源ありの測定からバックグラウンドを引くと、ADC 760 あたりのピークが残る 1 2 3 4 5 6 7
  1. 1測定データのファイルを選ぶ
  2. 2ビン幅と、ADC の範囲(任意)
  3. 3時間の範囲 — 何秒目から何秒目までを使うか
  4. 4バックグラウンド — 線源なしで測ったファイル。倍率はライブタイムの比で自動(手で入れても良い)
  5. 5バックグラウンドを引く・対数・keV(keV は校正があるとき)
  6. 6イベント数・平均・中央値・標準偏差
  7. 7グラフ — 黒い棒が差し引いた結果、青い線が測定、赤い点線がバックグラウンド。ドラッグで拡大、ダブルクリックで戻る
例: Cs-137 を置いて測ったデータから、置かずに測ったデータを引くと、ADC 760 あたりに Cs-137 の光電ピーク(662 keV)とその下のコンプトン連続部が残ります。宇宙線の山(ADC 1100 あたり)はほぼ消えます。

天頂角分布

検出器を傾けて、真上(0°)から 15° ずつ向きを変えてカウントレートを測ると、宇宙線(ミューオン)が真上から多く、横からは少なく降ってくることを確かめられます。

天頂(真上) θ ミューオン R(θ) = R(0°) · cosⁿθ R(θ): 角度 θ で測ったカウントレート 地上のミューオンでは n ≈ 2 cos θ → 1 R/R(0°)
天頂角分布のタブ。角度ごとのレートの表と、cosⁿθ のフィットの 2 つのグラフ 1 2 3
  1. 11 角度あたりの測定時間 — 誤差(√N)の計算に使う
  2. 2R(θ) — 各角度のカウントレートを入れる。比と誤差は自動で出る
  3. 3cosⁿθ でフィット — n と R² が出て、グラフに線が引かれる
入れた値はこのブラウザに残るので、測りながら少しずつ埋めていけます。

エネルギー校正

ADC の値をエネルギー(keV)に直すための式を、線源の既知のγ線から作ります。

エネルギー校正のタブ。Co-60 のスペクトルに 2 つのピークがあり、表に 2 点を入れて 1 次式でフィットしている 1 2 3 4 5 6 7
  1. 1線源を置いて測ったファイルを読み込む
  2. 2線源を選んで 線源のピークを入れる — 表にγ線のエネルギーが入る
  3. 3ピークを自動で探す — 候補に ▼ が付く
  4. 4ピークをクリック — 選んでいる行の Peak ADC に入る(ガウス近似でビンより細かく)
  5. 5選択 — クリックで値を入れる行
  6. 6Peak ADC — 手で入れても良い。FWHM と分解能も出る
  7. 7校正の式と R² — 1 次は 2 点、2 次は 3 点以上で計算
例: Co-60 の 1173 keV と 1332 keV の 2 本を使った 1 次の校正(合成データ)。

校正はブラウザに自動で保存され、ADC ヒストグラムのタブで 横軸を keV に すると、ほかの測定データにも使えます。.json に書き出して、別のパソコンに持っていくこともできます。

11困ったとき

アプリ

USB / Bluetooth のボタンが押せない
  • Chrome か Edge で開いているか確かめてください。理由はボタンの下に出ます。
  • Bluetooth は file:// で開いたページでは使えません。http://localhost で開き直してください(02)。
「シリアルポートを開けませんでした」と出る
  • ほかのアプリがポートを使っています。Arduino IDE のシリアルモニタや、このアプリを開いた別のタブを閉じてから、もう一度試してください。
Bluetooth の一覧に検出器が出ない
  • 検出器の名前 が検出器の名前と同じか確かめてください(大文字・小文字も区別します)。
  • 検出器の電源と距離、ほかのスマホやパソコンとつながっていないかを確かめてください。
「別の検出器につながりました」と出た
  • 画面の計数率・経過時間・件数には前の検出器の分も入っています。測り直すときは データを消去して最初から を押してください。
サーバーに「接続できません」と出る
  • ページを https:// で開いていないか確かめてください。http://localhost で開き直すのが確実です。
  • サーバー URL の綴りとポート番号(ふつうは 3000)を確かめてください。
  • サーバーで CORS が有効になっているか、管理者に確かめてください。
ログインはできるのに、送信でエラーになる / 「拒否」が増える
  • 観測局 ID が自分のアカウントの ID と同じか確かめてください。他人の ID には送れません。
  • 「拒否」が増えるときは、サーバーの検査で受け付けられていません。管理者に相談してください。
「未送信」が増え続ける
  • 回線に対して計数率が高すぎます。送る量 を「10 件に 1 件」以下にしてください。自動保存は全件続きます。

検出器

受信ログに何も出ない / “Booting” が出ない
  • Arduino IDE のボードが Arduino Nano ESP32、USB CDC On Boot が Enabled になっているか確かめて、書き込み直してください。
  • ボーレートを 9600 にしてください。
  • BOOT を押しながら RESET を押して書き込みモードにし、書き込み直してください。
イベントが 1 回も記録されない
  • しきい値が高すぎるかもしれません。自動校正 をやり直してください。
  • Digital / Dual のときは、Auto PWM をやり直してください。
  • オシロスコープで信号が来ているか確かめてください。
カウントレートが異常に高い
  • しきい値(Digital / Dual では PWM duty)が低すぎて、ノイズで反応しています。
  • ピークホールドのリセット(D8)が効いていないかもしれません。配線を確かめてください。
  • コンパレータの出力(D0)にノイズが乗っているかもしれません。グラウンドの配線を見直してください。
温度・湿度・気圧が「--」のまま
  • BME280 が見つかっていません。I²C アドレス(0x76 / 0x77)と配線(SDA = A4、SCL = A5)を確かめてください。
  • BMP280(温度と気圧だけ)では湿度は出ません。
OLED が真っ暗
  • 詳細設定 > 検出器の機能 で OLED がオンか確かめてください。
  • I²C の配線と電源(3.3 V / GND)、OLED のアドレス(0x3C、まれに 0x3D)を確かめてください。
外部検出器の Dig1〜3 がずっと 0(または 1)
  • 外部検出器の読み取り がオンか確かめてください。
  • 外部検出器の出力の電圧(3.3 V / 5 V)と、プルアップ・プルダウンの要否を回路図で確かめてください。

12用語集

SiPM
Silicon Photomultiplier(シリコン光電子増倍管)。シンチレーターが出す弱い光を電気の信号に変える素子。
ADC
信号の大きさを数にしたもの。この検出器では 0〜4095(12 ビット)。大きいほどエネルギーが大きい。
ピークホールド
パルスのいちばん高い電圧をしばらく保つ回路。マイコンが落ち着いて読めるようにするため。
コンパレータ
信号がしきい値を超えたかどうかを回路で判定する部品。しきい値は PWM の duty で作る。
Duty
PWM の信号が HIGH になっている時間の割合。0〜255 で表す。平均電圧 ≈ duty × 電源電圧 ÷ 255。
デッドタイム
1 イベントを処理している間など、次の信号を数えられない時間。
ライブタイム
経過時間からデッドタイムを引いた、実際に数えていた時間。カウントレートはこれで割る。
コインシデンス
複数の検出器がほぼ同時(µs 程度)に反応すること。貫いて通る粒子(ミューオンなど)だと確かめるのに使う。
BLE / NUS
Bluetooth Low Energy / Nordic UART Service。無線でシリアル通信のようにやりとりする仕組み。

付録 Aファイルとログの形式

検出器が送る行

イベントのたびに、USB と Bluetooth の両方へ 1 行ずつ送られます。空白区切りです。microSD のログも同じ形です。

### Event Time[us] ADC[0-4095] Deadtime[us] Temp[C] Hum[%] Press[hPa] Dig1 Dig2 Dig3 Ana1 Ana2 Ana3
42 18732450 1940 1203000 24.3 48.2 1013.2 1 0 1 2448 112 2804
列意味範囲・単位
Eventイベントの通し番号1, 2, 3, …
Time[us]起動(または RESET)からの時間µs
ADCこの検出器のピークホールドの値0〜4095
Deadtime[us]デッドタイムの累計µs
Temp[C] / Hum[%] / Press[hPa]BME280 の温度・湿度・気圧(2 秒ごとに更新)°C / %RH / hPa
v2Dig1〜3外部検出器 1〜3 のデジタル値0 / 1
v2Ana1〜3外部検出器 1〜3 のアナログ値0〜4095

このアプリが保存するファイル

検出器の行microSD のログ Event Time[us] ADC Deadtime[us] Temp … 0123 保存ファイル.dat / .csv Event PC_Timestamp Time[us] ADC Deadtime[us] Temp … 01234 ↓ 足した列(PC の時計)
小さい数字は 0 から数えた列の番号です。プログラムで読むときは、ファイルによって ADC が 2 列目か 3 列目かが変わることに気をつけてください(解析のページは見出しの行から自動で見分けます)。

上の列の 2 列目に PC_Timestamp(このパソコンの時計、UTC、末尾 Z)を足した形です。そのため 3 列目以降は、検出器の行より 1 つ右にずれます。.dat はタブ区切り、.csv はカンマ区切りです。

# 屋上・水平・晴れ                       ← メモ
# Source: CosmicRay Recorder v2
# Device: CosmicRay
# Trigger mode: ANALOG
# Signal threshold: 120 / 4095
# Event	PC_Timestamp	Time[us]	ADC[0-4095]	Deadtime[us]	Temp[C]	Hum[%]	Press[hPa]	Dig1	Dig2	Dig3	Ana1	Ana2	Ana3
1	2026-10-07-03-12-45.118Z	18732450	1940	1203000	24.3	48.2	1013.2	1	0	1	2448	112	2804

# で始まる行はメモです。Python の pandas で読むときは、.csv なら read_csv(path, comment='#') でそのまま読めます(列名の行は # なしで入っています)。.dat は列名の行も # で始まるので、comment='#' だけだと最初のイベントが列名として扱われ、1 件欠けます。列名を自分で渡してください。

cols = ['Event', 'PC_Timestamp', 'Time_us', 'ADC', 'Deadtime_us', 'Temp_C', 'Hum_pct', 'Press_hPa',
        'Dig1', 'Dig2', 'Dig3', 'Ana1', 'Ana2', 'Ana3']
df = pd.read_csv(path, sep='\t', comment='#', header=None, names=cols)

付録 Bコマンド一覧

このアプリのボタンは、内部で次のコマンドを検出器に送っています。シリアル(9600 bps)か BLE の RX に書き込むと、手で送ることもできます。改行(LF か CR)で確定します。設定は検出器の Preferences に保存され、次の起動でも残ります。

しきい値・トリガー

GET_THRESH

今の信号しきい値と PWM duty を THRESH:<sig> DUTY:<duty> で返します。

SET_THRESH:<signal>

Analog / Dual で使う信号しきい値を 0〜4095 で設定します。例: SET_THRESH:1200。

v1 の 2 つの引数(SET_THRESH:sig,rst)はなくなりました。リセットのしきい値は回路が受け持ちます。

AUTO_THRESH / AUTO_THRESH:<margin>

A0 のノイズを 100 回(約 1 秒)測り、最大値 + マージン を信号しきい値にします。光が入らない状態で実行してください。

  • AUTO_THRESH — 今のマージン(初期値 50)で校正します。
  • AUTO_THRESH:<margin> — マージンを変えてから校正します(例: AUTO_THRESH:60)。
GET_AUTO_MARGIN / SET_AUTO_MARGIN:<n>

自動校正のマージンを読む / 設定します。応答は AUTO_MARGIN:<n>。

GET_MODE / SET_MODE:DIGITAL|DUAL|ANALOG

トリガーモードを読む / 設定します。応答は MODE:ANALOG など。

コンパレータのしきい値(PWM)

GET_PWM / SET_PWM:<0-255>

Digital / Dual で使うコンパレータのしきい値(D2 の PWM duty)を読む / 設定します。応答は PWM:<duty>。

AUTO_PWM / AUTO_PWM:<target_edges_per_s>

duty を掃引して、ノイズの反応が目標(回/秒)以下になる点に合わせ、終わると PWM:<duty> を返します。Digital / Dual を使う前に一度実行してください。

コンパレータのしきい値は SET_THRESH とは別に設定します(以前の ×2 の換算はなくなりました)。

オシロスコープ

SET_SCOPE:ON|OFF / GET_SCOPE

波形を送るモードを切り替えます。応答は SCOPE:ON / SCOPE:OFF。ON の間は計数が止まり、その時間はデッドタイムに入ります。波形は WF,… で始まる行で届きます。

SET_SCOPE_RATE:<n> / GET_SCOPE_RATE

1 秒に送る波形の数の上限(1〜20、初期値 3)を読む / 設定します。応答は SCOPE_RATE:<n>。

SET_SCOPE_REARM:<offset> / GET_SCOPE_REARM

波形を 1 本撮ったあと、A0 が「しきい値 − offset」以下に戻ったら次を撮る、という差 offset を読む / 設定します(0〜4095、初期値 5)。応答は SCOPE_REARM:<offset>。保存されません。

SET_SCOPE_TRIG:NORMAL|FREE / GET_SCOPE_TRIG

撮り方を読む / 設定します。NORMAL(初期値)はしきい値を超えたときだけ、FREE はトリガーなしで最新の窓を撮り続けます。応答は SCOPE_TRIG:NORMAL / SCOPE_TRIG:FREE。保存されません。

ブザー

GET_BEEP / SET_BEEP:<min_hz>,<max_hz>,<ms>

イベントごとの音を読む / 設定します。応答は BEEP:<min>,<max>,<ms>(初期値 500,4000,25)。信号の大きさを対数で音の高さにし、しきい値ちょうどで min_hz、ADC 最大で max_hz になります。

範囲: min ≥ 50、min < max ≤ 20000、ms は 1〜500。音は待たずに鳴らすので、デッドタイムは増えません。

BEEP_TEST

最低・中間・最高の音を順に鳴らします。

振動モーター

GET_VIB_MS / SET_VIB_MS:<min_ms>,<max_ms>

振動の長さを読む / 設定します。応答は VIBMS:<min>,<max>(初期値 20,120)。信号が大きいほど長く振動します。範囲: min ≥ 1、min < max ≤ 500。止めるのは loop() 側なので、デッドタイムは増えません。

VIB_TEST

最短・中間・最長で順に振動させます。待っている間は計数が止まりますが、その時間はデッドタイムに入るので計数率は狂いません。

機能のオン / オフ

SET_SD / SET_EXT / SET_OLED / SET_BUZZER / SET_VIB :ON|OFF

microSD・外部検出器・OLED・ブザー・振動をオン / オフします(初期値はすべて ON)。読むときは GET_SD などで、応答は SD:ON、BUZZER:OFF の形です。

システム

GET_BLENAME / SET_BLENAME:<name>

Bluetooth の名前を読む / 変えます。応答は BLENAME:<name>。再起動すると反映されます。このアプリは 19 文字までに制限しています。

GET_BTADDR

基板の Bluetooth アドレスを BTADDR:aa:bb:cc:dd:ee:ff で返します。USB でつないでいても使えます。

RESET

イベント番号とデッドタイムを 0 に戻します。応答は RESET:OK。

Bluetooth(Nordic UART Service)

UUID用途
6E400001-B5A3-F393-E0A9-E50E24DCCA9Eサービス
6E400002-…RX(パソコン → 検出器、Write)
6E400003-…TX(検出器 → パソコン、Notify)

検出器は 20 バイトずつに分けて送り、受け取る側で 1 行につなぎ直します。このアプリのほか、スマホの汎用 BLE ターミナル(iOS: Bluefruit Connect、Android: Serial Bluetooth Terminal / nRF Connect)でも、UART モードで行を見たりコマンドを送ったりできます。

付録 Cハードウェアとピン

v1 からの主な変更

項目v1v2
トリガーADC を読み続けてしきい値と比べる外部コンパレータ + 割り込みも使える。しきい値は D2 の PWM duty
ピークホールド信号が下がるまで待つD8 のパルスで強制的にリセット
温度センサNTC サーミスタ(A3)BME280(I²C)で温度・湿度・気圧
コインシデンスMaster / Slave の 2 台外部検出器 3 台を同時に入力(DIG_IN1〜3 / ANA_IN1〜3)
出力LED のみブザー、音声ジャック(COIN_OUT、ANA_OUT)、振動モーター
ログMode 列(Master / Slave)湿度・気圧と Dig1〜3 / Ana1〜3 の列。時間は µs

Nano ESP32 のピン

Nano ピンラベルネット名方向用途
1D1 / TX(Buzzer)OUTブザー
2D0 / RXTriggerIN (INT)コンパレータの出力 → 割り込み
5D2PWMOUTコンパレータのしきい値(duty)
7D4DIG_IN3IN外部検出器 3(デジタル)
8D5DIG_IN2IN外部検出器 2(デジタル)
9D6DIG_IN1IN外部検出器 1(デジタル)
10D7COIN_OUTOUT音声ジャックのデジタル出力
11D8TriggerResetOUTピークホールドのリセットパルス
12〜16D9〜D13SPI—microSD(CS / MOSI / MISO / SCK)
19A0ANA_OUTIN (ADC)この検出器のピークホールドの値
20A1ANA_IN1IN (ADC)外部検出器 1(アナログ)
21A2ANA_IN2IN (ADC)外部検出器 2(アナログ)
23A4SDAI²COLED + BME280
24A5SCLI²COLED + BME280
25A6ANA_IN3IN (ADC)外部検出器 3(アナログ)
26A7(Vibration)OUT振動モーター(基板では空き。後付け)
ANA_OUT はマイコンから見ると入力です

「ANA_OUT」はアナログ回路(ピークホールド)からの出力という意味で、音声ジャックとマイコンの A0 に同じ信号がつながっています。マイコンはこの電圧を読むだけです。

信号の流れ

SiPM アンプ ピークホールド 音声ジャック ANA_OUT コンパレータ しきい値(PWM) リセットのパルス Arduino Nano ESP32 A0 D0割り込み D2PWM D8リセット 反応したら D7 → COIN_OUT D1 → ブザー A7 → 振動 外部検出器 1〜3 DIG_IN1〜3(D6 / D5 / D4) ANA_IN1〜3(A1 / A2 / A6) I²C(A4 / A5): OLED・BME280
ピークホールドは信号の頂点を保ち、マイコンが A0 で読んだあと D8 のパルスでリセットされます。オシロスコープで見える「立ち上がって頂点で止まり、ゆっくり下がる」形はこのためです。

振動モーターの配線

GPIO に直接つながないでください

振動モーターは A7(GPIO14)で動かします。D13 は使えません(microSD の SCK と共用で、SD のログが壊れます)。コイン型(10 × 2.7 mm)は 75〜90 mA ほど流れ、起動時はさらに大きく、ESP32-S3 の GPIO の絶対最大定格 40 mA を超えます。A7 → 1 kΩ → NPN トランジスタ(2N3904 / S8050)か N-ch MOSFET(2N7002)で駆動し、モーターと並列に還流ダイオード(1N4148)、端子間に 0.1 µF を入れてください。モーターのノイズは SiPM の誤トリガーの原因にもなります。

付録 Dファームウェアの書き込み

用意するもの

ライブラリ

ライブラリ用途
Adafruit SSD1306OLED
Adafruit GFX Library描画の土台
v2Adafruit BME280 Library温度・湿度・気圧
v2Adafruit Unified SensorBME280 が使う

BLE と Preferences は ESP32 Arduino Core に入っているので、別に入れる必要はありません。

書き込みの手順

  1. v2/COSMICRAY_DETECTOR_ESP32-S3-Nano-v2/COSMICRAY_DETECTOR_ESP32-S3-Nano-v2.ino を Arduino IDE で開きます。
  2. ツール > ボード で Arduino Nano ESP32 を選び、USB CDC On Boot を Enabled にします。
  3. ポートを選びます(Windows は COMxx、Mac は /dev/cu.usbmodem…)。
  4. ✓(検証)でコンパイルし、→(書き込み)で書き込みます。
  5. シリアルモニタ(9600 baud)に Booting v2... と出れば完了です。
書き込めないとき

基板の BOOT を押しながら RESET を一瞬押すと書き込みモードになります。そのあと IDE から書き込んでください。書き込み中はこのアプリを閉じておいてください(ポートを取り合います)。

起動の流れ

  1. 電源を入れると Booting v2... を送ります。
  2. 保存してある設定を読みます(初めてのときは自動校正)。
  3. Bluetooth の広告を始めます(名前は最初 CosmicRay)。
  4. OLED にオープニング画面を出します。
  5. BME280 を探します(0x76 → 0x77)。
  6. 計測を始めます。

OLED の表示

Accel Kitchen v2
Cnt:123  T:00:05:42
Rate: 0.41+/-0.04
Thr:30 Duty:7
Temp:24.3C

Cnt は累計のイベント数、T は経過時間、Rate は平均レートと統計誤差、Thr / Duty は信号しきい値と PWM duty、Temp は温度です。

ページの先頭へ