① 今日の目標
温度センサーでリアルタイム測定ができる
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で温度を読む
TMP36で温度を読む
2
判断
map()でPWM値を計算
map()でPWM値を計算
3
制御
analogWriteでモーター速度を変える
analogWriteでモーター速度を変える
4
繰り返し
loop()で連続監視
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範囲にスケール変換します。
map(値, 入力最小, 入力最大, 出力最小, 出力最大)の順。温度範囲をPWM範囲にスケール変換します。
constrain()で安全に
温度が40℃を超えたときmap()は255を超える値を返すことがある。constrain()で必ず範囲内に収める。
温度が40℃を超えたときmap()は255を超える値を返すことがある。constrain()で必ず範囲内に収める。
方向は固定、速度だけ変える
IN1=HIGH、IN2=LOWをsetup()で一度だけ設定。速度変更はENA(PWM)だけを変えればOK。
IN1=HIGH、IN2=LOWをsetup()で一度だけ設定。速度変更はENA(PWM)だけを変えればOK。
Serial.print()でデバッグ
シリアルモニタに温度とPWM値を出力することで、動作確認がしやすくなります。
シリアルモニタに温度とPWM値を出力することで、動作確認がしやすくなります。
⑤ 配線図
⚠️ 外部電源について
DCモーターは大きな電流が必要です。必ず外部電源(6〜12V)をL298Nに接続しましょう。Arduinoの5VだけではモーターもArduinoも壊れる危険があります!
DCモーターは大きな電流が必要です。必ず外部電源(6〜12V)をL298Nに接続しましょう。Arduinoの5VだけではモーターもArduinoも壊れる危険があります!
⑥ チェックリスト
⑦ チャレンジクイズ!
⑧ 🌬️ 自動ファンシミュレーター
温度スライダーを動かして、ファンの自動制御を体験しよう!
⏹ 停止中
25.0
°C
温度
25.0°C
PWM値
0
スピード
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
}
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(値, 入力最小, 入力最大,
出力最小, 出力最大)
map(値, 入力最小, 入力最大,
出力最小, 出力最大)
constrain()で安全に
map()の結果を
必ず範囲内に収める
map()の結果を
必ず範囲内に収める
フィードバック制御
計測→判断→制御の
ループが基本
計測→判断→制御の
ループが基本
Chapter 4 完了!
アクチュエータ&
表示のマスター!
アクチュエータ&
表示のマスター!