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 でグラフ化するとこんな感じになります.
コメント