arduinoから温度センサー情報で12Vファンを制御する
最近、3Dプリンタにかまけてarduino関係全然なのです。
ネタに出来そうな感じの回路があったので、組み合わせてちょっとばかり実験して見る事にしたいと思います。
実際のところは、注文していたMOSFETが来ないのでDualExtruderへの換装が途中で止まっています。
内容的には単純で、「温度センサの入力をアナログピンで受け取って計算した温度を元にPWMでファンをコントロールする」です。(ファンの駆動にはarduinoからの電源供給では間に合いませんので外付けでMOSFETの回路を作って12Vを供給しています。)
この回路が3Dプリンタで使うために作ったものの流用なのですけれどもね…。
せっかくなので回転数も見れるようにした方がいいのだろうかと思いちょっと改良してみます。
ちょっと調べると、回転数は1回転につき2パルスで出力されているようですので簡単な計算で求められそうです。
★回路図
簡単に考えていたのですが、作ってみたところ問題が発覚しました。
PWMでファン回転数を制御すると、回転信号にPWM信号が混入するのです…。(正確には電源をPWM制御しているのでその信号が重畳する)※:3Pinのファンの場合にはNGです、4Pinならば大丈夫だと思います。
そうなってしまうと正確な回転数が表示されません…。
対策を考えているのですがなかなかいい案が浮かばず、とりあえずの状態で情報をアップします。(うまくいったら情報更新します)
▲DC入力の場合のSENS出力波形
▲PWM変調した場合のSENS出力波形
★コード
#define INTERVAL 3 // 更新間隔(s) #define CHECKMS 60 // データ取得間隔(ms) #define MIN_TEMP 25 // 最低温度 #define MAX_TEMP 35 // 最大温度 #define MIN_FAN 75 // 最大RPM #define MAX_FAN 255 // 最大RPM int tempPin = 0; // TempSencer int fanPin = 6; // FAN(PWM) int t_data = 0; // input data from ADC int t_sum = 0; // summary of input data int sum_count; // summary counter unsigned long lastPulseTime = 0; // RPM unsigned long pulseInterval = 0; // RPM unsigned long lastUpdateTime; // RPM int disp_interval = INTERVAL*1000/CHECKMS; void setup() { analogReference(INTERNAL); //use internal 1.1v reference attachInterrupt(0, senseRotation, FALLING); // 0 = D2, 1 = D3 Serial.begin(19200); Serial.println("Init/Start"); } void loop() { uint16_t rpm; unsigned long cur = millis(); // pre counter if((cur - lastUpdateTime) > CHECKMS){ rpm = 60000000 / (pulseInterval * 2); // RPM calculate lastUpdateTime = cur; t_data = analogRead(tempPin); // Read temperature t_sum = t_sum + t_data; // Integrated temperature sum_count++; // The number of acquisitions } // disp interval if(sum_count >= disp_interval){ // Temperature double t_value = (double)(t_sum) / disp_interval * 1.1 / 1024.0 * 100.0; // Temperature calculate Serial.print("Temperature:"); Serial.print(t_value); t_sum = 0; sum_count = 0; // FAN-PWM int pwm_val = map(t_value*100, MIN_TEMP*100, MAX_TEMP*100, MIN_FAN, MAX_FAN); // FAN-PWM calculate analogWrite(fanPin, pwm_val); // Set FAN Speed Serial.print(" RPM:"); Serial.print(rpm); Serial.print("("); Serial.print(pwm_val); Serial.println(")"); } } void senseRotation(void) { unsigned long cur = micros(); unsigned long dif = cur - lastPulseTime; // Difference pulseInterval = (pulseInterval - (pulseInterval >> 2)) + (dif >> 2); lastPulseTime = cur; }
今回はWordPressプラグイン「SyntaxHighlighter Evolved」を使ってソースコードを表示してみました。
実験中風景
■参考資料
Cooling Fan MOSFET Driver by Danjhamer – Thingiverse
コメントはまだありません。