DCモーターを使う[拡張その①]
前回の記事ではまずは回転させてみようということでしたが、今回はそれを拡張して、
- スイッチで回転方向(CW & CCW)を切り替える
- 回転速度をボリュームで調整する
という二つの機能追加をやってみます。
目 次
スイッチで回転方向を切り替える
タクトスイッチを2個使い、それぞれをCW(時計回り)、CCW(反時計回り)を選択用にする。
スイッチ端子をデジタルピンのD9とD8に接続して値を読み取るようにします、デジタピンはpinMode(9,INPUT_PULLUP)というようにプルアップ抵抗有りで宣言します。
Arduino接続回路
回路的には前回記事の回路にアドオンした物になります。
回路図は以下の様になります
スケッチ
[Sample-1] SketchName:”DCmotor_advance1″
DCmotor_advance1
1 ファイル 0.80 KB
#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″
DCmotor_advance2
1 ファイル 0.96 KB
#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); }