開発者のためのシンチレーション測定器モジュール

サンプルプログラム提供

検出器モジュールは、USB/シリアル通信方式で、バイト列の送受信で測定データを取得できます。

放射線測定器へ測定値を要求するコマンドを送ることで、線量率・CPS値・測定誤差・スペクトル情報などが測定器から戻ってくる使いやすい仕様になっています。

Andorid 用 Java、Linux 版 C言語、Windows 版 .NET Visual Basic、.NET C# 言語、Arduinoスケッチ, Lazurite C言語のサンプルプログラムも付属していますので、Write/Read コマンドで簡単に測定データを利用したプログラム開発が可能です。

超高感度 CsI 検出器

BDG3には、感度 18,000 cpm/μSv/h の大型の CsIシンチレーション検出器を採用しています。高感度を生かした高速な測定を行うことができるため、移動しながらの測定や、低線量地域での測定に最適のモジュールです。

BDG3 耐熱・防水仕様は、動作温度範囲 -20~+50度、IP 65 防水となっており、屋外での利用を想定した仕様となっており、様々な放射線監視開発にご利用いただけます。

測定器の大きさは、130 x φ38mm , 重さ 180グラムと軽量です。

スペクトルと線量率測定

BDG3 は、1024チャネル (50keV ~3 MeV) までの放射線スペクトルを蓄積する内部保存メモリを搭載しています。開発プログラム( Andorid Java, Windows C# 等) から呼び出しすることで、環境のスペクトル情報を取り出すことができます。

また同時に、線量率( μSv/h ) での測定も可能となっており、ガンマ線による放射線監視用モジュールとして使いやすい仕様になっています。

通信仕様の公開

プログラム制御に対応した放射線測定器 BDG2 の通信プロトコル仕様は、秘密保持契約書にご署名の上でお使いいただくことができます。

サポートまでご相談いただければ、購入前に、契約書を見ていただき、ご検討いただくことができます。必要な修正があれば、ご連絡ください。

また購入後は、プログラム開発についてもアドバイスしております。

通信 API, サンプルコードの提供

BDG3 は、測定器本体にシリアル通信ポートを備えた開発者向け放射線測定モジュールです。1時間あたりのシーベルト値を測定できる線量率、CPS値、1024チャネルのスペクトルなどの情報を測定器から読み出すことができます。

その他、一定以上の線量率に到達した場合、アラームを発動させることができ、放射線の監視を行うこともできます。

測定器モジュールとの通信は、シリアル通信ですので、C言語、.NET C#, .NET Basic, アンドロイド Java、Arduinoスケッチ, Lazurite C言語など様々なプログラム言語から簡単に通信できます。また Windows, Linux といったパソコン以外にも、シリアル通信ができる様々なデバイスとも容易に通信を確立できます。

C言語、.NET C# 言語, .NET Visual Basic言語、Andorid Java、Arduinoスケッチ, Lazurite C言語については、サンプルコードを提供しております。基本的には、Write(”命令文”) を送信して、read(); で測定値情報を読み出すといった簡単なプログラム構成になっています。

測定値を秒単位でデータベースに転送して、ウェブサイトに公開するといったモニタリングアプリケーションを簡単に開発することができます。

  • アンドロイド Android OS

    Android Java

  • Windows 7, Window 8

    .NET C#, VB

  • Linux

    C言語等

  • Arduino

    Arduino

  • Lazurite

    Lazurite

  • Raspberry Pi

    Raspberry Pi

セットアップ

BDG3 は、USB接続、RS485接続の2種類の方法で、パソコンやその他のデバイスと接続できます。

USB接続の場合には、Windows/Linux 等のドライバーを経由して、シリアルポートとしてプログラムから通信できます。RS485 の場合には、RS485への変換モジュールを経由して、シリアル通信になります。

BDG3 - API,SDK,放射線測定ガイガーカウンター接続図

USB-RS485の変換器は、一般に販売されている機器が利用できます。測定器側のピン配置と、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] = 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);
        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] = 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);

}

プログラム開発では、様々なプログラム言語で接続できるようにサポートしております。

Android版サンプルコード

サンプルコードでは、線量率の測定と、スペクトルの取得、アラーム音の ON/OFF などを記述しています。スペクトルの拡大縮小も、スマホのような操作で可能です。

その他、測定器のアラーム発動設置値などの設定もありますが、お渡しする仕様書を見ることで、簡単に実装できると思います。


Windows版サンプルコード

線量率の測定と、スペクトルの取得、アラーム音の ON/OFF などを記述しています。スペクトル情報は、Csv としてファイルに出力します。


BDG3 の通信仕様の主な機能

  • Cs137, Am241, Co60の核種チャネル範囲
  • 1024チャネルのスペクトル( 50 keV ~ 3 MeV )
  • 温度依存パラメータ
  • 線量率
  • 線量率誤差
  • 探索モード
放射線測定 Android アプリ

Androidでの開発例

BDG3 に搭載された大型シンチレーションは、0.1μSv/h の通常の背景放射線量でも約1-2秒で測定が完了できる高感度設計です。

