Arduinoで人感センサーと2つのスイッチを組み合わせてサーボモーターを制御する方法

C言語関連

Arduinoでサーボモーターを制御する際、人感センサーによる自動動作と、ボタンやスイッチによる手動制御を組み合わせたいケースは少なくありません。本記事では、30秒タイマー付きの人感センサー制御と、90度・0度を切り替えるスイッチ制御を統合する考え方や配線方法を解説します。

2つのプログラムの役割を整理する

最初のプログラムは人感センサーを利用し、検知中はサーボを0度にし、非検知になってから30秒間は90度を維持する動作です。

2つ目のプログラムは、2つのスイッチを利用してサーボを90度または0度へ手動で切り替える仕組みです。

両方を組み合わせる場合は、人感センサーによる自動制御と、スイッチによる強制制御の優先順位を決める必要があります。

使用するピンの例

機器 Arduinoピン
サーボモーター D9
人感センサー(PIR) D2
90度ボタン D3
0度ボタン D4

D2を人感センサー専用にし、ボタン用のピンをD3とD4へ分離すると管理しやすくなります。

統合したプログラムの考え方

まずボタン操作を優先して判定し、押されていない場合のみ人感センサーによる自動制御を実行します。

この方法なら、普段は人感センサーで動作し、必要なときだけボタンで強制的に位置変更できます。

#include <Servo.h>

Servo sv;
uint32_t ms = -30001;

void setup() {
  sv.attach(9);

  pinMode(2, INPUT_PULLUP); // 人感センサー
  pinMode(3, INPUT_PULLUP); // 90度ボタン
  pinMode(4, INPUT_PULLUP); // 0度ボタン

  sv.write(0);
}

void loop() {

  if (digitalRead(3) == LOW) {
    sv.write(90);
  }
  else if (digitalRead(4) == LOW) {
    sv.write(0);
  }
  else {

    if (digitalRead(2) == LOW) {
      sv.write(0);
      ms = millis();
    }
    else {
      if (millis() - ms <= 30000)
        sv.write(90);
      else
        sv.write(0);
    }
  }

  delay(5);
}

配線時の注意点

サーボモーターは起動時に比較的大きな電流を消費します。小型サーボであればArduinoの5Vから動作する場合もありますが、動作が不安定な場合は外部電源を使用してください。

また、人感センサーの出力がHIGH検知タイプかLOW検知タイプかによって、条件式を変更する必要があります。使用しているセンサーの仕様を必ず確認しましょう。

動作確認の手順

まずボタンのみ接続して、90度・0度へ正常に動くか確認します。

その後、人感センサーを接続し、検知時と非検知時の30秒タイマーが期待通りに動作するか確認すると、トラブルの切り分けが容易になります。

まとめ

人感センサーと手動スイッチによるサーボ制御は、入力ピンを分離し、優先順位を決めてプログラムを構成することで両立できます。今回の例ではサーボをD9、人感センサーをD2、90度ボタンをD3、0度ボタンをD4に割り当てています。まずは個別に動作確認を行い、その後に統合してテストするとスムーズに完成させることができます。

コメント

タイトルとURLをコピーしました