前回の記事ではまずは回転させてみようということでしたが、今回はそれを拡張して、

  • スイッチで回転方向(CW & CCW)を切り替える
  • 回転速度をボリュームで調整する

という二つの機能追加をやってみます。

スイッチで回転方向を切り替える

タクトスイッチを2個使い、それぞれをCW(時計回り)、CCW(反時計回り)を選択用にする。

スイッチ端子をデジタルピンのD9とD8に接続して値を読み取るようにします、デジタピンはpinMode(9,INPUT_PULLUP)というようにプルアップ抵抗有りで宣言します。

 

Arduino接続回路

回路的には前回記事の回路にアドオンした物になります。

(画像の上をクリックで拡大画像が表示されます)

回路図は以下の様になります

 

スケッチ

[Sample-1] SketchName:”DCmotor_advance1″

 

#define IN1 12 //TA7291入力ピンIN1に接続するデジタルピン番号
#define IN2 11 //TA7291入力ピンIN2に接続するデジタルピン番号
#define IN3 9 //SW1に接続するデジタルピン番号
#define IN4 8 //SW2に接続するデジタルピン番号
#define VREF 10 //TA7291入力ピンVREFに接続するPWM出力ピン番号

void setup() {
  pinMode(IN1, OUTPUT); //IN1(D12ピン)を出力モード指定
  pinMode(IN2, OUTPUT); //IN2(D11ピン)を出力モード指定
  pinMode(IN3, INPUT_PULLUP); //IN3(D9ピン)を入力モード&プルアップ抵抗有り指定
  pinMode(IN4, INPUT_PULLUP); //IN4(D8ピン)を入力モード&プルアップ抵抗有り指定
  digitalWrite(IN1, LOW); //IN1(デジタルピン12)をLOW
  digitalWrite(IN2, LOW); //IN2(デジタルピン11)をLOW
  //初期設定ではIN1(D12ピン),IN2(D11ピン)の双方をLOWレベルにする、モーターはストップ状態となる。
}

void loop() {
  //IN3(D9ピン)がLOWレベル(00)か否かを判定
  if (digitalRead(IN3) == 00) {
    //判定結果が真(LOW)であれば以下の文、2行を実行
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
  }
  //IN4(D8ピン)がLOWレベル(00)か否かを判定
  if (digitalRead(IN4) == 00) {
    //判定結果が真(LOW)であれば以下の文、2行を実行(上記if文とは回転方向が逆になっている)
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
  }
  analogWrite(VREF, 255);//Vref端子にPWM値=255を加える(最大値)
  delay(500);
}

 

ボリュームで回転速度調整

今までの回路に、更にボリュームを追加して回転速度調整機能を追加してみます。

ボリュームで+5Vを分圧してその値をanalogRead()関数で読み取り、数値換算後にanalogWrite()関数の値に反映させるという処理の流れになります。

Arduino接続回路

(画像の上をクリックで拡大画像が表示されます)

 

回路図は以下の様になります

 

ボリュームには端子が3ピンあります、そしてそれぞれを+5V、GND、A0ピンに接続します。

2個ほど上の配線図でのボリュームのイラスト図と現物とはサイズと形状が微妙に異なります、そのため判り易いように実物の画像を以下に載せます。

(画像の上をクリックで拡大画像が表示されます)

(画像の上をクリックで拡大画像が表示されます)

スケッチ

[Sample-2] SketchName:”DCmotor_advance2″

 

#define IN1 12 //TA7291入力ピンIN1に接続するデジタルピン番号
#define IN2 11 //TA7291入力ピンIN2に接続するデジタルピン番号
#define IN3 9 //SW1に接続するデジタルピン番号
#define IN4 8 //SW2に接続するデジタルピン番号
#define VREF 10 //TA7291入力ピンVREFに接続するPWM出力ピン番号

void setup() {
  pinMode(IN1, OUTPUT); //IN1(D12ピン)を出力モード指定
  pinMode(IN2, OUTPUT); //IN2(D11ピン)を出力モード指定
  pinMode(IN3, INPUT_PULLUP);  //IN3(D9ピン)を入力モード&プルアップ抵抗有り指定
  pinMode(IN4, INPUT_PULLUP);  //IN4(D8ピン)を入力モード&プルアップ抵抗有り指定
  digitalWrite(IN1, LOW); //IN1(デジタルピン12)をLOW
  digitalWrite(IN2, LOW); //IN2(デジタルピン11)をLOW
    //初期設定ではIN1(D12ピン),IN2(D11ピン)の双方をLOWレベルにする、モーターはストップ状態となる。
}

void loop() {
  uint16_t analogIn, vrefValue ;
  //IN3(D9ピン)がLOWレベル(00)か否かを判定
  if (digitalRead(IN3) == 00) {
    //判定結果が真(LOW)であれば以下の文、2行を実行
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
  }
  //IN4(D8ピン)がLOWレベル(00)か否かを判定
  if (digitalRead(IN4) == 00) {
    //判定結果が真(LOW)であれば以下の文、2行を実行(上記if文とは回転方向が逆になっている)
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
  }
  analogIn = analogRead(0) ; // アナログ0番ピンからボリュームでの分圧電圧値を読む
  vrefValue  = map(analogIn, 0, 1023, 100, 255) ; // 分圧電圧値をPWM値にマッピングする
  //A0入力値(0~1023の値を100~255に対応するようにマッピング
  analogWrite(VREF, vrefValue);//Vref端子にPWM値=vrefValueを加える
  delay(500);
}