Posts モータを制御しよう
Post
Cancel

モータを制御しよう

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

モータドライバ


モータを動かすためには大きな電流を必要とします。モータドライバICを使うことで簡単にモータを制御することができます。写真に写っているICが100kinSATのモータドライバIC(TB6612FNG)です。

tb6612fng モータドライバIC

TB6612FNGは1つのICで2つのモータを制御することができます。

モータの制御


マイコンのGPIOピン3つ(IN1、IN2、PWM)で1つのモータを制御します。IN1とIN2のHIGHとLOWの組み合わせでモータの正転と逆転、ストップ、ブレーキを操作できます。PWMは0~255までの値を指定し、モータの回転速度の強弱を制御することができます。Arduino UNOではanalogWrite()関数を使用することができますが、ESP32ではLEDC機能を利用することでanalogWrite()と同様の機能を使うことができます。各ピンの入力によるモータの出力の関係は表のとおりです。

table モータへの入力と出力の関係

では、モータを動かしてみましょう。

モータ用のプログラムはmotor1.inoを使います。

ソースコードの説明


モータ制御ピンの設定

1
2
const int motorA[3] = {4, 13, 25};  // AIN1, AIN2, PWMA
const int motorB[3] = {14, 27, 26}; // BIN1, BIN2, PWMB

ここではモータの制御に使用するGPIOピンを配列に格納しています。

1
2
3
4
5
6
7
8
void setup() {
  for(int i = 0; i < 3; i++){
    pinMode(motorA[i], OUTPUT);
    pinMode(motorB[i], OUTPUT);
  }

  // 省略
}

次にsetup関数内でモータ制御に使用するピンを「出力」に設定します。

配列を利用することで「for文」により一括で設定を行うことができます。

LEDCの設定

次にLEDCの設定について説明します。

1
2
3
4
5
const int CHANNEL_A = 0;
const int CHANNEL_B = 1;

const int LEDC_TIMER_BIT = 8;
const int LEDC_BASE_FREQ = 490;

最初にチャンネルや周波数、分解能をグローバル変数に定義しています。

今回はモータを2つ動かすため、CHANNEL_ACHANNEL_Bの2つのチャンネルを使用します。

分解能を8ビットに指定したので、PWMは0~255(2^8)の範囲で指定できます。

1
2
3
4
5
6
7
8
9
void setup() {
  // 省略

  ledcSetup(CHANNEL_A, LEDC_BASE_FREQ, LEDC_TIMER_BIT);
  ledcSetup(CHANNEL_B, LEDC_BASE_FREQ, LEDC_TIMER_BIT);

  ledcAttachPin(motorA[2], CHANNEL_A);
  ledcAttachPin(motorB[2], CHANNEL_B);
}

setup関数内ではLEDC機能を設定します。

設定にはledcSetup関数を使用します。

1
ledcSetup(channel, freq, resolution)

引数にチャンネル、周波数、分解能を指定します。

次にledcAttachPin関数を使用してPWM信号を出力するピンとチャンネルを結びつけます。

loop関数

最後にloop関数内でモータを動かしているプログラムの説明を行います。

1
2
3
4
5
6
7
8
9
10
  // 前進
  // 左モータ(CCW、反時計回り)
  digitalWrite(motorA[1], LOW);
  digitalWrite(motorA[0], HIGH);
  ledcWrite(CHANNEL_A, 80);

  // 右モータ(CW、時計回り)
  digitalWrite(motorB[1], LOW);
  digitalWrite(motorB[0], HIGH);
  ledcWrite(CHANNEL_B, 80);

digitalWrite関数でピンの出力を「LOW」または「HIGH」にしています。この組み合わせにより、モータの正回転、逆回転を制御することができます。 CCWはCounterClockWiseを意味します。

PWMの出力にはledcWrite関数を使用します。第1引数に出力するピンのチャンネルを指定し、第2引数にPWM値を指定しています。第2引数には0~255の値を指定することができます。

 PWM値を変化させることでモータの回転速度が変化するので、いろいろな値を入力して動作を確認してください。

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

複数のセンサを組み合わせる

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