Lesson 20

🌬️ 自動ファンを作ろう!
温度でスピード自動調整

TMP36温度センサーとDCモーターを組み合わせて、暑くなるほど速く回る自動ファンを作ろう!map()関数で温度をPWMに変換するのがポイントだよ!

⏱ 60分 🤖 Arduino 🌡️ TMP36 ⚙️ L298N
🌬️

今日の目標

🌡️
温度センサーでリアルタイム測定ができる
📐
map()関数で値の範囲を変換できる
⚙️
温度に応じてモーター速度が変わる
🔗
センサーフィードバック制御の基礎を理解する

必要なもの

🔵

Arduino Uno

マイコンボード本体

🌡️

TMP36温度センサー

気温をアナログ電圧で出力

⚙️

L298Nモータードライバー

ENA・IN1・IN2でDCモーターを制御

🌀

DCモーター+プロペラ

扇風機の羽根を回す

🔋

外部電源 6〜12V

モーター用(Arduinoとは別)

🔌

ブレッドボード+ジャンパー線

部品をつなぐ

しくみを学ぼう

🗺️ map()関数 — 値の範囲を変換しよう

このレッスンの核心map() 関数です!温度(℃)をPWM値(0〜255)に変換します。

int pwm = map(temp, 20, 40, 0, 255);
  • 20℃ → PWM 0(停止)
  • 30℃ → PWM 128(約50%)
  • 40℃ → PWM 255(フルスピード)
  • 20℃以下 → 0(停止)※ constrain()で調整

🔗 センサーフィードバック制御

1
計測
TMP36で温度を読む
2
判断
map()でPWM値を計算
3
制御
analogWriteでモーター速度を変える
4
繰り返し
loop()で連続監視

この「計測→判断→制御→繰り返し」のサイクルがフィードバック制御の基本!エアコン・自動車など身の回りの多くの機器に使われているよ!

🛡️ constrain()で安全に値を収める

map()の結果が範囲外になることがあります。constrain()で必ず0〜255に収めましょう。

int pwm = map(temp, 20, 40, 0, 255);
pwm = constrain(pwm, 0, 255);

Arduinoコード

auto_fan.ino
// ── ピン定義 ──
const int TEMP_PIN = A0;   // TMP36センサー
const int ENA      = 3;    // モーター速度(PWMピン)
const int IN1      = 4;    // モーター方向1
const int IN2      = 5;    // モーター方向2

// ── 設定値 ──
const float TEMP_MIN  = 20.0; // この温度以下では停止
const float TEMP_MAX  = 40.0; // この温度でフルスピード

void setup() {
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);

  // モーターの回転方向を正転に設定
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);

  Serial.begin(9600);
  Serial.println("Auto Fan Ready!");
}

void loop() {
  // ── 温度を読んで変換 ──
  int   reading = analogRead(TEMP_PIN);
  float voltage = reading * 5.0 / 1024.0;
  float temp    = (voltage - 0.5) * 100.0;

  // ── 温度→PWMに変換 ──
  int pwm = map(temp, TEMP_MIN, TEMP_MAX, 0, 255);
  pwm = constrain(pwm, 0, 255);

  // ── モーター速度を設定 ──
  if (temp <= TEMP_MIN) {
    // 設定温度以下:停止
    analogWrite(ENA, 0);
    Serial.println("Fan: OFF");
  } else {
    // 設定温度以上:温度に応じたスピード
    analogWrite(ENA, pwm);
    Serial.print("Temp: "); Serial.print(temp, 1);
    Serial.print(" C  PWM: "); Serial.println(pwm);
  }

  delay(500);
}
🗺️
map()の引数
map(値, 入力最小, 入力最大, 出力最小, 出力最大)の順。温度範囲をPWM範囲にスケール変換します。
🛡️
constrain()で安全に
温度が40℃を超えたときmap()は255を超える値を返すことがある。constrain()で必ず範囲内に収める。
🔄
方向は固定、速度だけ変える
IN1=HIGH、IN2=LOWをsetup()で一度だけ設定。速度変更はENA(PWM)だけを変えればOK。
📊
Serial.print()でデバッグ
シリアルモニタに温度とPWM値を出力することで、動作確認がしやすくなります。

配線図

Arduino Uno 5V GND A0 D3 D4 D5 GND TMP36 温度センサー VCC OUT GND L298N モータードライバー ENA IN1 IN2 12V GND 5V out OUT+ OUT− DC モーター 🌀 外部電源 6〜12V 5V/電源 GND A0センサー ENA(PWM) IN1/IN2 モーター出力 外部電源
⚠️ 外部電源について
DCモーターは大きな電流が必要です。必ず外部電源(6〜12V)をL298Nに接続しましょう。Arduinoの5VだけではモーターもArduinoも壊れる危険があります!

チェックリスト

チャレンジクイズ!

🌬️ 自動ファンシミュレーター

温度スライダーを動かして、ファンの自動制御を体験しよう!

⏹ 停止中
25.0 °C
ファン速度 0%
温度
25.0°C
PWM値
0
スピード
0%
℃ 〜 ℃でフル
25.0℃
float temp = 25.0; // 温度(℃)
int pwm = map(temp, 20, 40, 0, 255); // → 64
pwm = constrain(pwm, 0, 255); // → 64
if (temp <= 20) {
  analogWrite(ENA, 0); // OFF
} else {
  analogWrite(ENA, 0); // speed
}

まとめ

🗺️
map()関数
map(値, 入力最小, 入力最大,
出力最小, 出力最大)
🛡️
constrain()で安全に
map()の結果を
必ず範囲内に収める
🔗
フィードバック制御
計測→判断→制御の
ループが基本
🏆
Chapter 4 完了!
アクチュエータ&
表示のマスター!
🏆
次のチャプター
Chapter 5: 総合作品に挑戦!
これまでに学んだすべての技術を組み合わせて、本格的な作品を作ろう!デジタルピアノ・ロボットカー・気象ステーションに挑戦!