arduinoから温度センサー情報で12Vファンを制御する
最近、3Dプリンタにかまけてarduino関係全然なのです。
ネタに出来そうな感じの回路があったので、組み合わせてちょっとばかり実験して見る事にしたいと思います。
実際のところは、注文していたMOSFETが来ないのでDualExtruderへの換装が途中で止まっています。
内容的には単純で、「温度センサの入力をアナログピンで受け取って計算した温度を元にPWMでファンをコントロールする」です。(ファンの駆動にはarduinoからの電源供給では間に合いませんので外付けでMOSFETの回路を作って12Vを供給しています。)
この回路が3Dプリンタで使うために作ったものの流用なのですけれどもね…。
せっかくなので回転数も見れるようにした方がいいのだろうかと思いちょっと改良してみます。
ちょっと調べると、回転数は1回転につき2パルスで出力されているようですので簡単な計算で求められそうです。
★回路図
簡単に考えていたのですが、作ってみたところ問題が発覚しました。
PWMでファン回転数を制御すると、回転信号にPWM信号が混入するのです…。(正確には電源をPWM制御しているのでその信号が重畳する)※:3Pinのファンの場合にはNGです、4Pinならば大丈夫だと思います。
そうなってしまうと正確な回転数が表示されません…。
対策を考えているのですがなかなかいい案が浮かばず、とりあえずの状態で情報をアップします。(うまくいったら情報更新します)
▲DC入力の場合のSENS出力波形
▲PWM変調した場合のSENS出力波形
★コード
[csharp]
#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;
}
[/csharp]
今回はWordPressプラグイン「SyntaxHighlighter Evolved」を使ってソースコードを表示してみました。
実験中風景
■参考資料
Cooling Fan MOSFET Driver by Danjhamer – Thingiverse
コメントはまだありません。