こちらの開発事例では、アンドロイド端末( Google Nexus 7 )に搭載された GPSを使い、地図作成機能、スペクトル測定機能を実装しています。 移動しながらの測定では、高感度な測定性能が必要になりますので、大型シンチレーションを使った BDG3 が最適な測定器です。

  • スペクトル測定と、現在位置を地図で表示
    放射線測定器とAndorid/Nexus 7/アンドロイド接続
  • 測定地点の自動マッピング表示
    Andorid/Nexus 7/放射線スペクトル
  • 記録の表示
    放射線測定器Andorid開発
  • 各測定地点における線量率とスペクトル表示
    サーベイメータ放射線開発Nexus 7

選べる放射線測定器・開発モジュール

Windows, Linux, Android, Arduino, Lazurite に対応した放射線測定モジュールです。
通信仕様が開示されており、校正ずみの放射線測定器を使った独自システムの開発を行うことができます。


ガイガーカウンター

ガンマ線量率 積算線量 CPS値

エネルギー補償タイプのGM管を採用した開発モジュール。低線量から高い線量( 10 Sv/h ) までの幅広い測定範囲をカバー。詳細 »

CsI シンチレーション

ガンマ線量率 CPS値 スペクトル測定

感度 18,000 cpm/uSv/h の大型シンチレーション検出器を搭載したスペクトル測定モジュール。移動測定、低線量での汚染調査向けの開発モジュール。詳細 »

中性子線検出器

中性子線量率 積算線量 CPS値 流束密度 積算の流束密度

低速の熱中性子線から 14 MeV までの中性子線までの幅広い測定範囲をもつ大型中性子線モジュールです。線量率・積算線量の測定が可能。詳細 »

中性子線検出器

中性子線量率 積算線量 CPS値 流束密度 積算の流束密度

低速の熱中性子線から 14 MeV までの中性子線までの幅広い測定範囲をもつ大型中性子線モジュールです。線量率・積算線量の測定が可能。詳細 »

中性子線の流束密度
Arduinoで放射線測定

Arduino で放射線測定

Polimaster の放射線モジュール BDG シリーズと Arduino を接続するところまでをご紹介。

放射線測定器からの測定データが取得できれば、無線で送信や、SDカードへ蓄積するなど、目的の用途に応用できます。

Arduinoで放射線測定

たろうまるの安心サポート体制

高性能な放射線測定器を、ずっと安心してお使いいただくために、最高のサービスを提供したいと考えています。
いつでもご遠慮なくお問い合わせください。

校正と点検

たろうまるは、正規販売店です。

測定器の販売、点検・校正、技術サポートまで、メーカーの技術者から教育を受けたスタッフが対応しております。 購入頂いた線量計、放射線測定器、サーベイメーター、食品用放射線測定器は たろうまるを経由して、メーカーでの修理、点検、校正を行うことができます。

安心の修理体制

メーカー保証期間、保証後も、修理は承っております。

修理品の送料につきまして、
弊社側からの発送の場合は弊社負担、お客様側からの発送については、お客様のご負担となります。あらかじめご了承ください。

サポート

すべての製品は、10年間以上利用されることを想定した耐久性のある設計です。 お求めいただく測定器は、長い期間お使いいただく製品になります。

たろうまるでは、お客様が製品を使用している間ずっとサポートを行っていく体制をとっております。 使い方、修理、校正、点検など、あらゆる場面において技術スタッフが、いつでも対応しております。

開発者のための放射線測定器モジュール BDG3 仕様

  • 製品の分類

    スペクトル・サーベイメーター
  • サイズと重さ

    高さ :133 mm
    直径 :40 mm
    重さ :160グラム POLIMASTER PM1403-BDG3
  • 検出器

    CsI シンチレーション検出器
  • CsIサイズ

    12 cm3
  • 線量率の測定

    0.01 μSv/h ~ 40 μSv/h
  • 線量率の誤差

    ±25%
  • カウントの測定

    1 ~ 9999 cps
  • スペクトル測定

    1,024チャンネル
  • エネルギー解像度

    8.5% ( Cs137 )
  • 感度

    18,000 cpm/(μSv/h)
  • エネルギー範囲

    0.05 ~ 3 MeV
  • エネルギー応答

    Cs-137比 ±30%
  • 校正

  • 電圧

    RS485 接続の場合 4.6~5.5V に対応
  • 消費電流(5V)

    • 音アラームOFF時

    線量率
    [uSv/h]
    消費電流
    [mA]
    背景放射線 6.9 mA
    1 μSv/h 7.0 mA
    10 μSv/h 7.3 mA
    30 μSv/h 9.0 mA
  • 付属

    USBケーブル
  • アラーム

    LEDライト
  • 防水・防塵

  • 動作環境

    • 温度 :-20度 ~ +50度
    • 湿度 :95% 以下, 35度
    • 気圧 :84~106.7 kPa
  • 保証

    • メーカー保証1年
    • 初期動作保証
  • ダウンロード

  • 開発サンプルコード

    • Linux - C言語等
    • Windows - .NET Visual Basic
    • Windows - .NET C#
    • Android - Java
  • Windows 対応

    Windows 10, 11
    Windows 10対応
  • 国際規格

    • Rohs