Arduino Nanoを使ってクリスマスイルミネーションを作る

LinkedIn にシェア
Delicious にシェア
LINEで送る
email this
Pocket

なんとなくクリスマス飾りをつけたくなるようなフレームを貰ったんですよ。

ただ飾るだけじゃつまらんし猫らに食われそうなので、
玄関先におくイルミネーションを作ってみよう。

せっかくなのでLEDテープだけ買って、
それをArduinoでスイッチしてみようではないか。
できれば明るくなったら自動で消えるようにしたい。

確か大昔にOLYMPUS XA2の自動露出を修理した時に
余分に買っておいたCdSがどこかに眠っているはず。

回路図
IMG_20171202_175043
手書き、で、雑!

左が日没を検知して全体に電気を供給する部分。
まるにギザギザがCdS。

暗くなるとCdSの抵抗値が上がってGNDに落ちていた電気が
MOSFETに流れてGNDが開く、そして全体に電気が流れるという算段。
分圧用の抵抗は手持ち可変抵抗で一番抵抗の大きい100kでも足りず、
直列で200kの固定抵抗を足した。
いや100kだったかもしれない。
ここの抵抗はCdSのばらつき具合によっても変わるので
実際に試してチェック。間違えても壊れないから大丈夫。
秋月CdS

3つ並んだLEDの上には便宜上電流制限抵抗を書いたけど
買ったテープLEDに抵抗入っているので実際にはLEDテープをつなぐだけ。

ArduinoのD2,D3,D4とMOSFETの間に電流制限抵抗、
GNDとの間にプルダウン抵抗を入れておけばいざという時に安心だけど、
まあ、実際やってみて動けば大丈夫だろう、多分。
MOSFETは2SK2925、正直オーバースペック。


ブレッドボードでテストしている様子。問題ない。

IMG_20171202_175033
さらに雑になった実体配線図。
これ忘れた頃にみたら読めないかもしれん。


ユニバーサル基板で作って無事動作。
裏は汚すぎて見せられないよ!
写真を撮り忘れたとも言う。

あとは屋外におくので防水。
基板はタッパーに入れて、タッパーの蓋に穴を開けて
配線を通して隙間をグルーガンで塞ぐ。
ACアダプターの部分はラップで包んで上からテープでぐるぐる巻き。
何度も書くけど写真を撮り忘れた。

IMG_20171203_130618
設置。

IMG_20171203_130626
昼間はマジマジとみない方がいいと思います。

IMG_20171203_130652
CdSは外に向けてなるべくちゃんと反応するように祈る。


ちゃんと光った。

int ft = 1000;

void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, LOW);
}

void fin2()
{
  for (int i = 0; i < ft; i++)
  {
    digitalWrite(2, LOW);
    delayMicroseconds(ft - i);
    digitalWrite(2, HIGH);
    delayMicroseconds(i);
  }
}

void fin3()
{
  for (int i = 0; i < ft; i++)
  {
    digitalWrite(3, LOW);
    delayMicroseconds(ft - i);
    digitalWrite(3, HIGH);
    delayMicroseconds(i);
  }
}

void fin4()
{
  for (int i = 0; i < ft; i++)
  {
    digitalWrite(4, LOW);
    delayMicroseconds(ft - i);
    digitalWrite(4, HIGH);
    delayMicroseconds(i);
  }
}

void fout2()
{
  for (int i = ft; i >= 0; i--)
  {
    digitalWrite(2, HIGH);
    delayMicroseconds(i);
    digitalWrite(2, LOW);
    delayMicroseconds(ft - i);
  }
}

void fout3()
{
  for (int i = ft; i >= 0; i--)
  {
    digitalWrite(3, HIGH);
    delayMicroseconds(i);
    digitalWrite(3, LOW);
    delayMicroseconds(ft - i);
  }
}

void fout4()
{
  for (int i = ft; i >= 0; i--)
  {
    digitalWrite(4, HIGH);
    delayMicroseconds(i);
    digitalWrite(4, LOW);
    delayMicroseconds(ft - i);
  }
}

void fin2fout4()
{
  for (int i = 0; i < ft; i++)
  {
    digitalWrite(2, LOW);
    digitalWrite(4, HIGH);
    delayMicroseconds(ft - i);
    digitalWrite(2, HIGH);
    digitalWrite(4, LOW);
    delayMicroseconds(i);
  }
}

void fin3fout2()
{
  for (int i = 0; i < ft; i++)
  {
    digitalWrite(3, LOW);
    digitalWrite(2, HIGH);
    delayMicroseconds(ft - i);
    digitalWrite(3, HIGH);
    digitalWrite(2, LOW);
    delayMicroseconds(i);
  }
}

void fin4fout3()
{
  for (int i = 0; i < ft; i++)
  {
    digitalWrite(4, LOW);
    digitalWrite(3, HIGH);
    delayMicroseconds(ft - i);
    digitalWrite(4, HIGH);
    digitalWrite(3, LOW);
    delayMicroseconds(i);
  }
}

void fin3fout4()
{
  for (int i = 0; i < ft; i++)
  {
    digitalWrite(3, LOW);
    digitalWrite(4, HIGH);
    delayMicroseconds(ft - i);
    digitalWrite(3, HIGH);
    digitalWrite(4, LOW);
    delayMicroseconds(i);
  }
}

void fin2fout3()
{
  for (int i = 0; i < ft; i++)
  {
    digitalWrite(2, LOW);
    digitalWrite(3, HIGH);
    delayMicroseconds(ft - i);
    digitalWrite(2, HIGH);
    digitalWrite(3, LOW);
    delayMicroseconds(i);
  }
}


void loop() {

fin2();
fin3();
fin4();
fout4();
fout3();
fout2();
delay(ft);

fin2();
fin3fout2();
fin4fout3();
delay(ft);
fin3fout4();
fin2fout3();
fout2();
delay(ft);

}

デジタルアウトだけどPWMとして
高速オンオフをすることでフェードを実装。
今気がついたけど、finとかの関数呼ぶ時に
引数でポートを渡せば関数側がもっと
少ない行でかけたなーと思いましたそのうち直すかもしれないけど
面倒だったら直さないかもしれない。

とりあえず稼働したので、あとは気が向いた時に
演出バリエーションを増やしていく、つもり。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

AP NANO V3.0 開発ボード AP-TH034
価格:1280円(税込、送料無料) (2017/12/6時点)

コチラの記事もどうぞ!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください