見出し画像

Arduinoの電子工作で遊ぼう! その29 ~モーターの回転速度や回転方向を変えてみよう2~

(前回からの続きです)

プログラムを見てみましょう

このプログラムでは、ArduinoでDCモーターの速度と回転方向を制御します。スイッチや半固定抵抗器を使って、モーターをON/OFFしたり、回転方向や速度を調整します。

const int controlPin1 = 2;
const int controlPin2 = 3;
const int enablePin = 9;
const int directionSwitchPin = 4;
const int onOffSwitchStateSwitchPin = 5;
const int potPin = A0;

int onOffSwitchState = 0;
int previousOnOffSwitchState = 0;
int directionSwitchState = 0;
int previousDirectionSwitchState = 0;

int motorEnabled = 0;
int motorSpeed = 0;
int motorDirection = 1;

void setup() {
  pinMode(directionSwitchPin, INPUT);
  pinMode(onOffSwitchStateSwitchPin, INPUT);
  pinMode(controlPin1, OUTPUT);
  pinMode(controlPin2, OUTPUT);
  pinMode(enablePin, OUTPUT);
  digitalWrite(enablePin, LOW);
}

void loop() {
  onOffSwitchState = digitalRead(onOffSwitchStateSwitchPin);
  delay(10);
  directionSwitchState = digitalRead(directionSwitchPin);
  motorSpeed = analogRead(potPin)/4;
  if(onOffSwitchState != previousOnOffSwitchState){
    if(onOffSwitchState == HIGH){
      motorEnabled = !motorEnabled;
    }
  }
  if(directionSwitchState != previousDirectionSwitchState){
    if(directionSwitchState == HIGH){
      motorDirection = !motorDirection;
    }
  }
  if(motorDirection == 1){
    digitalWrite(controlPin1, HIGH);
    digitalWrite(controlPin2,LOW);
  }
  else{
    digitalWrite(controlPin1, LOW);
    digitalWrite(controlPin2, HIGH);
  }
  if(motorEnabled == 1){
    analogWrite(enablePin, motorSpeed);
  }
  else{
    analogWrite(enablePin, 0);
  }
  previousDirectionSwitchState = directionSwitchState;
  previousOnOffSwitchState = onOffSwitchState;
}

1.グローバル変数の宣言

const int controlPin1 = 2;
const int controlPin2 = 3;
const int enablePin = 9;
const int directionSwitchPin = 4;
const int onOffSwitchStateSwitchPin = 5;
const int potPin = A0;

int onOffSwitchState = 0;
int previousOnOffSwitchState = 0;
int directionSwitchState = 0;
int previousDirectionSwitchState = 0;

int motorEnabled = 0;
int motorSpeed = 0;
int motorDirection = 1;
  • controlPin1 と controlPin2 は、モーターの回転方向を制御するためのピンです。

  • enablePin は、モーターの速度を制御するためのピンで、PWM信号を出力します。

  • directionSwitchPin と onOffSwitchStateSwitchPin は、それぞれ回転方向とON/OFFを切り替えるスイッチのピンです。

  • potPin は、モーターの速度を設定するための半固定抵抗器のピンです。

  • onOffSwitchState、previousOnOffSwitchState、directionSwitchState、previousDirectionSwitchState は、スイッチの状態を保持し、変化があったかどうかを確認するための変数です。

  • motorEnabled は、モーターのON/OFF状態を保持します。

  • motorSpeed は、モーターの速度を0~255の範囲で設定します。

  • motorDirection は、モーターの回転方向を保持します(1が正転、0が逆転)。

2.setup 関数

void setup() {
  pinMode(directionSwitchPin, INPUT);
  pinMode(onOffSwitchStateSwitchPin, INPUT);
  pinMode(controlPin1, OUTPUT);
  pinMode(controlPin2, OUTPUT);
  pinMode(enablePin, OUTPUT);
  digitalWrite(enablePin, LOW);
}
  • 各ピンのモードを設定します。directionSwitchPin と onOffSwitchStateSwitchPin はスイッチの入力ピンとして設定され、controlPin1、controlPin2、enablePin は出力ピンとして設定されます。

  • enablePin は初期状態でLOW(OFF)に設定され、モーターが停止した状態からスタートします。

3.loop 関数

void loop() {
  onOffSwitchState = digitalRead(onOffSwitchStateSwitchPin);
  delay(10);
  directionSwitchState = digitalRead(directionSwitchPin);
  motorSpeed = analogRead(potPin)/4;
  • onOffSwitchState と directionSwitchState にそれぞれスイッチの現在の状態を読み込みます。

  • motorSpeed に、半固定抵抗器から読み取った値を4で割ったものを代入します。これにより、0~1023の範囲が0~255にスケーリングされ、PWM信号で使用可能な範囲になります。

モーターのON/OFF制御

  if(onOffSwitchState != previousOnOffSwitchState){
    if(onOffSwitchState == HIGH){
      motorEnabled = !motorEnabled;
    }
  }
  • onOffSwitchState が以前の状態と異なる場合、スイッチが押されたと判断し、モーターのON/OFF状態(motorEnabled)をトグル(反転)します。

モーターの回転方向制御

  if(directionSwitchState != previousDirectionSwitchState){
    if(directionSwitchState == HIGH){
      motorDirection = !motorDirection;
    }
  }
  • directionSwitchState が前回の状態と異なる場合、回転方向のスイッチが押されたと判断し、motorDirection をトグル(反転)します。

モーターの方向と速度の設定

  if(motorDirection == 1){
    digitalWrite(controlPin1, HIGH);
    digitalWrite(controlPin2,LOW);
  }
  else{
    digitalWrite(controlPin1, LOW);
    digitalWrite(controlPin2, HIGH);
  }
  • motorDirection に基づき、controlPin1 と controlPin2 をHIGHまたはLOWに設定することで、モーターの回転方向を制御します。

  if(motorEnabled == 1){
    analogWrite(enablePin, motorSpeed);
  }
  else{
    analogWrite(enablePin, 0);
  }
  • motorEnabled が1の場合、enablePin にmotorSpeed をPWM信号で出力し、モーターの速度を設定します。motorEnabled が0の場合、enablePin に0を出力し、モーターを停止させます。

状態の更新

  previousDirectionSwitchState = directionSwitchState;
  previousOnOffSwitchState = onOffSwitchState;
}
  • previousDirectionSwitchState と previousOnOffSwitchState を現在のスイッチ状態で更新し、次のループで変化を検出できるようにします。

実際に動かしてみましょう!

1つ目のスイッチを押すと、モーターが動きました 
もう一度押すと、モーターが止まりました 
 2つ目のスイッチを押すと、モーターが逆回転しました
半固定抵抗器のノブを回すと、モーターの回転スピードが変わりました

無事、成功です!

いいなと思ったら応援しよう!