知的好奇心 for IoT

IoT関連の知的好奇心を探求するブログです

400V昇圧回路を自作してガイガーカウンターを1電源で動くように改良した

「昔作ったガイガーカウンターをESP8266とBlynkでIoT化する」でIoT化できたのですが、ガイガーミュラー管を動作させるための400V昇圧回路に写ルンです改造基板を使っていたことから、電源が2つ必要になっていました。

何とかできないものかとずっと思っていて、時々グーグル先生に相談していたら、ある日「昇圧チョッパ」という回路を見つけました。

Wikiによると、昇圧チョッパとは電流のON-OFFを繰り返すことによって発生するスパイク電流を用いて、入力電圧より上げる制御のことだそうです。

昇圧チョッパの回路図を調べると、スイッチング用MOSFETの制御にPWMコントローラーを使っているものが多かったのですが、ESP8266もPWM出力ができるのでESP8266でやってみることにしました。(これが後に2週間ほど完成を遅らせる遠因となります...)

f:id:IntellectualCuriosity:20171209113437j:plain
IoTガイガーカウンターV2

 

f:id:IntellectualCuriosity:20171209113529p:plain
自作回路と写ルンです改造基板の電圧比較

 

f:id:IntellectualCuriosity:20171209120542p:plain
Blynk側も1秒間のカウントを表示するように刷新

 


デモンストレーションビデオ

 

改良用部品

昇圧チョッパ回路

電源周り

 

回路図 ※2017/12/21更新

f:id:IntellectualCuriosity:20171221152950p:plain

昇圧チョッパ回路に使用した部品は、それぞれ数種類入手して1週間ぐらい実験した結果選んだものです。 しかし、昇圧チョッパ単体では400V出るのに、以前から使用していた3.3Vのレギュレーターを使って1電源にした実回路にすると電圧が100V以上下がる現象が発生しました。

この原因がさっぱりわからず2週間ぐらい費やした後、どうもESP8266ボード(回路図ではWeMos D1 mini)の3.3V入力ではなく5V入力を使うと電圧が下がらないということがわかり、レギュレーターを3.3Vから5Vのものに変更しました。

 

Blynk設定

新たに追加した1秒間のカウントレベル(Level H)と通知制御用ボタン(Button)の設定。

f:id:IntellectualCuriosity:20171209191031p:plain

1分間のカウント数(Value Deisplay)と1時間平均カウント数(Value Display)の設定。

f:id:IntellectualCuriosity:20171209191546p:plain

グラフ(SuperChart)と通知(Notification)の設定。

f:id:IntellectualCuriosity:20171209191325p:plain

 

スケッチ 

PWM出力はセットアップで次のように設定しています。周波数が840Hzでデューティ比を80%にすると、上記の回路で約400Vを出力することができました。

analogWriteFreq(840);
analogWriteRange(100);
analogWrite(PWM_PIN, 80);

1秒間のカウントも表示させるようにしたため、sendSecDataというファンクションと対応するtimer.setIntervalを追加しています。また、画面にボタンを用意して通知をON/OFFできるようにしました。

※2017/12/13ソースコード修正

※2020年1月19日追加 ボードマネージャーでインストールするESP8266のバージョンを2.5.xにすると割込みが動かないみたいです。バージョンを2.4.2にすると正常に動作するようになります。

/*
 * Geiger Counter V2
 * December 13, 2017
 * By Hiroyuki ITO
 * http://intellectualcuriosity.hatenablog.com/ 
 * MIT Licensed.
 */
#define BLYNK_PRINT Serial

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#define WIFI_SSID        "YourNetworkName"
#define WIFI_PASS        "YourPassword"
#define BLYNK_AUTH       "YourAuthToken"
#define NOTIFY_LIMIT     10 // 10 spm
#define NOTIFY_TEXT      "WARNINIG! The device detected more than 10 spm."
#define SIGNAL_PIN       12 // WeMos D1 mini D6 Pin
#define PWM_PIN          14 // WeMos D1 mini D5 Pin

/*
 * Global Variable
 */
volatile int sec_count;
volatile int min_count;
volatile int hour_count;
int times;
int notification_status;

BlynkTimer timer;

/*
 * Interrupt Function
 */
void interrupted() {
  sec_count++;
  min_count++;
  hour_count++;
}

/*
 * Receive Data from Blynk at connected 
 */
BLYNK_CONNECTED() {
  Blynk.syncVirtual(V3);
}

/*
 * Send Data to Blynk
 *  min_count
 *  hour_count
 */
void sendMinData() {
  Blynk.virtualWrite(V5, min_count);
  BLYNK_LOG("Minutes: %04d", min_count);
  min_count = 0;
  times++;

  // 1 hour
  if (times > 60-1) {
    Blynk.virtualWrite(V6, hour_count / 60);
    BLYNK_LOG("Hours: %04d", hour_count / 60);
    hour_count = 0;
    times = 0;
  }
}

/*
 * Send Data to Blynk
 *  sec_count
 */
void sendSecData() {
  Blynk.virtualWrite(V4, sec_count);
  BLYNK_LOG("sec count: %04d", sec_count);

  // Push Notification
  if (notification_status == 1 && sec_count > NOTIFY_LIMIT-1) {
    Blynk.notify(NOTIFY_TEXT);
  }

  sec_count = 0;
}

/*
 * Receive Data from Blynk
 */
BLYNK_WRITE(V3)
{
  notification_status = param.asInt();
}

/*
 * Setup
 */
void setup() {
  delay(10);
  Serial.begin(74880);
  BLYNK_LOG2("Reset Reason: ", ESP.getResetReason());
  pinMode(SIGNAL_PIN, INPUT);

  // Make high voltage
  pinMode(PWM_PIN, OUTPUT);
  analogWriteFreq(840);
  analogWriteRange(100);
  analogWrite(PWM_PIN, 80);

  attachInterrupt(SIGNAL_PIN, interrupted, FALLING);

  Blynk.begin(BLYNK_AUTH, WIFI_SSID, WIFI_PASS);
  Blynk.notify(String("Reset Reason: ") + ESP.getResetReason());

  // Setup a function to be called every second
  timer.setInterval(60000L, sendMinData); // 1 min
  timer.setInterval(1000L, sendSecData); // 1 sec

  times = 0;
  sec_count = 0;
  min_count = 0;
  hour_count = 0;
  notification_status = 0;
}

/*
 * Loop
 */
void loop() {
  Blynk.run();
  timer.run();
}

 

温湿度計と一体化 (2017/12/13追加)

ガイガーカウンター用のESP8266のGPIOピンが空いていたので、隣に設置していた温湿度計と一体化させました。

温湿度計用に1個、ガイガーカウンター用に2個、全部で3個設置していたUSB ACアダプタが、9VのACアダプタ1個になりかなりすっきりしました!

f:id:IntellectualCuriosity:20171213191404j:plain

 

おしまい