覚え書きブログ

子供の夏休みの自由研究(モータ制御編)

前回は、Arduino UNOからLEDの点滅をさせる簡単な動作を試した。今回は、もう少し高度なモータドライバTA7291Pを介した2つのモータの制御を試してみる。hirotaka-hachiya.hatenablog.com

先日、秋葉原で買い忘れた部品を横浜にある電子工作関連のお店で購入してきた。
まず、ブレッドボードとブレッドボード用テストコードとを、小机駅の近くにあるサトー電気の横浜店で購入してきた。
f:id:hirotaka_hachiya:20150813154555j:plain:w500

次に、タミヤのSPORTS TIRE SETTRUCK TIRE SETユニバーサルプレートおよびボールキャスターを、滝口模型で購入してきた。
f:id:hirotaka_hachiya:20150813144415j:plain:w500

両店とも、横浜で電子工作の部品と道具が手に入る貴重なお店である。

モータドライバTA7291Pの入出力ピンの仕様を確認し、Arduino UNOと、電池と、モータとを、次のように配線した。
f:id:hirotaka_hachiya:20150814072817p:plain

具体的には、Arduino UNOのGND、5V出力、11、 9、 8ピンを、それぞれTA7291Pの1(GND)、7(Vcc:ロジック側電源)、4(PWM)、5(IN1)、6(IN2)ピンに接続しているしている。TA7291Pの4(PWM)ピンは、モータの速度に比例するアナログの電圧値を入力し、5(IN1)、6(IN2)では、モータの回転方向に関するデジタル値を入力する。ちなみに、IN1, IN2ともにLOWの場合はストップで、IN1がHIGH、IN2がLOWの場合は、時計まわりに回転し、IN1がLOW、IN2がHIGHの場合は逆回転する。
また、電池のプラスとマイナスを、それぞれTA7291Pの8(モータへの出力電源)と1(GND)に接続し、モータの2線をTA7291Pの2(OUT1)と10(OUT2)とに接続している。
滝口模型で購入したユニバーサルプレートにTRUCK TIRE SETとボールキャスターを取り付けて次のようなロボットカーを作製した。
f:id:hirotaka_hachiya:20150814071633j:plain
f:id:hirotaka_hachiya:20150814071603j:plain

そして、ロボットカーを5秒間前進し、1秒間右回転を繰り返す、次のような簡単なプログラムを作り動作確認をした。

//左側のモータのピン番号設定
const int motorL_PWM = 11;
const int motorL_1 = 9;
const int motorL_2 = 7;


//右側のモータのピン番号設定
const int motorR_PWM = 10;
const int motorR_1 = 8;
const int motorR_2 = 6;

void setup() {
  //ピンを出力モードに設定
  pinMode(motorL_1,OUTPUT);
  pinMode(motorL_2,OUTPUT);
  pinMode(motorR_1,OUTPUT);
  pinMode(motorR_1,OUTPUT);  
}

void loop() {

  //--------------------------
  // 前進する
  digitalWrite(motorL_1,LOW);
  digitalWrite(motorL_2,HIGH);
  analogWrite(motorL_PWM,100);

  digitalWrite(motorR_1,HIGH);
  digitalWrite(motorR_2,LOW);
  analogWrite(motorR_PWM,100);  
  delay(5000);
  //--------------------------

  //--------------------------
  // 停止する
  digitalWrite(motorL_1,LOW);
  digitalWrite(motorL_2,LOW);

  digitalWrite(motorR_1,LOW);
  digitalWrite(motorR_2,LOW);
  
  delay(500);  
  //--------------------------
  
  //--------------------------
  // 右に回転
  digitalWrite(motorL_1,LOW);
  digitalWrite(motorL_2,HIGH);
  analogWrite(motorL_PWM,100);

  digitalWrite(motorR_1,LOW);
  digitalWrite(motorR_2,HIGH);
  analogWrite(motorR_PWM,100);  
  delay(1000);
  //--------------------------
}