Arduino UNO と Polimaster 測定器を接続

Arduino で放射線測定

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

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

Arduino

Arduinoで放射線測定

Arduino は、ハードウェアの詳しい知識がなくても使えるお手軽マイコンボードです。

Arduino で利用するプログラムは、スケッチと呼ばれるプログラム言語、といっても実際は単なるC言語です。わずか数10行ぐらいのプログラムを組むだけで、ハードウェアを制御してあらゆるものを作ることができます。

Arduino は、Bluetooth, Xbeeなどの無線モジュール、温度センサー、GPS、気圧計、速度計など、必要なセンサーも別売りされており、簡単に接続できるようになっています。

今回は、放射線測定器とArduino UNO を接続してみました。

この方法で接続できる放射線測定器は、Polimaster BDG2ガイガーカウンターモジュール、BDG3 CsIシンチレーションモジュール、BDN中性子線検出モジュール、BDG1 NaIシンチレーションモジュールです。

API通信 RS485, RS232C, USB放射線測定器 API通信 RS485, RS232C, USB放射線測定器

使ったもの

今回使ったハードウェア等は、こちらです。

型番 解説
Arduino UNO ハードウェアとして備えられているシリアル接続は、1つ。今回、2つ使いたいので、もう一つは、ソフトウェアでエミュレートした SoftwareSerial を使います。Arduino UNO は、参考書や、ネットの情報も多いので、使いやすいかと思います。
BOB-10124 UART-RS485モジュールです。RTSピンを High (3.3V)にすると、送信モード。Low(0V)にすると受信モードになります。このRTSピンを、Arduino のデジタル3番ピンで制御します。
DEV-09873 シリアル-USB変換器です。FTDIのチップが使われており、Windows で間違いなく使えるUSBチップです。今回使うのは、GND, TXI, RXO の3つだけ。これでArduino から放射線の測定情報を受信します。
Polimaster BDG3 CsI 超高感度・放射線測定モジュールです。線量率測定、スペクトル測定ができます。

シリアル接続

シリアル接続は、送信(TX) と受信(RX) の2本の接続を使って、情報を 0,1.... といった電圧のHigh, Low で送受信する単純な方式です。いつもパソコンのマウスやキーボードで使っているUSBも、シリアル接続です。

今回の接続の流れですが、Arduino UNO 、放射線測定器、パソコンの3つを、それぞれシリアル接続します。

Arduino と放射線測定器

最初にArduino UNO から、放射線測定器に向けて、「測定結果をください」という命令を送信します。

放射線測定器は、即座に線量率(μSv/h)、カウント率(cps)、積算線量(μSv)、スペクトル(1024チャネル)、測定誤差(%)のデータを、Arduino に回答します。Arduino はそれを受信して、同じ情報をそのままWindows パソコン側に送信します。Windows パソコンでは、これをモニターに表示する、という流れになっています。

屋外での放射線モニターを行うようなシステムを、これで組むことができます。その場合には、パソコンは最終的に不要になります。代わりに、測定結果は、Bluetooth や、2.4GHz 帯の Xbee 無線モジュール等を使って1km 離れた場所に送信して記録するといったシステムへ拡張していくことができます。

Arduino には、様々な接続モジュールが売られていますので、考えているものは、たいていのものは作ることができるでしょう。

Arduino とXbee

RS485接続もシリアル接続のひとつ

USBがシリアル接続ということをご紹介しましたが、シリアル接続には、いくつもの規格があります。

たとえば、RS232, RS485, USB, UART, ..... とたくさんあります。どれも情報を 0,1.... といった電圧のHigh, Low で送受信する単純な方式という点では同じです。規格の違いは、たとえば、USBだったらケーブルの最大長は5m までだったり、RS485 であれば、1200m までの長さで通信できたりと、通信速度の違いなどが規格の違いになっています。

Polimaster の放射線測定器は、USB接続と、RS485 接続の2つのシリアル通信を備えています。

USB接続は、パソコンと放射線測定器を直接つなぐ場合に便利です。RS485 接続は、ケーブルの最大長が 1200m まで延長できますので、大きな建物の中を監視する場合に利用できそうです。

今回、Arduino のシリアル通信をRS485 に変換するボード(Sparkfun BOB-10124)を経由して、放射線測定器と接続しました。

BOB-10124には、送受信制御のRTSピンがあります。送信するときには、RTSを High (3.3V) にして、受信するときには、RTS を Low ( 0 V ) にする必要があります。

RS485 という通信規格は、送信と受信を同時にできず、一方通行の通信方式であるため、送信が終わったら、受信する、といった切り替えが必要です。これを、RTSピンで切り替えています。

Polimasterの測定器の接続ピン

Arduino と放射線測定器の接続

ボードを買ってきて、つなぐだけなので、簡単です。

Ardino UNO には、ボード自体のハードウェアとして備えられているシリアル接続は、受信0番、送信1番ピンの1セットしかありません。この接続は、放射線測定器に利用します。

