関数

はじめに

一連の処理をひとまとめにしたものが関数です。例えば、setup()やloop()、pinMode()などもすべて関数です。C++/Cでは関数を記述することがプログラムを作成することとほぼ同じと言ってもいいかもしれません。

関数の定義方法

関数は以下の形で定義します。

1
2
3
返却値の型 関数名 (仮引数の型 仮引数, ) {
 /* 関数の実体 */
}

上記ではよくわからないので、具体例を交えて説明します。まずは、Arduinoソフトウェアの「ファイル > スケッチの例 > 01.Basics > BareMinimum」を選択して出てくる、Arduinoで動作する最低限のコードのsetup()関数を見てみます。以下のコードは、何もしないコードです。

1
2
3
4
void setup() {
  // put your setup code here, to run once:
 
}

返却値の型はvoidで、関数名がsetup、仮引数と関数の実体はありません。返却値の型のvoidは何も返却しないということを意味しています。仮引数とは関数の入力値のことです。setup()には入力値はありません。関数の実体もコメント行が書いてあるだけで、有効なコードは何もありません。つまり、この関数を呼んでも何も起こりません。

関数を定義するためには、関数を設計する必要があります。最低限決める必要のあるのは、以下の通りです。

項目 内容
関数名 関数の名前。
返却値の型 関数が返す値の型。関数が返却できる値は0個もしくは1個です。2個以上の値を返却することはできません。
仮引数 関数に渡す入力値。0個以上の入力を指定することができます。仮引数の型もあわせて定義する必要があります。
関数の仕様 定義する関数の中で何をするのか。どのように実装するのか。

返却値の型と関数名、仮引数の組み合わせが異なれば違う関数とみなされます。この3つの組み合わせのことを関数プロトタイプや関数のシグネチャと呼びます。

例としてアナログピンにかかっている電圧を取得する関数を考えます。

まずは、関数の仕様を考えていきます。Arduino標準の関数にanalogRead()という関数があります。この関数は指定したアナログピンにかかっている電圧に応じて0から1023の値を返す関数です。今回取得したいのは電圧なので、analogRead()の値を電圧に変換する必要があります。analogRead()のリファレンスanalogReference()のリファレンスによると、電圧は、参照電圧 * analogRead()の読み取り値 / 1024 で計算できると書いてあります。今回は参照電圧は5Vとします。

上記より、以下のような関数を作成していきます。

項目 内容
関数名 analogReadVoltage
返却値の型 float。電圧は小数点以下もあるため。
仮引数 int analogPin。読み取り対象のアナログピンの番号。
関数の仕様 参照電圧 * analogRead()の読み取り / 1024を返す。
1
2
3
float analogReadVoltage(int analogPin) {
  return analogRead(analogPin) * 5 / 1024;
}

上記の定義で一見問題はないように見えますが、大きな問題があります。analogRead()は整数型を返す関数なので、return文に書いてある式は整数の演算となります。データ操作のデータに対する操作で説明したとおり、整数同士の割り算では小数点以下が切り捨てられてしまいます。このため、上記の定義では、整数しか返さないことになりもともとの意図と異なっています。

式のどれかをfloat型に変換してやればfloat型での四則演算となります。

1
2
3
float analogReadVoltage(int analogPin) {
  return analogRead(analogPin) * 5 / 1024.0;
}

上記の関数を利用した下記のスケッチをコンパイルしてArduinoに書き込むと、アナログの0番ピンの電圧をシリアルコンソールに表示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
void setup() {
  Serial.begin(9600);
}
 
void loop() {
  float v = analogReadVoltage(0);
  Serial.println(v,4);
  delay(1000);
}
 
float analogReadVoltage(int analogPin) {
  return analogRead(analogPin) * 5 / 1024.0;
}

最終更新日

February 11, 2021

inserted by FC2 system