2018年11月25日

ガスガン内蔵ヒーター制御装置を作る その4

ヒーター制御装置の実装をします。

ガスガン内蔵ヒーター制御装置を作る その4
ガスガン内蔵ヒーター制御装置を作る その4

マイコンボードは更に小型のものを使います。

Digisparkというマイコンボードの互換機で
マイコンの仕様についてはこちら

このマイコンを使うときは、こちらの手順にしたがって開発環境を インストールする必要があります。
ただ、不具合があるようなのでインストールパッケージ定義をこちらのものに変更してください。

プログラムは入出力関係を少し変更する必要があります。

//ヒーター制御プログラムテスト(Digispark用)
//入出力ピンの名称変更
#define HEATER 0          //ヒーター制御出力
#define Temp_Input A1    //サーミスタ入力
#define Val_Input A2     //電圧測定入力
#define LED 1            //マイコンLED

//定数の宣言
const int V_R1 = 1000;     //電圧測定VIN側抵抗値(Ω)
const int V_R2 = 1000;     //電圧測定GND側抵抗値(Ω)
const int B = 4100;       //サーミスタB定数
const long T_R1 = 10000;   //サーミスタ基準抵抗値[Ω]
const long T_R2 = 10000;    //サーミスタバランス抵抗[Ω]
const int T0 = 298;       //サーミスタ基準温度[K]
const int Limit_Val = 740;    //測定電圧下限値[V×100]
const int Limit_L_Temp = -200,Limit_H_Temp = 400;  //正常温度閾値[℃×10]
const int L_Temp = 280;  //温度下限値[℃×10]
const int H_Temp = 300;  //温度上限値[℃×10]
//変数の宣言
float Vcc = 0;            //基準電圧[V]
int Val = 0;              //測定電圧[V×100]
int Temp = 0;             //測定温度[℃×10]

void setup () {
  //入出力ピンの設定
  pinMode(HEATER, OUTPUT);
  pinMode(LED, OUTPUT);
}

void loop () {
  Vcc = cpuVcc();                                //基準電圧の取得
  Temp = GetTemp(analogRead(Temp_Input));        //温度の取得
  Val = GetVal(analogRead(Val_Input));           //電圧を取得

  while (Temp > Limit_H_Temp || Temp < Limit_L_Temp){   //測定温度が正常な範囲内から外れると
    digitalWrite(HEATER, LOW);                          //ヒーターをオフにし、マイコンLEDが短い間隔で点滅する
    digitalWrite(LED, HIGH);
    delay(100);
    digitalWrite(LED, LOW);
    delay(100);
  }
  while (Val < Limit_Val) {                      //測定電圧が下限値を下回るとヒーターをオフにし、
    digitalWrite(HEATER, LOW);                   //マイコンLEDが長い間隔で点滅する
    digitalWrite(LED, HIGH);
    delay(100);
    digitalWrite(LED, LOW);
    delay(1000);
  }
  
  if (Temp <= L_Temp) {                         //測定温度が下限値以下になると
    digitalWrite(HEATER, HIGH);                 //ヒーターをオンにする
  }
  
  if (Temp >= H_Temp) {                         //測定温度が上限値以上になると
    digitalWrite(HEATER, LOW);                  //ヒーターをオフにする
  }
  delay(100);                                    //0.1s待つ
}
//センサーの値から温度を計算
float GetTemp (int raw) {
  float V_R2 ;
  float R ;
  float t;

  V_R2 = raw * Vcc / 1.024;                                         //バランス抵抗の消費電圧を算出
  R = Vcc * 1000.0 / V_R2 * T_R2 - T_R2;                            //サーミスタの抵抗値を算出
  t = (1000 / (1 / (0.001 * T0) + log(R / T_R1) * 1000 / B) - 273); //温度の計算
  return (int)(t * 10.0);                                           //10倍にして整数にする
}
//センサーの値から電圧を計算
int GetVal(int A) {
  float V;
  V = A * Vcc / 1024.0 / V_R2 * (V_R1 + V_R2);                      //電圧の計算
  return (int)(V * 100.0);                                //100倍して整数にする
}

float cpuVcc() {                     // 電源電圧(AVCC)測定関数
  long sum = 0;
  adcSetup(0x0C);                    // Vref=Vcc, input=internal1.1V
  for (int n = 0; n < 10; n++) {
    sum = sum + adc();               // adcの値を読んで積分
  }
  return (1.1 * 10240.0) / sum;      // 電圧を計算して戻り値にする
}

