開発者のための中性子線・放射線測定器モジュール
中性子線検出器
中性子線は、金属などの物質を簡単に透過する性質があります。特に高速・高エネルギー中性子線は、物を通り抜ける性質が高いため検出することが難しい粒子です。
BDKN-01 検出器モジュールは、水素原子を多く含む減速材(黒い部分)で検出器を包んでいます。高速な中性子線は減速材と衝突して減速します。これにより高エネルギーの中性子線でも検出器で測定することができます。
線量率、流束密度
線量率測定(H*(10))は、高感度な He3 検出器により毎秒リアルタイムで測定できます。
流速密度測定では、1秒間に 1cm x 1cm の平面を1秒間に通り抜ける中性子線のカウント率=中性子線の個数を測定するモードです。
汚染源の探索モード
中性子線の発生している場所を探すには、探索モードが便利です。
探索モードでは、中性子線の強さに応じて音アラームの頻度・強さが変化します。検出器を持って歩き、音の変化を聞くことで、体感的に汚染の強い場所を探し出すことができます。
探索モードは、Windows アプリ、サーベイメーター端末(PU2)や、測定API を使って開発したソフトウェアから利用可能です。
通信仕様の公開
検出器モジュールは、Modbus に対応したシリアル通信(RS232, RS485) 機器です。
公開された測定 API を利用することで、C#, Java, といたあらゆるプログラム言語を使ったアプリケーションの開発が可能です。
測定値の読み出しは簡単です。API仕様に決められた命令バイト列を送信すると、検出器から測定値(線量率、流束密度、カウント率)といった値を浮動小数点として受信できます。
流束密度とは?
流速密度とは、1秒間に 1cm x 1cm の平面を1秒間で通り抜ける中性子線のカウント率=中性子線の個数です。
原子炉の周辺や中性子を発する放射線源の周りで流速密度を測定し、その値に球の表面面積である 4πr2 を乗ずることで中心にある中性子線発生源からの総カウント数を求めることが可能となります。
ここで r は中性子線発生源からの距離です。
流束密度測定は、容易に近づくことができない中性子線線源に対する有効な測定方法です。
2タイプの中性子線検出モジュール
中性子線検出モジュールには、減速材の厚みによって2タイプあります。
減速材が大きい方は、低・高エネルギーまで安定して線量率が測定できます。
一方で減速材が小さい検出器の方は、汚染された場所を探す用途など高感度が必要になる場合に選択してください。
減速材(小)・中性子線検出モジュール
- BDKN-01 RS232USB
- BDKN-02 RS485USB
減速材(大)・中性子線検出モジュール
- BDKN-03 RS232USB
- BDKN-04 RS485USB
検出器の選択
2タイプの検出は、用途に合わせて選択してください。
| 測定目的 | おすすめできる中性子線検出器 |
|---|---|
線量率の測定
|
線量率(μSv/h )の測定を行う場合には、必ず大きい方の検出器を選択してください。 小さい方の検出器は、特定の核種(Pu-α-Be 、Cf-252)のみで正しい線量率測定ができます。対象となる中性子線が不明な場合には、減速材(黒い部分)が大きい検出器を選んでください。 |
線量率の測定
|
測定する対象となる中性子線が、Pu-α-Be 、Cf-252 由来と分かっている場合には、小さい方でも正確な線量率測定ができます。 原子力発電所の周辺で使う用途であれば、小さい方の検出器が利用できます。 |
流束密度、汚染場所の探索
|
汚染された場所を探す用途など高感度が必要になる場合には、どちらも利用できます。 流束密度( 1/s/cm2 = 1cm x 1cm の平面を1秒当たりに通り抜ける中性子線数)や、中性子線の汚染源を探すために使う探索モードを利用する場合には、減速材が小さい方が感度が高く有利です。 |
線量率の測定時のエネルギー応答
核分裂の過程から発生する高速中性子線は、高いエネルギーを持っています。
空間中を高速で飛び、分厚い金属などほとんどの物質を簡単に透過します。中性子線を測定・検出するには、減速材が必要になります。減速材がない場合、中性子線は検出器自体を簡単に通り抜けてしまい測定できません。
減速材(黒い部分)は、水素原子を多く含む物質でできており高速で移動する中性子線を衝突させて減速させることができます。中性子線が低速になれば、中心にある検出器で捕まえて測定することができるようになります。
ここでは線量率(μSv/h )の測定における減衰材の厚みと検出器のエネルギー応答の関係をご紹介します。
どちらのタイプの検出器でも、測定する対象となる中性子線が、Pu-α-Be 、Cf-252 の場合には、応答(縦軸) = 1 に近くなっています。応答1は校正の基準値となっています。
線量率測定では、Pu-α-Be 、Cf-252 核種由来の場合には、どちらの測定器でも常に正確な値を示すことが分かります。
大きい減速材の場合には、応答のラインは 1 近くで水平に近く、広いエネルギーで正しい線量率測定ができるようになっています。
探索モード、流束密度の測定時のエネルギー応答
中性子線の発生源がどこにあるのか、汚染源を探すような目的の場合には、減速材が小さい方が感度が高く、よりすばやい応答が期待できます。
ここでは探索モード、流速密度の測定における減衰材の厚みと検出器のエネルギー応答の関係をご紹介します。
探索モード、流速密度の測定の場合には、中性子線を捕まえる能力が高いほど測定時間が短縮できます。グラフでいえば、線が上の方にある方が感度が高いことを示しています。
小さい減速材の検出器は、熱中性子線と呼ばれる低いエネルギー(横軸左側)~Ra-γ-Be までの応答(縦軸)は、グラフの縦方向が高い位置にあります。感度が高く、これらの測定に向いていることを示しています。
一方で減速材の大きい検出器は、熱中性子線の応答(縦軸)は 0.0017 と小さくなっています。つまり熱中性子線に対して感度がとても低くなっていることが分かります。大きい方の検出器は熱中性子線の探索にはあまり向いていません。線量が高い場合には、それでも測定は可能です。
サーベイメーター端末 PU2 (別売)
PU2端末は、モジュールタイプの測定値を表示する多目的端末です。表示端末を利用することで、線量率、カウント率、流速密度の測定を行うサーベイメータとして利用できます。
- 中性子線の線量率の測定(µSv/h)
- 中性子線の流束密度の測定(s-1cm-2)
- 中性子線のカウント率の測定(cps)
- 中性子線の積算線量の測定(uSv)
- 探索モード
- 警告アラームの発動
測定 API
中性子線検出モジュールは、Modbus フォーマットに対応したRS232, RS485 シリアル通信機器です。
測定 API は、検出器に向けて命令文を書き込むと、検出器そくの測定値、設定値を浮動小数点、整数値として取得できます。応答レスポンスはとても高速なので、毎秒や、0.5秒おきでも測定値を取り出すことができます。
中性子線・放射線測定器モジュール BDKN シリーズでは、こちらの項目が測定 API から取得・設定することができます。
| 機能 | 取得できる情報、設定項目 | 値 |
|---|---|---|
| 測定値 読み出し |
線量率(Sv/h) | Float32 |
| 線量率の測定偏差(%) | Float32 | |
| 線量率の測定偏差(%) | Float32 | |
| 流束密度(1/s/cm2) | Float32 | |
| 流束密度の測定偏差(%) | Float32 | |
| 積算流束(1/cm2) | Float32 | |
| 探索モードにおける基準カウント率からの偏差量 | ||
| 動作時間(秒) | Int32 | |
| 総積算線量(Sv) | Float32 |
| 機能 | 取得できる情報、設定項目 | 値 |
|---|---|---|
| 状態チェック 読み出し |
探索モードにおけるカウント率が基準値を超えたかどうか | (0または1) |
| 探索モードにおける音アラームが発動したかどうか | (0または1) | |
| 測定値が機器の上限を超えていないかどうか | (0または1) | |
| 背景放射線を差し引くモードの稼働状況 | (0または1) | |
| 探索モードの稼働状況 | (0または1) |
| 機能 | 取得できる情報、設定項目 | 値 |
|---|---|---|
| 設定項目 読み出し 書き込み |
測定モードの変更( 線量率:Sv/h, 流束密度 1/s/cm2 ) | |
| カウント率の移動平均値 | Int16 | |
| カウント率の移動平均値の時間間隔(秒) | Float32 | |
| 探索モードにおける基準カウント率(Cps) | Float32 | |
| 背景放射線を差し引くモードにおける基準カウント率(Cps) | Float32 | |
| 背景放射線を差し引くモードにおけるカウント率の基準偏差(%) | Float32 | |
| 背景放射線を差し引くモードにおける線量率(Sv/h) | ||
| 背景放射線を差し引くモードにおける線量率の基準偏差(%) | Float32 | |
| 背景放射線を差し引くモードにおける流束密度(1/s/cm2) | Float32 | |
| 背景放射線を差し引くモードにおける流束密度の基準偏差(%) | Float32 |
| 機能 | 取得できる情報、設定項目 | 値 |
|---|---|---|
| コントロール 書き込み |
線量率、流束密度の測定をリセットして再度平均を開始する命令 | |
| 積算線量、積算流束の値を0にリセットする命令 | ||
| 探索モードを ON/OFF する命令 | ||
| 現在のカウント率を探索モードの基準値として設定する命令 | ||
| 背景放射線を差し引くモードを有効・無効にする命令 | ||
| 現在の線量率、流束密度の値を背景放射線を差し引くモードの基準値として設定する命令 |
| 機能 | 取得できる情報、設定項目 | 値 |
|---|---|---|
| 診断モード 読み出し |
不揮発性メモリの損傷 | |
| 校正日付データの破損 | Int16 | |
| 電圧変換器の損傷 | Float32 |
| 機能 | 取得できる情報、設定項目 | 値 |
|---|---|---|
| 機器識別情報 読み出し |
機器識別番号の取得 | 0x28 = BDKN-01, 0x24 = BDKN-03 |
サンプルコードの提供
BDKNシリーズ は、測定器本体にシリアル通信を備えた開発者向け放射線測定モジュールです。
開発者向けにサンプルコードを提供しております。基本的には、Write(”命令文”) を送信して、read(); で測定値情報を読み出すといった簡単なプログラム構成になっています。
- C言語
- .NET C#
- .NET Visual Basic言語
- Andorid Java
- Arduinoスケッチ
- Lazurite C言語
測定値を秒単位でデータベースに転送して、ウェブサイトに公開するといったモニタリングアプリケーションを簡単に開発することができます。

