【Arduino】Arduino Nano(互換機)で人感センサ付けてLEDを光らせる

久しぶりに電子工作をやります。
やりたいこととして、トイレの電灯を人がいれば点灯(電灯スイッチON)、いなければ消灯する(電灯スイッチをOFF)です。
これは最終的にサーボモータを組み合わせて実現するとして、試作として人がいると検知したらLEDを灯すのをメモとして残します。

1.使用パーツ

 ↓たぶんこれ?(数年前に買ったものなので、厳密にはたぶん違う)
 Rasbee Mini USB Arduino Nano V3.0 改良版 互換ボード ATmega328P搭載 1個 [並行輸入品] http://ur0.work/Wp9b

  • ブレッドボード
  • ジャンパーワイヤ
  • RIPモーションセンサ

 ↓たぶんこれ?((数年前に買ったものなので、厳密には違う。私が持っているものはピンの詳細が基盤に印字されてないので、どれかGNDとかわからなかったり)
 超小型赤外線センサーモジュール人体感知スイッチhttp://ur0.work/9Vq7

2.構成イメージと回路図

まぁこんな感じです。

f:id:engetu21:20190511202135p:plain
f:id:engetu21:20190511202210p:plain

RIPセンサーの信号はD8を利用、LEDに関してはD3を使います。
D3を使うのはプログラムで「analogWrite関数」を使いたいためです。
なぜ「analogWrite関数」を使いたいかというとLEDの明るさを小さくしたいためです。

Arduino Nanoの仕様は以下の図の通りですが、D3、つまり3ピン(紫で3の箇所)についてはPWM Pinと記載されています(線のところが~となっており、凡例を見るとこれがPWM Pinを表す)。
f:id:engetu21:20190511202711p:plain
D3にLEDのアノードを刺すことで明るさを小さくしたり大きくしたり。for文を用いれば、ゆっくり明るくするといったことも可能です。
※詳しくはこちら
明るさを変化させてみよう(PWMでアナログ出力):
http://jkoba.net/prototyping/arduino/led_brightness.html

実際の構築はこんな感じ。
f:id:engetu21:20190511203716j:plain

3.プログラム

#define LED_PIN 3
#define PIR_PIN 8

int sonzai = 0;        // 存在フラグ
int tentouzumi = 0;    // 点灯フラグ
int count = 0;         // 秒数カウンター

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(PIR_PIN, INPUT_PULLUP);
  Serial.begin(9600);

  tentouzumi = 1;      // 無条件で初回は点灯
}

void loop() {
  delay(1000);         // 1秒間スリープ
  count = count + 1;   // カウントアップ

  // 30秒後に判定
  if (count == 30){
    count = 0;                // カウンターリセット
    Serial.println("30秒目の判定!");
    Serial.println(sonzai);
    Serial.println(tentouzumi);
  
    // 点灯しており、かつ誰も居ない時
    if (tentouzumi == 1 && sonzai == 0){

      // 明かりを消す
      analogWrite(LED_PIN, 0);
      Serial.println("off");

      tentouzumi = 0;  // 点灯済みフラグをクリア
    }
    sonzai = 0;        // 存在フラグをクリア
  }
  
  // 満期に達してない場合
  if (count < 30){
    Serial.println(count);
    Serial.println(sonzai);
    Serial.println(tentouzumi);

    // 点灯しておらず、かつ誰か居る時
    if (tentouzumi == 0 && sonzai == 1){

      // 明かりを付ける
      analogWrite(LED_PIN, 1);
      Serial.println("on");

      tentouzumi = 1;     // 点灯済みフラグをONに
      count = 0;          // カウンタリセット
    }
  }
  
  // センサに反応があった場合(誰か居る場合)
  if (digitalRead(PIR_PIN) == HIGH){
      sonzai = 1;         // 存在フラグをONに
  }
}

大体これで動く。
満期は30秒とし、その際誰もいなければ消灯、一秒間隔の監視で誰かいたら点灯。
実際のところ、これは昔書いたラズパイ版のソースの流用です。
engetu21.hatenablog.com

電灯スイッチをサーボモータで押すため、サーボモータの動作時間を考えると一秒間隔よりもっと短く検知させ、すぐ電灯がつくようにしたほうがいいかもしれない。

そういえば、Arudino Nanoに関してはUSB(mini Type B)でPCと接続することでプログラムのライティングができる。これは互換機も同様。
Arduino IDEの設定としては以下のようにすれば設定すれば書き込みができた。
f:id:engetu21:20190511212327j:plain

なお、USB-ACアダブターをつなげて直接電源供給が可能なため、電源周りのセッティングはとても楽。

次回は今回の構成とプログラムにサーボモータを付けるようにして電灯スイッチを押させるようにします。