void adcSetup(byte data) {           // ADコンバーターの設定
  ADMUX = data;                      // ADC Multiplexer Select Reg.
  ADCSRA |= ( 1 << ADEN);            // ADC イネーブル
  ADCSRA |= 0x07;                    // AD変換クロック CK/128
  delayMicroseconds (500);             // 安定するまで待つ
}

unsigned int adc() {                 // ADCの値を読む
  unsigned int dL, dH;
  ADCSRA |= ( 1 << ADSC);            // AD変換開始
  while (ADCSRA & ( 1 << ADSC) ) {   // 変換完了待ち
  }
  dL = ADCL;                         // LSB側読み出し
  dH = ADCH;                         // MSB側
  return dL | (dH << 8);             // 10ビットに合成した値を返す
}

ガスガン内蔵ヒーター制御装置を作る その4
ガスガン内蔵ヒーター制御装置を作る その4

アナログ入力に干渉するため、
マイコンボードについているツェナーダイオードを取り外しています。

ガスガン内蔵ヒーター制御装置を作る その4

前回試した回路に取り付けて問題ないか確認しました。

ガスガン内蔵ヒーター制御装置を作る その4

実装する回路図はこちら。
ヒューズと電源スイッチ、プログラムを書き込むときに回路を切り離すスイッチを追加しました。

ガスガン内蔵ヒーター制御装置を作る その4
ガスガン内蔵ヒーター制御装置を作る その4
ガスガン内蔵ヒーター制御装置を作る その4

これをケースの中に入れて完成です。

最終的なプログラムはこちら。

