Posts モータの制御プログラムを関数化しよう
Post
Cancel

モータの制御プログラムを関数化しよう

この記事で使うソースコード

ここではモータを制御しようで書いたプログラムを関数化します。 関数化することでよく使うプログラムを何度も書かずに使いまわすことができます。 また、ソースコードの削減や可読性の向上が期待できます。

関数を作成する


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つの機能というようにします。

This post is licensed under CC BY 4.0 by the author.

GPSセンサの値を取得しよう

モータの制御プログラムをライブラリ化しよう