Arduino UNO の1つしかないシリアル接続(0,1番のピン)を使ってしまったので、測定結果をパソコンに送るためのシリアル接続が不足する事しますが、Arduino には、ソフトウェア的に、シリアル接続を作り出すSoftwareSerial という機能があります。これを使って、受信11番、送信12番ピンのセットを2つめのシリアル接続として使います。

放射線測定器をArduino と接続

ブレッドボードで接続 Arduino

Arduino スケッチを書く

Arduino のプログラムは、スケッチと呼ばれるC言語です。Windows パソコンで動作する Arduino 専用のスケッチ開発環境 Arduino IDEを使って、プログラムを書いて、それを Arduino へUSB経由で転送します。

使い方は、簡単ですね。

プログラムを書いて、コンパイル。転送ボタンを押すだけで、Arduino にプログラムが書き込まれて、その通りに動いてくれます。測定結果は、パソコンに出てきますので、うまく受信できたか、マイコン内部の動作をパソコンの画面で確認していくことができます。

Arduinoの使い方

Arduino IDE 放射線の測定

Polimaster の放射線測定器スケッチ

こちらのプログラムは、Polimaster の放射線測定器に利用できます。


対応測定器


// for Arduino UNO

#include <SoftwareSerial.h>

#define PIN_RTS 3 // 3番ピンを UART-RS485変換器のRTS(送受信制御) に使う
#define BUFFER 30 // 受信のためのバッファーサイズ

SoftwareSerial mySerial(11, 12); // SoftwareSerial の利用(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;

  // 4 byte の数値を float に変換
  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; // 線量率の測定値

  // 測定結果をパソコンに表示(uSv/h)
  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=Highにして書き込みモードに切り替え後、少し待つ
    delayMicroseconds(120);
    for(i=0;i<5;i++){
      Serial.write(cmd[i]);
    }
    // 測定データ要求コマンドを送信後、しばらく待つ
    delayMicroseconds(400);
    digitalWrite(PIN_RTS, LOW);
    // RTS=Lowにして読み込みモードに切り替え後、少し待つ
    delay(15);

// データの受信
    i=0;
    for(i=0;i<BUFFER;i++){
      txbuf[i]=Serial.read() ;
    }
    printbyte(txbuf,BUFFER);
    print_der(txbuf);

    // 1秒待ってから、再度、測定する
    delay(1000);

}


測定器の種類によっては、少し変更が必要になります。上記のプログラムは、BDG3でうまく動きます。

  • 測定値の要求コマンド cmd[5] は、測定器の購入後に提供しております。
  • スケッチ中で、delay(15); や、 delayMicroseconds(120); で待ち時間を入れてありますが、これは利用する RS485変換器によって異なります。今回利用したRS485 に変換するボード(Sparkfun BOB-10124)は、RTSを手動で High/Low と制御する必要がありました。そのため、待ち時間をいろいろ変えてみて、受信できるところを探った結果、このスケッチになりました。

その他の RS485 変換器

いろいろな UART - RS485 変換器が売られています。

一応、すべて試してみましたが、スケッチを少し変更すれば、どれでも大丈夫です。

よく使われるRS485変換器には、Max485チップが使われているものもあります。たとえば、Linksprite のRS485 Shield V2などでは、送受信の制御が自動化されています。送信データが来れば、自動的に送信モードになってくれます。Max485 チップを使った製品であれば、RTS制御のピンは、必要ないことになります。便利ですが、わずかに消費電流が多くなるようです。

こちらも見つけました。ノーブランドですが、Max485チップ搭載です。回路図を見ると、より詳しい制御ができるようになっていて、送信も受信もしないときに低消費電力モードに切り替え可能です。

Arduino RS485のシールド

Arduino RS485変換器

TeraTerm

Arduino などのシリアル通信になっている情報をパソコンの画面に表示する場合にお世話になるのが、TeraTerm です。

今回の回路では、このような接続で、Ardiuno が取得した放射線の測定値をパソコンに転送しています。この接続でパソコン側では、シリアル接続がデバイスマネージャー上で、COM として見えます。

Teratermで、COM番号を接続先に選んで、ボーレートを9600にすれば、Ardiuno からの通信を受信できます。ボーレートを9600にしたのは、スケッチ(プログラム)の中で、 mySerial.begin(9600); としたためです。ソフトウェアシリアルでは、38400ぐらいが最大のボーレートになります。

Arduinoとシリアル通信

COM番号は、COM1, COM2, COM3... といくつもあります。

どの番号が Ardiuno を接続した番号かは、Windows のデバイスマネジャーを見ながら、USBケーブルを抜いたり、接続したりをすれば、分かります。

ArduinoとTeratermの設定

測定結果

Windows 10 上で起動した TeraTerm で測定値を受信できました。

めでたし、めでたし、、。次は、無線化してみます。

Arduino で放射線測定

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

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


ガイガーカウンター

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

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

CsI シンチレーション

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

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

中性子線検出器

中性子線量率 積算線量 CPS値

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