map()

Last revision:2025/05/01

名称

map()

説明

ある範囲の数値を別の範囲の数値に対応づける。すなわち、fromLowはtoLowに、fromHighは、toHighに、fromLowとfromHighの間の数値はtoLowとtoHighの間の数値に対応づけられる。

範囲外の値を意識して使う場合もあるし有効でもあるので、変換する値は指定された範囲に限定しない。範囲を制限する必要がある場合は、constrain()を、この関数の前後で利用すればいい。

下位境界値は上位境界値よりも大きくてもいいし、上位境界値は下位境界値より小さくてもいい。これにより、例えば、値の範囲を逆転させることができる。

1
y = map(x, 1, 50, 50, 1);

負の値を使うこともでき,以下のような使い方も可能である。

1
y = map(x, 1, 50, 50, -100);

map()関数は整数で計算をするため、計算結果が小数になっても、小数は生成しない。小数点以下は切り捨てられる。四捨五入をしたり平均をとったりはしない。

書式

変数の範囲を他の範囲に対応付けるには、以下の関数を使う。

map(value, fromLow, fromHigh, toLow, toHigh)

C言語シグネチャ(avr)

long map(long value, long fromLow, long fromHigh, long toLow, long toHigh);

引数

この関数は以下の引数を受け付ける。

value対応させる値。
fromLow対応前の値の下位境界。
fromHigh
対応前の値の上位境界。
toLow対応後の値の下位境界。
toHigh対応後の値の上位境界。

戻り値

対応付けられた値。データ型: long

コード例

10ビット(0-1023)のアナログ入力値を、8ビット(0-255)の値に対応付け、9番ピンのPWM出力を制御する。入出力値は、シリアルモニターに表示される。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
/* Map an analog value to 8 bits (0 to 255) */
void setup() {
  Serial.begin(9600);
}

void loop() {
  int val = analogRead(0);

  Serial.print("Input value: ");
  Serial.print(val);

  val = map(val, 0, 1023, 0, 255); // mapping function

  Serial.print(", Output value: ");
  Serial.println(val);

  analogWrite(9, val); // PWM output
  delay(200);
}

アナログピン(A0)にポテンショメーターを、LEDを9番ピンに、それぞれ接続すれば、ポテンショメーターを回すことで、LEDの明るさを制御することができる。

補足

数学に興味のある人向け。この関数のすべてのソースは以下の通り。

1
2
3
long map(long x, long in_min, long in_max, long out_min, long out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

注意

既に言及しているが、map()関数は計算に整数を使う。このため小数は返却されない。例えば3/2や4/3、5/4は異なる値だが、map()では、全て1が返る。もしも、高精度の計算が必要な場合(例: 電圧が正確に小数点以下3桁が必要な場合)は、map()の使用を避け、自分で計算するように実装すること。

訳者註

使用例で、analogRead()で得られた10ビットの値を8ビットの値に変換する例が載っていますが、より正確には、以下ではないかと思います。

1
  val = map(val, 0, 1024, 0, 256);

参照

オリジナルのページ

https://docs.arduino.cc/language-reference/en/functions/math/map/

実装の解析

まだ解析していません。

最終更新日

August 16, 2026

inserted by FC2 system