//ヒーター制御プログラムVer.1.00(Digispark用)
//入出力ピンの名称変更=================================================================
#define HEATER 0          //ヒーター制御出力
#define Temp_Input A1    //サーミスタ入力
#define Val_Input A2     //電圧測定入力
#define LED 1            //マイコンLED
//定数の宣言===========================================================================
const int V_R1 = 1000;     //電圧測定VIN側抵抗値(Ω)
const int V_R2 = 1000;     //電圧測定GND側抵抗値(Ω)
const int B = 4100;       //サーミスタB定数
const long T_R1 = 10000;   //サーミスタ基準抵抗値[Ω]
const long T_R2 = 10000;    //サーミスタバランス抵抗[Ω]
const int T0 = 298;       //サーミスタ基準温度[K]
const int Limit_Val_S = 740;    //待機時電圧下限値[V×100]
const int Limit_Val_M = 730;    //稼働時電圧下限値[V×100]
const int Limit_L_Temp = -200,Limit_H_Temp = 400;  //正常温度閾値[℃×10]
const int L_Temp = 280;  //温度下限値[℃×10]
const int H_Temp = 300;  //温度上限値[℃×10]
//変数の宣言===========================================================================
float Vcc = 0;            //基準電圧[V]
int Val = 0;              //測定電圧[V×100]
int Temp = 0;             //測定温度[℃×10]
bool Battry_Low = false;  //オートカット用変数
bool Heater_sw = LOW;     //ヒータースイッチ
//セットアップ=========================================================================
void setup () {
//入出力ピンの設定=====================================================================
  pinMode(HEATER, OUTPUT);
  pinMode(LED, OUTPUT);
//起動処理============================================================================
  digitalWrite(HEATER, LOW);
  digitalWrite(LED, LOW);
}
//メインプログラム=====================================================================
void loop () {
//各センサーの数値を取得===============================================================
  Vcc = cpuVcc();                            //基準電圧の取得
  Temp = GetTemp(analogRead(Temp_Input));    //温度の取得
  Val = GetVal(analogRead(Val_Input));       //電圧を取得
//温度異常セーフティ処理===============================================================
  while (Temp > Limit_H_Temp || Temp < Limit_L_Temp){   //測定温度が正常な範囲内から外れると
    digitalWrite(HEATER, LOW);                          //ヒーターをオフにし、マイコンLEDが短い間隔で点滅する
    digitalWrite(LED, HIGH);
    delay(100);
    digitalWrite(LED, LOW);
    delay(100);
  }
//オートカット判定=====================================================================
  switch(Heater_sw == HIGH){
    case true:
      if (Val < Limit_Val_M){          //ヒーターがオンの時、稼働時下限値以下の時、
        Battry_Low = true;             //変数Battry_Lowをtrueにする
      }
      break;
    default:
      if (Val < Limit_Val_S){            //ヒーターがオフの時、待機時下限値以下の時、
        Battry_Low = true;             //変数Battry_Lowをtrueにする
      }
  }
//オートカット処理=====================================================================
  while (Battry_Low == true){         //変数Battry_Lowをtrueの時、ヒーターをオフにし、
    digitalWrite(HEATER, LOW);         //マイコンLEDが長い間隔で点滅する
    digitalWrite(LED, HIGH);
    delay(100);
    digitalWrite(LED, LOW);
    delay(1000);
  }
//ヒーター制御処理=====================================================================
  if (Temp <= L_Temp) {               //測定温度が下限値以下になると
    Heater_sw = HIGH;                 //ヒーターをオンにする
  }
  
  if (Temp >= H_Temp) {               //測定温度が上限値以上になると
    Heater_sw = LOW;                  //ヒーターをオフにする
  }
  digitalWrite(HEATER,Heater_sw);
  delay(100);                         //0.1s待つ
}
//センサーの値から温度を計算===========================================================
float GetTemp (int raw) {
  float V_R2 ;
  float R ;
  float t;

  V_R2 = raw * Vcc / 1.024;                                         //バランス抵抗の消費電圧を算出
  R = Vcc * 1000.0 / V_R2 * T_R2 - T_R2;                            //サーミスタの抵抗値を算出
  t = (1000 / (1 / (0.001 * T0) + log(R / T_R1) * 1000 / B) - 273); //温度の計算
  return (int)(t * 10.0);                                           //10倍にして整数にする
}
//センサーの値から電圧を計算===========================================================
int GetVal(int A) {
  float V;
  V = A * Vcc / 1024.00 / V_R2 * (V_R1 + V_R2);            //電圧の計算
  return (int)(V * 100.0);                                //100倍して整数にする
}
//電源電圧(AVCC)測定関数===============================================================
float cpuVcc() {
  long sum = 0;
  adcSetup(0x0C);                    // Vref=Vcc, input=internal1.1V
  for (int n = 0; n < 10; n++) {
    sum = sum + adc();               // adcの値を読んで積分
  }
  return (1.1 * 10240.0) / sum;      // 電圧を計算して戻り値にする
}
//ADコンバーターの設定===================================================
void adcSetup(byte data) {           
  ADMUX = data;                      // ADC Multiplexer Select Reg.
  ADCSRA |= ( 1 << ADEN);            // ADC イネーブル
  ADCSRA |= 0x07;                    // AD変換クロック CK/128
  delayMicroseconds (500);          // 安定するまで待つ
}
//ADCの値を読む==========================================================
unsigned int adc() {
  unsigned int dL, dH;
  ADCSRA |= ( 1 << ADSC);            // AD変換開始
  while (ADCSRA & ( 1 << ADSC) ) {   // 変換完了待ち
  }
  dL = ADCL;                         // LSB側読み出し
  dH = ADCH;                         // MSB側
  return dL | (dH << 8);             // 10ビットに合成した値を返す
}

稼働時間を少しでも延ばすため、
ヒーター稼動時と待機時で電圧下限値を変えてあります。

ガスガン内蔵ヒーター制御装置を作る その4

使うときはベルトに取り付けたラジオポーチに入れて使います。



同じカテゴリー(エアガン)の記事画像
クエーサ ジェルブラスターのエアガン化(改造編その1)
クエーサ ジェルブラスターのエアガン化(検証編)
M14カービンカスタム
側面吸気ピストンヘッドの自作
ARES SOC SLR 分解
ARES SOC SLR(中古品)
同じカテゴリー(エアガン)の記事
 クエーサ ジェルブラスターのエアガン化(改造編その1) (2023-02-01 23:33)
 クエーサ ジェルブラスターのエアガン化(検証編) (2022-12-30 22:33)
 M14カービンカスタム (2022-06-26 20:51)
 側面吸気ピストンヘッドの自作 (2022-06-22 00:10)
 ARES SOC SLR 分解 (2019-06-14 23:54)
 ARES SOC SLR(中古品) (2019-06-11 22:26)
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。