Android Java

.NET C#, VB

C言語等

Arduino

Lazurite

Raspberry Pi
型番による違い
BDKNシリーズには、4タイプあります。
| 型番 | 減速材 | 接続方法 | 備考 |
|---|---|---|---|
BDKN-01![]() |
小 | RS232 | 配線図付属 |
| USB | 変換器付属 | ||
| サーベイメーター端末 PU2(別売) | |||
BDKN-02![]() |
小 | RS485 | 配線図付属 |
| 型番 | 減速材 | 接続方法 | 備考 |
|---|---|---|---|
BDKN-03![]() |
大 | RS232 | 配線図付属 |
| USB | 変換器付属 | ||
| サーベイメーター端末 PU2(別売) | |||
BDKN-04![]() |
大 | RS485 | 配線図付属 |
利用する接続タイプに応じて型番を選んでください。
RS232タイプは、サーベイメータ端末と接続できます。RS485-RS232変換器を使うことで RS485方式にも簡単に変換できます。
サンプルコード
こちらのサンプルコードは、Linux 版 C言語, Windows 版 .NET C#, .NET VB 、Android 版 Java、Arduino, Lazruiteなどです。
パソコンから放射線測定器のデバイスに USB接続、またはシリアル通信で接続し、線量率(μSv/h)の値を取得するコードとなっています。
/***************************************************************
* Linux - C言語 サンプルプログラム (例)
***************************************************************/
main(){
BYTE buffer[BUFFER_SIZE];
buf[BUF_SIZE];
ssize_t ret, len, wrlen;
/* 初期化 */
init();
/* シリアルポートを読み書き可能な非制御端末 ttyS3 をオープン */
serial_fd = open(”/dev/ttyS3”, O_RDWR | O_NOCTTY );
/* エラーメッセージの表示 */
if (serial_fd < 0){ exitfail_errno(”open”); }
/* 終了シグナルに対してハンドラを設定 */
set_sig_handler( terminate_sig_list, ARRAY_SIZE(terminate_sig_list), terminate_sig_handler);
/* シリアルポートを設定 */
setup_serial(serial_fd);
/* バッファーを0で初期化 */
clearbytes( buffer, BUFFER_SIZE);
/* 命令文を格納 */
buffer[0] = 0x01; // 測定器の Modbus アドレス
buffer[1] = COMMAND; // 命令コマンド
buffer[2] = DATA_1; // パラメータ
buffer[3] = DATA_2; // パラメータ
buffer[4] = DATA_3; // パラメータ
buffer[5] = DATA_4; // パラメータ
buffer[6] = CRC1; // Modbus CRC符号
buffer[7] = CRC2; // Modbus CRC符号
/* 命令分を送信 */
ret = write(serial_fd, buffer, sent );
if (ret < 0) { exitfail_errno(”write”); }
/* バッファーを0で初期化 */
clearbytes( buffer,BUFFER_SIZE);
/* シリアルポートから読み込み 、5回チャレンジ */
for(x=0;x<5;x++){
ret = read(serial_fd, buffer, BUFFER_SIZE);
if (ret < 0){ /* 受信失敗 */
if( errno == EINTR){ exitfail_errno(”read”);}
}else{ /* 受信成功 */
printbytes(”Received : “, buffer, ret);
/* 線量率、積算線量、積算時間の表示 */
if( checker( buffer, sent, ret ) == 1){
print_R_data( buffer,sent ); break;
}else{
exitfail_errno(”not match”);}
}
}
return EXIT_SUCCESS;
}
'========================================================= '
' '
' .NET Visual Bacis 言語サンプルコード '
' このコードだけでは、動作しません。 '
' '
'========================================================= '
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.IO.Ports
Imports System.ComponentModel
Imports System.Data
Imports System.Diagnostics
Imports System.Threading
Imports System.Management
Imports USBXpressNET
Namespace BDG_VCS
Module mainModule
Sub Main()
Dim myDevice As New Serial()
' デバイスと接続して、命令を送信、受信データを待ちます '
myDevice.start_serial()
myDevice.make_command()
myDevice.send()
myDevice.ReceivedAction()
End Sub
End Module
Class Serial
Public PACKET_HEAD As Byte = &H55
Public DEVICE_ID As Byte = &H30
Public crc As Crc
Private Const BUFFER_SIZE As Integer = 128
Private Const WAITTIME As Integer = 5000
Public writeBuffer As Byte() = New Byte(BUFFER_SIZE - 1) {}
Public readBuffer As Byte() = New Byte(BUFFER_SIZE - 1) {}
Public Handle As UInteger
Public count As Integer
Public MainEncording As Encoding = Encoding.ASCII
Public Sub start_serial()
crc = New Crc()
Dim devices As Integer = 0
Dim x As Integer = 0
Dim productstrings As String = ""
' デバイス情報を取得します '
Dim retVal As ReturnValue = API.GetNumDevices(devices)
Dim retVal2 As ReturnValue = API.GetProductString(x, productstrings, DirectCast(0, GetProductOptions))
Debug.WriteLine("SI_RETURN_SERIAL_NUMBER : " & productstrings)
Dim retVal3 As ReturnValue = API.GetProductString(x, productstrings, DirectCast(1, GetProductOptions))
Debug.WriteLine("SI_RETURN_DESCRIPTION : " & productstrings)
Dim retVal4 As ReturnValue = API.GetProductString(x, productstrings, DirectCast(2, GetProductOptions))
Debug.WriteLine("SI_RETURN_LINK_NAME : " & productstrings)
Dim retVal5 As ReturnValue = API.GetProductString(x, productstrings, DirectCast(3, GetProductOptions))
Debug.WriteLine("SI_RETURN_VID : " & productstrings)
Dim retVal6 As ReturnValue = API.GetProductString(x, productstrings, DirectCast(4, GetProductOptions))
Debug.WriteLine("SI_RETURN_PID : " & productstrings)
If devices > 0 Then
Debug.WriteLine("{0} 個のデバイスが見つかりました !", devices)
retVal = API.Open(0, Handle)
If retVal = ReturnValue.SI_SUCCESS Then
' 無限に待つ場合 Dim inifity As Integer = 0xFFFF; '
Dim notinfinity As Integer = 5000
'最初、送受信バッファーを空にします '
API.FlushBuffers(Handle, True, True)
' 送受信の待ち時間を設定 '
API.SetTimeouts(notinfinity, notinfinity)
' ボードレートの設定 '
API.SetBaudRate(Handle, 115200)
Else
Debug.WriteLine("デバイスが見つかりません")
Environment.[Exit](0)
End If
End If
End Sub
Public Sub make_command()
' 送信コマンドの作成 '
writeBuffer(0) = 0x01; // 測定器の Modbus アドレス
writeBuffer(1) = COMMAND; // 命令コマンド
writeBuffer(2) = DATA_1; // パラメータ
writeBuffer(3) = DATA_2; // パラメータ
writeBuffer(4) = DATA_3; // パラメータ
writeBuffer(5) = DATA_4; // パラメータ
writeBuffer(6) = CRC1; // Modbus CRC符号
writeBuffer(7) = CRC2; // Modbus CRC符号
write_command(writeBuffer)
End Sub
Public Sub send()
Debug.WriteLine("Write: " & Convert.ToString(writeBuffer))
write_command(writeBuffer)
End Sub
Public Sub ReceivedAction()
' 受信データの処理 '
Debug.WriteLine("Read: start index count = " & count)
Dim ret As ReturnValue = API.Read(Handle, readBuffer, count)
If ret <> ReturnValue.SI_SUCCESS Then
Debug.WriteLine("Read is not success !!! {0}", ret)
Else
If crc.checkcrc(readBuffer) Then
'正しく受信できているので、'
Debug.WriteLine("Read:" & BitConverter.ToString(readBuffer, 0, readBuffer.Length))
Dim data_printer As New BDG2_data()
' 誤り訂正符号のチェック '
If readBuffer(2) = COMMAND_X Then
data_printer.command_R(readBuffer)
End If
End If
End If
'待ち時間'
Thread.Sleep(WAITTIME)
End Sub
Public Sub write_command(ByVal buffer As Byte())
'デバイスへの書き込み'
Debug.WriteLine("Write in byte : " & BitConverter.ToString(buffer, 0, buffer.Length))
Dim ret As ReturnValue = API.Write(Handle, buffer, count)
If ret <> ReturnValue.SI_SUCCESS Then
Debug.WriteLine("Write not success !!! {0}", ret)
End If
'待ち時間'
Thread.Sleep(WAITTIME)
End Sub
Public Sub close_serial()
API.Close(Handle)
End Sub
End Class
Class BDG2_data
Public Sub command_R(ByVal buffer As Byte())
' 受信データを出力ロジックをここに書きます '
' ..... '
' ..... '
' ..... '
' ..... '
End Sub
End Class
End Namespace
/***************************************************************
* .NET C# 言語サンプルコード
* --- このコードだけでは、動作しません。---
* --- 秘密保持契約後に、サンプルコードを提供可能です ---
***************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Threading;
using System.Management;
using USBXpressNET; // USBXpressNET ライブラリが使えるようになります。
namespace BDG_VCS
{
class Program
{
static void Main(string[] args)
{
// デバイスと接続して、命令を送信、データを受信します。
Serial myDevice = new Serial();
myDevice.start_serial();
myDevice.make_command();
myDevice.send();
myDevice.ReceivedAction();
}
}
class Serial
{
public byte PACKET_HEAD = 0x55;
public byte DEVICE_ID = 0x30;
public Crc crc;
private const int BUFFER_SIZE = 128;
private const int WAITTIME = 5000;
public byte[] writeBuffer = new byte[BUFFER_SIZE];
public byte[] readBuffer = new byte[BUFFER_SIZE];
public uint Handle;
public int count;
public Encoding MainEncording = Encoding.ASCII;
public void start_serial()
{
crc = new Crc();
int devices = 0;
int x = 0;
string productstrings = "";
// デバイス情報の取得
ReturnValue retVal = API.GetNumDevices(out devices);
ReturnValue retVal2 = API.GetProductString(x, out productstrings, (GetProductOptions)0);
Debug.WriteLine("SI_RETURN_SERIAL_NUMBER : " + productstrings);
ReturnValue retVal3 = API.GetProductString(x, out productstrings, (GetProductOptions)1);
Debug.WriteLine("SI_RETURN_DESCRIPTION : " + productstrings);
ReturnValue retVal4 = API.GetProductString(x, out productstrings, (GetProductOptions)2);
Debug.WriteLine("SI_RETURN_LINK_NAME : " + productstrings);
ReturnValue retVal5 = API.GetProductString(x, out productstrings, (GetProductOptions)3);
Debug.WriteLine("SI_RETURN_VID : " + productstrings);
ReturnValue retVal6 = API.GetProductString(x, out productstrings, (GetProductOptions)4);
Debug.WriteLine("SI_RETURN_PID : " + productstrings);
if (devices > 0)
{
Debug.WriteLine("{0} 個のデバイスが見つかりました !", devices);
retVal = API.Open(0, out Handle);
if (retVal == ReturnValue.SI_SUCCESS)
{
int notinfinity = 5000; //int inifity = 0xFFFF;
API.FlushBuffers(Handle, true, true); // 送受信バッファーを空にする。
API.SetTimeouts(notinfinity, notinfinity); // 送受信の待ち時間の設定
API.SetBaudRate(Handle, 115200); // ボードレートの設定
}
else
{
// デバイスが見つからない場合
Debug.WriteLine("No devices found");
Environment.Exit(0);
}
}
}
public void make_command()
{
// 送信コマンドを作成
writeBuffer[0] = 0x01; // 測定器の Modbus アドレス
writeBuffer[1] = COMMAND; // 命令コマンド
writeBuffer[2] = DATA_1; // パラメータ
writeBuffer[3] = DATA_2; // パラメータ
writeBuffer[4] = DATA_3; // パラメータ
writeBuffer[5] = DATA_4; // パラメータ
writeBuffer[6] = CRC1; // Modbus CRC符号
writeBuffer[7] = CRC2; // Modbus CRC符号
write_command(writeBuffer);
}
public void send()
{
Debug.WriteLine("Write: " + writeBuffer);
write_command(writeBuffer);
}
public void ReceivedAction()
{
// データを受信した場合
Debug.WriteLine("Read: start index count = " + count);
ReturnValue ret = API.Read(Handle, ref readBuffer, out count);
if (ret != ReturnValue.SI_SUCCESS)
{
// 受信失敗の場合
Debug.WriteLine("Read is not success !!! {0}", ret);
}
else
{
if ( crc.checkcrc(readBuffer) ) // 誤り訂正符号のチェック
{
Debug.WriteLine("Read:" + BitConverter.ToString(readBuffer, 0, readBuffer.Length));
BDG2_data data_printer = new BDG2_data();
if (readBuffer[2] == COMMAND_X)
{
data_printer.command_R(readBuffer);
}
}
}
Thread.Sleep(WAITTIME); //待ち時間
}
public void write_command(byte[] buffer)
{
Debug.WriteLine("Write in byte : " + BitConverter.ToString(buffer, 0, buffer.Length));
ReturnValue ret = API.Write(Handle, ref buffer, out count);
if (ret != ReturnValue.SI_SUCCESS)
{
Debug.WriteLine("Write not success !!! {0}", ret);
}
Thread.Sleep(WAITTIME);//待ち時間
}
public void close_serial()
{
API.Close(Handle);
}
}
class BDG2_data
{
public void command_R(byte[] buffer)
{
// ここに受信データの解析や、出力を記載します。
}
}
}
/***************************************************************
* Java - Raspberry Pi 言語サンプルコード
* --- このコードだけでは、動作しません。---
* --- 秘密保持契約後に、サンプルコードを提供可能です ---
***************************************************************/
/*
(1) Change Device PID to 0xEA60. This is enable to work as Serial Device.
Use CP210xSetIDs.exe from silabs.com
(2) Check your Raspberry Pi Kernel has Cp210x driver.
dmesg | grep 210x
lsmod | grep 210x
otherwise, You have to do compile kernel with
in Kernel configuration, You can find the device at :
Device Drivers -> USB support -> USB Serial Converter support ->
USB CP2101 UART Bridge Controller
(3) Install library.
sudo apt-get install librxtx-java
(4)
in .bashrc, Add this.
export CLASSPATH=$CLASSPATH:/usr/share/java/RXTXcomm.jar
LD_LIBRARY_PATH=/usr/lib/jni/
(5) compile
javac bdg3.java
(6) execute
java -Djava.library.path=/usr/lib/jni/ jp.taroumaru.bdg3.bdg3
*/
package jp.taroumaru.bdg3;
import gnu.io.*; // こちらは、apt-get で install できる。
//import javax.comm.*; // Sun の Serial ライブラリだが、raspberry では使えない。
import java.io.*;
import java.util.*;
class bdg3 implements SerialPortEventListener {
private SerialPort port;
private InputStream inputStream;
static OutputStream outputStream;
private static BufferedReader reader;
private static bdg3 obj;
private byte[] cmd = new byte[5];
bdg3() {
try {
// シリアルポートの初期化
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
// シリアルデバイス Raspberry Pi で割り当てられたデバイスを探す
// dmesg | grep 210x で探せます。
if (portId.getName().equals("/dev/ttyUSB0")) {
try {
// デバイスオープン
port = (SerialPort)
portId.open("serial", 2000);
} catch (PortInUseException e) {}
try {
// 入出力の設定
outputStream = port.getOutputStream();
inputStream = port.getInputStream();
reader = new BufferedReader(new InputStreamReader(inputStream));
} catch (IOException e) {}
try {
// ポートの設定
port.setSerialPortParams(115200,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
} catch (UnsupportedCommOperationException e) {}
try {
// データ(測定値)を受信した時のイベント
port.addEventListener(this);
port.notifyOnDataAvailable(true);
} catch (TooManyListenersException e) {
System.out.println("Error: " + e);
}
}
}
}
} catch (Exception e) {
System.out.println("Error: " + e);
System.exit(1);
}
}
public static String buffer2str(byte[] buffer) {
// Hex の値を画面に表示する
String bufferstr = "";
for (int i = 0;i < buffer.length; i++){
bufferstr += String.format("%02x ", buffer[i]);
}
return bufferstr;
}
public void run() {
try {
// 測定器に、測定値を返信するようにする命令
// 送信コマンドを作成
cmd[0] = 0x01; // 測定器の Modbus アドレス
cmd[1] = COMMAND; // 命令コマンド
cmd[2] = DATA_1; // パラメータ
cmd[3] = DATA_2; // パラメータ
cmd[4] = DATA_3; // パラメータ
cmd[5] = DATA_4; // パラメータ
cmd[6] = CRC1; // Modbus CRC符号
cmd[7] = CRC2; // Modbus CRC符号
OutputStream out = port.getOutputStream();
out.write(cmd);
System.out.println("Write: "+buffer2str(cmd));
Thread.sleep(3000);
port.close();
} catch (Exception e) {
System.out.println("Error: " + e);
}
}
public void serialEvent(SerialPortEvent event) {
// データ(測定値)を受け取ったときのイベント
if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
byte[] readBuffer = new byte[30];
try {
// read data
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}
System.out.println("Read: "+buffer2str(readBuffer));
} catch (IOException e) {}
}
}
public static void main(String arg[]) {
// 実行します。
obj = new bdg3();
obj.run();
}
}
/***************************************************************
* Android サンプルコード
* --- このコードだけでは、動作しません。---
* --- 秘密保持契約後に、サンプルコードを提供可能です ---
***************************************************************/
package com.example.bdg_for_android;
public class MainActivity extends Activity {
private final String TAG = MainActivity.class.getSimpleName();
private TextView tvMsg;
private static UsbSerialPort sPort = null;
private SerialInputOutputManager mSerialIoManager;
private PendingIntent mPermissionIntent = null;
private final SerialInputOutputManager.Listener mListener =
new SerialInputOutputManager.Listener() {
public void onNewData(final byte[] data) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//データを受信後、誤り訂正符号のチェック
if (crc.checkcrc(data)){
updateReceivedData(data);
}
}
});
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvMsg = (TextView)findViewById(R.id.tvMsg);
//デバイスと接続
if( connectUSB() ) {
//命令を送信
send();
}
}
private boolean connectUSB(){
// デバイス情報の取得
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbSerialProber prober = new UsbSerialProber(customTable);
List availableDrivers = prober.findAllDrivers(manager);
if (availableDrivers.isEmpty()) {
tvMsg.setText("No available drivers.");
return false;
}
UsbSerialDriver driver = availableDrivers.get(0);
// 接続の許可
if (mPermissionIntent == null) {
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent("USB_PERMISSION"), 0);
}
manager.requestPermission(driver.getDevice(), mPermissionIntent);
if (!manager.hasPermission(driver.getDevice())) {
tvMsg.setText("The driver does not have permission.");
return false;
}
UsbDeviceConnection connection = manager.openDevice(driver.getDevice());
if (connection == null) {
tvMsg.setText("Can not open a connection to the driver.");
return false;
}
// Open port
List myPortList = driver.getPorts();
sPort = myPortList.get(0);
try {
sPort.open(connection);
sPort.setParameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE);
} catch (IOException e) {
tvMsg.setText("Error opening device: " + e.getMessage());
try {
sPort.close();
} catch (IOException e2) {
// Ignore.w
}
sPort = null;
return false;
}
onDeviceStateChange();
return true;
}
private void send() {
// 送信コマンドを作成
writeBuffer[0] = 0x01; // 測定器の Modbus アドレス
writeBuffer[1] = COMMAND; // 命令コマンド
writeBuffer[2] = DATA_1; // パラメータ
writeBuffer[3] = DATA_2; // パラメータ
writeBuffer[4] = DATA_3; // パラメータ
writeBuffer[5] = DATA_4; // パラメータ
writeBuffer[6] = CRC1; // Modbus CRC符号
writeBuffer[7] = CRC2; // Modbus CRC符号
try {
sPort.write(writeBuffer, writeBuffer.length);
} catch(IOException e){
Log.e(TAG,e.getMessage());
}
}
private void updateReceivedData(byte[] buffer) {
// データを受信した場合
ByteBuffer buffer_wrap = ByteBuffer.wrap(buffer).order(ByteOrder.LITTLE_ENDIAN);
final String message;
message = "Statistics : " + der_statistics + "\n"
+ "Dose rate : " + (String.format("%.2f μSv/h", der)) + "\n"
+ "Dose : " + (String.format("%.3f mSv", de)) + "\n"
+ "Dose : " + (String.format("%.3f μSv", de_uSv)) + "\n"
+ "Dose time : " + (String.format("%d second", de_second)) + "\n";
tvMsg.setText(message);
}
}
/***************************************************************
* Arduino UNO 用のサンプルコード
* --- このコードだけでは、動作しません。---
* --- 秘密保持契約後に、サンプルコードを提供可能です ---
*
*
* Arduino UNO は、ハードウェアシリアルポートが一つだけなので、
* ハードウェアシリアルポート(ボーレート 115,200) を測定器に利用、
* Windows のCOMポートに割り当てられたシリアルモニターが使えなくなるため、
* 結果の表示に、SoftwareSerial mySerial(11, 12); // RX, TX を利用しました。
*
* [ Arduino UNO ] --- [UART-RS485変換チップ] ----RS485ケーブル--- [ 測定器 ]
* |
* |
* +------[Serial USB変換器]-----[Windows PC]
*
***************************************************************/
// for Arduino UNO
#include <SoftwareSerial.h>
#define PIN_RTS 3
#define BUFFER 30
int del=100;
SoftwareSerial mySerial(11, 12); // RX, TX
void setup() {
// 測定器は、115200 のボーレートが必要なため、Serial を利用。
Serial.begin(115200);
// 動作結果の表示は、ソフトウェアシリアルを利用する。
// パソコン等につないで、teraTerm で結果を表示する。
mySerial.begin(9600);
// RS485の送信・通信の制御ピン
pinMode(PIN_RTS, OUTPUT);
}
void printbyte( byte *cmd, int length ){
// Byte の配列を hex の形で表示する
int i;
for(i=0;i<length;i++){
if( ( cmd[i] >> 4 ) == 0 ){
mySerial.print("0");
}
mySerial.print(cmd[i],HEX);
if( i<length-1 ){
mySerial.print(",");
}
}
mySerial.print("\r\n");
}
void print_der(byte *buf){
float der;
int stat;
union u_tag {
byte b[4];
float fval;
} u;
stat = buf[4+21];
u.b[0] = buf[4+14];
u.b[1] = buf[4+15];
u.b[2] = buf[4+16];
u.b[3] = buf[4+17];
der = u.fval;
mySerial.print(der,3);
mySerial.println( " uSv/h");
mySerial.print(stat,DEC);
mySerial.println( " %");
}
void loop() {
byte cmd[5] = { /* 通信仕様のコマンド */ 0x01, COMMAND, DATA_1, DATA_2, DATA_3, DATA_4, CRC1, CRC2 };
byte txbuf[BUFFER];
int i;
// データの書き込み
mySerial.println("Writing..");
printbyte(cmd,5);
digitalWrite(PIN_RTS, HIGH);
// RTS(送受信制御)を切り替えた後、少し時間を置いた方がよい
delayMicroseconds(120);
for(i=0;i<5;i++){
Serial.write(cmd[i]);
}
// 送信後に、少し時間を置いた方がよい
delayMicroseconds(400);
digitalWrite(PIN_RTS, LOW);
// RTS(送受信制御)を切り替えた後、少し時間を置いた方がよい
delay(15);
// データの受信
i=0;
for(i=0;i<BUFFER;i++){
txbuf[i]=Serial.read() ;
}
printbyte(txbuf,BUFFER);
print_der(txbuf);
delay(1000);
}
プログラム開発では、様々なプログラム言語で接続できるようにサポートしております。
ハンドル・取り付け金具
放射線測定器・検出器モジュールには、ハンドルや、壁付け金具が用意されています。
測定器には、いずれか1つの金具が付属しています。注文時にご指定ください。
ハンドル(1)
検出器を持ち運ぶためのハンドルです。
あると便利です。
ハンドル(2)
サーベイメーター端末PU2も一緒に
止めておけるハンドルです。
金具(1)
BDKN-01を壁付け
固定できる金具です。
選べる放射線測定器・開発モジュール
Windows, Linux, Android, Arduino, Lazurite に対応した放射線測定モジュールです。
通信仕様が開示されており、校正ずみの放射線測定器を使った独自システムの開発を行うことができます。
CsI シンチレーション
感度 18,000 cpm/uSv/h の大型シンチレーション検出器を搭載したスペクトル測定モジュール。移動測定、低線量での汚染調査向けの開発モジュール。詳細 »
中性子線検出器
低速の熱中性子線から 14 MeV までの中性子線までの幅広い測定範囲をもつ大型中性子線モジュールです。線量率・積算線量の測定が可能。詳細 »
中性子線検出器
低速の熱中性子線から 14 MeV までの中性子線までの幅広い測定範囲をもつ大型中性子線モジュールです。線量率・積算線量の測定が可能。詳細 »
Arduino で放射線測定
放射線モジュール BDG シリーズと Arduino を接続するところまでをご紹介。
放射線測定器からの測定データが取得できれば、無線で送信や、SDカードへ蓄積するなど、目的の用途に応用できます。
たろうまるの安心サポート体制
高性能な放射線測定器を、ずっと安心してお使いいただくために、最高のサービスを提供したいと考えています。
いつでもご遠慮なくお問い合わせください。
校正と点検
たろうまるは、正規販売店です。
測定器の販売、点検・校正、技術サポートまで、メーカーの技術者から教育を受けたスタッフが対応しております。 購入頂いた線量計、放射線測定器、サーベイメーター、食品用放射線測定器は たろうまるを経由して、メーカーでの修理、点検、校正を行うことができます。
安心の修理体制
メーカー保証期間、保証後も、修理は承っております。
修理品の送料につきまして、
弊社側からの発送の場合は弊社負担、お客様側からの発送については、お客様のご負担となります。あらかじめご了承ください。
サポート
すべての製品は、10年間以上利用されることを想定した耐久性のある設計です。 お求めいただく測定器は、長い期間お使いいただく製品になります。
たろうまるでは、お客様が製品を使用している間ずっとサポートを行っていく体制をとっております。 使い方、修理、校正、点検など、あらゆる場面において技術スタッフが、いつでも対応しております。
開発者のための中性子線用 He3 放射線測定器モジュール BDKN-01, BDKN-02 仕様
-
製品の分類
開発用検出モジュール -
サイズと重さ
高さ :260 mm
直径 :90 mm
重さ : 2 kg
-
通信方式
型番 通信方式 BDKN-01 RS232 USB BDKN-02 RS485 USB - USB接続は、変換器を利用します。
- サーベイメーター端末PU2は、BDKN-01とのみ接続できます。
- RS232-RS485 変換器も利用できますので BDKN-01をおすすめ致します
-
検出器
He3 -
測定項目
- H*(10) 線量率
- 積算線量
- CPS値
- 流束密度
- 流束密度の積算(=フルエンス)
-
線量率の測定
0.1 μSv/h ~ 10 mSv/h -
積算線量の測定
0.1 μSv ~ 10 Sv -
流束密度の測定
0.1 ~ 104 s-1∙cm-2 -
積算流束密度の測定
1 ~ 3×106 cm-2 -
線量率の誤差
±35% -
流束密度の誤差
±20% -
流束密度の感度 Pu-α-Be
0.5 カウント/(neutron/s∙cm-2) -
線量率の感度 Pu-α-Be
0.355 cps/(μSv/h) -
エネルギー範囲
熱中性子線 0.025 eV~14 MeV -
測定時間
200秒
(Pu-α-Be線源
中性子線の流束密度 1 s-1∙cm-2 時) -
校正
Pu-α-Be 4.16 MeV -
電源
- 外部電源 5V を供給
- USBからの5V供給
-
電圧
- RS485 接続 6.5~27 V
- RS232接続 5.3~14 V
-
消費電流(5V)
15 mA -
付属
RS232/USB変換器
-
防水・防塵
IP64 -
動作環境
- 温度 :-40度 ~ +50度
- 湿度 :95% 以下, 35度以下
- 気圧 :84~106.7 kPa
-
背景放射線
0.2 μSv/h 以下 -
保証
- メーカー保証1年
- 初期動作保証
-
取扱説明書
-
ダウンロード
-
付属アプリ
Atexch
測定値確認Windows 用アプリ
-
開発サンプルコード
- Linux - C言語等
- Windows - .NET Visual Basic
- Windows - .NET C#
- Android - Java
-
Windows 対応
Windows 10, 11~
-
国際規格
- GOST 30804.4.2-2013
- Rohs
-
校正・試験所規格
ISO 17025


