つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション17 ~ モータードライバによる制御

1. モータードライバによるDCモーターの制御

 前回までにリレー回路を用いたDCモーターの制御、次にサーボモーターの制御について紹介してきたが、今回はモータードライバを用いたDCモーターの制御方法を紹介する。

2. モータードライバとの接続

 今回はTinkercad上のHブリッジモータードライバ(L293D)を用いてDCモーターの回転方向を制御する方法を紹介する。L293Dの各ピンの機能は次のサイトに Arduino と L293D で DC モーターを制御する方法 - Arduino - 基礎からの IoT 入門、配線接続に関しては動画を参照して下図のようにした。2台のモーターまで制御できるが、今回は1台だけとして主に左側のピンに配線をしている。 モーターの電力を供給するために、電源をL293D上の電力2端子に接続し、1uFのコンデンサを並列に入れる。入力電圧は5V~36Vだが、とりあえず電源を5Vに設定しておく。電圧は5Vだが消費電流が大きいのでArduinoの5V端子には接続しない。(してはいけない)次にL293D自体の電源である電力1端子にはArduinoの5V端子を接続した。L293Dの中心の2つの接地端子をGNDに接続し、出力1端子(1A)をDCモーターの正極、出力2端子(2A)を負極に接続する。入力1端子をArduinoの出力ピン5、入力2端子を出力ピン6に接続する。モータードライバの入力端子はHIGHが入力されると出力端子から正電圧が出力される。よって入力1(1Y)と入力2(2Y)に対してHIGH/LOWを組み合わせることで、DCモーターを右、左回転、停止の制御を行うことができる。最後にイネーブル1,2端子に抵抗10kΩを介して5Vを供給することで、モータードライバの入出力が有効になる。

モータードライバー配線
モータードライバ配線

3. スケッチ

 基本的にはモータードライバ入力端子1,2にHIGH/LOWを出力するようにすればよい。Arduino と L293D で DC モーターを制御する方法 - Arduino - 基礎からの IoT 入門のスケッチを少し改変したのが以下のようにした。 1秒間右回転させ、1秒間停止、1秒間左回転、1秒間停止を繰り返すようになっている。

void setup()
{
  pinMode(5, OUTPUT); // 1Yへ入力
  pinMode(6, OUTPUT);// 2Yへ入力
}

void loop()
{
  motor( HIGH,  LOW, 1000);
  motor(  LOW,  LOW, 1000);

  motor(  LOW, HIGH, 1000);
  motor(  LOW,  LOW, 1000);  
}

void motor(int a1, int a2, int d){
  digitalWrite(5, a1);
  digitalWrite(6, a2);
  delay(d);
}

ロジックを表にまとめると以下のようになる。(CWは時計周り、CCは半時計周り)

入力1(1Y) 入力2(2Y) 出力1(1A) 出力2(2A) 回転
HIGH LOW HIGH LOW CW
LOW HIGH LOW HIGH CC
LOW LOW LOW LOW STOP
HIGH HIGH HIGH HIGH STOP

Tinkercad上で実行すると、DCモーターが1秒間右回転、1秒間停止、1秒間左回転、1秒間停止を繰り返すことが確認できる。

4. エンコーダー付きDCモーター

 さらにエンコーダー付きのDCモーターの使用例を示したい。Tinkercad上のモデルはDCモーターの代わりにエンコーダー付き(3~12V遊星ギアモーター)を選択し、モータードライバの出力1、出力2端子をモーター(正)とモーター(負)に接続する。エンコーダーの電力端子、接地端子には5VとGNDを接続し、さらにチャネルAはArduinoの2ピンにつなぎ、波形を観測するためのオシロスコープも接続する。(下図参照)

エンコーダー付きDCモータへの接続
エンコーダー付きDCモーターへの接続

スケッチは以下のようにした。ポイントはエンコーダー出力を接続する2ピンをINPUT_PULLUPに設定して読み出すことにある。今回はエンコーダーのパルス信号のカウントなどは行わず、単純にパルス幅をpulseIn(2,HIGH)を用いてシリアルモニタに表示するのみとした。パルス信号をさらに活用すれば15 エンコーダ付きモータを使ってみよう2 - 電子工作チュートリアルにあるようにエンコーダーパルスをカウントしたりすることで回転角を割り出すこともできる。 モーターの制御としては右回転、左回転を2秒づつ繰り返す動作とした。上と同様に停止を入れると動作が止まってしまう。(原因ははっきりわからないが、動作時と停止時で電力消費が変動して電源側からの電力供給が安定的に行えていない可能性がある)

void setup()
{
  Serial.begin(9600);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(2, INPUT_PULLUP); //エンコーダー出力をPULLUPで接続
  digitalRead(2); //読み出し動作を1回行う
}

void loop()
{
  motor( HIGH,  LOW, 2000);
  motor( LOW,  HIGH, 2000);
}

void motor(int a1, int a2, int d){
  digitalWrite(5, a1);
  digitalWrite(6, a2);
  Serial.print("Pulse: ");
  Serial.println(pulseIn(2,HIGH)); //エンコーダーパルス幅表示
  delay(d);
}

Tinkercadシミュレーション実行時のエンコーダー出力の信号を下に示す。電源を6Vに設定した場合、モーターの回転数は176RPMでパルス幅は769usとなる。電源の電圧を変更すると、モーターの回転数が変わりパルス幅も変化する。例えば電源電圧5Vにすると回転数は147RPMでパルス幅は928usとなる。

エンコーダー出力信号
エンコーダー出力信号

5. まとめ

 今回はモータードライバL293Dを用いてDCモーターの回転方向制御について取り上げた。またエンコーダー付きDCモーターを動作させ、エンコーダー出力パルス幅を表示させる方法を紹介した。