プログラム開発者向け・放射線測定器
高線量+耐久性
BDKG-23 は、検出器シリーズの中でも最も高耐久性を追求した製品です。
良好なエネルギー特性を持ちながら低線量から高線量 100 Gy/h まで測定できるGM管(ガイガーミュラー管)検出器です。
長期間の放射線モニタリングを目的として、耐衝撃、耐振動、耐EMI、防水、高温などあらゆる点で耐久性を高めた検出器を採用しています。
アプリ開発サポート
検出器モジュールは、表示部を持たない開発者向けの放射線測定器です。
Windows, Mac, Linux, Android, iPhone などシリアル接続ができるデバイスから命令を送信することで、独自のアプリ開発が行えます。
Windows C#, Android Java などのサンプルプログラムも提供しております。簡単なプログラムで放射線測定器を使ったモニタリングシステムを構築できます。
無線化とModbus
通信方式は、Modbus RTSです。この方式は工場などで稼働する 産業用ロボットや制御機器に利用されている標準的な通信方法です。汎用性が高いため測定器の有線ケーブルを無線化することも可能です。 (おすすめの無線機器の例)
複数個所に放射線測定器を設置する場合には、測定器のアドレスを1,2,3.. と変えていくことで単一ネットワーク内に最大255台の測定器を設置することができます。
高線量での校正
100 Gy/h の超高線量においても正確な測定結果を表示するため、BDKG-23 では高線量 40 Gy/h での校正を行っています。
超高線量の放射線は、測定器の検出器や電子回路に少なからずダメージを与えます。高線量環境でも正確な測定を行うために、 BDKG-23ではケーブル、配線、電子回路に至るまで高線量時の耐久性を高めた設計が行われています。
空気カーマ(Air Kerma)とは?
カーマ("Kerma")とは、物理量です。
一番身近な物理量といえば、重さの単位 kg や温度(℃)などがあります。カーマもこれと同じでグレイ (Gy)という単位で測定できるエネルギーの大きさを表します。
カーマ Gy は、放射線が照射された 1kg の物体中で発生する電子の運動エネルギーの合計量として定義されています。
もう少し詳しく厳密に定義を見ていくと、電離放射線(具体的にはX線、ガンマ線、中性子線など)が物( 1kg のもの )に照射されて、 電離した(跳ね飛ばした)荷電粒子(電子など)の初期運動エネルギーの合計量という定義になっています。
Kerma という名前は、kinetic energy released in materials(物質に放出される運動エネルギー)という英文の頭字語になっています。この量は目には見えないし感じることもできない量なので想像するしかありません。
空気カーマ(Air Kerma)の場合には、空気 1kg で発生するカーマについて考える量になります。
吸収線量とカーマの違い
吸収線量とカーマは、どちらも同じ単位グレイ(Gy)です。
- 吸収線量とは、1kgの物体が蓄積する放射線からのエネルギーとして定義されています。
- カーマとは、1kg の物体中で発生する荷電粒子の初期運動エネルギーの合計量として定義されています。
どちらも放射線の照射を受けて発生するエネルギー量であるため、低エネルギーの放射線の時は吸収線量=カーマとして考えることができます。 放射線のエネルギーが高エネルギーになってくると、吸収線量とカーマは、以下の理由で一致しなくなってきます。
- 跳ね飛ばされた荷電粒子の運動エネルギーが再び物体に吸収されることがある
- エネルギーがさらに高くなると吸収される前に 1kg の物質の外にエネルギーが出てしまう分が増えてくる
高エネルギーの放射線の場合には、カーマの方が吸収線量より大きくなります。特に物体の外に出てしまうようなエネルギーは、カーマの方は運動エネルギーとして数えられますが、吸収線量の方は吸収していないものとしてみなされます。
カーマという物理量は医療の分野でよく使われています。
シリアル通信の仕組み
シリアルはプログラム開発の中でも簡単な手順で実行できる通信方式です。
シリアル通信のプログラムでは、Write 命令を使って放射線測定器に命令文を送ると、放射線測定器が測定値を返してくるのでこれを read で読み出すという単純なプログラムになります。こちらの3ステップを繰り返すことで、定期的に測定値を取得することができます。
アプリの開発は弊社たろうまるでも必要なアプリの開発を行うことができます。ご遠慮なくご相談ください。
命令を送信
お使いのWindows パソコンや Android, iPhone のスマートフォンからシリアル通信上に命令文を送信します。 命令文は8ビットのバイト列です。プログラムから Write して測定器へ測定命令を送信します。
測定値を受け取る
続いてプログラムでシリアル通信を Read すると測定器から届いた測定値情報が入ったバイト列を受信できます。このバイト列には、線量率、CPSなどの浮動小数点情報が含まれています。
アプリに表示
線量率などの測定値を値に変換し、パソコンやスマートフォンの画面に表示します。この動作を繰り返すことで、測定値情報を使ったアプリケーションを簡単に開発することができます。
放射線測定器の制御コマンド一覧
- 線量率 [Gy/h]
- 線量率の偏差[%]
- CPS
- 平均CPS
- CPSの偏差[%]
- 積算線量 [Gy]
- 積算時間 [秒]
- 積算線量を0にリセット
- 探索モードでの CPS 基準を保存
- 探索モードの ON/OFF
- 探索アラーム音の ON/OFF
- 背景放射線の差分モード ON/OFF
- 2段階の線量率警告の設定
- 2段階の線量率警告に対するドライコンタクトスイッチ発動
- Baudrate (300-115,200 bit/s)の変更
- 測定器のネットワークアドレスの変更
- 診断モード
- 測定器の識別番号の取得
- 背景放射線量の差分モードを設定
- カウント率を背景放射線量として保存
- 放射線測定器の初期化
- 放射線測定器の自己診断モード開始
- 解読不可能な命令の例外を検出
接続回路の例
放射線測定器 BDKG23 は、電源として ACアダプターで9~30V の直流電源が必要です。
電源には、モバイルバッテリーなども利用できます。放射線量が高くなると消費電力も上がりますが、最大でも 1W 以下です。
外部電源を使う
ACアダプターを使って連続的に安定電源を供給する方法です。バッテリーを使うこともできます。
USBから電源供給
こちらは持ち運び安い方にUSBから電力を使う方法です。USBは通常5Vですので、9Vへ変換が必要になります。変換ケーブル等はご要望に合わせて提供しております。
2つの接点スイッチ
放射線量が設定された警告発動値を超えた場合、放射線測定器モジュール自体に備わった接点スイッチを閉じることができます。 接点スイッチを使うことで警告パトライト、放送開始などの外部機器を警告動作にさせることができます。
コネクタのピン配置
RS485ネットワーク(A,B), RS485(A,B,A',B')に加えて、3つの接点スイッチのピンがあります。
ピン番号 | 指定 |
1 | GND |
2 | 電源電圧(9~30V) |
3 | A |
4 | B |
5 | A' |
6 | B' |
7 | 接点スイッチ-1 |
8 | 接点スイッチ-2 |
9 | 接点スイッチ-3 |
10 | 接点スイッチ-GND |
ケーブル側コネクタは、DBEU 105 A069-130です。 対して検出器側のコネクタは、S 1031 A012-130と 護スリーブЕ3 1031.2/6.2の組み合わせです。
詳しくは、フィッシャーコネクターズから探すことができます。
開発例
検出器モジュールを使って病院施設の放射線モニタリングを行った例です。
サンプルコード
こちらのサンプルコードは、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] = COMMAND_1; buffer[1] = COMMAND_2; buffer[2] = COMMAND_3; /* 命令分を送信 */ 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) = PACKET_HEAD writeBuffer(1) = COMMAND_1 writeBuffer(2) = COMMAND_2 writeBuffer(3) = COMMAND_3 writeBuffer(4) = crc.makecrc(writeBuffer) 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] = PACKET_HEAD; writeBuffer[1] = COMMAND_1; writeBuffer[2] = COMMAND_2; writeBuffer[3] = COMMAND_3; writeBuffer[4] = crc.makecrc(writeBuffer); 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]=0x00; cmd[1]=0x00; cmd[2]=0x00; cmd[3]=(byte)0x00; cmd[4]=0x00; 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); ListavailableDrivers = 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] = PACKET_HEAD; writeBuffer[1] = COMMAND_1; writeBuffer[2] = COMMAND_2; writeBuffer[3] = COMMAND_3; writeBuffer[4] = crc.makecrc(writeBuffer); 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] = { /* 通信仕様のコマンド */0x00, 0x00, 0x00, 0x00, 0x00 }; 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); }
プログラム開発では、様々なプログラム言語で接続できるようにサポートしております。
高耐久・放射線測定器モジュールシリーズ
こちらの機種は、耐久性を高めた仕様をもつ放射線測定器・検出器モジュールです。
BDKG-22
ガンマ線・高耐久GM菅
高い耐久性のあるエネルギー補償型GM菅を採用した高耐久ガンマ線・線量率モジュールのベーシックタイプです。
BDKG-23/1
ガンマ線・100 Sv/h 超高線量・高耐久GM菅
高い耐久性のあるエネルギー補償型GM菅を2つ搭載し、100 Sv/h の高線量まで測定できる高耐久ガンマ線・線量率モジュールのベーシックタイプです。
BDKG-23
空気カーマ率の測定・100 Gy/h 超高線量・高耐久GM菅
空気カーマ率を測定するため開発者・シリアル検出器の高い耐久性のあるエネルギー補償型GM菅を2つ搭載し、100 Sv/h の高線量まで測定できる高耐久ガンマ線・線量率モジュールのベーシックタイプです。
たろうまるの安心サポート体制
高性能な放射線測定器を、ずっと安心してお使いいただくために、最高のサービスを提供したいと考えています。
いつでもご遠慮なくお問い合わせください。
校正と点検
たろうまるは、正規販売店です。
測定器の販売、点検・校正、技術サポートまで、メーカーの技術者から教育を受けたスタッフが対応しております。 購入頂いた線量計、放射線測定器、サーベイメーター、食品用放射線測定器は たろうまるを経由して、メーカーでの修理、点検、校正を行うことができます。
安心の修理体制
メーカー保証期間、保証後も、修理は承っております。
修理品の送料につきまして、
弊社側からの発送の場合は弊社負担、お客様側からの発送については、お客様のご負担となります。あらかじめご了承ください。
サポート
すべての製品は、10年間以上利用されることを想定した耐久性のある設計です。 お求めいただく測定器は、長い期間お使いいただく製品になります。
たろうまるでは、お客様が製品を使用している間ずっとサポートを行っていく体制をとっております。 使い方、修理、校正、点検など、あらゆる場面において技術スタッフが、いつでも対応しております。
シリアル通信・放射線測定器モジュール BDKG-23 仕様
-
写真
-
製品の分類
- 空気カーマ率の測定
- 積算カーマの測定
- 測定単位 Gy( グレイ )
- CPS値の測定
- シリアル・放射線測定器
- ロボット・ドローン用の放射線測定器
-
検出器
GM菅 + 高線量対応 GM菅の2本 -
エネルギー範囲
60keV~3MeV -
空気カーマ率の測定範囲
0.1μGy/h~100Gy/h -
空気カーマ率の固有相対誤差
±20% -
積算空気カーマの測定範囲
0.1μGy~100Gy -
積算空気カーマの固有相対誤差
±20% -
ボーレート
300~115,200 bit/s -
エネルギー依存性
-25~+35%
(137Cs 662keV比) -
感度
241Am 4.6cps/(μGy/h) 137Cs 4.6cps/(μGy/h) 60Co 4.6cps/(μGy/h) -
通信プロトコル
Modbus RTU形式に準拠 -
電源電圧
9~30V -
消費電力
1W以下 -
動作温度
-40~70℃ -
動作湿度
-40~70℃ -
防水・防塵
IP 67 -
サイズ
Φ 60 x 255mm -
重さ
0.55kg -
保証
- メーカー保証1年
- 初期動作保証
-
ダウンロード
-
開発サンプルコード
- Linux - C言語等
- Windows - .NET Visual Basic
- Windows - .NET C#
- Android - Java
-
Windows 対応
Windows 10, 11~ -
Android 対応
- Bluetooth LEは 4.0 以上
- OTG USB接続は対応可能
-
国際規格
- GOST 30804.4.2-2013
- Rohs
-
校正
照射・線量率 単位 0.7 μGy/h 7 μGy/h 70 μGy/h 0.7 mGy/h 7 mGy/h 70 mGy/h 0.7 Gy/h 7 Gy/h 40 Gy/h -
校正・試験所規格
ISO 17025