当記事では、ArduinoのMath関数(数学関数)の使い方について詳しく解説します。
Math関数を使うことによって、数値の比較、絶対値、べき乗、平方根などの計算をすることができます。
なお、その他のArduino関数・ライブラリについては、以下の記事をご覧ください。
Math関数(数学関数)
関数 | 引数 | 戻り値 | 説明 |
---|---|---|---|
min(x, y) | x:1つ目の数値 y:2つ目の数値 |
2つの数値を比べて小さい数値を返す | 2つの数値を比べて小さい数値を算出 |
max(x, y) | x:1つ目の数値 y:2つ目の数値 |
2つの数値を比べて大きい数値を返す | 2つの数値を比べて大きい数値を算出 |
abs(x) | x:数値 | 絶対値を返す | 絶対値を計算 |
constrain(x, a, b) | x:対象の数値 a:範囲の最小値 b:範囲の最大値 |
範囲内の値を返す | 対象の数値が範囲内であれば、そのまま算出 範囲外であれば範囲の最小値または最大値で算出 |
long map(long value, long fromLow, long fromHigh, long toLow, long toHigh) | value:対象の数値 fromLow:元の範囲の最小値 fromHigh:元の範囲の最大値 toLow:変換後の範囲の最小値 toHigh:変換後の範囲の最大値 |
変換した値を返す | 対象の値を元の範囲から変換後の範囲に割合で変換 |
double pow(float base, float exponent) | base:基数 exponent:乗数 |
べき乗した値を返す | べき乗計算 |
double sqrt(x) | x:数値 | 平方根で計算した値を返す | 平方根を計算 |
sq(x) | x:数値 | 対象の値の2乗を計算した値を返す | 対象の値の2乗を計算 |
min()/2つの数値を比べて小さい数値を算出
- 関数:min(x, y)
- 引数:x⇒1つ目の数値
- :y⇒2つ目の数値
- 戻り値:2つの数値を比べて小さい数値を返す
min()関数は、引数で指定した2つの数値を比べて小さい数値を戻り値で返します。
max()/2つの数値を比べて大きい数値を算出
- 関数:max(x, y)
- 引数:x⇒1つ目の数値
- :y⇒2つ目の数値
- 戻り値:2つの数値を比べて大きい数値を返す
max()関数は、引数で指定した2つの数値を比べて大きい数値を戻り値で返します。
abs()/絶対値を計算
- 関数:abs(x)
- 引数:x⇒数値
- 戻り値:絶対値を返す
abs()関数は、引数で指定した数値の絶対値を戻り値で返します。
constrain()/範囲内の値を算出
- 関数:constrain(x, a, b)
- 引数:x⇒対象の数値
- :a⇒範囲の最小値
- :b⇒範囲の最大値
- 戻り値:範囲内の値を返す
constrain()関数は、引数に対象の数値、範囲の最小・最大値を指定して、範囲内の値を戻り値として返します。
map()/対象の値を元の範囲から変換後の範囲に割合で変換
- 関数:long map(long value, long fromLow, long fromHigh, long toLow, long toHigh)
- 引数:value⇒対象の数値
- :fromLow⇒元の範囲の最小値
- :fromHigh⇒元の範囲の最大値
- :toLow⇒変換後の範囲の最小値
- :toHigh⇒変換後の範囲の最大値
- 戻り値:変換した値を返す
map()関数は、対象の値を元の範囲から変換後の範囲に割合で変換します。
pow()/べき乗計算
- 関数:double pow(float base, float exponent)
- 引数:base⇒基数
- :exponent⇒乗数
- 戻り値:べき乗した値を返す
pow()関数は、引数に基数と乗数を指定して、べき乗した値を戻り値として返します。
sqrt()/平方根を計算
- 関数:double sqrt(x)
- 引数:x⇒数値
- 戻り値:平方根で計算した値を返す
sqrt()関数は、引数に指定した数値の平方根で計算した値を戻り値として返します。
sq()/対象の値の2乗を計算
- 関数:sq(x)
- 引数:x⇒数値
- 戻り値:対象の値の2乗を計算した値を返す
sq()関数は、引数に指定した数値の2乗を計算した値を戻り値として返します。
サンプルプログラム(サンプルスケッチ)
- Arduino Uno
- USBケーブル
- PC(プログラム書き込み・シリアルモニタ表示)
min()/2つの数値を比べて小さい数値を算出
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char cal;//「cal」をunsigned charで変数宣言
cal = min(5, 3);//5と3を比較、小さい3をcalに代入
Serial.print("minimum:");//文字列「minimum:」を送信
Serial.println(cal);//数字「3」(小さい値)を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
minimum:3
minimum:3
minimum:3
minimum:3
minimum:3
minimum:3
minimum:3
minimum:3
minimum:3
minimum:3
サンプルプログラムは、「5」と「3」の数値を比較して、小さい「3」をシリアルモニタに表示させることを繰り返します。
max()/2つの数値を比べて大きい数値を算出
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char cal;//「cal」をunsigned charで変数宣言
cal = min(5, 3);//5と3を比較、大きい5をcalに代入
Serial.print("max:");//文字列「max:」を送信
Serial.println(cal);//数字「5」(大きい値)を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
max:5
max:5
max:5
max:5
max:5
max:5
max:5
max:5
max:5
max:5
サンプルプログラムは、「5」と「3」の数値を比較して、大きい「5」をシリアルモニタに表示させることを繰り返します。
abs()/絶対値を計算
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
int cal;//「cal」をintで変数宣言
cal = abs(5);//+5の絶対値をcalに代入
Serial.print("+5 absolute value:");//文字列「+5 absolute value:」を送信
Serial.println(cal);//数字「5」(+5の絶対値)を送信、改行
cal = abs(-5);//-5の絶対値をcalに代入
Serial.print("-5 absolute value:");//文字列「-5 absolute value:」を送信
Serial.println(cal);//数字「5」(-5の絶対値)を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
+5 absolute value:5
-5 absolute value:5
+5 absolute value:5
-5 absolute value:5
+5 absolute value:5
-5 absolute value:5
+5 absolute value:5
-5 absolute value:5
+5 absolute value:5
-5 absolute value:5
サンプルプログラムは、「+5」の絶対値「5」と「-5」の絶対値「5」を、それぞれシリアルモニタに表示させることを繰り返します。
constrain()/範囲内の値を算出
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
unsigned char cal;//「cal」をunsigned charで変数宣言
cal = constrain(5, 3, 7);//対象値「5」が範囲3~7の間に入っているので、5がcalに代入
Serial.print("x=5 low=3 high=7:");//文字列「x=5 low=3 high=7:」を送信
Serial.println(cal);//数字「5」を送信、改行
cal = constrain(1, 3, 7);//対象値「1」が範囲3~7より小さい値なので、3がcalに代入
Serial.print("x=1 low=3 high=7:");//文字列「x=1 low=3 high=7:」を送信
Serial.println(cal);//数字「3」を送信、改行
cal = constrain(10, 3, 7);//対象値「10」が範囲3~7より大きい値なので、7がcalに代入
Serial.print("x=10 low=3 high=7:");//文字列「x=10 low=3 high=7:」を送信
Serial.println(cal);//数字「7」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
x=5 low=3 high=7:5
x=1 low=3 high=7:3
x=10 low=3 high=7:7
x=5 low=3 high=7:5
x=1 low=3 high=7:3
x=10 low=3 high=7:7
x=5 low=3 high=7:5
x=1 low=3 high=7:3
x=10 low=3 high=7:7
サンプルプログラムでは、対象値が範囲内に入っていれば、そのまま値がシリアルモニタに表示して、対象値が範囲外であれば、範囲値の最小または最大の値がシリアルモニタに表示します。
map()/対象の値を元の範囲から変換後の範囲に割合で変換
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
long cal;//「cal」をlongで変数宣言
cal = map(5, 1, 10, 10, 100);//対象値「5」は、元の範囲1~10から変換対象の範囲10~100の割合が10倍なので、50がcalに代入
Serial.print("x=5 from low=1 from high=10 to low=10 to high=100:");//文字列「x=5 from low=1 from high=10 to low=10 to high=100:」を送信
Serial.println(cal);//数字「50」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
x=5 from low=1 from high=10 to low=10 to high=100:50
x=5 from low=1 from high=10 to low=10 to high=100:50
x=5 from low=1 from high=10 to low=10 to high=100:50
x=5 from low=1 from high=10 to low=10 to high=100:50
x=5 from low=1 from high=10 to low=10 to high=100:50
x=5 from low=1 from high=10 to low=10 to high=100:50
x=5 from low=1 from high=10 to low=10 to high=100:50
x=5 from low=1 from high=10 to low=10 to high=100:50
x=5 from low=1 from high=10 to low=10 to high=100:50
x=5 from low=1 from high=10 to low=10 to high=100:50
サンプルプログラムは、元の範囲1~10から変換対象の範囲10~100の割合が10倍なので、対象の値「5」を10倍にした「50」をシリアルモニタに繰り返し表示させます。
pow()/べき乗計算
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
double cal;//「cal」をdoubleで変数宣言
cal = pow(2, 3);//2の3乗なので、8.00をcalに代入
Serial.print("2の3乗:");//文字列「2の3乗:」を送信
Serial.println(cal);//数字「8.00」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
2の3乗:8.00
2の3乗:8.00
2の3乗:8.00
2の3乗:8.00
2の3乗:8.00
2の3乗:8.00
2の3乗:8.00
2の3乗:8.00
2の3乗:8.00
2の3乗:8.00
サンプルプログラムは、「2の3乗」をべき乗計算した「8.00」を、シリアルモニタに表示させることを繰り返します。
sqrt()/平方根を計算
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
double cal;//「cal」をdoubleで変数宣言
cal = sqrt(4);//4の平方根なので、2.00をcalに代入
Serial.print("4の平方根:");//文字列「4の平方根:」を送信
Serial.println(cal);//数字「2.00」を送信、改行
cal = sqrt(5);//5の平方根なので、2.24をcalに代入
Serial.print("5の平方根:");//文字列「5の平方根:」を送信
Serial.println(cal);//数字「2.24」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
4の平方根:2.00
5の平方根:2.24
4の平方根:2.00
5の平方根:2.24
4の平方根:2.00
5の平方根:2.24
4の平方根:2.00
5の平方根:2.24
4の平方根:2.00
5の平方根:2.24
サンプルプログラムは、「4の平方根」を計算した「2.00」と「5の平方根」を計算した「2.24」を、それぞれシリアルモニタに表示させることを繰り返します。
sq()/対象の値の2乗を計算
void setup() {
Serial.begin(9600);//シリアル通信を9600bpsで初期化
}
void loop() {
int cal;//「cal」をintで変数宣言
cal = sq(4);//4の2乗なので、16をcalに代入
Serial.print("4の2乗:");//文字列「4の2乗:」を送信
Serial.println(cal);//数字「16」を送信、改行
cal = sq(5);//5の2乗なので、25をcalに代入
Serial.print("5の2乗:");//文字列「5の2乗:」を送信
Serial.println(cal);//数字「25」を送信、改行
delay(1000);//1秒待機(1000msec待機)
}
4の2乗:16
5の2乗:25
4の2乗:16
5の2乗:25
4の2乗:16
5の2乗:25
4の2乗:16
5の2乗:25
4の2乗:16
5の2乗:25
サンプルプログラムは、「4の2乗」を計算した「16」と「5の2乗」を計算した「25」を、それぞれシリアルモニタに表示させることを繰り返します。
おすすめのArduinoボードはどれ?
当記事『Arduino-Math関数(数学関数)の使い方』では、Arduino Unoを使用したサンプルプログラムを解説してきました。
やはり、たくさんの種類のあるArduinoボードの中でも、最も基本的なエディションのArduino Unoがおすすめなのですが、Arduino Unoと電子部品を組み合わせたキットも存在します。
電子工作初心者にとっては、いちいち電子部品を別途購入する必要がないので非常に有用です。以下の記事で初心者でもわかりやすいように、ランキング形式でおすすめのArduino Unoを紹介しているので、ぜひご覧ください。
また、以下の記事で、安価でWi-Fi/Bluetoothに対応している「ESP32開発ボード」についてもまとめてみました。
このボードは、Arduinoボードではありませんが、Arduino IDEでソフト開発ができるため、電子工作でIoTを実現したい方におすすめです。