PR 記事には広告が含まれています
スポンサーリンク
Translate

人感センサSR602を使って人が近づいたらLEDがレインボーに光る電飾を作ってみました

スポンサーリンク

コイン電池で動作し、人が近づいたらLEDがレインボーに輝く電飾を作りたいと思います。

スポンサーリンク

人感センサ

SR602

人感センサには、電池でも長持ちするように、待機電力が小さいSR602を使います。

HiLetgo 3個セットミニSR602モーションセンサー検出器モジュール焦電式赤外線感覚スイッチArduino PI向け高感度
HiLetgo

SR602について詳しくは、こちらの記事をご覧ください。

このセンサは、人に反応すると、出力ピンがHiになります。

スポンサーリンク

レインボーLED

3Vの電源をつなぐと、赤青緑の光が時間と共に変化し、混ざり合って、様々な色に変化する便利なLEDです。

色の変化はランダムではなく、決まったパターンの繰り返しのようです。

スポンサーリンク

回路を考える

MOS-FETでLEDをドライブ

まず考えられるのが、上記のような回路です。コイン電池CR2032を電源として、SR602に電源を供給します。SR602の出力ピンから取り出せる電流はとても弱く、LEDを直接接続するとセンサが不安定になってしまいます。そのため、センサの出力をMOS-FETに接続し、センサが反応して出力ピンがHiになると、MOS-FETがONしてLEDが点灯するようにします。

MOS-FETではなく、トランジスタを使う方法も考えられますが、トランジスタの場合にはONした時に0.6V程度電圧が低下してしまいます。コイン電池が3Vとすると、LEDの電圧は2.4Vになってしまい、青色のLEDが点灯するには電圧不足となります。MOS-FETの場合、トランジスタのような大きな電圧降下がないので、青色LEDも光ってくれます。

ただこの回路、一つ問題があります。

レインボーに光るLEDは、色が変化するパターンが同じため、4つのLEDが同時にONすると、4つ共に同じような色になってしまいます。それぞれのLEDが、ばらばらな色で光って欲しいのです。

マイコンを使う

そこで、マイコンを使うことを考えます。マイコンで、4つのLEDをONするタイミングを少しずつずらし、同じパターンで光っても、それぞれのLEDの色が異なるようにしようと思います。

スポンサーリンク

プログラムを考える

マイコンには、8ピンDIPパッケージで工作しやすい、AVRマイコンのATtiny13Aを使うことにしました。

このマイコンは、MCUDudeさんが、Arduinoでプログラムできるパッケージを公開してくれています。このパッケージをインストールすることで、Arduino言語で簡単にプログラムを作ることができます。インストール方法など詳しくは、こちらをご覧ください。

このマイコンで実行したい処理は以下の通りです。

  • 普段はSleepしていて低消費電流で待機
  • INT0ピンがLowになったらプログラムを実行開始
  • LEDを200m秒ごとに順番にONする
  • 10秒待つ
  • LEDを200m秒ごとに順番にOFFする
  • Sleepに入る

MCUDudeさんのパッケージを使って、Arduino言語で書くとこうなります。

#include <avr/sleep.h>
#include <avr/interrupt.h>
#define LED1 3
#define LED2 4
#define LED3 0
#define LED4 2
#define Triger 1

void setup() {
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(Triger, INPUT_PULLUP);
  digitalWrite(LED1, LOW);
  digitalWrite(LED2, LOW);
  digitalWrite(LED3, LOW);
  digitalWrite(LED4, LOW);
}

void wakeUpNow() {
}

void sleepNow() {
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  attachInterrupt(0, wakeUpNow, LOW);
  sleep_mode();
  sleep_disable();
  detachInterrupt(0);
}

int delayTime = 200;
int stayTime = 10000;
void loop() {
  //turn on
  digitalWrite(LED1, HIGH);
  delay(delayTime);
  digitalWrite(LED2, HIGH);
  delay(delayTime);
  digitalWrite(LED3, HIGH);
  delay(delayTime);
  digitalWrite(LED4, HIGH);

  delay(stayTime);

  //trun off
  digitalWrite(LED1, LOW);
  delay(delayTime);
  digitalWrite(LED2, LOW);
  delay(delayTime);
  digitalWrite(LED3, LOW);
  delay(delayTime);
  digitalWrite(LED4, LOW);

  sleepNow(); // sleep
}

レジスタ操作を全くせずに、ピン変化割り込みや、Sleepの処理が簡単に書けてしまいます。なんて便利なんでしょう。

スポンサーリンク

動作テスト

人の動きに反応して、LEDがレインボーに光るようになりました。LEDが光っていない時の電流を調べたところ20uAでした。CR2032の容量が200mAh程度なので、かなりの長期間動作できますね。