cpp コピー #include // --- モーター設定 --- const int stepsPerRevolution = 2048; // 28BYJ-48 の標準値 Stepper motorA(stepsPerRevolution, 2, 4, 3, 5); // IN1,IN3,IN2,IN4 の順 // --- ピン設定 --- const int homeSwitch = 10; // 原点近接スイッチ(ON=LOW を想定) const int startButton = 11; // スタートボタン(押すと LOW) const int doneSignal = 12; // 完了信号(HIGH=完了) // --- 動作設定 --- int targetAngle = 90; // 回したい角度(例:90°) int stepDelay = 5; // ステップ間隔(遅め) // --- 内部状態 --- bool started = false; void setup() { pinMode(homeSwitch, INPUT_PULLUP); // 近接スイッチ(NO → ONでLOW) pinMode(startButton, INPUT_PULLUP); // スタートボタン pinMode(doneSignal, OUTPUT); digitalWrite(doneSignal, LOW); motorA.setSpeed(8); // RPM(遅め) } void loop() { // --- スタート待ち --- if (!started) { if (digitalRead(startButton) == LOW) { delay(50); // チャタリング除去 if (digitalRead(startButton) == LOW) { started = true; } } return; } // --- 原点復帰 --- homeMotorA(); // --- 指定角度へ回転 --- rotateFromHomeA(targetAngle); // --- 完了信号を出す --- digitalWrite(doneSignal, HIGH); delay(500); digitalWrite(doneSignal, LOW); // 1 回だけ動かす場合は停止 started = false; } // ============================= // 原点復帰(常に同方向で回転) // ============================= void homeMotorA() { // 近接スイッチが OFF の間は回し続ける while (digitalRead(homeSwitch) == HIGH) { motorA.step(1); // 常に同方向 delay(stepDelay); } // 原点に到達したので少し戻して位置を安定させる for (int i = 0; i < 10; i++) { motorA.step(1); delay(stepDelay); } } // ============================= // 原点から指定角度へ回転 // ============================= void rotateFromHomeA(int angleDeg) { long steps = (long)angleDeg * stepsPerRevolution / 360; for (long i = 0; i < steps; i++) { motorA.step(1); delay(stepDelay); } }