ESP32 でガイガーカウンタの出力を読み取って,Fluentd でロギングする方法を紹介します.
はじめに
今回は,UART で放射線量を出力するセンサーと ESP32 を組み合わせます.ESP32 の UART を活用する実例はあまり無い気がするので,その参考になれば幸いです.
必要な部品
必要な部品はこんな感じ.
eBay で入手するもの
- Geiger Counter DIY Kit ver.2.00
- 
 
 ガイガーカウンターのキットです.ガイガーミュラー管は付属していません.
 
ヤフオク で入手するもの
- LND 712
- 
 
 LND 社の高性能定番ガイガーミュラー管です.普通に海外で買うとかなり高いですが,ヤフオクで常に流している方がいるので,そこから入手するのがオススメです.
 
秋月電子 で入手するもの
- NJU7223F33
- 
 
 3.3V 生成用の電源です.ガイガーカウンタは 5V 動作なのに対して ESP32 は 3.3V 動作なので,5V から 3.3V を生成するのに使います.
 
- 電源用マイクロ USB コネクタ DIP 化キット
- 
 
 USB ケーブルから 5V の供給を受ける用です.別にこれを使わなくても OK です.昨今はマイクロ USB ケーブルや,USB アダプタはどこにでも余ってたりすると思うので,割と便利です.参考まで. 
 
MonotaRO で入手するもの
- 極低頭六角穴付ボルト(SCM435/黒色酸化皮膜)全ねじ
- 
 
 パネルをケースに固定するためのネジです.普通のネジでも OK ですが,これを使うと見た目が良いのでおすすめです.
 
回路
結線は普通に接続するだけです.特に工夫する点はありません.
留意点が2つあります.
- スピーカ
- 今回使用する基板はガイガーミュラー管の出力を音にして出力する機能を持っていますが,なかなか沢が紙です.常時設置する場合は Geiger Counter DIY Kit のスピーカの配線をカットしておくと良いかもしれません.
- 絶縁
- 
ガイガーミュラー管には 600V 近く印可しますので,最初から基板の裏側を絶縁しておくと安心です.
私の場合,作業していて手にしびれを感じたので,それ以降は下図のように電気用RTVゴムを基板裏に塗って絶縁してから作業しました.使い切れなくても保存できるので,手元に1本あると何かと便利です. 
ソフト
Geiger Counter DIY Kit は 10 秒毎に計測した CPM 値を出力するので,これを読み取って Fluentd に投げます.
ソフト全体は,github に上げてありますので,ここではポイントとなる部分のみ抜粋します.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | static void uart_read_task() {     uint8_t buf[GEIGER_UART_BUF_SIZE];     uart_config_t uart_config = {         .baud_rate = 9600,         .data_bits = UART_DATA_8_BITS,         .parity = UART_PARITY_DISABLE,         .stop_bits = UART_STOP_BITS_1,         .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,     };     uart_param_config(GEIGER_UART_NUM, &uart_config);     uart_set_pin(GEIGER_UART_NUM, GEIGER_UART_TXD, GEIGER_UART_RXD,                  UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);     uart_driver_install(GEIGER_UART_NUM, GEIGER_UART_BUF_SIZE*2, 0, 0, NULL, 0);     while (1) {         memset(buf, 0, GEIGER_UART_BUF_SIZE);         int len = uart_read_bytes(GEIGER_UART_NUM, buf, GEIGER_UART_BUF_SIZE,                                   10/portTICK_RATE_MS);         if (len > 0) {             if (sense_num == ARRAY_SIZEOF(sense_data)) {                 continue;             }             sense_data[sense_num++] = (uint16_t)atoi((char *)buf);             if (sense_num == ARRAY_SIZEOF(sense_data)) {                 xSemaphoreGive(sense_done);             }         }     } } | 
UART_HW_FLOWCTRL_DISABLE でフロー制御を無効かしておき,uart_set_pin の引数でも使わないピンは UART_PIN_NO_CHANGE を指定しておきます.
あとは,uart_read_bytes で定期的に読み出して処理します.
UART 通信処理以外は別タスクに切り出したかったので,セマフォを使ってタスク間で待ち合わせを行いようにしています.
完成
ケースに納めれば完成です.
Fluentd で集めたデータを Grafana でグラフ化するとこんな感じになります.
 
  
  
  
  






コメント