
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 を現在のスイッチ状態で更新し、次のループで変化を検出できるようにします。
実際に動かしてみましょう!



