ここではモータを制御しようで書いたプログラムを関数化します。 関数化することでよく使うプログラムを何度も書かずに使いまわすことができます。 また、ソースコードの削減や可読性の向上が期待できます。
関数を作成する
Arduinoのプログラムはsetup
関数とloop
関数が必要です。 それ以外に関数を追加したい場合は下記のようにfunction1()
やfunction2()
を追加します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void setup() {
// ここに最初に1回だけ実行する処理を書く
}
void loop() {
// ここに繰り返す処理を書く
}
void function1() {
// ここに関数化するソースコードを書く
}
void function2() {
// ここに関数化するソースコードを書く
}
前進のプログラムは下記のように関数化できます。 forward()
という関数にしました。
これでloop
関数からforward(80)
のように呼び出すと前進の制御ができます。 このとき関数に80という引数(ひきすう)を渡しています。 引数は関数が受け取る値で、今回はint
型のpwm
という変数を関数に定義しています。 引数のpwmは0~255の値を渡すようにします。
1
2
3
4
5
6
7
8
9
10
11
12
/** 前進 */
void forward(int pwm) {
// 左モータ(CCW、反時計回り)
digitalWrite(motorA[1], LOW);
digitalWrite(motorA[0], HIGH);
ledcWrite(CHANNEL_A, pwm);
// 右モータ(CW、時計回り)
digitalWrite(motorB[1], LOW);
digitalWrite(motorB[0], HIGH);
ledcWrite(CHANNEL_B, pwm);
}
同様に、逆転と停止の制御をそれぞれback()
、stop()
という関数にします。 関数にすることでloop
関数は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
void loop() {
forward(80);
delay(1000);
stop();
delay(1000);
back(80);
delay(1000);
stop();
delay(1000);
}
関数化する前のloop
関数と比較してソースコードを短く、わかりやすく書けるようになりました。 特に停止の処理は、これまで同じ内容を2回書いていましたが、関数にすることで単にstop()
と書くだけでよくなりました。
プログラミングの基本的な考え方としてmain
関数(Aruduinoの場合loop
関数)の中身は短く書くようにします。 また、関数の中身も短く、1つの関数に1つの機能というようにします。